From 6b958fd1779e1882dbd91f714719cfae08752f67 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Mon, 26 Mar 2012 17:30:27 +0200 Subject: Added anchor-selection widget, it doesn't do much at the moment, next step will be to wire everything together, btw, you can see the widget in the 'rows and columns' panel (bzr r11073.1.3) --- share/icons/icons.svg | 25695 +++++++++++++--- share/icons/tango_icons.svg | 56454 ++++++++++++++++++++++++++++++------ src/ui/CMakeLists.txt | 2 + src/ui/dialog/tile.cpp | 1 + src/ui/dialog/tile.h | 3 + src/ui/widget/anchor-selector.cpp | 123 + src/ui/widget/anchor-selector.h | 37 + 7 files changed, 70410 insertions(+), 11905 deletions(-) create mode 100644 src/ui/widget/anchor-selector.cpp create mode 100644 src/ui/widget/anchor-selector.h diff --git a/share/icons/icons.svg b/share/icons/icons.svg index cff58130d..f83730d2d 100644 --- a/share/icons/icons.svg +++ b/share/icons/icons.svg @@ -1,3691 +1,22010 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Created with Inkscape + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Created with Inkscape http://www.inkscape.org/ -image/svg+xml - - - - -Inkscape Developers - - - - -Inkscape Developers - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + image/svg+xml + + + + + Inkscape Developers + + + + + Inkscape Developers + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/share/icons/tango_icons.svg b/share/icons/tango_icons.svg index 915d6a097..edf18e623 100644 --- a/share/icons/tango_icons.svg +++ b/share/icons/tango_icons.svg @@ -1,8220 +1,48240 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Created with Inkscape + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Created with Inkscape http://www.inkscape.org/ -image/svg+xml - - - - -Inkscape Developers - - - - -Inkscape Developers - - - - - -jEsuSdA 8) www.jesusda.com - - -09/01/2009 - - - - - - - - - - - - -Menus -File -Edit -View -Layer -Object -Path -Text -Help - - -XML Editor -Align and Distribute -Transform -Grid Arrange / Tiled clones -Misc -Tools -and tools' bars -Dialogs -Fill and stroke -Text -Others - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -none - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -a - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + image/svg+xml + + + + + Inkscape Developers + + + + + Inkscape Developers + + + + + + jEsuSdA 8) www.jesusda.com + + + 09/01/2009 + + + + + + + + + + + + + Menus + File + Edit + View + Layer + Object + Path + Text + Help + + + XML Editor + Align and Distribute + Transform + Grid Arrange / Tiled clones + Misc + Tools + and tools' bars + Dialogs + Fill and stroke + Text + Others + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 484edc6e2..e21c3795f 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -72,6 +72,7 @@ set(ui_SRC # dialog/whiteboard-sharewithchat.cpp # dialog/whiteboard-sharewithuser.cpp + widget/anchor-selector.cpp widget/button.cpp widget/color-picker.cpp widget/color-preview.cpp @@ -200,6 +201,7 @@ set(ui_SRC view/view-widget.h view/view.h + widget/anchor-selector.h widget/attr-widget.h widget/button.h widget/color-picker.h diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 77dae056f..5ce41c716 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -796,6 +796,7 @@ TileDialog::TileDialog() SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); TileBox.pack_start(SpinsHBox, false, false, MARGIN); + TileBox.pack_start(anchorSelector); { /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index f9e9d9842..f1493664d 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -20,6 +20,7 @@ #include #include +#include "ui/widget/anchor-selector.h" #include "ui/widget/panel.h" #include "ui/widget/spinbutton.h" #include "ui/widget/scalar-unit.h" @@ -78,6 +79,8 @@ private: bool userHidden; bool updating; + AnchorSelector anchorSelector; + Gtk::Notebook notebook; Gtk::VBox TileBox; diff --git a/src/ui/widget/anchor-selector.cpp b/src/ui/widget/anchor-selector.cpp new file mode 100644 index 000000000..f32346436 --- /dev/null +++ b/src/ui/widget/anchor-selector.cpp @@ -0,0 +1,123 @@ +/* + * anchor-selector.cpp + * + * Created on: Mar 22, 2012 + * Author: denis + */ + +#include +#include "widgets/icon.h" +#include "ui/icon-names.h" +#include "ui/widget/anchor-selector.h" + +void AnchorSelector::setupButton(const Glib::ustring& icon, Gtk::ToggleButton& button) { + Gtk::Widget* buttonIcon = Gtk::manage(sp_icon_get_icon(icon, Inkscape::ICON_SIZE_LARGE_TOOLBAR)); + buttonIcon->show(); + + button.set_relief(Gtk::RELIEF_NONE); + button.show(); + button.add(*buttonIcon); + button.set_can_focus(false); +} + +AnchorSelector::AnchorSelector() + : Gtk::Alignment(0.5, 0, 0, 0), + _container(3, 3, true) +{ + setupButton(INKSCAPE_ICON("boundingbox_top_left"), _buttons[0]); + setupButton(INKSCAPE_ICON("boundingbox_top"), _buttons[1]); + setupButton(INKSCAPE_ICON("boundingbox_top_right"), _buttons[2]); + setupButton(INKSCAPE_ICON("boundingbox_left"), _buttons[3]); + setupButton(INKSCAPE_ICON("boundingbox_center"), _buttons[4]); + setupButton(INKSCAPE_ICON("boundingbox_right"), _buttons[5]); + setupButton(INKSCAPE_ICON("boundingbox_bottom_left"), _buttons[6]); + setupButton(INKSCAPE_ICON("boundingbox_bottom"), _buttons[7]); + setupButton(INKSCAPE_ICON("boundingbox_bottom_right"), _buttons[8]); + + _buttons[0].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_tl_activated)); + _buttons[1].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_t_activated)); + _buttons[2].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_tr_activated)); + _buttons[3].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_l_activated)); + _buttons[4].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_c_activated)); + _buttons[5].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_r_activated)); + _buttons[6].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_bl_activated)); + _buttons[7].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_b_activated)); + _buttons[8].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_br_activated)); + + for(int i = 0; i < 9; ++i) { + _container.attach(_buttons[i], i % 3, i % 3+1, i / 3, i / 3+1, Gtk::FILL, Gtk::FILL); + } + _selection = 4; + _buttons[4].set_active(); + + this->add(_container); +} + +AnchorSelector::~AnchorSelector() +{ + // TODO Auto-generated destructor stub +} + +void AnchorSelector::btn_activated(int index) +{ + if(_buttons[index].get_active()) + { + std::cout << "btn_activated(" << index << ", old=" << _selection << ");" << std::endl; + if(index != _selection) + { + _buttons[_selection].set_active(false); + _buttons[index].set_active(); + _selection = index; + } else { + _buttons[index].set_active(); + } + } +} + +void AnchorSelector::btn_tl_activated() +{ + btn_activated(0); +} + +void AnchorSelector::btn_t_activated() +{ + btn_activated(1); +} + +void AnchorSelector::btn_tr_activated() +{ + btn_activated(2); +} + +void AnchorSelector::btn_l_activated() +{ + btn_activated(3); +} + +void AnchorSelector::btn_c_activated() +{ + btn_activated(4); +} + +void AnchorSelector::btn_r_activated() +{ + btn_activated(5); +} + +void AnchorSelector::btn_bl_activated() +{ + btn_activated(6); +} + +void AnchorSelector::btn_b_activated() +{ + btn_activated(7); +} + +void AnchorSelector::btn_br_activated() +{ + btn_activated(8); +} + + + diff --git a/src/ui/widget/anchor-selector.h b/src/ui/widget/anchor-selector.h new file mode 100644 index 000000000..c852a1a5d --- /dev/null +++ b/src/ui/widget/anchor-selector.h @@ -0,0 +1,37 @@ +/* + * anchor-selector.h + * + * Created on: Mar 22, 2012 + * Author: denis + */ + +#ifndef ANCHOR_SELECTOR_H_ +#define ANCHOR_SELECTOR_H_ + +#include + +class AnchorSelector : public Gtk::Alignment +{ +private: + Gtk::ToggleButton _buttons[9]; + int _selection; + Gtk::Table _container; + + void setupButton(const Glib::ustring &icon, Gtk::ToggleButton &button); + void btn_activated(int index); + void btn_tl_activated(); + void btn_t_activated(); + void btn_tr_activated(); + void btn_l_activated(); + void btn_c_activated(); + void btn_r_activated(); + void btn_bl_activated(); + void btn_b_activated(); + void btn_br_activated(); + +public: + AnchorSelector(); + virtual ~AnchorSelector(); +}; + +#endif /* ANCHOR_SELECTOR_H_ */ -- cgit v1.2.3 From 3f7eff8696693c9b946fe47c2831c8706bffb68d Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Wed, 28 Mar 2012 17:44:47 +0200 Subject: Integrated the newly created Anchor-Selection-Widget with the existing "Rows and Columns" panel. Code still needs documentation and cleenup however. (bzr r11073.1.5) --- src/ui/dialog/tile.cpp | 56 +++++++++----------------- src/ui/dialog/tile.h | 25 ++---------- src/ui/widget/anchor-selector.cpp | 82 +++++++-------------------------------- src/ui/widget/anchor-selector.h | 19 ++++----- 4 files changed, 47 insertions(+), 135 deletions(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 5ce41c716..4a5e9785f 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -517,39 +517,15 @@ void TileDialog::Spacing_button_changed() } /** - * changed Radio button in Vertical Align group. + * changed Anchor selection widget. */ -void TileDialog::VertAlign_changed() +void TileDialog::Align_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (VertTopRadioButton.get_active()) { - VertAlign = 0; - prefs->setInt("/dialogs/gridtiler/VertAlign", 0); - } else if (VertCentreRadioButton.get_active()){ - VertAlign = 1; - prefs->setInt("/dialogs/gridtiler/VertAlign", 1); - } else if (VertBotRadioButton.get_active()){ - VertAlign = 2; - prefs->setInt("/dialogs/gridtiler/VertAlign", 2); - } -} - -/** - * changed Radio button in Vertical Align group. - */ -void TileDialog::HorizAlign_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (HorizLeftRadioButton.get_active()) { - HorizAlign = 0; - prefs->setInt("/dialogs/gridtiler/HorizAlign", 0); - } else if (HorizCentreRadioButton.get_active()){ - HorizAlign = 1; - prefs->setInt("/dialogs/gridtiler/HorizAlign", 1); - } else if (HorizRightRadioButton.get_active()){ - HorizAlign = 2; - prefs->setInt("/dialogs/gridtiler/HorizAlign", 2); - } + VertAlign = AlignmentSelector.getVerticalAlignment(); + prefs->setInt("/dialogs/gridtiler/VertAlign", VertAlign); + HorizAlign = AlignmentSelector.getHorizontalAlignment(); + prefs->setInt("/dialogs/gridtiler/HorizAlign", HorizAlign); } /** @@ -685,8 +661,8 @@ TileDialog::TileDialog() RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::on_RowSize_checkbutton_changed)); - { - /*#### Radio buttons to control vertical alignment ####*/ +/* { + /*#### Radio buttons to control vertical alignment ####*//* VertAlignLabel.set_label(_("Align:")); VertAlignHBox.pack_start(VertAlignLabel, false, false, MARGIN); @@ -715,7 +691,7 @@ TileDialog::TileDialog() } VertAlignHBox.pack_start(VertAlignVBox, false, false, MARGIN); NoOfRowsBox.pack_start(VertAlignHBox, false, false, MARGIN); - } + }*/ SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); @@ -757,8 +733,8 @@ TileDialog::TileDialog() ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::on_ColSize_checkbutton_changed)); - { - /*#### Radio buttons to control horizontal alignment ####*/ + /*{ + /*#### Radio buttons to control horizontal alignment ####*//* HorizAlignLabel.set_label(_("Align:")); HorizAlignVBox.pack_start(HorizAlignLabel, false, false, MARGIN); @@ -791,12 +767,18 @@ TileDialog::TileDialog() } HorizAlignVBox.pack_start(HorizAlignHBox, false, false, MARGIN); NoOfColsBox.pack_start(HorizAlignVBox, false, false, MARGIN); - } + }*/ SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); TileBox.pack_start(SpinsHBox, false, false, MARGIN); - TileBox.pack_start(anchorSelector); + + + // Anchor selection widget + AlignLabel.set_label("Alignment:"); + AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &TileDialog::Align_changed)); + TileBox.pack_start(AlignLabel, false, false, MARGIN); + TileBox.pack_start(AlignmentSelector, true, false, MARGIN); { /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index f1493664d..b3bf390b6 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -67,8 +67,7 @@ public: void on_rowSize_spinbutton_changed(); void on_colSize_spinbutton_changed(); void Spacing_button_changed(); - void VertAlign_changed(); - void HorizAlign_changed(); + void Align_changed(); static TileDialog& getInstance() { return *new TileDialog(); } @@ -79,8 +78,6 @@ private: bool userHidden; bool updating; - AnchorSelector anchorSelector; - Gtk::Notebook notebook; Gtk::VBox TileBox; @@ -112,24 +109,10 @@ private: bool AutoColSize; Gtk::CheckButton ColumnWidthButton; - // Vertical align - Gtk::Label VertAlignLabel; - Gtk::HBox VertAlignHBox; - Gtk::VBox VertAlignVBox; - Gtk::RadioButtonGroup VertAlignGroup; - Gtk::RadioButton VertCentreRadioButton; - Gtk::RadioButton VertTopRadioButton; - Gtk::RadioButton VertBotRadioButton; + // Alignment + Gtk::Label AlignLabel; + AnchorSelector AlignmentSelector; double VertAlign; - - // Horizontal align - Gtk::Label HorizAlignLabel; - Gtk::VBox HorizAlignVBox; - Gtk::HBox HorizAlignHBox; - Gtk::RadioButtonGroup HorizAlignGroup; - Gtk::RadioButton HorizCentreRadioButton; - Gtk::RadioButton HorizLeftRadioButton; - Gtk::RadioButton HorizRightRadioButton; double HorizAlign; Inkscape::UI::Widget::ScalarUnit XPadding; diff --git a/src/ui/widget/anchor-selector.cpp b/src/ui/widget/anchor-selector.cpp index f32346436..aa173e0a0 100644 --- a/src/ui/widget/anchor-selector.cpp +++ b/src/ui/widget/anchor-selector.cpp @@ -3,6 +3,8 @@ * * Created on: Mar 22, 2012 * Author: denis + * + * Released under GNU GPL. Read the file 'COPYING' for more information. */ #include @@ -34,17 +36,9 @@ AnchorSelector::AnchorSelector() setupButton(INKSCAPE_ICON("boundingbox_bottom"), _buttons[7]); setupButton(INKSCAPE_ICON("boundingbox_bottom_right"), _buttons[8]); - _buttons[0].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_tl_activated)); - _buttons[1].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_t_activated)); - _buttons[2].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_tr_activated)); - _buttons[3].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_l_activated)); - _buttons[4].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_c_activated)); - _buttons[5].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_r_activated)); - _buttons[6].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_bl_activated)); - _buttons[7].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_b_activated)); - _buttons[8].signal_clicked().connect(sigc::mem_fun(*this, &AnchorSelector::btn_br_activated)); - for(int i = 0; i < 9; ++i) { + _buttons[i].signal_clicked().connect( + sigc::bind(sigc::mem_fun(*this, &AnchorSelector::btn_activated), i)); _container.attach(_buttons[i], i % 3, i % 3+1, i / 3, i / 3+1, Gtk::FILL, Gtk::FILL); } _selection = 4; @@ -60,64 +54,16 @@ AnchorSelector::~AnchorSelector() void AnchorSelector::btn_activated(int index) { - if(_buttons[index].get_active()) + + if(_selection == index && _buttons[index].get_active() == false) { - std::cout << "btn_activated(" << index << ", old=" << _selection << ");" << std::endl; - if(index != _selection) - { - _buttons[_selection].set_active(false); - _buttons[index].set_active(); - _selection = index; - } else { - _buttons[index].set_active(); - } + _buttons[index].set_active(true); + } + else if(_selection != index && _buttons[index].get_active()) + { + int old_selection = _selection; + _selection = index; + _buttons[old_selection].set_active(false); + _selectionChanged.emit(); } } - -void AnchorSelector::btn_tl_activated() -{ - btn_activated(0); -} - -void AnchorSelector::btn_t_activated() -{ - btn_activated(1); -} - -void AnchorSelector::btn_tr_activated() -{ - btn_activated(2); -} - -void AnchorSelector::btn_l_activated() -{ - btn_activated(3); -} - -void AnchorSelector::btn_c_activated() -{ - btn_activated(4); -} - -void AnchorSelector::btn_r_activated() -{ - btn_activated(5); -} - -void AnchorSelector::btn_bl_activated() -{ - btn_activated(6); -} - -void AnchorSelector::btn_b_activated() -{ - btn_activated(7); -} - -void AnchorSelector::btn_br_activated() -{ - btn_activated(8); -} - - - diff --git a/src/ui/widget/anchor-selector.h b/src/ui/widget/anchor-selector.h index c852a1a5d..ad20bf063 100644 --- a/src/ui/widget/anchor-selector.h +++ b/src/ui/widget/anchor-selector.h @@ -3,6 +3,8 @@ * * Created on: Mar 22, 2012 * Author: denis + * + * Released under GNU GPL. Read the file 'COPYING' for more information. */ #ifndef ANCHOR_SELECTOR_H_ @@ -17,19 +19,18 @@ private: int _selection; Gtk::Table _container; + sigc::signal _selectionChanged; + void setupButton(const Glib::ustring &icon, Gtk::ToggleButton &button); void btn_activated(int index); - void btn_tl_activated(); - void btn_t_activated(); - void btn_tr_activated(); - void btn_l_activated(); - void btn_c_activated(); - void btn_r_activated(); - void btn_bl_activated(); - void btn_b_activated(); - void btn_br_activated(); public: + + int getHorizontalAlignment() { return _selection % 3; } + int getVerticalAlignment() { return _selection / 3; } + + sigc::signal &on_selectionChanged() { return _selectionChanged; } + AnchorSelector(); virtual ~AnchorSelector(); }; -- cgit v1.2.3 From f31125febfcaf661ffb7227081b72da399440730 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Thu, 29 Mar 2012 18:31:07 +0200 Subject: Removed some commented code, which i replaced, and is therefore no longer used. (bzr r11073.1.7) --- src/ui/dialog/tile.cpp | 69 -------------------------------------------------- 1 file changed, 69 deletions(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 4a5e9785f..4c83c7be0 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -661,38 +661,6 @@ TileDialog::TileDialog() RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::on_RowSize_checkbutton_changed)); -/* { - /*#### Radio buttons to control vertical alignment ####*//* - - VertAlignLabel.set_label(_("Align:")); - VertAlignHBox.pack_start(VertAlignLabel, false, false, MARGIN); - - VertTopRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::VertAlign_changed)); - VertAlignGroup = VertTopRadioButton.get_group(); - VertAlignVBox.pack_start(VertTopRadioButton, false, false, 0); - - VertCentreRadioButton.set_group(VertAlignGroup); - VertCentreRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::VertAlign_changed)); - VertAlignVBox.pack_start(VertCentreRadioButton, false, false, 0); - - VertBotRadioButton.set_group(VertAlignGroup); - VertBotRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::VertAlign_changed)); - VertAlignVBox.pack_start(VertBotRadioButton, false, false, 0); - - VertAlign = prefs->getInt("/dialogs/gridtiler/VertAlign", 1); - if (VertAlign == 0) { - VertTopRadioButton.set_active(TRUE); - } - else if (VertAlign == 1) { - VertCentreRadioButton.set_active(TRUE); - } - else if (VertAlign == 2){ - VertBotRadioButton.set_active(TRUE); - } - VertAlignHBox.pack_start(VertAlignVBox, false, false, MARGIN); - NoOfRowsBox.pack_start(VertAlignHBox, false, false, MARGIN); - }*/ - SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); @@ -732,43 +700,6 @@ TileDialog::TileDialog() ColumnWidthButton.set_tooltip_text(_("If not set, each column has the width of the widest object in it")); ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::on_ColSize_checkbutton_changed)); - - /*{ - /*#### Radio buttons to control horizontal alignment ####*//* - - HorizAlignLabel.set_label(_("Align:")); - HorizAlignVBox.pack_start(HorizAlignLabel, false, false, MARGIN); - - HorizAlignHBox.pack_start(*(new Gtk::HBox()), true, true, 0); // centering strut - - HorizLeftRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::HorizAlign_changed)); - HorizAlignGroup = HorizLeftRadioButton.get_group(); - HorizAlignHBox.pack_start(HorizLeftRadioButton, false, false, 0); - - HorizCentreRadioButton.set_group(HorizAlignGroup); - HorizCentreRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::HorizAlign_changed)); - HorizAlignHBox.pack_start(HorizCentreRadioButton, false, false, 0); - - HorizRightRadioButton.set_group(HorizAlignGroup); - HorizRightRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::HorizAlign_changed)); - HorizAlignHBox.pack_start(HorizRightRadioButton, false, false, 0); - - HorizAlignHBox.pack_start(*(new Gtk::HBox()), true, true, 0); // centering strut - - HorizAlign = prefs->getInt("/dialogs/gridtiler/HorizAlign", 1); - if (HorizAlign == 0) { - HorizLeftRadioButton.set_active(TRUE); - } - else if (HorizAlign == 1) { - HorizCentreRadioButton.set_active(TRUE); - } - else if (HorizAlign == 2) { - HorizRightRadioButton.set_active(TRUE); - } - HorizAlignVBox.pack_start(HorizAlignHBox, false, false, MARGIN); - NoOfColsBox.pack_start(HorizAlignVBox, false, false, MARGIN); - }*/ - SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); TileBox.pack_start(SpinsHBox, false, false, MARGIN); -- cgit v1.2.3 From dc6fcf4ec96d4f4345ad86b1940d4b31d6771a0f Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sat, 31 Mar 2012 15:20:19 +0200 Subject: Brought old code, "Rows and Columns" in it's own class. Added a separate class for the panel. Still some cleanup to do. (bzr r11073.1.8) --- src/ui/dialog/dialog-manager.cpp | 4 +- src/ui/dialog/tile.cpp | 98 ++++++++++++++++++++++++++-------------- src/ui/dialog/tile.h | 56 +++++++++++++++++++---- 3 files changed, 112 insertions(+), 46 deletions(-) diff --git a/src/ui/dialog/dialog-manager.cpp b/src/ui/dialog/dialog-manager.cpp index 60011ca9d..746cfc1b4 100644 --- a/src/ui/dialog/dialog-manager.cpp +++ b/src/ui/dialog/dialog-manager.cpp @@ -121,7 +121,7 @@ DialogManager::DialogManager() { registerFactory("SvgFontsDialog", &create); #endif registerFactory("Swatches", &create); - registerFactory("TileDialog", &create); + registerFactory("TileDialog", &create); registerFactory("Trace", &create); registerFactory("Transformation", &create); registerFactory("UndoHistory", &create); @@ -156,7 +156,7 @@ DialogManager::DialogManager() { registerFactory("SvgFontsDialog", &create); #endif registerFactory("Swatches", &create); - registerFactory("TileDialog", &create); + registerFactory("TileDialog", &create); registerFactory("Trace", &create); registerFactory("Transformation", &create); registerFactory("UndoHistory", &create); diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 4c83c7be0..9297b5154 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -109,6 +109,34 @@ namespace Inkscape { namespace UI { namespace Dialog { +ArrangeDialog::ArrangeDialog() + : UI::Widget::Panel("", "/dialogs/gridtiler", SP_VERB_SELECTION_GRIDTILE), + _gridArrangeTab(new GridArrangeTab(this)) +{ + Gtk::Box *contents = this->_getContents(); + + _notebook.append_page(*_gridArrangeTab, C_("Arrange dialog", "Rectangular grid")); + _arrangeBox.pack_start(_notebook); + + _arrangeButton = this->addResponseButton(C_("Arrange dialog","_Arrange"), GTK_RESPONSE_APPLY); + _arrangeButton->set_use_underline(true); + _arrangeButton->set_tooltip_text(_("Arrange selected objects")); + _arrangeBox.pack_start(*_arrangeButton); + contents->pack_start(_arrangeBox); + show_all_children(); +} + +void ArrangeDialog::_apply() +{ + switch(_notebook.get_current_page()) + { + case 0: + _gridArrangeTab->arrange(); + break; + } +} + + //######################################################################### //## E V E N T S @@ -120,7 +148,7 @@ namespace Dialog { * */ -void TileDialog::Grid_Arrange () +void GridArrangeTab::arrange() { int cnt,row_cnt,col_cnt,a,row,col; @@ -159,7 +187,7 @@ void TileDialog::Grid_Arrange () grid_left = 99999; grid_top = 99999; - SPDesktop *desktop = getDesktop(); + SPDesktop *desktop = Parent->getDesktop(); sp_desktop_document(desktop)->ensureUpToDate(); Inkscape::Selection *selection = sp_desktop_selection (desktop); @@ -356,16 +384,16 @@ g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_h //######################################################################### -void TileDialog::_apply() +void GridArrangeTab::_apply() { - Grid_Arrange(); + arrange(); } /** * changed value in # of columns spinbox. */ -void TileDialog::on_row_spinbutton_changed() +void GridArrangeTab::on_row_spinbutton_changed() { // quit if run by the attr_changed listener if (updating) { @@ -374,7 +402,7 @@ void TileDialog::on_row_spinbutton_changed() // in turn, prevent listener from responding updating = true; - SPDesktop *desktop = getDesktop(); + SPDesktop *desktop = Parent->getDesktop(); Inkscape::Selection *selection = desktop ? desktop->selection : 0; g_return_if_fail( selection ); @@ -392,7 +420,7 @@ void TileDialog::on_row_spinbutton_changed() /** * changed value in # of rows spinbox. */ -void TileDialog::on_col_spinbutton_changed() +void GridArrangeTab::on_col_spinbutton_changed() { // quit if run by the attr_changed listener if (updating) { @@ -401,7 +429,7 @@ void TileDialog::on_col_spinbutton_changed() // in turn, prevent listener from responding updating = true; - SPDesktop *desktop = getDesktop(); + SPDesktop *desktop = Parent->getDesktop(); Inkscape::Selection *selection = desktop ? desktop->selection : 0; g_return_if_fail(selection); @@ -419,7 +447,7 @@ void TileDialog::on_col_spinbutton_changed() /** * changed value in x padding spinbox. */ -void TileDialog::on_xpad_spinbutton_changed() +void GridArrangeTab::on_xpad_spinbutton_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble("/dialogs/gridtiler/XPad", XPadding.getValue("px")); @@ -429,7 +457,7 @@ void TileDialog::on_xpad_spinbutton_changed() /** * changed value in y padding spinbox. */ -void TileDialog::on_ypad_spinbutton_changed() +void GridArrangeTab::on_ypad_spinbutton_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble("/dialogs/gridtiler/YPad", YPadding.getValue("px")); @@ -439,7 +467,7 @@ void TileDialog::on_ypad_spinbutton_changed() /** * checked/unchecked autosize Rows button. */ -void TileDialog::on_RowSize_checkbutton_changed() +void GridArrangeTab::on_RowSize_checkbutton_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (RowHeightButton.get_active()) { @@ -453,7 +481,7 @@ void TileDialog::on_RowSize_checkbutton_changed() /** * checked/unchecked autosize Rows button. */ -void TileDialog::on_ColSize_checkbutton_changed() +void GridArrangeTab::on_ColSize_checkbutton_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (ColumnWidthButton.get_active()) { @@ -467,7 +495,7 @@ void TileDialog::on_ColSize_checkbutton_changed() /** * changed value in columns spinbox. */ -void TileDialog::on_rowSize_spinbutton_changed() +void GridArrangeTab::on_rowSize_spinbutton_changed() { // quit if run by the attr_changed listener if (updating) { @@ -485,7 +513,7 @@ void TileDialog::on_rowSize_spinbutton_changed() /** * changed value in rows spinbox. */ -void TileDialog::on_colSize_spinbutton_changed() +void GridArrangeTab::on_colSize_spinbutton_changed() { // quit if run by the attr_changed listener if (updating) { @@ -503,7 +531,7 @@ void TileDialog::on_colSize_spinbutton_changed() /** * changed Radio button in Spacing group. */ -void TileDialog::Spacing_button_changed() +void GridArrangeTab::Spacing_button_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (SpaceManualRadioButton.get_active()) { @@ -519,7 +547,7 @@ void TileDialog::Spacing_button_changed() /** * changed Anchor selection widget. */ -void TileDialog::Align_changed() +void GridArrangeTab::Align_changed() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); VertAlign = AlignmentSelector.getVerticalAlignment(); @@ -531,7 +559,7 @@ void TileDialog::Align_changed() /** * Desktop selection changed */ -void TileDialog::updateSelection() +void GridArrangeTab::updateSelection() { // quit if run by the attr_changed listener if (updating) { @@ -541,7 +569,7 @@ void TileDialog::updateSelection() Inkscape::Preferences *prefs = Inkscape::Preferences::get(); // in turn, prevent listener from responding updating = true; - SPDesktop *desktop = getDesktop(); + SPDesktop *desktop = Parent->getDesktop(); Inkscape::Selection *selection = desktop ? desktop->selection : 0; GSList const *items = selection ? selection->itemList() : 0; @@ -577,7 +605,7 @@ void TileDialog::updateSelection() ## Experimental ##########################*/ -static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, TileDialog *dlg) +static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg) { dlg->updateSelection(); } @@ -589,8 +617,8 @@ static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscap /** * Constructor */ -TileDialog::TileDialog() - : UI::Widget::Panel("", "/dialogs/gridtiler", SP_VERB_SELECTION_GRIDTILE), +GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) + : Parent(parent), XPadding(_("X:"), _("Horizontal spacing between columns."), UNIT_TYPE_LINEAR, "", "object-columns"), YPadding(_("Y:"), _("Vertical spacing between rows."), XPadding, "", "object-rows") { @@ -608,13 +636,13 @@ TileDialog::TileDialog() g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (updateSelectionCallback), this); } - Gtk::Box *contents = _getContents(); + Gtk::Box *contents = this; #define MARGIN 2 //##Set up the panel - SPDesktop *desktop = getDesktop(); + SPDesktop *desktop = Parent->getDesktop(); Inkscape::Selection *selection = desktop ? desktop->selection : 0; g_return_if_fail( selection ); @@ -642,7 +670,7 @@ TileDialog::TileDialog() NoOfRowsSpinner.set_increments(1, 0); NoOfRowsSpinner.set_range(1.0, 10000.0); NoOfRowsSpinner.set_value(PerCol); - NoOfRowsSpinner.signal_changed().connect(sigc::mem_fun(*this, &TileDialog::on_col_spinbutton_changed)); + NoOfRowsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_col_spinbutton_changed)); NoOfRowsSpinner.set_tooltip_text(_("Number of rows")); NoOfRowsBox.pack_start(NoOfRowsSpinner, false, false, MARGIN); gtk_size_group_add_widget(_col1, (GtkWidget *) NoOfRowsBox.gobj()); @@ -659,7 +687,7 @@ TileDialog::TileDialog() NoOfRowsBox.pack_start(RowHeightButton, false, false, MARGIN); RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); - RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::on_RowSize_checkbutton_changed)); + RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_RowSize_checkbutton_changed)); SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); @@ -682,7 +710,7 @@ TileDialog::TileDialog() NoOfColsSpinner.set_increments(1, 0); NoOfColsSpinner.set_range(1.0, 10000.0); NoOfColsSpinner.set_value(PerRow); - NoOfColsSpinner.signal_changed().connect(sigc::mem_fun(*this, &TileDialog::on_row_spinbutton_changed)); + NoOfColsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_row_spinbutton_changed)); NoOfColsSpinner.set_tooltip_text(_("Number of columns")); NoOfColsBox.pack_start(NoOfColsSpinner, false, false, MARGIN); gtk_size_group_add_widget(_col3, (GtkWidget *) NoOfColsBox.gobj()); @@ -698,7 +726,7 @@ TileDialog::TileDialog() NoOfColsBox.pack_start(ColumnWidthButton, false, false, MARGIN); ColumnWidthButton.set_tooltip_text(_("If not set, each column has the width of the widest object in it")); - ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::on_ColSize_checkbutton_changed)); + ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ColSize_checkbutton_changed)); SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); @@ -707,7 +735,7 @@ TileDialog::TileDialog() // Anchor selection widget AlignLabel.set_label("Alignment:"); - AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &TileDialog::Align_changed)); + AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); TileBox.pack_start(AlignLabel, false, false, MARGIN); TileBox.pack_start(AlignmentSelector, true, false, MARGIN); @@ -715,7 +743,7 @@ TileDialog::TileDialog() /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ SpaceByBBoxRadioButton.set_label(_("_Fit into selection box")); SpaceByBBoxRadioButton.set_use_underline (true); - SpaceByBBoxRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::Spacing_button_changed)); + SpaceByBBoxRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); SpacingGroup = SpaceByBBoxRadioButton.get_group(); SpacingVBox.pack_start(SpaceByBBoxRadioButton, false, false, MARGIN); @@ -723,7 +751,7 @@ TileDialog::TileDialog() SpaceManualRadioButton.set_label(_("_Set spacing:")); SpaceManualRadioButton.set_use_underline (true); SpaceManualRadioButton.set_group(SpacingGroup); - SpaceManualRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &TileDialog::Spacing_button_changed)); + SpaceManualRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); SpacingVBox.pack_start(SpaceManualRadioButton, false, false, MARGIN); TileBox.pack_start(SpacingVBox, false, false, MARGIN); @@ -737,7 +765,7 @@ TileDialog::TileDialog() YPadding.setRange(-10000, 10000); double yPad = prefs->getDouble("/dialogs/gridtiler/YPad", 15); YPadding.setValue(yPad, "px"); - YPadding.signal_value_changed().connect(sigc::mem_fun(*this, &TileDialog::on_ypad_spinbutton_changed)); + YPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ypad_spinbutton_changed)); XPadding.setDigits(5); XPadding.setIncrements(0.2, 0); @@ -745,7 +773,7 @@ TileDialog::TileDialog() double xPad = prefs->getDouble("/dialogs/gridtiler/XPad", 15); XPadding.setValue(xPad, "px"); - XPadding.signal_value_changed().connect(sigc::mem_fun(*this, &TileDialog::on_xpad_spinbutton_changed)); + XPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_xpad_spinbutton_changed)); } TileBox.pack_start(XPadding, false, false, MARGIN); TileBox.pack_start(YPadding, false, false, MARGIN); @@ -763,10 +791,10 @@ TileDialog::TileDialog() XPadding.set_sensitive (ManualSpacing); YPadding.set_sensitive (ManualSpacing); - //## The OK button - TileOkButton = addResponseButton(C_("Rows and columns dialog","_Arrange"), GTK_RESPONSE_APPLY); + //## The OK button FIXME + /*TileOkButton = addResponseButton(C_("Rows and columns dialog","_Arrange"), GTK_RESPONSE_APPLY); TileOkButton->set_use_underline(true); - TileOkButton->set_tooltip_text(_("Arrange selected objects")); + TileOkButton->set_tooltip_text(_("Arrange selected objects"));*/ show_all_children(); } diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index b3bf390b6..657841ad0 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -33,19 +33,58 @@ namespace Inkscape { namespace UI { namespace Dialog { +/** + * This interface should be implemented by each arrange mode. + * The class is a Gtk::VBox and will be displayed as a tab in + * the dialog + */ +class ArrangeTab : public Gtk::VBox +{ +public: + ArrangeTab() {}; + virtual ~ArrangeTab() {}; + + /** + * Do the actual work! + */ + virtual void arrange() = 0; +}; + +class GridArrangeTab; + +class ArrangeDialog : public UI::Widget::Panel { +private: + Gtk::VBox _arrangeBox; + Gtk::Notebook _notebook; + + GridArrangeTab *_gridArrangeTab; + + Gtk::Button *_arrangeButton; + +public: + ArrangeDialog(); + virtual ~ArrangeDialog() {}; + + /** + * Callback from Apply + */ + virtual void _apply(); + + static ArrangeDialog& getInstance() { return *new ArrangeDialog(); } +}; /** * Dialog for tiling an object */ -class TileDialog : public UI::Widget::Panel { +class GridArrangeTab : public ArrangeTab { public: - TileDialog() ; - virtual ~TileDialog() {}; + GridArrangeTab(ArrangeDialog *parent); + virtual ~GridArrangeTab() {}; /** * Do the actual work */ - void Grid_Arrange(); + virtual void arrange(); /** * Respond to selection change @@ -69,17 +108,16 @@ public: void Spacing_button_changed(); void Align_changed(); - static TileDialog& getInstance() { return *new TileDialog(); } private: - TileDialog(TileDialog const &d); // no copy - void operator=(TileDialog const &d); // no assign + GridArrangeTab(GridArrangeTab const &d); // no copy + void operator=(GridArrangeTab const &d); // no assign + + ArrangeDialog *Parent; bool userHidden; bool updating; - Gtk::Notebook notebook; - Gtk::VBox TileBox; Gtk::Button *TileOkButton; Gtk::Button *TileCancelButton; -- cgit v1.2.3 From 13a67ac44b1120308c2fc607715ddf0cf3d516e9 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Mon, 2 Apr 2012 12:08:22 +0200 Subject: Anchor widget now reads the last alignment from the settings. Anchor selection widget is also smaller now. (bzr r11073.1.10) --- src/ui/dialog/dialog-manager.cpp | 2 +- src/ui/dialog/tile.cpp | 4 ++++ src/ui/widget/anchor-selector.cpp | 11 ++++++++++- src/ui/widget/anchor-selector.h | 2 ++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/ui/dialog/dialog-manager.cpp b/src/ui/dialog/dialog-manager.cpp index 746cfc1b4..528ddf5b3 100644 --- a/src/ui/dialog/dialog-manager.cpp +++ b/src/ui/dialog/dialog-manager.cpp @@ -121,7 +121,7 @@ DialogManager::DialogManager() { registerFactory("SvgFontsDialog", &create); #endif registerFactory("Swatches", &create); - registerFactory("TileDialog", &create); + registerFactory("TileDialog", &create); registerFactory("Trace", &create); registerFactory("Transformation", &create); registerFactory("UndoHistory", &create); diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 9297b5154..ab3781630 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -732,9 +732,13 @@ GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) TileBox.pack_start(SpinsHBox, false, false, MARGIN); + VertAlign = prefs->getInt("/dialogs/gridtiler/VertAlign", 1); + HorizAlign = prefs->getInt("/dialogs/gridtiler/HorizAlign", 1); // Anchor selection widget AlignLabel.set_label("Alignment:"); + AlignLabel.set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER); + AlignmentSelector.setAlignment(HorizAlign, VertAlign); AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); TileBox.pack_start(AlignLabel, false, false, MARGIN); TileBox.pack_start(AlignmentSelector, true, false, MARGIN); diff --git a/src/ui/widget/anchor-selector.cpp b/src/ui/widget/anchor-selector.cpp index aa173e0a0..49387fc34 100644 --- a/src/ui/widget/anchor-selector.cpp +++ b/src/ui/widget/anchor-selector.cpp @@ -13,7 +13,7 @@ #include "ui/widget/anchor-selector.h" void AnchorSelector::setupButton(const Glib::ustring& icon, Gtk::ToggleButton& button) { - Gtk::Widget* buttonIcon = Gtk::manage(sp_icon_get_icon(icon, Inkscape::ICON_SIZE_LARGE_TOOLBAR)); + Gtk::Widget* buttonIcon = Gtk::manage(sp_icon_get_icon(icon, Inkscape::ICON_SIZE_SMALL_TOOLBAR)); buttonIcon->show(); button.set_relief(Gtk::RELIEF_NONE); @@ -67,3 +67,12 @@ void AnchorSelector::btn_activated(int index) _selectionChanged.emit(); } } + +void AnchorSelector::setAlignment(int horizontal, int vertical) +{ + int index = 3 * vertical + horizontal; + if(index >= 0 && index < 9) + { + _buttons[index].set_active(!_buttons[index].get_active()); + } +} diff --git a/src/ui/widget/anchor-selector.h b/src/ui/widget/anchor-selector.h index ad20bf063..361528d11 100644 --- a/src/ui/widget/anchor-selector.h +++ b/src/ui/widget/anchor-selector.h @@ -31,6 +31,8 @@ public: sigc::signal &on_selectionChanged() { return _selectionChanged; } + void setAlignment(int horizontal, int vertical); + AnchorSelector(); virtual ~AnchorSelector(); }; -- cgit v1.2.3 From 591b007232d0806995bc24c7dd93babdec283834 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Wed, 4 Apr 2012 08:42:22 +0200 Subject: Changed enum used for alignment, which hopefully will fix daily deb builds. (bzr r11073.1.11) --- src/ui/dialog/tile.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index ab3781630..2e5e3f822 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -737,7 +737,7 @@ GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) // Anchor selection widget AlignLabel.set_label("Alignment:"); - AlignLabel.set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER); + AlignLabel.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); AlignmentSelector.setAlignment(HorizAlign, VertAlign); AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); TileBox.pack_start(AlignLabel, false, false, MARGIN); -- cgit v1.2.3 From e3102d923b09da811953f791fdaa1d0a01e13032 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Wed, 4 Apr 2012 11:08:28 +0200 Subject: Changed makefile (bzr r11073.1.12) --- src/ui/widget/Makefile_insert | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ui/widget/Makefile_insert b/src/ui/widget/Makefile_insert index 4dc83a81d..718d95979 100644 --- a/src/ui/widget/Makefile_insert +++ b/src/ui/widget/Makefile_insert @@ -1,6 +1,8 @@ ## Makefile.am fragment sourced by src/Makefile.am. ink_common_sources += \ + ui/widget/anchor-selector.h \ + ui/widget/anchor-selector.cpp \ ui/widget/attr-widget.h \ ui/widget/button.h \ ui/widget/button.cpp \ -- cgit v1.2.3 From d35a809b15aa11aa5ee3c0a035710683e8c76eaa Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Mon, 9 Apr 2012 22:12:58 +0200 Subject: Added initial gui for polar arrangement tab (bzr r11073.1.13) --- src/ui/dialog/tile.cpp | 53 ++++++++++++++++++++++++++++++++++++++++-------- src/ui/dialog/tile.h | 55 +++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 91 insertions(+), 17 deletions(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 2e5e3f822..0e3b24f7c 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -111,11 +111,13 @@ namespace Dialog { ArrangeDialog::ArrangeDialog() : UI::Widget::Panel("", "/dialogs/gridtiler", SP_VERB_SELECTION_GRIDTILE), - _gridArrangeTab(new GridArrangeTab(this)) + _gridArrangeTab(new GridArrangeTab(this)), + _polarArrangeTab(new PolarArrangeTab(this)) { Gtk::Box *contents = this->_getContents(); _notebook.append_page(*_gridArrangeTab, C_("Arrange dialog", "Rectangular grid")); + _notebook.append_page(*_polarArrangeTab, C_("Arrange dialog", "Polar Coordinates")); _arrangeBox.pack_start(_notebook); _arrangeButton = this->addResponseButton(C_("Arrange dialog","_Arrange"), GTK_RESPONSE_APPLY); @@ -133,9 +135,51 @@ void ArrangeDialog::_apply() case 0: _gridArrangeTab->arrange(); break; + case 1: + _polarArrangeTab->arrange(); + break; } } +PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) + : parent(parent_) +{ + anchorPointLabel.set_text("Anchor point:"); + anchorPointLabel.set_alignment(Gtk::ALIGN_START); + pack_start(anchorPointLabel, false, false); + + anchorBoundingBoxRadio.set_label("Object's bounding box:"); + anchorBoundingBoxRadio.set_group(anchorRadioGroup); + pack_start(anchorBoundingBoxRadio, false, false); + + pack_start(anchorSelector, false, false); + + anchorObjectPivotRadio.set_label("Object's rotational center"); + anchorObjectPivotRadio.set_group(anchorRadioGroup); + pack_start(anchorObjectPivotRadio, false, false); + + arrangeOnLabel.set_text("Arrange on:"); + arrangeOnLabel.set_alignment(Gtk::ALIGN_START); + pack_start(arrangeOnLabel, false, false); + + arrangeOnCircleRadio.set_label("Last selected circle/ellipse/arc"); + anchorObjectPivotRadio.set_group(arrangeRadioGroup); + pack_start(arrangeOnCircleRadio, false, false); + + arrangeOnParametersRadio.set_label("Parameterized:"); + anchorObjectPivotRadio.set_group(arrangeRadioGroup); + pack_start(arrangeOnParametersRadio, false, false); +} + +void PolarArrangeTab::arrange() +{ + std::cout << "PolarArrangeTab::arrange()" << std::endl; +} + +void PolarArrangeTab::updateSelection() +{ + +} //######################################################################### @@ -383,13 +427,6 @@ g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_h //## E V E N T S //######################################################################### - -void GridArrangeTab::_apply() -{ - arrange(); -} - - /** * changed value in # of columns spinbox. */ diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index 657841ad0..ab075fb28 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -51,15 +51,17 @@ public: }; class GridArrangeTab; +class PolarArrangeTab; class ArrangeDialog : public UI::Widget::Panel { private: - Gtk::VBox _arrangeBox; - Gtk::Notebook _notebook; + Gtk::VBox _arrangeBox; + Gtk::Notebook _notebook; - GridArrangeTab *_gridArrangeTab; + GridArrangeTab *_gridArrangeTab; + PolarArrangeTab *_polarArrangeTab; - Gtk::Button *_arrangeButton; + Gtk::Button *_arrangeButton; public: ArrangeDialog(); @@ -91,11 +93,6 @@ public: */ void updateSelection(); - /** - * Callback from Apply - */ - virtual void _apply(); - // Callbacks from spinbuttons void on_row_spinbutton_changed(); void on_col_spinbutton_changed(); @@ -176,6 +173,46 @@ private: Inkscape::UI::Widget::SpinButton ColumnWidthSpinner; }; +class PolarArrangeTab : public ArrangeTab { +public: + PolarArrangeTab(ArrangeDialog *parent_); + virtual ~PolarArrangeTab() {}; + + /** + * Do the actual work + */ + virtual void arrange(); + + /** + * Respond to selection change + */ + void updateSelection(); + +private: + PolarArrangeTab(PolarArrangeTab const &d); // no copy + void operator=(PolarArrangeTab const &d); // no assign + + ArrangeDialog *parent; + + Gtk::Label anchorPointLabel; + + Gtk::RadioButtonGroup anchorRadioGroup; + Gtk::RadioButton anchorBoundingBoxRadio; + Gtk::RadioButton anchorObjectPivotRadio; + AnchorSelector anchorSelector; + + Gtk::Label arrangeOnLabel; + + Gtk::RadioButtonGroup arrangeRadioGroup; + Gtk::RadioButton arrangeOnCircleRadio; + Gtk::RadioButton arrangeOnParametersRadio; + + Inkscape::UI::Widget::SpinButton centerXSpin; + Inkscape::UI::Widget::SpinButton centerYSpin; + + +}; + } //namespace Dialog } //namespace UI -- cgit v1.2.3 From ffef031f0c930b63abe89386ad7edfcff0469029 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sun, 15 Apr 2012 14:27:18 +0200 Subject: Improved User interface. Added controls for Center, Radius and Angles. Note that none of them actually do something yet (bzr r11073.1.14) --- src/ui/dialog/tile.cpp | 31 +++++++++++++++++++++++++++---- src/ui/dialog/tile.h | 15 +++++++++++++-- 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 0e3b24f7c..dd49ac9eb 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -142,14 +142,21 @@ void ArrangeDialog::_apply() } PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) - : parent(parent_) + : parent(parent_), + parametersTable(3, 3, false), + centerY("", "Y coordinate of the center", UNIT_TYPE_LINEAR), + centerX("", "X coordinate of the center", centerY), + radiusY("", "Y coordinate of the radius", UNIT_TYPE_LINEAR), + radiusX("", "X coordinate of the radius", radiusY), + angleY("", "Starting angle", UNIT_TYPE_RADIAL), + angleX("", "End angle", angleY) { anchorPointLabel.set_text("Anchor point:"); anchorPointLabel.set_alignment(Gtk::ALIGN_START); pack_start(anchorPointLabel, false, false); anchorBoundingBoxRadio.set_label("Object's bounding box:"); - anchorBoundingBoxRadio.set_group(anchorRadioGroup); + anchorRadioGroup = anchorBoundingBoxRadio.get_group(); pack_start(anchorBoundingBoxRadio, false, false); pack_start(anchorSelector, false, false); @@ -163,12 +170,28 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) pack_start(arrangeOnLabel, false, false); arrangeOnCircleRadio.set_label("Last selected circle/ellipse/arc"); - anchorObjectPivotRadio.set_group(arrangeRadioGroup); + arrangeRadioGroup = arrangeOnCircleRadio.get_group(); pack_start(arrangeOnCircleRadio, false, false); arrangeOnParametersRadio.set_label("Parameterized:"); - anchorObjectPivotRadio.set_group(arrangeRadioGroup); + arrangeOnParametersRadio.set_group(arrangeRadioGroup); pack_start(arrangeOnParametersRadio, false, false); + + centerLabel.set_text("Center X/Y:"); + parametersTable.attach(centerLabel, 0, 1, 0, 1); + parametersTable.attach(centerX, 1, 2, 0, 1, Gtk::EXPAND); + parametersTable.attach(centerY, 2, 3, 0, 1, Gtk::EXPAND); + + radiusLabel.set_text("Radius X/Y:"); + parametersTable.attach(radiusLabel, 0, 1, 1, 2); + parametersTable.attach(radiusX, 1, 2, 1, 2, Gtk::EXPAND); + parametersTable.attach(radiusY, 2, 3, 1, 2, Gtk::EXPAND); + + angleLabel.set_text("Center X/Y:"); + parametersTable.attach(angleLabel, 0, 1, 2, 3); + parametersTable.attach(angleX, 1, 2, 2, 3, Gtk::EXPAND); + parametersTable.attach(angleY, 2, 3, 2, 3, Gtk::EXPAND); + pack_start(parametersTable, false, false); } void PolarArrangeTab::arrange() diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index ab075fb28..40352f90d 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -207,8 +207,19 @@ private: Gtk::RadioButton arrangeOnCircleRadio; Gtk::RadioButton arrangeOnParametersRadio; - Inkscape::UI::Widget::SpinButton centerXSpin; - Inkscape::UI::Widget::SpinButton centerYSpin; + Gtk::Table parametersTable; + + Gtk::Label centerLabel; + Inkscape::UI::Widget::ScalarUnit centerY; + Inkscape::UI::Widget::ScalarUnit centerX; + + Gtk::Label radiusLabel; + Inkscape::UI::Widget::ScalarUnit radiusY; + Inkscape::UI::Widget::ScalarUnit radiusX; + + Gtk::Label angleLabel; + Inkscape::UI::Widget::ScalarUnit angleY; + Inkscape::UI::Widget::ScalarUnit angleX; }; -- cgit v1.2.3 From 35b3c61da544c8e771078a015690d4311203bf84 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sun, 15 Apr 2012 22:21:15 +0200 Subject: Added some POC code to move objects around (bzr r11073.1.16) --- src/ui/dialog/tile.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index dd49ac9eb..af2319411 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -197,6 +197,18 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) void PolarArrangeTab::arrange() { std::cout << "PolarArrangeTab::arrange()" << std::endl; + Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); + const GSList *items = selection->itemList(); + int i = 0; + while(items) + { + SPItem *item = SP_ITEM(items->data); + Geom::Point move = Geom::Point(100 * i, -100 * i); + Geom::Affine const affine = Geom::Affine(Geom::Translate(move)); + item->set_i2d_affine(affine); + items = items->next; + ++i; + } } void PolarArrangeTab::updateSelection() -- cgit v1.2.3 From 88a55277617ed0a8ded158fb212669e45f19ff1c Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Mon, 16 Apr 2012 15:27:44 +0200 Subject: Edited include order (putting gtkmm in first place) in the hope that it will fix the compilation issues on launchpad. (bzr r11073.1.17) --- src/ui/widget/anchor-selector.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/widget/anchor-selector.cpp b/src/ui/widget/anchor-selector.cpp index 49387fc34..87f50cf5f 100644 --- a/src/ui/widget/anchor-selector.cpp +++ b/src/ui/widget/anchor-selector.cpp @@ -7,10 +7,10 @@ * Released under GNU GPL. Read the file 'COPYING' for more information. */ +#include "ui/widget/anchor-selector.h" #include #include "widgets/icon.h" #include "ui/icon-names.h" -#include "ui/widget/anchor-selector.h" void AnchorSelector::setupButton(const Glib::ustring& icon, Gtk::ToggleButton& button) { Gtk::Widget* buttonIcon = Gtk::manage(sp_icon_get_icon(icon, Inkscape::ICON_SIZE_SMALL_TOOLBAR)); -- cgit v1.2.3 From 610dc4491aefb2afc144cad45893bf5435168648 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Thu, 19 Apr 2012 16:12:26 +0200 Subject: Improved UI of PolarArrangement Tab and connected some widgets to events (now parts of the GUI disable themselves when needed) (bzr r11073.1.18) --- src/ui/dialog/tile.cpp | 78 ++++++++++++++++++++++++++++++++++++++++++++++---- src/ui/dialog/tile.h | 5 ++++ 2 files changed, 77 insertions(+), 6 deletions(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index af2319411..9e2ba71c4 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -157,12 +157,14 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) anchorBoundingBoxRadio.set_label("Object's bounding box:"); anchorRadioGroup = anchorBoundingBoxRadio.get_group(); + anchorBoundingBoxRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); pack_start(anchorBoundingBoxRadio, false, false); pack_start(anchorSelector, false, false); anchorObjectPivotRadio.set_label("Object's rotational center"); anchorObjectPivotRadio.set_group(anchorRadioGroup); + anchorObjectPivotRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); pack_start(anchorObjectPivotRadio, false, false); arrangeOnLabel.set_text("Arrange on:"); @@ -171,27 +173,71 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) arrangeOnCircleRadio.set_label("Last selected circle/ellipse/arc"); arrangeRadioGroup = arrangeOnCircleRadio.get_group(); + arrangeOnCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); pack_start(arrangeOnCircleRadio, false, false); arrangeOnParametersRadio.set_label("Parameterized:"); arrangeOnParametersRadio.set_group(arrangeRadioGroup); + arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); pack_start(arrangeOnParametersRadio, false, false); + //FIXME: Objects in grid do not line up properly! centerLabel.set_text("Center X/Y:"); parametersTable.attach(centerLabel, 0, 1, 0, 1); - parametersTable.attach(centerX, 1, 2, 0, 1, Gtk::EXPAND); - parametersTable.attach(centerY, 2, 3, 0, 1, Gtk::EXPAND); + centerX.setDigits(2); + centerX.set_size_request(60, -1); + centerX.setIncrements(0.2, 0); + centerX.setRange(-10000, 10000); + centerX.setValue(0, "px"); + centerY.setDigits(2); + centerY.set_size_request(120, -1); + centerY.setIncrements(0.2, 0); + centerY.setRange(-10000, 10000); + centerY.setValue(0, "px"); + parametersTable.attach(centerX, 1, 2, 0, 1); + parametersTable.attach(centerY, 2, 3, 0, 1); radiusLabel.set_text("Radius X/Y:"); parametersTable.attach(radiusLabel, 0, 1, 1, 2); - parametersTable.attach(radiusX, 1, 2, 1, 2, Gtk::EXPAND); - parametersTable.attach(radiusY, 2, 3, 1, 2, Gtk::EXPAND); + radiusX.setDigits(2); + radiusX.set_size_request(60, -1); + radiusX.setIncrements(0.2, 0); + radiusX.setRange(-10000, 10000); + radiusX.setValue(0, "px"); + radiusY.setDigits(2); + radiusY.set_size_request(120, -1); + radiusY.setIncrements(0.2, 0); + radiusY.setRange(-10000, 10000); + radiusY.setValue(0, "px"); + parametersTable.attach(radiusX, 1, 2, 1, 2); + parametersTable.attach(radiusY, 2, 3, 1, 2); angleLabel.set_text("Center X/Y:"); parametersTable.attach(angleLabel, 0, 1, 2, 3); - parametersTable.attach(angleX, 1, 2, 2, 3, Gtk::EXPAND); - parametersTable.attach(angleY, 2, 3, 2, 3, Gtk::EXPAND); + angleX.setDigits(2); + angleX.set_size_request(60, -1); + angleX.setIncrements(0.2, 0); + angleX.setRange(-10000, 10000); + angleX.setValue(0, "°"); + angleY.setDigits(2); + angleY.set_size_request(120, -1); + angleY.setIncrements(0.2, 0); + angleY.setRange(-10000, 10000); + angleY.setValue(0, "°"); + parametersTable.attach(angleX, 1, 2, 2, 3); + parametersTable.attach(angleY, 2, 3, 2, 3); pack_start(parametersTable, false, false); + + rotateObjectsCheckBox.set_label("Rotate objects"); + rotateObjectsCheckBox.set_active(true); + pack_start(rotateObjectsCheckBox, false, false); + + centerX.set_sensitive(false); + centerY.set_sensitive(false); + angleX.set_sensitive(false); + angleY.set_sensitive(false); + radiusX.set_sensitive(false); + radiusY.set_sensitive(false); } void PolarArrangeTab::arrange() @@ -213,7 +259,27 @@ void PolarArrangeTab::arrange() void PolarArrangeTab::updateSelection() { +} + +void PolarArrangeTab::on_arrange_radio_changed() +{ + bool arrangeParametric = !arrangeOnCircleRadio.get_active(); + + centerX.set_sensitive(arrangeParametric); + centerY.set_sensitive(arrangeParametric); + + angleX.set_sensitive(arrangeParametric); + angleY.set_sensitive(arrangeParametric); + + radiusX.set_sensitive(arrangeParametric); + radiusY.set_sensitive(arrangeParametric); +} + +void PolarArrangeTab::on_anchor_radio_changed() +{ + bool anchorBoundingBox = anchorBoundingBoxRadio.get_active(); + anchorSelector.set_sensitive(anchorBoundingBox); } diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index 40352f90d..b09416d04 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -188,6 +188,9 @@ public: */ void updateSelection(); + void on_anchor_radio_changed(); + void on_arrange_radio_changed(); + private: PolarArrangeTab(PolarArrangeTab const &d); // no copy void operator=(PolarArrangeTab const &d); // no assign @@ -221,6 +224,8 @@ private: Inkscape::UI::Widget::ScalarUnit angleY; Inkscape::UI::Widget::ScalarUnit angleX; + Gtk::CheckButton rotateObjectsCheckBox; + }; -- cgit v1.2.3 From 64d1318049350136ae837f74c56bc5ad9a3c363c Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Tue, 24 Apr 2012 22:24:04 +0200 Subject: Added first support for elliptical arrangements (bzr r11073.1.19) --- src/ui/dialog/tile.cpp | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 9e2ba71c4..d4c597b84 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -34,6 +34,7 @@ #include "sp-item.h" #include "widgets/icon.h" #include "desktop.h" +#include "sp-item-transform.h" /* * Sort items by their x co-ordinates, taking account of y (keeps rows intact) @@ -249,9 +250,29 @@ void PolarArrangeTab::arrange() while(items) { SPItem *item = SP_ITEM(items->data); - Geom::Point move = Geom::Point(100 * i, -100 * i); - Geom::Affine const affine = Geom::Affine(Geom::Translate(move)); - item->set_i2d_affine(affine); + + float centerx = 1000; + float centery = 2000; + + float radiusx = 1000; + float radiusy = 2000; + + float objectx = - item->documentVisualBounds()->min()[Geom::X]; + float objecty = item->documentVisualBounds()->min()[Geom::Y]; + + float angle = M_PI / 36 * i; + + float r = (radiusx * radiusy) / + sqrtf(powf(radiusy * cos(angle), 2) + powf(radiusx * sin(angle), 2)); + float calcx = cos(angle) * r; + float calcy = sin(angle) * r; + + sp_item_move_rel(item, Geom::Translate(objectx + calcx, objecty + calcy)); + sp_item_rotate_rel(item, Geom::Rotate(angle)); + + //item->set_i2d_affine(item->i2dt_affine() * toOrigin * rotation); + //item->doWriteTransform(item->getRepr(), item->transform, NULL); + items = items->next; ++i; } -- cgit v1.2.3 From 3b4367f104ffcb7e07664dc711b8a879d1122dec Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Fri, 27 Apr 2012 23:43:11 +0200 Subject: Code Refactoreing. Moved parts of the code from tile.cpp tile.h to arrangetab.h, gridarrangetab(.cpp|.h), polararrangetab(.cpp|.h) Also modified the name of the verb used by the "Rows and Columns" dialog to SP_VERB_SELECTION_ARRANGE (bzr r11073.1.21) --- src/desktop.cpp | 2 +- src/menus-skeleton.h | 2 +- src/ui/CMakeLists.txt | 5 + src/ui/dialog/arrangetab.h | 54 +++ src/ui/dialog/gridarrangetab.cpp | 786 ++++++++++++++++++++++++++++++++ src/ui/dialog/gridarrangetab.h | 147 ++++++ src/ui/dialog/polararrangetab.cpp | 206 +++++++++ src/ui/dialog/polararrangetab.h | 86 ++++ src/ui/dialog/tile.cpp | 914 +------------------------------------- src/ui/dialog/tile.h | 177 +------- src/verbs.cpp | 8 +- src/verbs.h | 2 +- 12 files changed, 1298 insertions(+), 1091 deletions(-) create mode 100644 src/ui/dialog/arrangetab.h create mode 100644 src/ui/dialog/gridarrangetab.cpp create mode 100644 src/ui/dialog/gridarrangetab.h create mode 100644 src/ui/dialog/polararrangetab.cpp create mode 100644 src/ui/dialog/polararrangetab.h diff --git a/src/desktop.cpp b/src/desktop.cpp index 7aabb1245..f7a060670 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -1827,7 +1827,7 @@ SPDesktop::show_dialogs() mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_SVG_FONTS, "/dialogs/svgfonts") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_INPUT, "/dialogs/inputdevices") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_DISPLAY, "/dialogs/preferences") ); - mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_GRIDTILE, "/dialogs/gridtiler") ); + mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_ARRANGE, "/dialogs/gridtiler") ); //FIXME: denis: change also preferences? mapVerbPreference.insert(std::make_pair ((int)SP_VERB_SELECTION_TRACE, "/dialogs/trace") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_TEXT, "/dialogs/textandfont") ); mapVerbPreference.insert(std::make_pair ((int)SP_VERB_DIALOG_EXPORT, "/dialogs/export") ); diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h index 84ecc83ea..459b3d378 100644 --- a/src/menus-skeleton.h +++ b/src/menus-skeleton.h @@ -210,7 +210,7 @@ static char const menus_skeleton[] = " \n" " \n" " \n" -" \n" +" \n" " \n" " \n" " \n" diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 2c6a68569..b244b7349 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -42,6 +42,7 @@ set(ui_SRC dialog/find.cpp dialog/floating-behavior.cpp dialog/glyphs.cpp + dialog/gridarrangetab.cpp dialog/guides.cpp dialog/icon-preview.cpp dialog/inkscape-preferences.cpp @@ -55,6 +56,7 @@ set(ui_SRC dialog/object-attributes.cpp dialog/object-properties.cpp dialog/ocaldialogs.cpp + dialog/polararrangetab.cpp dialog/print-colors-preview-dialog.cpp dialog/print.cpp dialog/scriptdialog.cpp @@ -132,6 +134,7 @@ set(ui_SRC dialog/aboutbox.h dialog/align-and-distribute.h + dialog/arrangetab.h dialog/behavior.h dialog/calligraphic-profile-rename.h dialog/color-item.h @@ -155,6 +158,7 @@ set(ui_SRC dialog/floating-behavior.h dialog/glyphs.h dialog/guides.h + dialog/gridarrangetab.h dialog/icon-preview.h dialog/inkscape-preferences.h dialog/input.h @@ -168,6 +172,7 @@ set(ui_SRC dialog/object-properties.h dialog/ocaldialogs.h dialog/panel-dialog.h + dialog/polararrangetab.h dialog/print-colors-preview-dialog.h dialog/print.h dialog/scriptdialog.h diff --git a/src/ui/dialog/arrangetab.h b/src/ui/dialog/arrangetab.h new file mode 100644 index 000000000..3ffe1ef4c --- /dev/null +++ b/src/ui/dialog/arrangetab.h @@ -0,0 +1,54 @@ +/** + * @brief Arrange tools base class + */ +/* Authors: + * * Declara Denis + * Copyright (C) 2012 Authors + * + * Released under GNU GPL. Read the file 'COPYING' for more information. + */ + +#ifndef INKSCAPE_UI_DIALOG_ARRANGE_TAB_H +#define INKSCAPE_UI_DIALOG_ARRANGE_TAB_H + +#include + +namespace Inkscape { +namespace UI { +namespace Dialog { + +/** + * This interface should be implemented by each arrange mode. + * The class is a Gtk::VBox and will be displayed as a tab in + * the dialog + */ +class ArrangeTab : public Gtk::VBox +{ +public: + ArrangeTab() {}; + virtual ~ArrangeTab() {}; + + /** + * Do the actual work! This method is invoked to actually arrange the + * selection + */ + virtual void arrange() = 0; +}; + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + + +#endif /* INKSCAPE_UI_DIALOG_ARRANGE_TAB_H */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/gridarrangetab.cpp b/src/ui/dialog/gridarrangetab.cpp new file mode 100644 index 000000000..fca7c5b0e --- /dev/null +++ b/src/ui/dialog/gridarrangetab.cpp @@ -0,0 +1,786 @@ +/* + * A simple dialog for creating grid type arrangements of selected objects + * + * Authors: + * Bob Jamison ( based off trace dialog) + * John Cliff + * Other dudes from The Inkscape Organization + * Abhishek Sharma + * Declara Denis + * + * Copyright (C) 2004 Bob Jamison + * Copyright (C) 2004 John Cliff + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ +//#define DEBUG_GRID_ARRANGE 1 + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "ui/dialog/gridarrangetab.h" +#include //for GTK_RESPONSE* types +#include +#include +#include <2geom/transforms.h> + +#include "verbs.h" +#include "preferences.h" +#include "inkscape.h" +#include "desktop-handles.h" +#include "selection.h" +#include "document.h" +#include "document-undo.h" +#include "sp-item.h" +#include "widgets/icon.h" +#include "desktop.h" +//#include "sp-item-transform.h" FIXME +#include "ui/dialog/tile.h" // for Inkscape::UI::Dialog::ArrangeDialog + +/* + * Sort items by their x co-ordinates, taking account of y (keeps rows intact) + * + * <0 *elem1 goes before *elem2 + * 0 *elem1 == *elem2 + * >0 *elem1 goes after *elem2 + */ +int sp_compare_x_position(SPItem *first, SPItem *second) +{ + using Geom::X; + using Geom::Y; + + Geom::OptRect a = first->documentVisualBounds(); + Geom::OptRect b = second->documentVisualBounds(); + + if ( !a || !b ) { + // FIXME? + return 0; + } + + double const a_height = a->dimensions()[Y]; + double const b_height = b->dimensions()[Y]; + + bool a_in_b_vert = false; + if ((a->min()[Y] < b->min()[Y] + 0.1) && (a->min()[Y] > b->min()[Y] - b_height)) { + a_in_b_vert = true; + } else if ((b->min()[Y] < a->min()[Y] + 0.1) && (b->min()[Y] > a->min()[Y] - a_height)) { + a_in_b_vert = true; + } else if (b->min()[Y] == a->min()[Y]) { + a_in_b_vert = true; + } else { + a_in_b_vert = false; + } + + if (!a_in_b_vert) { + return -1; + } + if (a_in_b_vert && a->min()[X] > b->min()[X]) { + return 1; + } + if (a_in_b_vert && a->min()[X] < b->min()[X]) { + return -1; + } + return 0; +} + +/* + * Sort items by their y co-ordinates. + */ +int sp_compare_y_position(SPItem *first, SPItem *second) +{ + Geom::OptRect a = first->documentVisualBounds(); + Geom::OptRect b = second->documentVisualBounds(); + + if ( !a || !b ) { + // FIXME? + return 0; + } + + if (a->min()[Geom::Y] > b->min()[Geom::Y]) { + return 1; + } + if (a->min()[Geom::Y] < b->min()[Geom::Y]) { + return -1; + } + + return 0; +} + +namespace Inkscape { +namespace UI { +namespace Dialog { + + +//######################################################################### +//## E V E N T S +//######################################################################### + +/* + * + * This arranges the selection in a grid pattern. + * + */ + +void GridArrangeTab::arrange() +{ + + int cnt,row_cnt,col_cnt,a,row,col; + double grid_left,grid_top,col_width,row_height,paddingx,paddingy,width, height, new_x, new_y,cx,cy; + double total_col_width,total_row_height; + col_width = 0; + row_height = 0; + total_col_width=0; + total_row_height=0; + + // check for correct numbers in the row- and col-spinners + on_col_spinbutton_changed(); + on_row_spinbutton_changed(); + + // set padding to manual values + paddingx = XPadding.getValue("px"); + paddingy = YPadding.getValue("px"); + + std::vector row_heights; + std::vector col_widths; + std::vector row_ys; + std::vector col_xs; + + int NoOfCols = NoOfColsSpinner.get_value_as_int(); + int NoOfRows = NoOfRowsSpinner.get_value_as_int(); + + width = 0; + for (a=0;agetDesktop(); + sp_desktop_document(desktop)->ensureUpToDate(); + + Inkscape::Selection *selection = sp_desktop_selection (desktop); + const GSList *items = selection ? selection->itemList() : 0; + cnt=0; + for (; items != NULL; items = items->next) { + SPItem *item = SP_ITEM(items->data); + Geom::OptRect b = item->documentVisualBounds(); + if (!b) { + continue; + } + + width = b->dimensions()[Geom::X]; + height = b->dimensions()[Geom::Y]; + + cx = b->midpoint()[Geom::X]; + cy = b->midpoint()[Geom::Y]; + + if (b->min()[Geom::X] < grid_left) { + grid_left = b->min()[Geom::X]; + } + if (b->min()[Geom::Y] < grid_top) { + grid_top = b->min()[Geom::Y]; + } + if (width > col_width) { + col_width = width; + } + if (height > row_height) { + row_height = height; + } + } + + + // 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((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); + + + // 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); + Geom::OptRect b = item->documentVisualBounds(); + if (b) { + width = b->dimensions()[Geom::X]; + height = b->dimensions()[Geom::Y]; + if (width > col_widths[(cnt % NoOfCols)]) { + col_widths[(cnt % NoOfCols)] = width; + } + if (height > row_heights[(cnt / NoOfCols)]) { + row_heights[(cnt / NoOfCols)] = height; + } + } + + cnt++; + } + + + /// Make sure the top and left of the grid dont move by compensating for align values. + if (RowHeightButton.get_active()){ + grid_top = grid_top - (((row_height - row_heights[0]) / 2)*(VertAlign)); + } + if (ColumnWidthButton.get_active()){ + grid_left = grid_left - (((col_width - col_widths[0]) /2)*(HorizAlign)); + } + + #ifdef DEBUG_GRID_ARRANGE + g_print("\n cx = %f cy= %f gridleft=%f",cx,cy,grid_left); + #endif + + // Calculate total widths and heights, allowing for columns and rows non uniformly sized. + + if (ColumnWidthButton.get_active()){ + total_col_width = col_width * NoOfCols; + col_widths.clear(); + for (a=0;avisualBounds(); + // Fit to bbox, calculate padding between rows accordingly. + if ( sel_bbox && !SpaceManualRadioButton.get_active() ){ +#ifdef DEBUG_GRID_ARRANGE +g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_height,total_col_width, b.extent(Geom::X), b.extent(Geom::Y)); +#endif + paddingx = (sel_bbox->width() - total_col_width) / (NoOfCols -1); + paddingy = (sel_bbox->height() - total_row_height) / (NoOfRows -1); + } + +/* + Horizontal align - Left = 0 + Centre = 1 + Right = 2 + + Vertical align - Top = 0 + Middle = 1 + Bottom = 2 + + X position is calculated by taking the grids left co-ord, adding the distance to the column, + then adding 1/2 the spacing multiplied by the align variable above, + Y position likewise, takes the top of the grid, adds the y to the current row then adds the padding in to align it. + +*/ + + // Calculate row and column x and y coords required to allow for columns and rows which are non uniformly sized. + + for (a=0;adata); + sorted = sorted->next; + } + + for (; current_row != NULL; current_row = current_row->next) { + SPItem *item=SP_ITEM(current_row->data); + Inkscape::XML::Node *repr = item->getRepr(); + Geom::OptRect b = item->documentVisualBounds(); + Geom::Point min; + if (b) { + width = b->dimensions()[Geom::X]; + height = b->dimensions()[Geom::Y]; + min = b->min(); + } else { + width = height = 0; + min = Geom::Point(0, 0); + } + + row = cnt / NoOfCols; + col = cnt % NoOfCols; + + new_x = grid_left + (((col_widths[col] - width)/2)*HorizAlign) + col_xs[col]; + new_y = grid_top + (((row_heights[row] - height)/2)*VertAlign) + row_ys[row]; + + // signs are inverted between x and y due to y inversion + Geom::Point move = Geom::Point(new_x - min[Geom::X], min[Geom::Y] - new_y); + Geom::Affine const affine = Geom::Affine(Geom::Translate(move)); + item->set_i2d_affine(item->i2dt_affine() * affine); + item->doWriteTransform(repr, item->transform, NULL); + SP_OBJECT (current_row->data)->updateRepr(); + cnt +=1; + } + g_slist_free (current_row); + } + + DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_ARRANGE, + _("Arrange in a grid")); + +} + + +//######################################################################### +//## E V E N T S +//######################################################################### + +/** + * changed value in # of columns spinbox. + */ +void GridArrangeTab::on_row_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + SPDesktop *desktop = Parent->getDesktop(); + + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + g_return_if_fail( selection ); + + GSList const *items = selection->itemList(); + int selcount = g_slist_length((GSList *)items); + + double PerCol = ceil(selcount / NoOfColsSpinner.get_value()); + NoOfRowsSpinner.set_value(PerCol); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/NoOfCols", NoOfColsSpinner.get_value()); + updating=false; +} + +/** + * changed value in # of rows spinbox. + */ +void GridArrangeTab::on_col_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + SPDesktop *desktop = Parent->getDesktop(); + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + g_return_if_fail(selection); + + GSList const *items = selection->itemList(); + int selcount = g_slist_length((GSList *)items); + + double PerRow = ceil(selcount / NoOfRowsSpinner.get_value()); + NoOfColsSpinner.set_value(PerRow); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/NoOfCols", PerRow); + + updating=false; +} + +/** + * changed value in x padding spinbox. + */ +void GridArrangeTab::on_xpad_spinbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/XPad", XPadding.getValue("px")); + +} + +/** + * changed value in y padding spinbox. + */ +void GridArrangeTab::on_ypad_spinbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/YPad", YPadding.getValue("px")); +} + + +/** + * checked/unchecked autosize Rows button. + */ +void GridArrangeTab::on_RowSize_checkbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (RowHeightButton.get_active()) { + prefs->setDouble("/dialogs/gridtiler/AutoRowSize", 20); + } else { + prefs->setDouble("/dialogs/gridtiler/AutoRowSize", -20); + } + RowHeightBox.set_sensitive ( !RowHeightButton.get_active()); +} + +/** + * checked/unchecked autosize Rows button. + */ +void GridArrangeTab::on_ColSize_checkbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (ColumnWidthButton.get_active()) { + prefs->setDouble("/dialogs/gridtiler/AutoColSize", 20); + } else { + prefs->setDouble("/dialogs/gridtiler/AutoColSize", -20); + } + ColumnWidthBox.set_sensitive ( !ColumnWidthButton.get_active()); +} + +/** + * changed value in columns spinbox. + */ +void GridArrangeTab::on_rowSize_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/RowHeight", RowHeightSpinner.get_value()); + updating=false; + +} + +/** + * changed value in rows spinbox. + */ +void GridArrangeTab::on_colSize_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/ColWidth", ColumnWidthSpinner.get_value()); + updating=false; + +} + +/** + * changed Radio button in Spacing group. + */ +void GridArrangeTab::Spacing_button_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (SpaceManualRadioButton.get_active()) { + prefs->setDouble("/dialogs/gridtiler/SpacingType", 20); + } else { + prefs->setDouble("/dialogs/gridtiler/SpacingType", -20); + } + + XPadding.set_sensitive ( SpaceManualRadioButton.get_active()); + YPadding.set_sensitive ( SpaceManualRadioButton.get_active()); +} + +/** + * changed Anchor selection widget. + */ +void GridArrangeTab::Align_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + VertAlign = AlignmentSelector.getVerticalAlignment(); + prefs->setInt("/dialogs/gridtiler/VertAlign", VertAlign); + HorizAlign = AlignmentSelector.getHorizontalAlignment(); + prefs->setInt("/dialogs/gridtiler/HorizAlign", HorizAlign); +} + +/** + * Desktop selection changed + */ +void GridArrangeTab::updateSelection() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + // in turn, prevent listener from responding + updating = true; + SPDesktop *desktop = Parent->getDesktop(); + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + GSList const *items = selection ? selection->itemList() : 0; + + if (items) { + int selcount = g_slist_length((GSList *)items); + + if (NoOfColsSpinner.get_value() > 1 && NoOfRowsSpinner.get_value() > 1){ + // Update the number of rows assuming number of columns wanted remains same. + double NoOfRows = ceil(selcount / NoOfColsSpinner.get_value()); + NoOfRowsSpinner.set_value(NoOfRows); + + // if the selection has less than the number set for one row, reduce it appropriately + if (selcount < NoOfColsSpinner.get_value()) { + double NoOfCols = ceil(selcount / NoOfRowsSpinner.get_value()); + NoOfColsSpinner.set_value(NoOfCols); + prefs->setInt("/dialogs/gridtiler/NoOfCols", NoOfCols); + } + } else { + double PerRow = ceil(sqrt(selcount)); + double PerCol = ceil(sqrt(selcount)); + NoOfRowsSpinner.set_value(PerRow); + NoOfColsSpinner.set_value(PerCol); + prefs->setInt("/dialogs/gridtiler/NoOfCols", static_cast(PerCol)); + } + } + + updating = false; +} + + + +/*########################## +## Experimental +##########################*/ + +static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg) +{ + dlg->updateSelection(); +} + + +//######################################################################### +//## C O N S T R U C T O R / D E S T R U C T O R +//######################################################################### +/** + * Constructor + */ +GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) + : Parent(parent), + XPadding(_("X:"), _("Horizontal spacing between columns."), UNIT_TYPE_LINEAR, "", "object-columns"), + YPadding(_("Y:"), _("Vertical spacing between rows."), XPadding, "", "object-rows") +{ + // bool used by spin button callbacks to stop loops where they change each other. + updating = false; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + + // could not do this in gtkmm - there's no Gtk::SizeGroup public constructor (!) + GtkSizeGroup *_col1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + GtkSizeGroup *_col2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + GtkSizeGroup *_col3 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + + { + // Selection Change signal + g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (updateSelectionCallback), this); + } + + Gtk::Box *contents = this; + +#define MARGIN 2 + + //##Set up the panel + + SPDesktop *desktop = Parent->getDesktop(); + + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + g_return_if_fail( selection ); + int selcount = 1; + if (!selection->isEmpty()) { + GSList const *items = selection->itemList(); + selcount = g_slist_length((GSList *)items); + } + + + /*#### Number of Rows ####*/ + + double PerRow = ceil(sqrt(selcount)); + double PerCol = ceil(sqrt(selcount)); + + #ifdef DEBUG_GRID_ARRANGE + g_print("/n PerRox = %f PerCol = %f selcount = %d",PerRow,PerCol,selcount); + #endif + + NoOfRowsLabel.set_text_with_mnemonic(_("_Rows:")); + NoOfRowsLabel.set_mnemonic_widget(NoOfRowsSpinner); + NoOfRowsBox.pack_start(NoOfRowsLabel, false, false, MARGIN); + + NoOfRowsSpinner.set_digits(0); + NoOfRowsSpinner.set_increments(1, 0); + NoOfRowsSpinner.set_range(1.0, 10000.0); + NoOfRowsSpinner.set_value(PerCol); + NoOfRowsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_col_spinbutton_changed)); + NoOfRowsSpinner.set_tooltip_text(_("Number of rows")); + NoOfRowsBox.pack_start(NoOfRowsSpinner, false, false, MARGIN); + gtk_size_group_add_widget(_col1, (GtkWidget *) NoOfRowsBox.gobj()); + + RowHeightButton.set_label(_("Equal _height")); + RowHeightButton.set_use_underline(true); + double AutoRow = prefs->getDouble("/dialogs/gridtiler/AutoRowSize", 15); + if (AutoRow>0) + AutoRowSize=true; + else + AutoRowSize=false; + RowHeightButton.set_active(AutoRowSize); + + NoOfRowsBox.pack_start(RowHeightButton, false, false, MARGIN); + + RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); + RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_RowSize_checkbutton_changed)); + + SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); + + + /*#### Label for X ####*/ + padXByYLabel.set_label(" "); + XByYLabelVBox.pack_start(padXByYLabel, false, false, MARGIN); + XByYLabel.set_markup(" × "); + XByYLabelVBox.pack_start(XByYLabel, false, false, MARGIN); + SpinsHBox.pack_start(XByYLabelVBox, false, false, MARGIN); + gtk_size_group_add_widget(_col2, (GtkWidget *) XByYLabelVBox.gobj()); + + /*#### Number of columns ####*/ + + NoOfColsLabel.set_text_with_mnemonic(_("_Columns:")); + NoOfColsLabel.set_mnemonic_widget(NoOfColsSpinner); + NoOfColsBox.pack_start(NoOfColsLabel, false, false, MARGIN); + + NoOfColsSpinner.set_digits(0); + NoOfColsSpinner.set_increments(1, 0); + NoOfColsSpinner.set_range(1.0, 10000.0); + NoOfColsSpinner.set_value(PerRow); + NoOfColsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_row_spinbutton_changed)); + NoOfColsSpinner.set_tooltip_text(_("Number of columns")); + NoOfColsBox.pack_start(NoOfColsSpinner, false, false, MARGIN); + gtk_size_group_add_widget(_col3, (GtkWidget *) NoOfColsBox.gobj()); + + ColumnWidthButton.set_label(_("Equal _width")); + ColumnWidthButton.set_use_underline(true); + double AutoCol = prefs->getDouble("/dialogs/gridtiler/AutoColSize", 15); + if (AutoCol>0) + AutoColSize=true; + else + AutoColSize=false; + ColumnWidthButton.set_active(AutoColSize); + NoOfColsBox.pack_start(ColumnWidthButton, false, false, MARGIN); + + ColumnWidthButton.set_tooltip_text(_("If not set, each column has the width of the widest object in it")); + ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ColSize_checkbutton_changed)); + + SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); + + TileBox.pack_start(SpinsHBox, false, false, MARGIN); + + VertAlign = prefs->getInt("/dialogs/gridtiler/VertAlign", 1); + HorizAlign = prefs->getInt("/dialogs/gridtiler/HorizAlign", 1); + + // Anchor selection widget + AlignLabel.set_label("Alignment:"); + AlignLabel.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + AlignmentSelector.setAlignment(HorizAlign, VertAlign); + AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); + TileBox.pack_start(AlignLabel, false, false, MARGIN); + TileBox.pack_start(AlignmentSelector, true, false, MARGIN); + + { + /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ + SpaceByBBoxRadioButton.set_label(_("_Fit into selection box")); + SpaceByBBoxRadioButton.set_use_underline (true); + SpaceByBBoxRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); + SpacingGroup = SpaceByBBoxRadioButton.get_group(); + + SpacingVBox.pack_start(SpaceByBBoxRadioButton, false, false, MARGIN); + + SpaceManualRadioButton.set_label(_("_Set spacing:")); + SpaceManualRadioButton.set_use_underline (true); + SpaceManualRadioButton.set_group(SpacingGroup); + SpaceManualRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); + SpacingVBox.pack_start(SpaceManualRadioButton, false, false, MARGIN); + + TileBox.pack_start(SpacingVBox, false, false, MARGIN); + } + + { + /*#### Padding ####*/ + + YPadding.setDigits(5); + YPadding.setIncrements(0.2, 0); + YPadding.setRange(-10000, 10000); + double yPad = prefs->getDouble("/dialogs/gridtiler/YPad", 15); + YPadding.setValue(yPad, "px"); + YPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ypad_spinbutton_changed)); + + XPadding.setDigits(5); + XPadding.setIncrements(0.2, 0); + XPadding.setRange(-10000, 10000); + double xPad = prefs->getDouble("/dialogs/gridtiler/XPad", 15); + XPadding.setValue(xPad, "px"); + + XPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_xpad_spinbutton_changed)); + } + TileBox.pack_start(XPadding, false, false, MARGIN); + TileBox.pack_start(YPadding, false, false, MARGIN); + + contents->pack_start(TileBox); + + double SpacingType = prefs->getDouble("/dialogs/gridtiler/SpacingType", 15); + if (SpacingType>0) { + ManualSpacing=true; + } else { + ManualSpacing=false; + } + SpaceManualRadioButton.set_active(ManualSpacing); + SpaceByBBoxRadioButton.set_active(!ManualSpacing); + XPadding.set_sensitive (ManualSpacing); + YPadding.set_sensitive (ManualSpacing); + + //## The OK button FIXME + /*TileOkButton = addResponseButton(C_("Rows and columns dialog","_Arrange"), GTK_RESPONSE_APPLY); + TileOkButton->set_use_underline(true); + TileOkButton->set_tooltip_text(_("Arrange selected objects"));*/ + + show_all_children(); +} + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/gridarrangetab.h b/src/ui/dialog/gridarrangetab.h new file mode 100644 index 000000000..bc82258b8 --- /dev/null +++ b/src/ui/dialog/gridarrangetab.h @@ -0,0 +1,147 @@ +/** + * @brief Arranges Objects into a Grid + */ +/* Authors: + * Bob Jamison ( based off trace dialog) + * John Cliff + * Other dudes from The Inkscape Organization + * Abhishek Sharma + * Declara Denis + * + * Copyright (C) 2004 Bob Jamison + * Copyright (C) 2004 John Cliff + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H +#define INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H + +#include + +#include "ui/dialog/arrangetab.h" + +#include "ui/widget/anchor-selector.h" +#include "ui/widget/scalar-unit.h" +#include "ui/widget/spinbutton.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class ArrangeDialog; + +/** + * Dialog for tiling an object + */ +class GridArrangeTab : public ArrangeTab { +public: + GridArrangeTab(ArrangeDialog *parent); + virtual ~GridArrangeTab() {}; + + /** + * Do the actual work + */ + virtual void arrange(); + + /** + * Respond to selection change + */ + void updateSelection(); + + // Callbacks from spinbuttons + void on_row_spinbutton_changed(); + void on_col_spinbutton_changed(); + void on_xpad_spinbutton_changed(); + void on_ypad_spinbutton_changed(); + void on_RowSize_checkbutton_changed(); + void on_ColSize_checkbutton_changed(); + void on_rowSize_spinbutton_changed(); + void on_colSize_spinbutton_changed(); + void Spacing_button_changed(); + void Align_changed(); + + +private: + GridArrangeTab(GridArrangeTab const &d); // no copy + void operator=(GridArrangeTab const &d); // no assign + + ArrangeDialog *Parent; + + bool userHidden; + bool updating; + + Gtk::VBox TileBox; + Gtk::Button *TileOkButton; + Gtk::Button *TileCancelButton; + + // Number selected label + Gtk::Label SelectionContentsLabel; + + + Gtk::HBox AlignHBox; + Gtk::HBox SpinsHBox; + + // Number per Row + Gtk::VBox NoOfColsBox; + Gtk::Label NoOfColsLabel; + Inkscape::UI::Widget::SpinButton NoOfColsSpinner; + bool AutoRowSize; + Gtk::CheckButton RowHeightButton; + + Gtk::VBox XByYLabelVBox; + Gtk::Label padXByYLabel; + Gtk::Label XByYLabel; + + // Number per Column + Gtk::VBox NoOfRowsBox; + Gtk::Label NoOfRowsLabel; + Inkscape::UI::Widget::SpinButton NoOfRowsSpinner; + bool AutoColSize; + Gtk::CheckButton ColumnWidthButton; + + // Alignment + Gtk::Label AlignLabel; + AnchorSelector AlignmentSelector; + double VertAlign; + double HorizAlign; + + Inkscape::UI::Widget::ScalarUnit XPadding; + Inkscape::UI::Widget::ScalarUnit YPadding; + + // BBox or manual spacing + Gtk::VBox SpacingVBox; + Gtk::RadioButtonGroup SpacingGroup; + Gtk::RadioButton SpaceByBBoxRadioButton; + Gtk::RadioButton SpaceManualRadioButton; + bool ManualSpacing; + + // Row height + Gtk::VBox RowHeightVBox; + Gtk::HBox RowHeightBox; + Gtk::Label RowHeightLabel; + Inkscape::UI::Widget::SpinButton RowHeightSpinner; + + // Column width + Gtk::VBox ColumnWidthVBox; + Gtk::HBox ColumnWidthBox; + Gtk::Label ColumnWidthLabel; + Inkscape::UI::Widget::SpinButton ColumnWidthSpinner; +}; + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +#endif /* INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp new file mode 100644 index 000000000..d36a78759 --- /dev/null +++ b/src/ui/dialog/polararrangetab.cpp @@ -0,0 +1,206 @@ +/** + * @brief Arranges Objects into a Circle/Ellipse + */ +/* Authors: + * Declara Denis + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include <2geom/transforms.h> +#include + +#include "ui/dialog/polararrangetab.h" +#include "ui/dialog/tile.h" + +#include "verbs.h" +#include "preferences.h" +#include "inkscape.h" +#include "desktop-handles.h" +#include "selection.h" +#include "document.h" +#include "document-undo.h" +#include "sp-item.h" +#include "widgets/icon.h" +#include "desktop.h" +#include "sp-item-transform.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) + : parent(parent_), + parametersTable(3, 3, false), + centerY("", "Y coordinate of the center", UNIT_TYPE_LINEAR), + centerX("", "X coordinate of the center", centerY), + radiusY("", "Y coordinate of the radius", UNIT_TYPE_LINEAR), + radiusX("", "X coordinate of the radius", radiusY), + angleY("", "Starting angle", UNIT_TYPE_RADIAL), + angleX("", "End angle", angleY) +{ + anchorPointLabel.set_text("Anchor point:"); + anchorPointLabel.set_alignment(Gtk::ALIGN_START); + pack_start(anchorPointLabel, false, false); + + anchorBoundingBoxRadio.set_label("Object's bounding box:"); + anchorRadioGroup = anchorBoundingBoxRadio.get_group(); + anchorBoundingBoxRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); + pack_start(anchorBoundingBoxRadio, false, false); + + pack_start(anchorSelector, false, false); + + anchorObjectPivotRadio.set_label("Object's rotational center"); + anchorObjectPivotRadio.set_group(anchorRadioGroup); + anchorObjectPivotRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); + pack_start(anchorObjectPivotRadio, false, false); + + arrangeOnLabel.set_text("Arrange on:"); + arrangeOnLabel.set_alignment(Gtk::ALIGN_START); + pack_start(arrangeOnLabel, false, false); + + arrangeOnCircleRadio.set_label("Last selected circle/ellipse/arc"); + arrangeRadioGroup = arrangeOnCircleRadio.get_group(); + arrangeOnCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnCircleRadio, false, false); + + arrangeOnParametersRadio.set_label("Parameterized:"); + arrangeOnParametersRadio.set_group(arrangeRadioGroup); + arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnParametersRadio, false, false); + + //FIXME: Objects in grid do not line up properly! + centerLabel.set_text("Center X/Y:"); + parametersTable.attach(centerLabel, 0, 1, 0, 1); + centerX.setDigits(2); + centerX.set_size_request(60, -1); + centerX.setIncrements(0.2, 0); + centerX.setRange(-10000, 10000); + centerX.setValue(0, "px"); + centerY.setDigits(2); + centerY.set_size_request(120, -1); + centerY.setIncrements(0.2, 0); + centerY.setRange(-10000, 10000); + centerY.setValue(0, "px"); + parametersTable.attach(centerX, 1, 2, 0, 1); + parametersTable.attach(centerY, 2, 3, 0, 1); + + radiusLabel.set_text("Radius X/Y:"); + parametersTable.attach(radiusLabel, 0, 1, 1, 2); + radiusX.setDigits(2); + radiusX.set_size_request(60, -1); + radiusX.setIncrements(0.2, 0); + radiusX.setRange(-10000, 10000); + radiusX.setValue(0, "px"); + radiusY.setDigits(2); + radiusY.set_size_request(120, -1); + radiusY.setIncrements(0.2, 0); + radiusY.setRange(-10000, 10000); + radiusY.setValue(0, "px"); + parametersTable.attach(radiusX, 1, 2, 1, 2); + parametersTable.attach(radiusY, 2, 3, 1, 2); + + angleLabel.set_text("Center X/Y:"); + parametersTable.attach(angleLabel, 0, 1, 2, 3); + angleX.setDigits(2); + angleX.set_size_request(60, -1); + angleX.setIncrements(0.2, 0); + angleX.setRange(-10000, 10000); + angleX.setValue(0, "°"); + angleY.setDigits(2); + angleY.set_size_request(120, -1); + angleY.setIncrements(0.2, 0); + angleY.setRange(-10000, 10000); + angleY.setValue(0, "°"); + parametersTable.attach(angleX, 1, 2, 2, 3); + parametersTable.attach(angleY, 2, 3, 2, 3); + pack_start(parametersTable, false, false); + + rotateObjectsCheckBox.set_label("Rotate objects"); + rotateObjectsCheckBox.set_active(true); + pack_start(rotateObjectsCheckBox, false, false); + + centerX.set_sensitive(false); + centerY.set_sensitive(false); + angleX.set_sensitive(false); + angleY.set_sensitive(false); + radiusX.set_sensitive(false); + radiusY.set_sensitive(false); +} + +void PolarArrangeTab::arrange() +{ + std::cout << "PolarArrangeTab::arrange()" << std::endl; + Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); + const GSList *items = selection->itemList(); + int i = 0; + while(items) + { + SPItem *item = SP_ITEM(items->data); + + float centerx = 1000; + float centery = 2000; + + float radiusx = 1000; + float radiusy = 2000; + + float objectx = - item->documentVisualBounds()->min()[Geom::X]; + float objecty = item->documentVisualBounds()->min()[Geom::Y]; + + float angle = M_PI / 36 * i; + + float r = (radiusx * radiusy) / + sqrtf(powf(radiusy * cos(angle), 2) + powf(radiusx * sin(angle), 2)); + float calcx = cos(angle) * r; + float calcy = sin(angle) * r; + + sp_item_move_rel(item, Geom::Translate(objectx + calcx, objecty + calcy)); + sp_item_rotate_rel(item, Geom::Rotate(angle)); + + //item->set_i2d_affine(item->i2dt_affine() * toOrigin * rotation); + //item->doWriteTransform(item->getRepr(), item->transform, NULL); + + items = items->next; + ++i; + } +} + +void PolarArrangeTab::updateSelection() +{ +} + +void PolarArrangeTab::on_arrange_radio_changed() +{ + bool arrangeParametric = !arrangeOnCircleRadio.get_active(); + + centerX.set_sensitive(arrangeParametric); + centerY.set_sensitive(arrangeParametric); + + angleX.set_sensitive(arrangeParametric); + angleY.set_sensitive(arrangeParametric); + + radiusX.set_sensitive(arrangeParametric); + radiusY.set_sensitive(arrangeParametric); +} + +void PolarArrangeTab::on_anchor_radio_changed() +{ + bool anchorBoundingBox = anchorBoundingBoxRadio.get_active(); + + anchorSelector.set_sensitive(anchorBoundingBox); +} + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/polararrangetab.h b/src/ui/dialog/polararrangetab.h new file mode 100644 index 000000000..81b7de4d9 --- /dev/null +++ b/src/ui/dialog/polararrangetab.h @@ -0,0 +1,86 @@ +/** + * @brief Arranges Objects into a Circle/Ellipse + */ +/* Authors: + * Declara Denis + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H +#define INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H + +#include + +#include "ui/dialog/arrangetab.h" + +#include "ui/widget/anchor-selector.h" +#include "ui/widget/scalar-unit.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class ArrangeDialog; + +class PolarArrangeTab : public ArrangeTab { +public: + PolarArrangeTab(ArrangeDialog *parent_); + virtual ~PolarArrangeTab() {}; + + /** + * Do the actual work + */ + virtual void arrange(); + + /** + * Respond to selection change + */ + void updateSelection(); + + void on_anchor_radio_changed(); + void on_arrange_radio_changed(); + +private: + PolarArrangeTab(PolarArrangeTab const &d); // no copy + void operator=(PolarArrangeTab const &d); // no assign + + ArrangeDialog *parent; + + Gtk::Label anchorPointLabel; + + Gtk::RadioButtonGroup anchorRadioGroup; + Gtk::RadioButton anchorBoundingBoxRadio; + Gtk::RadioButton anchorObjectPivotRadio; + AnchorSelector anchorSelector; + + Gtk::Label arrangeOnLabel; + + Gtk::RadioButtonGroup arrangeRadioGroup; + Gtk::RadioButton arrangeOnCircleRadio; + Gtk::RadioButton arrangeOnParametersRadio; + + Gtk::Table parametersTable; + + Gtk::Label centerLabel; + Inkscape::UI::Widget::ScalarUnit centerY; + Inkscape::UI::Widget::ScalarUnit centerX; + + Gtk::Label radiusLabel; + Inkscape::UI::Widget::ScalarUnit radiusY; + Inkscape::UI::Widget::ScalarUnit radiusX; + + Gtk::Label angleLabel; + Inkscape::UI::Widget::ScalarUnit angleY; + Inkscape::UI::Widget::ScalarUnit angleX; + + Gtk::CheckButton rotateObjectsCheckBox; + + +}; + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +#endif /* INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H */ diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index d4c597b84..879c9182f 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -6,112 +6,28 @@ * John Cliff * Other dudes from The Inkscape Organization * Abhishek Sharma + * Declara Denis * * Copyright (C) 2004 Bob Jamison * Copyright (C) 2004 John Cliff * * Released under GNU GPL, read the file 'COPYING' for more information */ -//#define DEBUG_GRID_ARRANGE 1 -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "tile.h" -#include //for GTK_RESPONSE* types #include -#include -#include <2geom/transforms.h> +#include "tile.h" #include "verbs.h" -#include "preferences.h" -#include "inkscape.h" -#include "desktop-handles.h" -#include "selection.h" -#include "document.h" -#include "document-undo.h" -#include "sp-item.h" -#include "widgets/icon.h" -#include "desktop.h" -#include "sp-item-transform.h" - -/* - * Sort items by their x co-ordinates, taking account of y (keeps rows intact) - * - * <0 *elem1 goes before *elem2 - * 0 *elem1 == *elem2 - * >0 *elem1 goes after *elem2 - */ -int sp_compare_x_position(SPItem *first, SPItem *second) -{ - using Geom::X; - using Geom::Y; - - Geom::OptRect a = first->documentVisualBounds(); - Geom::OptRect b = second->documentVisualBounds(); - - if ( !a || !b ) { - // FIXME? - return 0; - } - - double const a_height = a->dimensions()[Y]; - double const b_height = b->dimensions()[Y]; - - bool a_in_b_vert = false; - if ((a->min()[Y] < b->min()[Y] + 0.1) && (a->min()[Y] > b->min()[Y] - b_height)) { - a_in_b_vert = true; - } else if ((b->min()[Y] < a->min()[Y] + 0.1) && (b->min()[Y] > a->min()[Y] - a_height)) { - a_in_b_vert = true; - } else if (b->min()[Y] == a->min()[Y]) { - a_in_b_vert = true; - } else { - a_in_b_vert = false; - } - - if (!a_in_b_vert) { - return -1; - } - if (a_in_b_vert && a->min()[X] > b->min()[X]) { - return 1; - } - if (a_in_b_vert && a->min()[X] < b->min()[X]) { - return -1; - } - return 0; -} - -/* - * Sort items by their y co-ordinates. - */ -int -sp_compare_y_position(SPItem *first, SPItem *second) -{ - Geom::OptRect a = first->documentVisualBounds(); - Geom::OptRect b = second->documentVisualBounds(); - - if ( !a || !b ) { - // FIXME? - return 0; - } - if (a->min()[Geom::Y] > b->min()[Geom::Y]) { - return 1; - } - if (a->min()[Geom::Y] < b->min()[Geom::Y]) { - return -1; - } - - return 0; -} +#include "ui/dialog/gridarrangetab.h" +#include "ui/dialog/polararrangetab.h" namespace Inkscape { namespace UI { namespace Dialog { ArrangeDialog::ArrangeDialog() - : UI::Widget::Panel("", "/dialogs/gridtiler", SP_VERB_SELECTION_GRIDTILE), + : UI::Widget::Panel("", "/dialogs/gridtiler", SP_VERB_SELECTION_ARRANGE), _gridArrangeTab(new GridArrangeTab(this)), _polarArrangeTab(new PolarArrangeTab(this)) { @@ -142,826 +58,6 @@ void ArrangeDialog::_apply() } } -PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) - : parent(parent_), - parametersTable(3, 3, false), - centerY("", "Y coordinate of the center", UNIT_TYPE_LINEAR), - centerX("", "X coordinate of the center", centerY), - radiusY("", "Y coordinate of the radius", UNIT_TYPE_LINEAR), - radiusX("", "X coordinate of the radius", radiusY), - angleY("", "Starting angle", UNIT_TYPE_RADIAL), - angleX("", "End angle", angleY) -{ - anchorPointLabel.set_text("Anchor point:"); - anchorPointLabel.set_alignment(Gtk::ALIGN_START); - pack_start(anchorPointLabel, false, false); - - anchorBoundingBoxRadio.set_label("Object's bounding box:"); - anchorRadioGroup = anchorBoundingBoxRadio.get_group(); - anchorBoundingBoxRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); - pack_start(anchorBoundingBoxRadio, false, false); - - pack_start(anchorSelector, false, false); - - anchorObjectPivotRadio.set_label("Object's rotational center"); - anchorObjectPivotRadio.set_group(anchorRadioGroup); - anchorObjectPivotRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); - pack_start(anchorObjectPivotRadio, false, false); - - arrangeOnLabel.set_text("Arrange on:"); - arrangeOnLabel.set_alignment(Gtk::ALIGN_START); - pack_start(arrangeOnLabel, false, false); - - arrangeOnCircleRadio.set_label("Last selected circle/ellipse/arc"); - arrangeRadioGroup = arrangeOnCircleRadio.get_group(); - arrangeOnCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); - pack_start(arrangeOnCircleRadio, false, false); - - arrangeOnParametersRadio.set_label("Parameterized:"); - arrangeOnParametersRadio.set_group(arrangeRadioGroup); - arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); - pack_start(arrangeOnParametersRadio, false, false); - - //FIXME: Objects in grid do not line up properly! - centerLabel.set_text("Center X/Y:"); - parametersTable.attach(centerLabel, 0, 1, 0, 1); - centerX.setDigits(2); - centerX.set_size_request(60, -1); - centerX.setIncrements(0.2, 0); - centerX.setRange(-10000, 10000); - centerX.setValue(0, "px"); - centerY.setDigits(2); - centerY.set_size_request(120, -1); - centerY.setIncrements(0.2, 0); - centerY.setRange(-10000, 10000); - centerY.setValue(0, "px"); - parametersTable.attach(centerX, 1, 2, 0, 1); - parametersTable.attach(centerY, 2, 3, 0, 1); - - radiusLabel.set_text("Radius X/Y:"); - parametersTable.attach(radiusLabel, 0, 1, 1, 2); - radiusX.setDigits(2); - radiusX.set_size_request(60, -1); - radiusX.setIncrements(0.2, 0); - radiusX.setRange(-10000, 10000); - radiusX.setValue(0, "px"); - radiusY.setDigits(2); - radiusY.set_size_request(120, -1); - radiusY.setIncrements(0.2, 0); - radiusY.setRange(-10000, 10000); - radiusY.setValue(0, "px"); - parametersTable.attach(radiusX, 1, 2, 1, 2); - parametersTable.attach(radiusY, 2, 3, 1, 2); - - angleLabel.set_text("Center X/Y:"); - parametersTable.attach(angleLabel, 0, 1, 2, 3); - angleX.setDigits(2); - angleX.set_size_request(60, -1); - angleX.setIncrements(0.2, 0); - angleX.setRange(-10000, 10000); - angleX.setValue(0, "°"); - angleY.setDigits(2); - angleY.set_size_request(120, -1); - angleY.setIncrements(0.2, 0); - angleY.setRange(-10000, 10000); - angleY.setValue(0, "°"); - parametersTable.attach(angleX, 1, 2, 2, 3); - parametersTable.attach(angleY, 2, 3, 2, 3); - pack_start(parametersTable, false, false); - - rotateObjectsCheckBox.set_label("Rotate objects"); - rotateObjectsCheckBox.set_active(true); - pack_start(rotateObjectsCheckBox, false, false); - - centerX.set_sensitive(false); - centerY.set_sensitive(false); - angleX.set_sensitive(false); - angleY.set_sensitive(false); - radiusX.set_sensitive(false); - radiusY.set_sensitive(false); -} - -void PolarArrangeTab::arrange() -{ - std::cout << "PolarArrangeTab::arrange()" << std::endl; - Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); - const GSList *items = selection->itemList(); - int i = 0; - while(items) - { - SPItem *item = SP_ITEM(items->data); - - float centerx = 1000; - float centery = 2000; - - float radiusx = 1000; - float radiusy = 2000; - - float objectx = - item->documentVisualBounds()->min()[Geom::X]; - float objecty = item->documentVisualBounds()->min()[Geom::Y]; - - float angle = M_PI / 36 * i; - - float r = (radiusx * radiusy) / - sqrtf(powf(radiusy * cos(angle), 2) + powf(radiusx * sin(angle), 2)); - float calcx = cos(angle) * r; - float calcy = sin(angle) * r; - - sp_item_move_rel(item, Geom::Translate(objectx + calcx, objecty + calcy)); - sp_item_rotate_rel(item, Geom::Rotate(angle)); - - //item->set_i2d_affine(item->i2dt_affine() * toOrigin * rotation); - //item->doWriteTransform(item->getRepr(), item->transform, NULL); - - items = items->next; - ++i; - } -} - -void PolarArrangeTab::updateSelection() -{ -} - -void PolarArrangeTab::on_arrange_radio_changed() -{ - bool arrangeParametric = !arrangeOnCircleRadio.get_active(); - - centerX.set_sensitive(arrangeParametric); - centerY.set_sensitive(arrangeParametric); - - angleX.set_sensitive(arrangeParametric); - angleY.set_sensitive(arrangeParametric); - - radiusX.set_sensitive(arrangeParametric); - radiusY.set_sensitive(arrangeParametric); -} - -void PolarArrangeTab::on_anchor_radio_changed() -{ - bool anchorBoundingBox = anchorBoundingBoxRadio.get_active(); - - anchorSelector.set_sensitive(anchorBoundingBox); -} - - -//######################################################################### -//## E V E N T S -//######################################################################### - -/* - * - * This arranges the selection in a grid pattern. - * - */ - -void GridArrangeTab::arrange() -{ - - int cnt,row_cnt,col_cnt,a,row,col; - double grid_left,grid_top,col_width,row_height,paddingx,paddingy,width, height, new_x, new_y,cx,cy; - double total_col_width,total_row_height; - col_width = 0; - row_height = 0; - total_col_width=0; - total_row_height=0; - - // check for correct numbers in the row- and col-spinners - on_col_spinbutton_changed(); - on_row_spinbutton_changed(); - - // set padding to manual values - paddingx = XPadding.getValue("px"); - paddingy = YPadding.getValue("px"); - - std::vector row_heights; - std::vector col_widths; - std::vector row_ys; - std::vector col_xs; - - int NoOfCols = NoOfColsSpinner.get_value_as_int(); - int NoOfRows = NoOfRowsSpinner.get_value_as_int(); - - width = 0; - for (a=0;agetDesktop(); - sp_desktop_document(desktop)->ensureUpToDate(); - - Inkscape::Selection *selection = sp_desktop_selection (desktop); - const GSList *items = selection ? selection->itemList() : 0; - cnt=0; - for (; items != NULL; items = items->next) { - SPItem *item = SP_ITEM(items->data); - Geom::OptRect b = item->documentVisualBounds(); - if (!b) { - continue; - } - - width = b->dimensions()[Geom::X]; - height = b->dimensions()[Geom::Y]; - - cx = b->midpoint()[Geom::X]; - cy = b->midpoint()[Geom::Y]; - - if (b->min()[Geom::X] < grid_left) { - grid_left = b->min()[Geom::X]; - } - if (b->min()[Geom::Y] < grid_top) { - grid_top = b->min()[Geom::Y]; - } - if (width > col_width) { - col_width = width; - } - if (height > row_height) { - row_height = height; - } - } - - - // 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((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); - - - // 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); - Geom::OptRect b = item->documentVisualBounds(); - if (b) { - width = b->dimensions()[Geom::X]; - height = b->dimensions()[Geom::Y]; - if (width > col_widths[(cnt % NoOfCols)]) { - col_widths[(cnt % NoOfCols)] = width; - } - if (height > row_heights[(cnt / NoOfCols)]) { - row_heights[(cnt / NoOfCols)] = height; - } - } - - cnt++; - } - - - /// Make sure the top and left of the grid dont move by compensating for align values. - if (RowHeightButton.get_active()){ - grid_top = grid_top - (((row_height - row_heights[0]) / 2)*(VertAlign)); - } - if (ColumnWidthButton.get_active()){ - grid_left = grid_left - (((col_width - col_widths[0]) /2)*(HorizAlign)); - } - - #ifdef DEBUG_GRID_ARRANGE - g_print("\n cx = %f cy= %f gridleft=%f",cx,cy,grid_left); - #endif - - // Calculate total widths and heights, allowing for columns and rows non uniformly sized. - - if (ColumnWidthButton.get_active()){ - total_col_width = col_width * NoOfCols; - col_widths.clear(); - for (a=0;avisualBounds(); - // Fit to bbox, calculate padding between rows accordingly. - if ( sel_bbox && !SpaceManualRadioButton.get_active() ){ -#ifdef DEBUG_GRID_ARRANGE -g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_height,total_col_width, b.extent(Geom::X), b.extent(Geom::Y)); -#endif - paddingx = (sel_bbox->width() - total_col_width) / (NoOfCols -1); - paddingy = (sel_bbox->height() - total_row_height) / (NoOfRows -1); - } - -/* - Horizontal align - Left = 0 - Centre = 1 - Right = 2 - - Vertical align - Top = 0 - Middle = 1 - Bottom = 2 - - X position is calculated by taking the grids left co-ord, adding the distance to the column, - then adding 1/2 the spacing multiplied by the align variable above, - Y position likewise, takes the top of the grid, adds the y to the current row then adds the padding in to align it. - -*/ - - // Calculate row and column x and y coords required to allow for columns and rows which are non uniformly sized. - - for (a=0;adata); - sorted = sorted->next; - } - - for (; current_row != NULL; current_row = current_row->next) { - SPItem *item=SP_ITEM(current_row->data); - Inkscape::XML::Node *repr = item->getRepr(); - Geom::OptRect b = item->documentVisualBounds(); - Geom::Point min; - if (b) { - width = b->dimensions()[Geom::X]; - height = b->dimensions()[Geom::Y]; - min = b->min(); - } else { - width = height = 0; - min = Geom::Point(0, 0); - } - - row = cnt / NoOfCols; - col = cnt % NoOfCols; - - new_x = grid_left + (((col_widths[col] - width)/2)*HorizAlign) + col_xs[col]; - new_y = grid_top + (((row_heights[row] - height)/2)*VertAlign) + row_ys[row]; - - // signs are inverted between x and y due to y inversion - Geom::Point move = Geom::Point(new_x - min[Geom::X], min[Geom::Y] - new_y); - Geom::Affine const affine = Geom::Affine(Geom::Translate(move)); - item->set_i2d_affine(item->i2dt_affine() * affine); - item->doWriteTransform(repr, item->transform, NULL); - SP_OBJECT (current_row->data)->updateRepr(); - cnt +=1; - } - g_slist_free (current_row); - } - - DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_GRIDTILE, - _("Arrange in a grid")); - -} - - -//######################################################################### -//## E V E N T S -//######################################################################### - -/** - * changed value in # of columns spinbox. - */ -void GridArrangeTab::on_row_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - SPDesktop *desktop = Parent->getDesktop(); - - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - g_return_if_fail( selection ); - - GSList const *items = selection->itemList(); - int selcount = g_slist_length((GSList *)items); - - double PerCol = ceil(selcount / NoOfColsSpinner.get_value()); - NoOfRowsSpinner.set_value(PerCol); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/NoOfCols", NoOfColsSpinner.get_value()); - updating=false; -} - -/** - * changed value in # of rows spinbox. - */ -void GridArrangeTab::on_col_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - SPDesktop *desktop = Parent->getDesktop(); - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - g_return_if_fail(selection); - - GSList const *items = selection->itemList(); - int selcount = g_slist_length((GSList *)items); - - double PerRow = ceil(selcount / NoOfRowsSpinner.get_value()); - NoOfColsSpinner.set_value(PerRow); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/NoOfCols", PerRow); - - updating=false; -} - -/** - * changed value in x padding spinbox. - */ -void GridArrangeTab::on_xpad_spinbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/XPad", XPadding.getValue("px")); - -} - -/** - * changed value in y padding spinbox. - */ -void GridArrangeTab::on_ypad_spinbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/YPad", YPadding.getValue("px")); -} - - -/** - * checked/unchecked autosize Rows button. - */ -void GridArrangeTab::on_RowSize_checkbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (RowHeightButton.get_active()) { - prefs->setDouble("/dialogs/gridtiler/AutoRowSize", 20); - } else { - prefs->setDouble("/dialogs/gridtiler/AutoRowSize", -20); - } - RowHeightBox.set_sensitive ( !RowHeightButton.get_active()); -} - -/** - * checked/unchecked autosize Rows button. - */ -void GridArrangeTab::on_ColSize_checkbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (ColumnWidthButton.get_active()) { - prefs->setDouble("/dialogs/gridtiler/AutoColSize", 20); - } else { - prefs->setDouble("/dialogs/gridtiler/AutoColSize", -20); - } - ColumnWidthBox.set_sensitive ( !ColumnWidthButton.get_active()); -} - -/** - * changed value in columns spinbox. - */ -void GridArrangeTab::on_rowSize_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/RowHeight", RowHeightSpinner.get_value()); - updating=false; - -} - -/** - * changed value in rows spinbox. - */ -void GridArrangeTab::on_colSize_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/ColWidth", ColumnWidthSpinner.get_value()); - updating=false; - -} - -/** - * changed Radio button in Spacing group. - */ -void GridArrangeTab::Spacing_button_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (SpaceManualRadioButton.get_active()) { - prefs->setDouble("/dialogs/gridtiler/SpacingType", 20); - } else { - prefs->setDouble("/dialogs/gridtiler/SpacingType", -20); - } - - XPadding.set_sensitive ( SpaceManualRadioButton.get_active()); - YPadding.set_sensitive ( SpaceManualRadioButton.get_active()); -} - -/** - * changed Anchor selection widget. - */ -void GridArrangeTab::Align_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - VertAlign = AlignmentSelector.getVerticalAlignment(); - prefs->setInt("/dialogs/gridtiler/VertAlign", VertAlign); - HorizAlign = AlignmentSelector.getHorizontalAlignment(); - prefs->setInt("/dialogs/gridtiler/HorizAlign", HorizAlign); -} - -/** - * Desktop selection changed - */ -void GridArrangeTab::updateSelection() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - // in turn, prevent listener from responding - updating = true; - SPDesktop *desktop = Parent->getDesktop(); - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - GSList const *items = selection ? selection->itemList() : 0; - - if (items) { - int selcount = g_slist_length((GSList *)items); - - if (NoOfColsSpinner.get_value() > 1 && NoOfRowsSpinner.get_value() > 1){ - // Update the number of rows assuming number of columns wanted remains same. - double NoOfRows = ceil(selcount / NoOfColsSpinner.get_value()); - NoOfRowsSpinner.set_value(NoOfRows); - - // if the selection has less than the number set for one row, reduce it appropriately - if (selcount < NoOfColsSpinner.get_value()) { - double NoOfCols = ceil(selcount / NoOfRowsSpinner.get_value()); - NoOfColsSpinner.set_value(NoOfCols); - prefs->setInt("/dialogs/gridtiler/NoOfCols", NoOfCols); - } - } else { - double PerRow = ceil(sqrt(selcount)); - double PerCol = ceil(sqrt(selcount)); - NoOfRowsSpinner.set_value(PerRow); - NoOfColsSpinner.set_value(PerCol); - prefs->setInt("/dialogs/gridtiler/NoOfCols", static_cast(PerCol)); - } - } - - updating = false; -} - - - -/*########################## -## Experimental -##########################*/ - -static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg) -{ - dlg->updateSelection(); -} - - -//######################################################################### -//## C O N S T R U C T O R / D E S T R U C T O R -//######################################################################### -/** - * Constructor - */ -GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) - : Parent(parent), - XPadding(_("X:"), _("Horizontal spacing between columns."), UNIT_TYPE_LINEAR, "", "object-columns"), - YPadding(_("Y:"), _("Vertical spacing between rows."), XPadding, "", "object-rows") -{ - // bool used by spin button callbacks to stop loops where they change each other. - updating = false; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - // could not do this in gtkmm - there's no Gtk::SizeGroup public constructor (!) - GtkSizeGroup *_col1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - GtkSizeGroup *_col2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - GtkSizeGroup *_col3 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - { - // Selection Change signal - g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (updateSelectionCallback), this); - } - - Gtk::Box *contents = this; - -#define MARGIN 2 - - //##Set up the panel - - SPDesktop *desktop = Parent->getDesktop(); - - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - g_return_if_fail( selection ); - int selcount = 1; - if (!selection->isEmpty()) { - GSList const *items = selection->itemList(); - selcount = g_slist_length((GSList *)items); - } - - - /*#### Number of Rows ####*/ - - double PerRow = ceil(sqrt(selcount)); - double PerCol = ceil(sqrt(selcount)); - - #ifdef DEBUG_GRID_ARRANGE - g_print("/n PerRox = %f PerCol = %f selcount = %d",PerRow,PerCol,selcount); - #endif - - NoOfRowsLabel.set_text_with_mnemonic(_("_Rows:")); - NoOfRowsLabel.set_mnemonic_widget(NoOfRowsSpinner); - NoOfRowsBox.pack_start(NoOfRowsLabel, false, false, MARGIN); - - NoOfRowsSpinner.set_digits(0); - NoOfRowsSpinner.set_increments(1, 0); - NoOfRowsSpinner.set_range(1.0, 10000.0); - NoOfRowsSpinner.set_value(PerCol); - NoOfRowsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_col_spinbutton_changed)); - NoOfRowsSpinner.set_tooltip_text(_("Number of rows")); - NoOfRowsBox.pack_start(NoOfRowsSpinner, false, false, MARGIN); - gtk_size_group_add_widget(_col1, (GtkWidget *) NoOfRowsBox.gobj()); - - RowHeightButton.set_label(_("Equal _height")); - RowHeightButton.set_use_underline(true); - double AutoRow = prefs->getDouble("/dialogs/gridtiler/AutoRowSize", 15); - if (AutoRow>0) - AutoRowSize=true; - else - AutoRowSize=false; - RowHeightButton.set_active(AutoRowSize); - - NoOfRowsBox.pack_start(RowHeightButton, false, false, MARGIN); - - RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); - RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_RowSize_checkbutton_changed)); - - SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); - - - /*#### Label for X ####*/ - padXByYLabel.set_label(" "); - XByYLabelVBox.pack_start(padXByYLabel, false, false, MARGIN); - XByYLabel.set_markup(" × "); - XByYLabelVBox.pack_start(XByYLabel, false, false, MARGIN); - SpinsHBox.pack_start(XByYLabelVBox, false, false, MARGIN); - gtk_size_group_add_widget(_col2, (GtkWidget *) XByYLabelVBox.gobj()); - - /*#### Number of columns ####*/ - - NoOfColsLabel.set_text_with_mnemonic(_("_Columns:")); - NoOfColsLabel.set_mnemonic_widget(NoOfColsSpinner); - NoOfColsBox.pack_start(NoOfColsLabel, false, false, MARGIN); - - NoOfColsSpinner.set_digits(0); - NoOfColsSpinner.set_increments(1, 0); - NoOfColsSpinner.set_range(1.0, 10000.0); - NoOfColsSpinner.set_value(PerRow); - NoOfColsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_row_spinbutton_changed)); - NoOfColsSpinner.set_tooltip_text(_("Number of columns")); - NoOfColsBox.pack_start(NoOfColsSpinner, false, false, MARGIN); - gtk_size_group_add_widget(_col3, (GtkWidget *) NoOfColsBox.gobj()); - - ColumnWidthButton.set_label(_("Equal _width")); - ColumnWidthButton.set_use_underline(true); - double AutoCol = prefs->getDouble("/dialogs/gridtiler/AutoColSize", 15); - if (AutoCol>0) - AutoColSize=true; - else - AutoColSize=false; - ColumnWidthButton.set_active(AutoColSize); - NoOfColsBox.pack_start(ColumnWidthButton, false, false, MARGIN); - - ColumnWidthButton.set_tooltip_text(_("If not set, each column has the width of the widest object in it")); - ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ColSize_checkbutton_changed)); - - SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); - - TileBox.pack_start(SpinsHBox, false, false, MARGIN); - - VertAlign = prefs->getInt("/dialogs/gridtiler/VertAlign", 1); - HorizAlign = prefs->getInt("/dialogs/gridtiler/HorizAlign", 1); - - // Anchor selection widget - AlignLabel.set_label("Alignment:"); - AlignLabel.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - AlignmentSelector.setAlignment(HorizAlign, VertAlign); - AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); - TileBox.pack_start(AlignLabel, false, false, MARGIN); - TileBox.pack_start(AlignmentSelector, true, false, MARGIN); - - { - /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ - SpaceByBBoxRadioButton.set_label(_("_Fit into selection box")); - SpaceByBBoxRadioButton.set_use_underline (true); - SpaceByBBoxRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); - SpacingGroup = SpaceByBBoxRadioButton.get_group(); - - SpacingVBox.pack_start(SpaceByBBoxRadioButton, false, false, MARGIN); - - SpaceManualRadioButton.set_label(_("_Set spacing:")); - SpaceManualRadioButton.set_use_underline (true); - SpaceManualRadioButton.set_group(SpacingGroup); - SpaceManualRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); - SpacingVBox.pack_start(SpaceManualRadioButton, false, false, MARGIN); - - TileBox.pack_start(SpacingVBox, false, false, MARGIN); - } - - { - /*#### Padding ####*/ - - YPadding.setDigits(5); - YPadding.setIncrements(0.2, 0); - YPadding.setRange(-10000, 10000); - double yPad = prefs->getDouble("/dialogs/gridtiler/YPad", 15); - YPadding.setValue(yPad, "px"); - YPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ypad_spinbutton_changed)); - - XPadding.setDigits(5); - XPadding.setIncrements(0.2, 0); - XPadding.setRange(-10000, 10000); - double xPad = prefs->getDouble("/dialogs/gridtiler/XPad", 15); - XPadding.setValue(xPad, "px"); - - XPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_xpad_spinbutton_changed)); - } - TileBox.pack_start(XPadding, false, false, MARGIN); - TileBox.pack_start(YPadding, false, false, MARGIN); - - contents->pack_start(TileBox); - - double SpacingType = prefs->getDouble("/dialogs/gridtiler/SpacingType", 15); - if (SpacingType>0) { - ManualSpacing=true; - } else { - ManualSpacing=false; - } - SpaceManualRadioButton.set_active(ManualSpacing); - SpaceByBBoxRadioButton.set_active(!ManualSpacing); - XPadding.set_sensitive (ManualSpacing); - YPadding.set_sensitive (ManualSpacing); - - //## The OK button FIXME - /*TileOkButton = addResponseButton(C_("Rows and columns dialog","_Arrange"), GTK_RESPONSE_APPLY); - TileOkButton->set_use_underline(true); - TileOkButton->set_tooltip_text(_("Arrange selected objects"));*/ - - show_all_children(); -} - } //namespace Dialog } //namespace UI } //namespace Inkscape diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index b09416d04..d42dd7f65 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -5,6 +5,7 @@ * Bob Jamison ( based off trace dialog) * John Cliff * Other dudes from The Inkscape Organization + * Declara Denis * * Copyright (C) 2004 Bob Jamison * Copyright (C) 2004 John Cliff @@ -20,10 +21,7 @@ #include #include -#include "ui/widget/anchor-selector.h" #include "ui/widget/panel.h" -#include "ui/widget/spinbutton.h" -#include "ui/widget/scalar-unit.h" namespace Gtk { class Button; @@ -33,23 +31,7 @@ namespace Inkscape { namespace UI { namespace Dialog { -/** - * This interface should be implemented by each arrange mode. - * The class is a Gtk::VBox and will be displayed as a tab in - * the dialog - */ -class ArrangeTab : public Gtk::VBox -{ -public: - ArrangeTab() {}; - virtual ~ArrangeTab() {}; - - /** - * Do the actual work! - */ - virtual void arrange() = 0; -}; - +class ArrangeTab; class GridArrangeTab; class PolarArrangeTab; @@ -75,161 +57,6 @@ public: static ArrangeDialog& getInstance() { return *new ArrangeDialog(); } }; -/** - * Dialog for tiling an object - */ -class GridArrangeTab : public ArrangeTab { -public: - GridArrangeTab(ArrangeDialog *parent); - virtual ~GridArrangeTab() {}; - - /** - * Do the actual work - */ - virtual void arrange(); - - /** - * Respond to selection change - */ - void updateSelection(); - - // Callbacks from spinbuttons - void on_row_spinbutton_changed(); - void on_col_spinbutton_changed(); - void on_xpad_spinbutton_changed(); - void on_ypad_spinbutton_changed(); - void on_RowSize_checkbutton_changed(); - void on_ColSize_checkbutton_changed(); - void on_rowSize_spinbutton_changed(); - void on_colSize_spinbutton_changed(); - void Spacing_button_changed(); - void Align_changed(); - - -private: - GridArrangeTab(GridArrangeTab const &d); // no copy - void operator=(GridArrangeTab const &d); // no assign - - ArrangeDialog *Parent; - - bool userHidden; - bool updating; - - Gtk::VBox TileBox; - Gtk::Button *TileOkButton; - Gtk::Button *TileCancelButton; - - // Number selected label - Gtk::Label SelectionContentsLabel; - - - Gtk::HBox AlignHBox; - Gtk::HBox SpinsHBox; - - // Number per Row - Gtk::VBox NoOfColsBox; - Gtk::Label NoOfColsLabel; - Inkscape::UI::Widget::SpinButton NoOfColsSpinner; - bool AutoRowSize; - Gtk::CheckButton RowHeightButton; - - Gtk::VBox XByYLabelVBox; - Gtk::Label padXByYLabel; - Gtk::Label XByYLabel; - - // Number per Column - Gtk::VBox NoOfRowsBox; - Gtk::Label NoOfRowsLabel; - Inkscape::UI::Widget::SpinButton NoOfRowsSpinner; - bool AutoColSize; - Gtk::CheckButton ColumnWidthButton; - - // Alignment - Gtk::Label AlignLabel; - AnchorSelector AlignmentSelector; - double VertAlign; - double HorizAlign; - - Inkscape::UI::Widget::ScalarUnit XPadding; - Inkscape::UI::Widget::ScalarUnit YPadding; - - // BBox or manual spacing - Gtk::VBox SpacingVBox; - Gtk::RadioButtonGroup SpacingGroup; - Gtk::RadioButton SpaceByBBoxRadioButton; - Gtk::RadioButton SpaceManualRadioButton; - bool ManualSpacing; - - // Row height - Gtk::VBox RowHeightVBox; - Gtk::HBox RowHeightBox; - Gtk::Label RowHeightLabel; - Inkscape::UI::Widget::SpinButton RowHeightSpinner; - - // Column width - Gtk::VBox ColumnWidthVBox; - Gtk::HBox ColumnWidthBox; - Gtk::Label ColumnWidthLabel; - Inkscape::UI::Widget::SpinButton ColumnWidthSpinner; -}; - -class PolarArrangeTab : public ArrangeTab { -public: - PolarArrangeTab(ArrangeDialog *parent_); - virtual ~PolarArrangeTab() {}; - - /** - * Do the actual work - */ - virtual void arrange(); - - /** - * Respond to selection change - */ - void updateSelection(); - - void on_anchor_radio_changed(); - void on_arrange_radio_changed(); - -private: - PolarArrangeTab(PolarArrangeTab const &d); // no copy - void operator=(PolarArrangeTab const &d); // no assign - - ArrangeDialog *parent; - - Gtk::Label anchorPointLabel; - - Gtk::RadioButtonGroup anchorRadioGroup; - Gtk::RadioButton anchorBoundingBoxRadio; - Gtk::RadioButton anchorObjectPivotRadio; - AnchorSelector anchorSelector; - - Gtk::Label arrangeOnLabel; - - Gtk::RadioButtonGroup arrangeRadioGroup; - Gtk::RadioButton arrangeOnCircleRadio; - Gtk::RadioButton arrangeOnParametersRadio; - - Gtk::Table parametersTable; - - Gtk::Label centerLabel; - Inkscape::UI::Widget::ScalarUnit centerY; - Inkscape::UI::Widget::ScalarUnit centerX; - - Gtk::Label radiusLabel; - Inkscape::UI::Widget::ScalarUnit radiusY; - Inkscape::UI::Widget::ScalarUnit radiusX; - - Gtk::Label angleLabel; - Inkscape::UI::Widget::ScalarUnit angleY; - Inkscape::UI::Widget::ScalarUnit angleX; - - Gtk::CheckButton rotateObjectsCheckBox; - - -}; - - } //namespace Dialog } //namespace UI } //namespace Inkscape diff --git a/src/verbs.cpp b/src/verbs.cpp index 1b57ad4ff..5d5414213 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -1127,9 +1127,9 @@ void SelectionVerb::perform(SPAction *action, void *data) case SP_VERB_SELECTION_BREAK_APART: sp_selected_path_break_apart(dt); break; - case SP_VERB_SELECTION_GRIDTILE: + case SP_VERB_SELECTION_ARRANGE: inkscape_dialogs_unhide(); - dt->_dlg_mgr->showDialog("TileDialog"); + dt->_dlg_mgr->showDialog("TileDialog"); //FIXME: denis: What's this string (to be changed) break; default: break; @@ -2412,8 +2412,8 @@ Verb *Verb::_base_verbs[] = { // Advanced tutorial for more info new SelectionVerb(SP_VERB_SELECTION_BREAK_APART, "SelectionBreakApart", N_("Break _Apart"), N_("Break selected paths into subpaths"), INKSCAPE_ICON("path-break-apart")), - new SelectionVerb(SP_VERB_SELECTION_GRIDTILE, "DialogGridArrange", N_("Ro_ws and Columns..."), - N_("Arrange selected objects in a table"), INKSCAPE_ICON("dialog-rows-and-columns")), + new SelectionVerb(SP_VERB_SELECTION_ARRANGE, "DialogArrange", N_("_Arrange..."), + N_("Arrange selected objects in a table or circle"), INKSCAPE_ICON("dialog-rows-and-columns")), // Layer new LayerVerb(SP_VERB_LAYER_NEW, "LayerNew", N_("_Add Layer..."), N_("Create a new layer"), INKSCAPE_ICON("layer-new")), diff --git a/src/verbs.h b/src/verbs.h index 1a9efdb81..b666ec92b 100644 --- a/src/verbs.h +++ b/src/verbs.h @@ -130,7 +130,7 @@ enum { SP_VERB_SELECTION_CREATE_BITMAP, SP_VERB_SELECTION_COMBINE, SP_VERB_SELECTION_BREAK_APART, - SP_VERB_SELECTION_GRIDTILE, + SP_VERB_SELECTION_ARRANGE, // Former SP_VERB_SELECTION_GRIDTILE /* Layer */ SP_VERB_LAYER_NEW, SP_VERB_LAYER_RENAME, -- cgit v1.2.3 From 06b0c9af0d579d4c9005bc8acf456288d7bea196 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sat, 28 Apr 2012 18:17:05 +0200 Subject: Changed Makefile plus some minor tab vs. spaces fixes (bzr r11073.1.22) --- src/ui/dialog/Makefile_insert | 5 +++++ src/ui/dialog/gridarrangetab.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ui/dialog/Makefile_insert b/src/ui/dialog/Makefile_insert index f8b95247a..34cceae54 100644 --- a/src/ui/dialog/Makefile_insert +++ b/src/ui/dialog/Makefile_insert @@ -5,6 +5,7 @@ ink_common_sources += \ ui/dialog/aboutbox.h \ ui/dialog/align-and-distribute.cpp \ ui/dialog/align-and-distribute.h \ + ui/dialog/arrangetab.h \ ui/dialog/behavior.h \ ui/dialog/calligraphic-profile-rename.h \ ui/dialog/calligraphic-profile-rename.cpp \ @@ -48,6 +49,8 @@ ink_common_sources += \ ui/dialog/floating-behavior.h \ ui/dialog/glyphs.cpp \ ui/dialog/glyphs.h \ + ui/dialog/gridarrangetab.h \ + ui/dialog/gridarrangetab.cpp \ ui/dialog/guides.cpp \ ui/dialog/guides.h \ ui/dialog/icon-preview.cpp \ @@ -75,6 +78,8 @@ ink_common_sources += \ ui/dialog/object-properties.cpp \ ui/dialog/object-properties.h \ ui/dialog/panel-dialog.h \ + ui/dialog/polararrangetab.cpp \ + ui/dialog/polararrangetab.h \ ui/dialog/print.cpp \ ui/dialog/print.h \ ui/dialog/print-colors-preview-dialog.cpp \ diff --git a/src/ui/dialog/gridarrangetab.h b/src/ui/dialog/gridarrangetab.h index bc82258b8..16780e55f 100644 --- a/src/ui/dialog/gridarrangetab.h +++ b/src/ui/dialog/gridarrangetab.h @@ -36,7 +36,7 @@ class ArrangeDialog; */ class GridArrangeTab : public ArrangeTab { public: - GridArrangeTab(ArrangeDialog *parent); + GridArrangeTab(ArrangeDialog *parent); virtual ~GridArrangeTab() {}; /** -- cgit v1.2.3 From d1cc21d52c7800015a3713603cc0eb0ade15549d Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Tue, 1 May 2012 14:16:34 +0200 Subject: Added translation support code (_(), C_()) to the polar arrange tab. (bzr r11073.1.23) --- src/ui/dialog/polararrangetab.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp index d36a78759..26a163b1c 100644 --- a/src/ui/dialog/polararrangetab.cpp +++ b/src/ui/dialog/polararrangetab.cpp @@ -39,38 +39,38 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) angleY("", "Starting angle", UNIT_TYPE_RADIAL), angleX("", "End angle", angleY) { - anchorPointLabel.set_text("Anchor point:"); + anchorPointLabel.set_text(C_("Polar arrange tab", "Anchor point:")); anchorPointLabel.set_alignment(Gtk::ALIGN_START); pack_start(anchorPointLabel, false, false); - anchorBoundingBoxRadio.set_label("Object's bounding box:"); + anchorBoundingBoxRadio.set_label(C_("Polar arrange tab", "Object's bounding box:")); anchorRadioGroup = anchorBoundingBoxRadio.get_group(); anchorBoundingBoxRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); pack_start(anchorBoundingBoxRadio, false, false); pack_start(anchorSelector, false, false); - anchorObjectPivotRadio.set_label("Object's rotational center"); + anchorObjectPivotRadio.set_label(C_("Polar arrange tab", "Object's rotational center")); anchorObjectPivotRadio.set_group(anchorRadioGroup); anchorObjectPivotRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); pack_start(anchorObjectPivotRadio, false, false); - arrangeOnLabel.set_text("Arrange on:"); + arrangeOnLabel.set_text(C_("Polar arrange tab", "Arrange on:")); arrangeOnLabel.set_alignment(Gtk::ALIGN_START); pack_start(arrangeOnLabel, false, false); - arrangeOnCircleRadio.set_label("Last selected circle/ellipse/arc"); + arrangeOnCircleRadio.set_label(C_("Polar arrange tab", "Last selected circle/ellipse/arc")); arrangeRadioGroup = arrangeOnCircleRadio.get_group(); arrangeOnCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); pack_start(arrangeOnCircleRadio, false, false); - arrangeOnParametersRadio.set_label("Parameterized:"); + arrangeOnParametersRadio.set_label(C_("Polar arrange tab", "Parameterized:")); arrangeOnParametersRadio.set_group(arrangeRadioGroup); arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); pack_start(arrangeOnParametersRadio, false, false); //FIXME: Objects in grid do not line up properly! - centerLabel.set_text("Center X/Y:"); + centerLabel.set_text(_("Center X/Y:")); parametersTable.attach(centerLabel, 0, 1, 0, 1); centerX.setDigits(2); centerX.set_size_request(60, -1); @@ -85,7 +85,7 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) parametersTable.attach(centerX, 1, 2, 0, 1); parametersTable.attach(centerY, 2, 3, 0, 1); - radiusLabel.set_text("Radius X/Y:"); + radiusLabel.set_text(_("Radius X/Y:")); parametersTable.attach(radiusLabel, 0, 1, 1, 2); radiusX.setDigits(2); radiusX.set_size_request(60, -1); @@ -100,7 +100,7 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) parametersTable.attach(radiusX, 1, 2, 1, 2); parametersTable.attach(radiusY, 2, 3, 1, 2); - angleLabel.set_text("Center X/Y:"); + angleLabel.set_text(_("Center X/Y:")); parametersTable.attach(angleLabel, 0, 1, 2, 3); angleX.setDigits(2); angleX.set_size_request(60, -1); @@ -116,7 +116,7 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) parametersTable.attach(angleY, 2, 3, 2, 3); pack_start(parametersTable, false, false); - rotateObjectsCheckBox.set_label("Rotate objects"); + rotateObjectsCheckBox.set_label(_("Rotate objects")); rotateObjectsCheckBox.set_active(true); pack_start(rotateObjectsCheckBox, false, false); -- cgit v1.2.3 From 52e7e054851153e738c95fef279ef28edf091b85 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Tue, 1 May 2012 14:22:52 +0200 Subject: Fixed keys file in order to reflect the new verb modification I did (bzr r11073.1.24) --- share/keys/default.xml | 2 +- share/keys/inkscape.xml | 2 +- share/keys/macromedia-freehand-mx.xml | 2 +- share/keys/xara.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/share/keys/default.xml b/share/keys/default.xml index 6cbbc3ae5..dcefde98b 100644 --- a/share/keys/default.xml +++ b/share/keys/default.xml @@ -569,7 +569,7 @@ override) the bindings in the main default.xml. - + diff --git a/share/keys/inkscape.xml b/share/keys/inkscape.xml index 72364bec1..c2e20d331 100644 --- a/share/keys/inkscape.xml +++ b/share/keys/inkscape.xml @@ -566,7 +566,7 @@ override) the bindings in the main default.xml. - + diff --git a/share/keys/macromedia-freehand-mx.xml b/share/keys/macromedia-freehand-mx.xml index 9297f4d2b..2e492e584 100644 --- a/share/keys/macromedia-freehand-mx.xml +++ b/share/keys/macromedia-freehand-mx.xml @@ -412,7 +412,7 @@ File, Edit, View, Modify, Text, Xtras, Window, Help. - + diff --git a/share/keys/xara.xml b/share/keys/xara.xml index 43e909011..0e6157531 100644 --- a/share/keys/xara.xml +++ b/share/keys/xara.xml @@ -534,7 +534,7 @@ Hom/end keys-select minimum or maximum feather values - + -- cgit v1.2.3 From d5ff00bb49276d55c53060770d7e79e4950b3906 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Tue, 1 May 2012 16:46:32 +0200 Subject: Got parametrized arrangement to work (bzr r11073.1.25) --- src/ui/dialog/polararrangetab.cpp | 198 ++++++++++++++++++++++++++++++-------- 1 file changed, 156 insertions(+), 42 deletions(-) diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp index 26a163b1c..faad5493b 100644 --- a/src/ui/dialog/polararrangetab.cpp +++ b/src/ui/dialog/polararrangetab.cpp @@ -71,49 +71,49 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) //FIXME: Objects in grid do not line up properly! centerLabel.set_text(_("Center X/Y:")); - parametersTable.attach(centerLabel, 0, 1, 0, 1); + parametersTable.attach(centerLabel, 0, 1, 0, 1, Gtk::FILL); centerX.setDigits(2); - centerX.set_size_request(60, -1); + //centerX.set_size_request(60, -1); centerX.setIncrements(0.2, 0); centerX.setRange(-10000, 10000); centerX.setValue(0, "px"); centerY.setDigits(2); - centerY.set_size_request(120, -1); + //centerY.set_size_request(120, -1); centerY.setIncrements(0.2, 0); centerY.setRange(-10000, 10000); centerY.setValue(0, "px"); - parametersTable.attach(centerX, 1, 2, 0, 1); - parametersTable.attach(centerY, 2, 3, 0, 1); + parametersTable.attach(centerX, 1, 2, 0, 1, Gtk::FILL); + parametersTable.attach(centerY, 2, 3, 0, 1, Gtk::FILL); radiusLabel.set_text(_("Radius X/Y:")); - parametersTable.attach(radiusLabel, 0, 1, 1, 2); + parametersTable.attach(radiusLabel, 0, 1, 1, 2, Gtk::FILL); radiusX.setDigits(2); - radiusX.set_size_request(60, -1); + //radiusX.set_size_request(60, -1); radiusX.setIncrements(0.2, 0); - radiusX.setRange(-10000, 10000); - radiusX.setValue(0, "px"); + radiusX.setRange(0.001, 10000); + radiusX.setValue(100, "px"); radiusY.setDigits(2); - radiusY.set_size_request(120, -1); + //radiusY.set_size_request(120, -1); radiusY.setIncrements(0.2, 0); - radiusY.setRange(-10000, 10000); - radiusY.setValue(0, "px"); - parametersTable.attach(radiusX, 1, 2, 1, 2); - parametersTable.attach(radiusY, 2, 3, 1, 2); + radiusY.setRange(0.001, 10000); + radiusY.setValue(100, "px"); + parametersTable.attach(radiusX, 1, 2, 1, 2, Gtk::FILL); + parametersTable.attach(radiusY, 2, 3, 1, 2, Gtk::FILL); - angleLabel.set_text(_("Center X/Y:")); - parametersTable.attach(angleLabel, 0, 1, 2, 3); + angleLabel.set_text(_("Angle X/Y:")); + parametersTable.attach(angleLabel, 0, 1, 2, 3, Gtk::FILL); angleX.setDigits(2); - angleX.set_size_request(60, -1); + //angleX.set_size_request(60, -1); angleX.setIncrements(0.2, 0); angleX.setRange(-10000, 10000); angleX.setValue(0, "°"); angleY.setDigits(2); - angleY.set_size_request(120, -1); + //angleY.set_size_request(120, -1); angleY.setIncrements(0.2, 0); angleY.setRange(-10000, 10000); - angleY.setValue(0, "°"); - parametersTable.attach(angleX, 1, 2, 2, 3); - parametersTable.attach(angleY, 2, 3, 2, 3); + angleY.setValue(180, "°"); + parametersTable.attach(angleX, 1, 2, 2, 3, Gtk::FILL); + parametersTable.attach(angleY, 2, 3, 2, 3, Gtk::FILL); pack_start(parametersTable, false, false); rotateObjectsCheckBox.set_label(_("Rotate objects")); @@ -128,39 +128,153 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) radiusY.set_sensitive(false); } +void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation) +{ + Geom::Translate const s(center); + Geom::Affine affine = Geom::Affine(s).inverse() * Geom::Affine(rotation) * Geom::Affine(s); + + // Save old center + center = item->getCenter(); + + item->set_i2d_affine(item->i2dt_affine() * affine); + item->doWriteTransform(item->getRepr(), item->transform); + + if(item->isCenterSet()) + { + item->setCenter(center * affine); + item->updateRepr(); + } +} + +float calcAngle(float arcBegin, float arcEnd, int count, int n) +{ + float arcLength = arcEnd - arcBegin; + if(abs(abs(arcLength) - 2*M_PI) > 0.0001) count--; // If not a complete circle, put an object also at the extremes of the arc; + + float angle = n / (float)count; + // Normalize for arcLength: + angle = angle * arcLength; + angle += arcBegin; + + return angle; +} + +Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) +{ + // Parameters for radius equation + float a = ry * cos(angle); + float b = rx * sin(angle); + + float radius = (rx * ry) / sqrtf((a*a) + (b*b)); + + return Geom::Point(cos(angle) * radius + cx, sin(angle) * radius + cy); +} + +Geom::Point getAnchorPoint(int anchor, SPItem *item) +{ + Geom::Point source; + + Geom::OptRect bbox = item->documentVisualBounds(); + + switch(anchor) + { + case 0: // Top - Left + case 3: // Middle - Left + case 6: // Bottom - Left + source[0] = bbox->min()[Geom::X]; + break; + case 1: // Top - Middle + case 4: // Middle - Middle + case 7: // Bottom - Middle + source[0] = (bbox->min()[Geom::X] + bbox->max()[Geom::X]) / 2.0f; + break; + case 2: // Top - Right + case 5: // Middle - Right + case 8: // Bottom - Right + source[0] = bbox->max()[Geom::X]; + break; + }; + + switch(anchor) + { + case 0: // Top - Left + case 1: // Top - Middle + case 2: // Top - Right + source[1] = bbox->min()[Geom::Y]; + break; + case 3: // Middle - Left + case 4: // Middle - Middle + case 5: // Middle - Right + source[1] = (bbox->min()[Geom::Y] + bbox->max()[Geom::Y]) / 2.0f; + break; + case 6: // Bottom - Left + case 7: // Bottom - Middle + case 8: // Bottom - Right + source[1] = bbox->max()[Geom::Y]; + break; + }; + + // If using center + if(anchor == 9) + source = item->getCenter(); + else + { + source[1] -= item->document->getHeight(); + source[1] *= -1; + } + + return source; +} + +void moveToPoint(int anchor, SPItem *item, Geom::Point p) +{ + sp_item_move_rel(item, Geom::Translate(p - getAnchorPoint(anchor, item))); +} + void PolarArrangeTab::arrange() { std::cout << "PolarArrangeTab::arrange()" << std::endl; Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); - const GSList *items = selection->itemList(); - int i = 0; - while(items) - { - SPItem *item = SP_ITEM(items->data); + const GSList *items, *tmp; + tmp = items = selection->itemList(); - float centerx = 1000; - float centery = 2000; + int count = 0; + while(tmp) + { + tmp = tmp->next; + ++count; + } - float radiusx = 1000; - float radiusy = 2000; + // Read options from UI + float cx = centerX.getValue("px"); + float cy = centerY.getValue("px"); + float rx = radiusX.getValue("px"); + float ry = radiusY.getValue("px"); + float arcBeg = angleX.getValue("rad"); + float arcEnd = angleY.getValue("rad"); - float objectx = - item->documentVisualBounds()->min()[Geom::X]; - float objecty = item->documentVisualBounds()->min()[Geom::Y]; + int anchor = 9; + if(anchorBoundingBoxRadio.get_active()) + { + anchor = anchorSelector.getHorizontalAlignment() + + anchorSelector.getVerticalAlignment() * 3; + } - float angle = M_PI / 36 * i; + tmp = items; + int i = 0; + while(tmp) + { + SPItem *item = SP_ITEM(tmp->data); - float r = (radiusx * radiusy) / - sqrtf(powf(radiusy * cos(angle), 2) + powf(radiusx * sin(angle), 2)); - float calcx = cos(angle) * r; - float calcy = sin(angle) * r; + float angle = calcAngle(arcBeg, arcEnd, count, i); + Geom::Point newLocation = calcPoint(cx, cy, rx, ry, angle); - sp_item_move_rel(item, Geom::Translate(objectx + calcx, objecty + calcy)); - sp_item_rotate_rel(item, Geom::Rotate(angle)); + moveToPoint(anchor, item, newLocation); - //item->set_i2d_affine(item->i2dt_affine() * toOrigin * rotation); - //item->doWriteTransform(item->getRepr(), item->transform, NULL); + if(rotateObjectsCheckBox.get_active()) + rotateAround(item, newLocation, Geom::Rotate(angle)); - items = items->next; + tmp = tmp->next; ++i; } } -- cgit v1.2.3 From ad72a653c9ae867201bb36fc41a4e8eb2459d0d5 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Tue, 1 May 2012 17:19:13 +0200 Subject: Added undo support for polar arrangement as well as some minor fixes (bzr r11073.1.26) --- src/ui/dialog/polararrangetab.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp index faad5493b..afb2ce680 100644 --- a/src/ui/dialog/polararrangetab.cpp +++ b/src/ui/dialog/polararrangetab.cpp @@ -149,7 +149,8 @@ void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation float calcAngle(float arcBegin, float arcEnd, int count, int n) { float arcLength = arcEnd - arcBegin; - if(abs(abs(arcLength) - 2*M_PI) > 0.0001) count--; // If not a complete circle, put an object also at the extremes of the arc; + float delta = std::abs(std::abs(arcLength) - 2*M_PI); + if(delta > 0.01) count--; // If not a complete circle, put an object also at the extremes of the arc; float angle = n / (float)count; // Normalize for arcLength: @@ -277,6 +278,9 @@ void PolarArrangeTab::arrange() tmp = tmp->next; ++i; } + + DocumentUndo::done(sp_desktop_document(parent->getDesktop()), SP_VERB_SELECTION_ARRANGE, + _("Arrange on ellipse")); } void PolarArrangeTab::updateSelection() -- cgit v1.2.3 From eb9d9b2480d4549f7887b1dc2a75339062f78895 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Thu, 3 May 2012 16:36:41 +0200 Subject: Now also the "Arrange on last selected circle" option of the polar arrangement works. (bzr r11073.1.27) --- src/ui/dialog/polararrangetab.cpp | 92 +++++++++++++++++++++++++++++++++------ 1 file changed, 79 insertions(+), 13 deletions(-) diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp index afb2ce680..ce78e43a4 100644 --- a/src/ui/dialog/polararrangetab.cpp +++ b/src/ui/dialog/polararrangetab.cpp @@ -23,6 +23,7 @@ #include "sp-item.h" #include "widgets/icon.h" #include "desktop.h" +#include "sp-ellipse.h" #include "sp-item-transform.h" namespace Inkscape { @@ -128,6 +129,12 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) radiusY.set_sensitive(false); } +/** + * This function rotates an item around a given point by a given amount + * @param item item to rotate + * @param center center of the rotation to perform + * @param rotation amount to rotate the object by + */ void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation) { Geom::Translate const s(center); @@ -146,6 +153,15 @@ void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation } } +/** + * Calculates the angle at which to put an object given the total amount + * of objects, the index of the objects as well as the arc start and end + * points + * @param arcBegin angle at which the arc begins + * @param arcEnd angle at which the arc ends + * @param count number of objects in the selection + * @param n index of the object in the selection + */ float calcAngle(float arcBegin, float arcEnd, int count, int n) { float arcLength = arcEnd - arcBegin; @@ -160,6 +176,10 @@ float calcAngle(float arcBegin, float arcEnd, int count, int n) return angle; } +/** + * Calculates the point at which the object needs to be, given the center of the ellipse, + * it's radius (x and y), as well as the angle + */ Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) { // Parameters for radius equation @@ -220,6 +240,7 @@ Geom::Point getAnchorPoint(int anchor, SPItem *item) source = item->getCenter(); else { + // FIXME: source[1] -= item->document->getHeight(); source[1] *= -1; } @@ -235,24 +256,64 @@ void moveToPoint(int anchor, SPItem *item, Geom::Point p) void PolarArrangeTab::arrange() { std::cout << "PolarArrangeTab::arrange()" << std::endl; + Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); const GSList *items, *tmp; tmp = items = selection->itemList(); + SPGenericEllipse *referenceEllipse = NULL; // Last ellipse in selection int count = 0; while(tmp) { + SPItem *item = SP_ITEM(tmp->data); + + // The last selected ellipse is actually the first in list + if(SP_IS_GENERICELLIPSE(item) && referenceEllipse == NULL) + referenceEllipse = SP_GENERICELLIPSE(item); + tmp = tmp->next; ++count; } - // Read options from UI - float cx = centerX.getValue("px"); - float cy = centerY.getValue("px"); - float rx = radiusX.getValue("px"); - float ry = radiusY.getValue("px"); - float arcBeg = angleX.getValue("rad"); - float arcEnd = angleY.getValue("rad"); + float cx, cy; // Center of the ellipse + float rx, ry; // Radiuses of the ellipse in x and y direction + float arcBeg, arcEnd; // begin and end angles for arcs + Geom::Affine transformation; // Any additional transformation to apply to the objects + + if(arrangeOnCircleRadio.get_active()) + { + if(referenceEllipse == NULL) + { + Gtk::MessageDialog dialog(_("Couldn't find an ellipse in selection"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); + dialog.run(); + return; + } else { + cx = referenceEllipse->cx.value; + cy = referenceEllipse->cy.value; + rx = referenceEllipse->rx.value; + ry = referenceEllipse->ry.value; + arcBeg = referenceEllipse->start; + arcEnd = referenceEllipse->end; + transformation = referenceEllipse->i2dt_affine(); + + // We decrement the count by 1 as we are not going to lay + // out the reference ellipse + --count; + } + + } else { + // Read options from UI + cx = centerX.getValue("px"); + cy = centerY.getValue("px"); + rx = radiusX.getValue("px"); + ry = radiusY.getValue("px"); + arcBeg = angleX.getValue("rad"); + arcEnd = angleY.getValue("rad"); + transformation.setIdentity(); + referenceEllipse = NULL; + } + + int anchor = 9; if(anchorBoundingBoxRadio.get_active()) @@ -267,16 +328,21 @@ void PolarArrangeTab::arrange() { SPItem *item = SP_ITEM(tmp->data); - float angle = calcAngle(arcBeg, arcEnd, count, i); - Geom::Point newLocation = calcPoint(cx, cy, rx, ry, angle); + // Ignore the reference ellipse if any + if(item != referenceEllipse) + { + float angle = calcAngle(arcBeg, arcEnd, count, i); + Geom::Point newLocation = calcPoint(cx, cy, rx, ry, angle) * transformation; + + moveToPoint(anchor, item, newLocation); - moveToPoint(anchor, item, newLocation); + if(rotateObjectsCheckBox.get_active()) + rotateAround(item, newLocation, Geom::Rotate(angle)); - if(rotateObjectsCheckBox.get_active()) - rotateAround(item, newLocation, Geom::Rotate(angle)); + ++i; + } tmp = tmp->next; - ++i; } DocumentUndo::done(sp_desktop_document(parent->getDesktop()), SP_VERB_SELECTION_ARRANGE, -- cgit v1.2.3 From 822480f5f68d7a1cd6aea9f4031f98b33980215e Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sat, 5 May 2012 15:31:09 +0200 Subject: Fixed some math, so that the objects now line up correctly (bzr r11073.1.28) --- src/ui/dialog/polararrangetab.cpp | 70 ++++++++++++++++++++++++++------------- src/ui/dialog/polararrangetab.h | 3 +- 2 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp index ce78e43a4..6968be35a 100644 --- a/src/ui/dialog/polararrangetab.cpp +++ b/src/ui/dialog/polararrangetab.cpp @@ -60,10 +60,15 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) arrangeOnLabel.set_alignment(Gtk::ALIGN_START); pack_start(arrangeOnLabel, false, false); - arrangeOnCircleRadio.set_label(C_("Polar arrange tab", "Last selected circle/ellipse/arc")); - arrangeRadioGroup = arrangeOnCircleRadio.get_group(); - arrangeOnCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); - pack_start(arrangeOnCircleRadio, false, false); + arrangeOnFirstCircleRadio.set_label(C_("Polar arrange tab", "First selected circle/ellipse/arc")); + arrangeRadioGroup = arrangeOnFirstCircleRadio.get_group(); + arrangeOnFirstCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnFirstCircleRadio, false, false); + + arrangeOnLastCircleRadio.set_label(C_("Polar arrange tab", "Last selected circle/ellipse/arc")); + arrangeOnLastCircleRadio.set_group(arrangeRadioGroup); + arrangeOnLastCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnLastCircleRadio, false, false); arrangeOnParametersRadio.set_label(C_("Polar arrange tab", "Parameterized:")); arrangeOnParametersRadio.set_group(arrangeRadioGroup); @@ -182,15 +187,16 @@ float calcAngle(float arcBegin, float arcEnd, int count, int n) */ Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) { - // Parameters for radius equation - float a = ry * cos(angle); - float b = rx * sin(angle); - - float radius = (rx * ry) / sqrtf((a*a) + (b*b)); - - return Geom::Point(cos(angle) * radius + cx, sin(angle) * radius + cy); + return Geom::Point(cx + cos(angle) * rx, cy + sin(angle) * ry); } +/** + * Returns the selected anchor point in document coordinates. If anchor + * is 0 to 8, then a bounding box point has been choosen. If it is 9 however + * the rotational center is chosen. + * @todo still using a hack to get the real coordinate space (subtracting document height + * and inverting axes) + */ Geom::Point getAnchorPoint(int anchor, SPItem *item) { Geom::Point source; @@ -262,15 +268,27 @@ void PolarArrangeTab::arrange() tmp = items = 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) { - SPItem *item = SP_ITEM(tmp->data); - - // The last selected ellipse is actually the first in list - if(SP_IS_GENERICELLIPSE(item) && referenceEllipse == NULL) - referenceEllipse = SP_GENERICELLIPSE(item); - + if(arrangeOnEllipse) + { + SPItem *item = SP_ITEM(tmp->data); + + if(arrangeOnFirstEllipse) + { + // The first selected ellipse is actually the last one in the list + if(SP_IS_GENERICELLIPSE(item)) + referenceEllipse = SP_GENERICELLIPSE(item); + } else { + // The last selected ellipse is actually the first in list + if(SP_IS_GENERICELLIPSE(item) && referenceEllipse == NULL) + referenceEllipse = SP_GENERICELLIPSE(item); + } + } tmp = tmp->next; ++count; } @@ -280,7 +298,7 @@ void PolarArrangeTab::arrange() float arcBeg, arcEnd; // begin and end angles for arcs Geom::Affine transformation; // Any additional transformation to apply to the objects - if(arrangeOnCircleRadio.get_active()) + if(arrangeOnEllipse) { if(referenceEllipse == NULL) { @@ -294,6 +312,8 @@ void PolarArrangeTab::arrange() ry = referenceEllipse->ry.value; arcBeg = referenceEllipse->start; arcEnd = referenceEllipse->end; + + std::cout << "Arc: " << arcBeg << ", " << arcEnd << std::endl; transformation = referenceEllipse->i2dt_affine(); // We decrement the count by 1 as we are not going to lay @@ -313,8 +333,6 @@ void PolarArrangeTab::arrange() referenceEllipse = NULL; } - - int anchor = 9; if(anchorBoundingBoxRadio.get_active()) { @@ -322,6 +340,8 @@ void PolarArrangeTab::arrange() anchorSelector.getVerticalAlignment() * 3; } + Geom::Point realCenter = Geom::Point(cx, cy) * transformation; + tmp = items; int i = 0; while(tmp) @@ -336,12 +356,16 @@ void PolarArrangeTab::arrange() moveToPoint(anchor, item, newLocation); - if(rotateObjectsCheckBox.get_active()) + if(rotateObjectsCheckBox.get_active()) { + // Calculate the angle by which to rotate each object + angle = -atan2f(newLocation.x() - realCenter.x(), newLocation.y() - realCenter.y()); rotateAround(item, newLocation, Geom::Rotate(angle)); + } + + std::cout << "object " << i << " out of " << count << ": " << angle << std::endl; ++i; } - tmp = tmp->next; } @@ -355,7 +379,7 @@ void PolarArrangeTab::updateSelection() void PolarArrangeTab::on_arrange_radio_changed() { - bool arrangeParametric = !arrangeOnCircleRadio.get_active(); + bool arrangeParametric = arrangeOnParametersRadio.get_active(); centerX.set_sensitive(arrangeParametric); centerY.set_sensitive(arrangeParametric); diff --git a/src/ui/dialog/polararrangetab.h b/src/ui/dialog/polararrangetab.h index 81b7de4d9..24760a8bc 100644 --- a/src/ui/dialog/polararrangetab.h +++ b/src/ui/dialog/polararrangetab.h @@ -57,7 +57,8 @@ private: Gtk::Label arrangeOnLabel; Gtk::RadioButtonGroup arrangeRadioGroup; - Gtk::RadioButton arrangeOnCircleRadio; + Gtk::RadioButton arrangeOnFirstCircleRadio; + Gtk::RadioButton arrangeOnLastCircleRadio; Gtk::RadioButton arrangeOnParametersRadio; Gtk::Table parametersTable; -- cgit v1.2.3 From 71d330c244fa7da51136dee09c2132814e84fdcf Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Wed, 9 May 2012 16:50:16 +0200 Subject: Fixed runtime assertion about Parent beeing Null (bzr r11073.1.30) --- src/ui/dialog/tile.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 879c9182f..917544d3d 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -40,7 +40,6 @@ ArrangeDialog::ArrangeDialog() _arrangeButton = this->addResponseButton(C_("Arrange dialog","_Arrange"), GTK_RESPONSE_APPLY); _arrangeButton->set_use_underline(true); _arrangeButton->set_tooltip_text(_("Arrange selected objects")); - _arrangeBox.pack_start(*_arrangeButton); contents->pack_start(_arrangeBox); show_all_children(); } -- cgit v1.2.3 From 2b693f8037ad4b25b368376274811f20f5864c1b Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Wed, 9 May 2012 17:03:55 +0200 Subject: Renamed files to better match coding conventions (bzr r11073.1.31) --- src/ui/CMakeLists.txt | 8 +- src/ui/dialog/Makefile_insert | 8 +- src/ui/dialog/grid-arrange-tab.cpp | 786 ++++++++++++++++++++++++++++++++++++ src/ui/dialog/grid-arrange-tab.h | 147 +++++++ src/ui/dialog/gridarrangetab.cpp | 786 ------------------------------------ src/ui/dialog/gridarrangetab.h | 147 ------- src/ui/dialog/polar-arrange-tab.cpp | 414 +++++++++++++++++++ src/ui/dialog/polar-arrange-tab.h | 87 ++++ src/ui/dialog/polararrangetab.cpp | 414 ------------------- src/ui/dialog/polararrangetab.h | 87 ---- src/ui/dialog/tile.cpp | 4 +- src/ui/widget/anchor-selector.cpp | 19 + src/ui/widget/anchor-selector.h | 19 + 13 files changed, 1482 insertions(+), 1444 deletions(-) create mode 100644 src/ui/dialog/grid-arrange-tab.cpp create mode 100644 src/ui/dialog/grid-arrange-tab.h delete mode 100644 src/ui/dialog/gridarrangetab.cpp delete mode 100644 src/ui/dialog/gridarrangetab.h create mode 100644 src/ui/dialog/polar-arrange-tab.cpp create mode 100644 src/ui/dialog/polar-arrange-tab.h delete mode 100644 src/ui/dialog/polararrangetab.cpp delete mode 100644 src/ui/dialog/polararrangetab.h diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 22f6b2bab..7435720fd 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -43,7 +43,7 @@ set(ui_SRC dialog/find.cpp dialog/floating-behavior.cpp dialog/glyphs.cpp - dialog/gridarrangetab.cpp + dialog/grid-arrange-tab.cpp dialog/guides.cpp dialog/icon-preview.cpp dialog/inkscape-preferences.cpp @@ -57,7 +57,7 @@ set(ui_SRC dialog/object-attributes.cpp dialog/object-properties.cpp dialog/ocaldialogs.cpp - dialog/polararrangetab.cpp + dialog/polar-arrange-tab.cpp dialog/print-colors-preview-dialog.cpp dialog/print.cpp dialog/scriptdialog.cpp @@ -160,7 +160,7 @@ set(ui_SRC dialog/floating-behavior.h dialog/glyphs.h dialog/guides.h - dialog/gridarrangetab.h + dialog/grid-arrange-tab.h dialog/icon-preview.h dialog/inkscape-preferences.h dialog/input.h @@ -174,7 +174,7 @@ set(ui_SRC dialog/object-properties.h dialog/ocaldialogs.h dialog/panel-dialog.h - dialog/polararrangetab.h + dialog/polar-arrange-tab.h dialog/print-colors-preview-dialog.h dialog/print.h dialog/scriptdialog.h diff --git a/src/ui/dialog/Makefile_insert b/src/ui/dialog/Makefile_insert index 34cceae54..53533a08f 100644 --- a/src/ui/dialog/Makefile_insert +++ b/src/ui/dialog/Makefile_insert @@ -49,8 +49,8 @@ ink_common_sources += \ ui/dialog/floating-behavior.h \ ui/dialog/glyphs.cpp \ ui/dialog/glyphs.h \ - ui/dialog/gridarrangetab.h \ - ui/dialog/gridarrangetab.cpp \ + ui/dialog/grid-arrange-tab.h \ + ui/dialog/grid-arrange-tab.cpp \ ui/dialog/guides.cpp \ ui/dialog/guides.h \ ui/dialog/icon-preview.cpp \ @@ -78,8 +78,8 @@ ink_common_sources += \ ui/dialog/object-properties.cpp \ ui/dialog/object-properties.h \ ui/dialog/panel-dialog.h \ - ui/dialog/polararrangetab.cpp \ - ui/dialog/polararrangetab.h \ + ui/dialog/polar-arrange-tab.cpp \ + ui/dialog/polar-arrange-tab.h \ ui/dialog/print.cpp \ ui/dialog/print.h \ ui/dialog/print-colors-preview-dialog.cpp \ diff --git a/src/ui/dialog/grid-arrange-tab.cpp b/src/ui/dialog/grid-arrange-tab.cpp new file mode 100644 index 000000000..54b667ed9 --- /dev/null +++ b/src/ui/dialog/grid-arrange-tab.cpp @@ -0,0 +1,786 @@ +/* + * A simple dialog for creating grid type arrangements of selected objects + * + * Authors: + * Bob Jamison ( based off trace dialog) + * John Cliff + * Other dudes from The Inkscape Organization + * Abhishek Sharma + * Declara Denis + * + * Copyright (C) 2004 Bob Jamison + * Copyright (C) 2004 John Cliff + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ +//#define DEBUG_GRID_ARRANGE 1 + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "ui/dialog/grid-arrange-tab.h" +#include //for GTK_RESPONSE* types +#include +#include +#include <2geom/transforms.h> + +#include "verbs.h" +#include "preferences.h" +#include "inkscape.h" +#include "desktop-handles.h" +#include "selection.h" +#include "document.h" +#include "document-undo.h" +#include "sp-item.h" +#include "widgets/icon.h" +#include "desktop.h" +//#include "sp-item-transform.h" FIXME +#include "ui/dialog/tile.h" // for Inkscape::UI::Dialog::ArrangeDialog + +/* + * Sort items by their x co-ordinates, taking account of y (keeps rows intact) + * + * <0 *elem1 goes before *elem2 + * 0 *elem1 == *elem2 + * >0 *elem1 goes after *elem2 + */ +int sp_compare_x_position(SPItem *first, SPItem *second) +{ + using Geom::X; + using Geom::Y; + + Geom::OptRect a = first->documentVisualBounds(); + Geom::OptRect b = second->documentVisualBounds(); + + if ( !a || !b ) { + // FIXME? + return 0; + } + + double const a_height = a->dimensions()[Y]; + double const b_height = b->dimensions()[Y]; + + bool a_in_b_vert = false; + if ((a->min()[Y] < b->min()[Y] + 0.1) && (a->min()[Y] > b->min()[Y] - b_height)) { + a_in_b_vert = true; + } else if ((b->min()[Y] < a->min()[Y] + 0.1) && (b->min()[Y] > a->min()[Y] - a_height)) { + a_in_b_vert = true; + } else if (b->min()[Y] == a->min()[Y]) { + a_in_b_vert = true; + } else { + a_in_b_vert = false; + } + + if (!a_in_b_vert) { + return -1; + } + if (a_in_b_vert && a->min()[X] > b->min()[X]) { + return 1; + } + if (a_in_b_vert && a->min()[X] < b->min()[X]) { + return -1; + } + return 0; +} + +/* + * Sort items by their y co-ordinates. + */ +int sp_compare_y_position(SPItem *first, SPItem *second) +{ + Geom::OptRect a = first->documentVisualBounds(); + Geom::OptRect b = second->documentVisualBounds(); + + if ( !a || !b ) { + // FIXME? + return 0; + } + + if (a->min()[Geom::Y] > b->min()[Geom::Y]) { + return 1; + } + if (a->min()[Geom::Y] < b->min()[Geom::Y]) { + return -1; + } + + return 0; +} + +namespace Inkscape { +namespace UI { +namespace Dialog { + + +//######################################################################### +//## E V E N T S +//######################################################################### + +/* + * + * This arranges the selection in a grid pattern. + * + */ + +void GridArrangeTab::arrange() +{ + + int cnt,row_cnt,col_cnt,a,row,col; + double grid_left,grid_top,col_width,row_height,paddingx,paddingy,width, height, new_x, new_y,cx,cy; + double total_col_width,total_row_height; + col_width = 0; + row_height = 0; + total_col_width=0; + total_row_height=0; + + // check for correct numbers in the row- and col-spinners + on_col_spinbutton_changed(); + on_row_spinbutton_changed(); + + // set padding to manual values + paddingx = XPadding.getValue("px"); + paddingy = YPadding.getValue("px"); + + std::vector row_heights; + std::vector col_widths; + std::vector row_ys; + std::vector col_xs; + + int NoOfCols = NoOfColsSpinner.get_value_as_int(); + int NoOfRows = NoOfRowsSpinner.get_value_as_int(); + + width = 0; + for (a=0;agetDesktop(); + sp_desktop_document(desktop)->ensureUpToDate(); + + Inkscape::Selection *selection = sp_desktop_selection (desktop); + const GSList *items = selection ? selection->itemList() : 0; + cnt=0; + for (; items != NULL; items = items->next) { + SPItem *item = SP_ITEM(items->data); + Geom::OptRect b = item->documentVisualBounds(); + if (!b) { + continue; + } + + width = b->dimensions()[Geom::X]; + height = b->dimensions()[Geom::Y]; + + cx = b->midpoint()[Geom::X]; + cy = b->midpoint()[Geom::Y]; + + if (b->min()[Geom::X] < grid_left) { + grid_left = b->min()[Geom::X]; + } + if (b->min()[Geom::Y] < grid_top) { + grid_top = b->min()[Geom::Y]; + } + if (width > col_width) { + col_width = width; + } + if (height > row_height) { + row_height = height; + } + } + + + // 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((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); + + + // 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); + Geom::OptRect b = item->documentVisualBounds(); + if (b) { + width = b->dimensions()[Geom::X]; + height = b->dimensions()[Geom::Y]; + if (width > col_widths[(cnt % NoOfCols)]) { + col_widths[(cnt % NoOfCols)] = width; + } + if (height > row_heights[(cnt / NoOfCols)]) { + row_heights[(cnt / NoOfCols)] = height; + } + } + + cnt++; + } + + + /// Make sure the top and left of the grid dont move by compensating for align values. + if (RowHeightButton.get_active()){ + grid_top = grid_top - (((row_height - row_heights[0]) / 2)*(VertAlign)); + } + if (ColumnWidthButton.get_active()){ + grid_left = grid_left - (((col_width - col_widths[0]) /2)*(HorizAlign)); + } + + #ifdef DEBUG_GRID_ARRANGE + g_print("\n cx = %f cy= %f gridleft=%f",cx,cy,grid_left); + #endif + + // Calculate total widths and heights, allowing for columns and rows non uniformly sized. + + if (ColumnWidthButton.get_active()){ + total_col_width = col_width * NoOfCols; + col_widths.clear(); + for (a=0;avisualBounds(); + // Fit to bbox, calculate padding between rows accordingly. + if ( sel_bbox && !SpaceManualRadioButton.get_active() ){ +#ifdef DEBUG_GRID_ARRANGE +g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_height,total_col_width, b.extent(Geom::X), b.extent(Geom::Y)); +#endif + paddingx = (sel_bbox->width() - total_col_width) / (NoOfCols -1); + paddingy = (sel_bbox->height() - total_row_height) / (NoOfRows -1); + } + +/* + Horizontal align - Left = 0 + Centre = 1 + Right = 2 + + Vertical align - Top = 0 + Middle = 1 + Bottom = 2 + + X position is calculated by taking the grids left co-ord, adding the distance to the column, + then adding 1/2 the spacing multiplied by the align variable above, + Y position likewise, takes the top of the grid, adds the y to the current row then adds the padding in to align it. + +*/ + + // Calculate row and column x and y coords required to allow for columns and rows which are non uniformly sized. + + for (a=0;adata); + sorted = sorted->next; + } + + for (; current_row != NULL; current_row = current_row->next) { + SPItem *item=SP_ITEM(current_row->data); + Inkscape::XML::Node *repr = item->getRepr(); + Geom::OptRect b = item->documentVisualBounds(); + Geom::Point min; + if (b) { + width = b->dimensions()[Geom::X]; + height = b->dimensions()[Geom::Y]; + min = b->min(); + } else { + width = height = 0; + min = Geom::Point(0, 0); + } + + row = cnt / NoOfCols; + col = cnt % NoOfCols; + + new_x = grid_left + (((col_widths[col] - width)/2)*HorizAlign) + col_xs[col]; + new_y = grid_top + (((row_heights[row] - height)/2)*VertAlign) + row_ys[row]; + + // signs are inverted between x and y due to y inversion + Geom::Point move = Geom::Point(new_x - min[Geom::X], min[Geom::Y] - new_y); + Geom::Affine const affine = Geom::Affine(Geom::Translate(move)); + item->set_i2d_affine(item->i2dt_affine() * affine); + item->doWriteTransform(repr, item->transform, NULL); + SP_OBJECT (current_row->data)->updateRepr(); + cnt +=1; + } + g_slist_free (current_row); + } + + DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_ARRANGE, + _("Arrange in a grid")); + +} + + +//######################################################################### +//## E V E N T S +//######################################################################### + +/** + * changed value in # of columns spinbox. + */ +void GridArrangeTab::on_row_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + SPDesktop *desktop = Parent->getDesktop(); + + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + g_return_if_fail( selection ); + + GSList const *items = selection->itemList(); + int selcount = g_slist_length((GSList *)items); + + double PerCol = ceil(selcount / NoOfColsSpinner.get_value()); + NoOfRowsSpinner.set_value(PerCol); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/NoOfCols", NoOfColsSpinner.get_value()); + updating=false; +} + +/** + * changed value in # of rows spinbox. + */ +void GridArrangeTab::on_col_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + SPDesktop *desktop = Parent->getDesktop(); + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + g_return_if_fail(selection); + + GSList const *items = selection->itemList(); + int selcount = g_slist_length((GSList *)items); + + double PerRow = ceil(selcount / NoOfRowsSpinner.get_value()); + NoOfColsSpinner.set_value(PerRow); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/NoOfCols", PerRow); + + updating=false; +} + +/** + * changed value in x padding spinbox. + */ +void GridArrangeTab::on_xpad_spinbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/XPad", XPadding.getValue("px")); + +} + +/** + * changed value in y padding spinbox. + */ +void GridArrangeTab::on_ypad_spinbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/YPad", YPadding.getValue("px")); +} + + +/** + * checked/unchecked autosize Rows button. + */ +void GridArrangeTab::on_RowSize_checkbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (RowHeightButton.get_active()) { + prefs->setDouble("/dialogs/gridtiler/AutoRowSize", 20); + } else { + prefs->setDouble("/dialogs/gridtiler/AutoRowSize", -20); + } + RowHeightBox.set_sensitive ( !RowHeightButton.get_active()); +} + +/** + * checked/unchecked autosize Rows button. + */ +void GridArrangeTab::on_ColSize_checkbutton_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (ColumnWidthButton.get_active()) { + prefs->setDouble("/dialogs/gridtiler/AutoColSize", 20); + } else { + prefs->setDouble("/dialogs/gridtiler/AutoColSize", -20); + } + ColumnWidthBox.set_sensitive ( !ColumnWidthButton.get_active()); +} + +/** + * changed value in columns spinbox. + */ +void GridArrangeTab::on_rowSize_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/RowHeight", RowHeightSpinner.get_value()); + updating=false; + +} + +/** + * changed value in rows spinbox. + */ +void GridArrangeTab::on_colSize_spinbutton_changed() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + // in turn, prevent listener from responding + updating = true; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/dialogs/gridtiler/ColWidth", ColumnWidthSpinner.get_value()); + updating=false; + +} + +/** + * changed Radio button in Spacing group. + */ +void GridArrangeTab::Spacing_button_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (SpaceManualRadioButton.get_active()) { + prefs->setDouble("/dialogs/gridtiler/SpacingType", 20); + } else { + prefs->setDouble("/dialogs/gridtiler/SpacingType", -20); + } + + XPadding.set_sensitive ( SpaceManualRadioButton.get_active()); + YPadding.set_sensitive ( SpaceManualRadioButton.get_active()); +} + +/** + * changed Anchor selection widget. + */ +void GridArrangeTab::Align_changed() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + VertAlign = AlignmentSelector.getVerticalAlignment(); + prefs->setInt("/dialogs/gridtiler/VertAlign", VertAlign); + HorizAlign = AlignmentSelector.getHorizontalAlignment(); + prefs->setInt("/dialogs/gridtiler/HorizAlign", HorizAlign); +} + +/** + * Desktop selection changed + */ +void GridArrangeTab::updateSelection() +{ + // quit if run by the attr_changed listener + if (updating) { + return; + } + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + // in turn, prevent listener from responding + updating = true; + SPDesktop *desktop = Parent->getDesktop(); + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + GSList const *items = selection ? selection->itemList() : 0; + + if (items) { + int selcount = g_slist_length((GSList *)items); + + if (NoOfColsSpinner.get_value() > 1 && NoOfRowsSpinner.get_value() > 1){ + // Update the number of rows assuming number of columns wanted remains same. + double NoOfRows = ceil(selcount / NoOfColsSpinner.get_value()); + NoOfRowsSpinner.set_value(NoOfRows); + + // if the selection has less than the number set for one row, reduce it appropriately + if (selcount < NoOfColsSpinner.get_value()) { + double NoOfCols = ceil(selcount / NoOfRowsSpinner.get_value()); + NoOfColsSpinner.set_value(NoOfCols); + prefs->setInt("/dialogs/gridtiler/NoOfCols", NoOfCols); + } + } else { + double PerRow = ceil(sqrt(selcount)); + double PerCol = ceil(sqrt(selcount)); + NoOfRowsSpinner.set_value(PerRow); + NoOfColsSpinner.set_value(PerCol); + prefs->setInt("/dialogs/gridtiler/NoOfCols", static_cast(PerCol)); + } + } + + updating = false; +} + + + +/*########################## +## Experimental +##########################*/ + +static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg) +{ + dlg->updateSelection(); +} + + +//######################################################################### +//## C O N S T R U C T O R / D E S T R U C T O R +//######################################################################### +/** + * Constructor + */ +GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) + : Parent(parent), + XPadding(_("X:"), _("Horizontal spacing between columns."), UNIT_TYPE_LINEAR, "", "object-columns"), + YPadding(_("Y:"), _("Vertical spacing between rows."), XPadding, "", "object-rows") +{ + // bool used by spin button callbacks to stop loops where they change each other. + updating = false; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + + // could not do this in gtkmm - there's no Gtk::SizeGroup public constructor (!) + GtkSizeGroup *_col1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + GtkSizeGroup *_col2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + GtkSizeGroup *_col3 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); + + { + // Selection Change signal + g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (updateSelectionCallback), this); + } + + Gtk::Box *contents = this; + +#define MARGIN 2 + + //##Set up the panel + + SPDesktop *desktop = Parent->getDesktop(); + + Inkscape::Selection *selection = desktop ? desktop->selection : 0; + g_return_if_fail( selection ); + int selcount = 1; + if (!selection->isEmpty()) { + GSList const *items = selection->itemList(); + selcount = g_slist_length((GSList *)items); + } + + + /*#### Number of Rows ####*/ + + double PerRow = ceil(sqrt(selcount)); + double PerCol = ceil(sqrt(selcount)); + + #ifdef DEBUG_GRID_ARRANGE + g_print("/n PerRox = %f PerCol = %f selcount = %d",PerRow,PerCol,selcount); + #endif + + NoOfRowsLabel.set_text_with_mnemonic(_("_Rows:")); + NoOfRowsLabel.set_mnemonic_widget(NoOfRowsSpinner); + NoOfRowsBox.pack_start(NoOfRowsLabel, false, false, MARGIN); + + NoOfRowsSpinner.set_digits(0); + NoOfRowsSpinner.set_increments(1, 0); + NoOfRowsSpinner.set_range(1.0, 10000.0); + NoOfRowsSpinner.set_value(PerCol); + NoOfRowsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_col_spinbutton_changed)); + NoOfRowsSpinner.set_tooltip_text(_("Number of rows")); + NoOfRowsBox.pack_start(NoOfRowsSpinner, false, false, MARGIN); + gtk_size_group_add_widget(_col1, (GtkWidget *) NoOfRowsBox.gobj()); + + RowHeightButton.set_label(_("Equal _height")); + RowHeightButton.set_use_underline(true); + double AutoRow = prefs->getDouble("/dialogs/gridtiler/AutoRowSize", 15); + if (AutoRow>0) + AutoRowSize=true; + else + AutoRowSize=false; + RowHeightButton.set_active(AutoRowSize); + + NoOfRowsBox.pack_start(RowHeightButton, false, false, MARGIN); + + RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); + RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_RowSize_checkbutton_changed)); + + SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); + + + /*#### Label for X ####*/ + padXByYLabel.set_label(" "); + XByYLabelVBox.pack_start(padXByYLabel, false, false, MARGIN); + XByYLabel.set_markup(" × "); + XByYLabelVBox.pack_start(XByYLabel, false, false, MARGIN); + SpinsHBox.pack_start(XByYLabelVBox, false, false, MARGIN); + gtk_size_group_add_widget(_col2, (GtkWidget *) XByYLabelVBox.gobj()); + + /*#### Number of columns ####*/ + + NoOfColsLabel.set_text_with_mnemonic(_("_Columns:")); + NoOfColsLabel.set_mnemonic_widget(NoOfColsSpinner); + NoOfColsBox.pack_start(NoOfColsLabel, false, false, MARGIN); + + NoOfColsSpinner.set_digits(0); + NoOfColsSpinner.set_increments(1, 0); + NoOfColsSpinner.set_range(1.0, 10000.0); + NoOfColsSpinner.set_value(PerRow); + NoOfColsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_row_spinbutton_changed)); + NoOfColsSpinner.set_tooltip_text(_("Number of columns")); + NoOfColsBox.pack_start(NoOfColsSpinner, false, false, MARGIN); + gtk_size_group_add_widget(_col3, (GtkWidget *) NoOfColsBox.gobj()); + + ColumnWidthButton.set_label(_("Equal _width")); + ColumnWidthButton.set_use_underline(true); + double AutoCol = prefs->getDouble("/dialogs/gridtiler/AutoColSize", 15); + if (AutoCol>0) + AutoColSize=true; + else + AutoColSize=false; + ColumnWidthButton.set_active(AutoColSize); + NoOfColsBox.pack_start(ColumnWidthButton, false, false, MARGIN); + + ColumnWidthButton.set_tooltip_text(_("If not set, each column has the width of the widest object in it")); + ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ColSize_checkbutton_changed)); + + SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); + + TileBox.pack_start(SpinsHBox, false, false, MARGIN); + + VertAlign = prefs->getInt("/dialogs/gridtiler/VertAlign", 1); + HorizAlign = prefs->getInt("/dialogs/gridtiler/HorizAlign", 1); + + // Anchor selection widget + AlignLabel.set_label("Alignment:"); + AlignLabel.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); + AlignmentSelector.setAlignment(HorizAlign, VertAlign); + AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); + TileBox.pack_start(AlignLabel, false, false, MARGIN); + TileBox.pack_start(AlignmentSelector, true, false, MARGIN); + + { + /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ + SpaceByBBoxRadioButton.set_label(_("_Fit into selection box")); + SpaceByBBoxRadioButton.set_use_underline (true); + SpaceByBBoxRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); + SpacingGroup = SpaceByBBoxRadioButton.get_group(); + + SpacingVBox.pack_start(SpaceByBBoxRadioButton, false, false, MARGIN); + + SpaceManualRadioButton.set_label(_("_Set spacing:")); + SpaceManualRadioButton.set_use_underline (true); + SpaceManualRadioButton.set_group(SpacingGroup); + SpaceManualRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); + SpacingVBox.pack_start(SpaceManualRadioButton, false, false, MARGIN); + + TileBox.pack_start(SpacingVBox, false, false, MARGIN); + } + + { + /*#### Padding ####*/ + + YPadding.setDigits(5); + YPadding.setIncrements(0.2, 0); + YPadding.setRange(-10000, 10000); + double yPad = prefs->getDouble("/dialogs/gridtiler/YPad", 15); + YPadding.setValue(yPad, "px"); + YPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ypad_spinbutton_changed)); + + XPadding.setDigits(5); + XPadding.setIncrements(0.2, 0); + XPadding.setRange(-10000, 10000); + double xPad = prefs->getDouble("/dialogs/gridtiler/XPad", 15); + XPadding.setValue(xPad, "px"); + + XPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_xpad_spinbutton_changed)); + } + TileBox.pack_start(XPadding, false, false, MARGIN); + TileBox.pack_start(YPadding, false, false, MARGIN); + + contents->pack_start(TileBox); + + double SpacingType = prefs->getDouble("/dialogs/gridtiler/SpacingType", 15); + if (SpacingType>0) { + ManualSpacing=true; + } else { + ManualSpacing=false; + } + SpaceManualRadioButton.set_active(ManualSpacing); + SpaceByBBoxRadioButton.set_active(!ManualSpacing); + XPadding.set_sensitive (ManualSpacing); + YPadding.set_sensitive (ManualSpacing); + + //## The OK button FIXME + /*TileOkButton = addResponseButton(C_("Rows and columns dialog","_Arrange"), GTK_RESPONSE_APPLY); + TileOkButton->set_use_underline(true); + TileOkButton->set_tooltip_text(_("Arrange selected objects"));*/ + + show_all_children(); +} + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/grid-arrange-tab.h b/src/ui/dialog/grid-arrange-tab.h new file mode 100644 index 000000000..7e90accf1 --- /dev/null +++ b/src/ui/dialog/grid-arrange-tab.h @@ -0,0 +1,147 @@ +/** + * @brief Arranges Objects into a Grid + */ +/* Authors: + * Bob Jamison ( based off trace dialog) + * John Cliff + * Other dudes from The Inkscape Organization + * Abhishek Sharma + * Declara Denis + * + * Copyright (C) 2004 Bob Jamison + * Copyright (C) 2004 John Cliff + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H +#define INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H + +#include + +#include "ui/dialog/arrangetab.h" + +#include "ui/widget/anchor-selector.h" +#include "ui/widget/scalar-unit.h" +#include "ui/widget/spinbutton.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class ArrangeDialog; + +/** + * Dialog for tiling an object + */ +class GridArrangeTab : public ArrangeTab { +public: + GridArrangeTab(ArrangeDialog *parent); + virtual ~GridArrangeTab() {}; + + /** + * Do the actual work + */ + virtual void arrange(); + + /** + * Respond to selection change + */ + void updateSelection(); + + // Callbacks from spinbuttons + void on_row_spinbutton_changed(); + void on_col_spinbutton_changed(); + void on_xpad_spinbutton_changed(); + void on_ypad_spinbutton_changed(); + void on_RowSize_checkbutton_changed(); + void on_ColSize_checkbutton_changed(); + void on_rowSize_spinbutton_changed(); + void on_colSize_spinbutton_changed(); + void Spacing_button_changed(); + void Align_changed(); + + +private: + GridArrangeTab(GridArrangeTab const &d); // no copy + void operator=(GridArrangeTab const &d); // no assign + + ArrangeDialog *Parent; + + bool userHidden; + bool updating; + + Gtk::VBox TileBox; + Gtk::Button *TileOkButton; + Gtk::Button *TileCancelButton; + + // Number selected label + Gtk::Label SelectionContentsLabel; + + + Gtk::HBox AlignHBox; + Gtk::HBox SpinsHBox; + + // Number per Row + Gtk::VBox NoOfColsBox; + Gtk::Label NoOfColsLabel; + Inkscape::UI::Widget::SpinButton NoOfColsSpinner; + bool AutoRowSize; + Gtk::CheckButton RowHeightButton; + + Gtk::VBox XByYLabelVBox; + Gtk::Label padXByYLabel; + Gtk::Label XByYLabel; + + // Number per Column + Gtk::VBox NoOfRowsBox; + Gtk::Label NoOfRowsLabel; + Inkscape::UI::Widget::SpinButton NoOfRowsSpinner; + bool AutoColSize; + Gtk::CheckButton ColumnWidthButton; + + // Alignment + Gtk::Label AlignLabel; + Inkscape::UI::Widget::AnchorSelector AlignmentSelector; + double VertAlign; + double HorizAlign; + + Inkscape::UI::Widget::ScalarUnit XPadding; + Inkscape::UI::Widget::ScalarUnit YPadding; + + // BBox or manual spacing + Gtk::VBox SpacingVBox; + Gtk::RadioButtonGroup SpacingGroup; + Gtk::RadioButton SpaceByBBoxRadioButton; + Gtk::RadioButton SpaceManualRadioButton; + bool ManualSpacing; + + // Row height + Gtk::VBox RowHeightVBox; + Gtk::HBox RowHeightBox; + Gtk::Label RowHeightLabel; + Inkscape::UI::Widget::SpinButton RowHeightSpinner; + + // Column width + Gtk::VBox ColumnWidthVBox; + Gtk::HBox ColumnWidthBox; + Gtk::Label ColumnWidthLabel; + Inkscape::UI::Widget::SpinButton ColumnWidthSpinner; +}; + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +#endif /* INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/gridarrangetab.cpp b/src/ui/dialog/gridarrangetab.cpp deleted file mode 100644 index fca7c5b0e..000000000 --- a/src/ui/dialog/gridarrangetab.cpp +++ /dev/null @@ -1,786 +0,0 @@ -/* - * A simple dialog for creating grid type arrangements of selected objects - * - * Authors: - * Bob Jamison ( based off trace dialog) - * John Cliff - * Other dudes from The Inkscape Organization - * Abhishek Sharma - * Declara Denis - * - * Copyright (C) 2004 Bob Jamison - * Copyright (C) 2004 John Cliff - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ -//#define DEBUG_GRID_ARRANGE 1 - -#ifdef HAVE_CONFIG_H -# include -#endif - -#include "ui/dialog/gridarrangetab.h" -#include //for GTK_RESPONSE* types -#include -#include -#include <2geom/transforms.h> - -#include "verbs.h" -#include "preferences.h" -#include "inkscape.h" -#include "desktop-handles.h" -#include "selection.h" -#include "document.h" -#include "document-undo.h" -#include "sp-item.h" -#include "widgets/icon.h" -#include "desktop.h" -//#include "sp-item-transform.h" FIXME -#include "ui/dialog/tile.h" // for Inkscape::UI::Dialog::ArrangeDialog - -/* - * Sort items by their x co-ordinates, taking account of y (keeps rows intact) - * - * <0 *elem1 goes before *elem2 - * 0 *elem1 == *elem2 - * >0 *elem1 goes after *elem2 - */ -int sp_compare_x_position(SPItem *first, SPItem *second) -{ - using Geom::X; - using Geom::Y; - - Geom::OptRect a = first->documentVisualBounds(); - Geom::OptRect b = second->documentVisualBounds(); - - if ( !a || !b ) { - // FIXME? - return 0; - } - - double const a_height = a->dimensions()[Y]; - double const b_height = b->dimensions()[Y]; - - bool a_in_b_vert = false; - if ((a->min()[Y] < b->min()[Y] + 0.1) && (a->min()[Y] > b->min()[Y] - b_height)) { - a_in_b_vert = true; - } else if ((b->min()[Y] < a->min()[Y] + 0.1) && (b->min()[Y] > a->min()[Y] - a_height)) { - a_in_b_vert = true; - } else if (b->min()[Y] == a->min()[Y]) { - a_in_b_vert = true; - } else { - a_in_b_vert = false; - } - - if (!a_in_b_vert) { - return -1; - } - if (a_in_b_vert && a->min()[X] > b->min()[X]) { - return 1; - } - if (a_in_b_vert && a->min()[X] < b->min()[X]) { - return -1; - } - return 0; -} - -/* - * Sort items by their y co-ordinates. - */ -int sp_compare_y_position(SPItem *first, SPItem *second) -{ - Geom::OptRect a = first->documentVisualBounds(); - Geom::OptRect b = second->documentVisualBounds(); - - if ( !a || !b ) { - // FIXME? - return 0; - } - - if (a->min()[Geom::Y] > b->min()[Geom::Y]) { - return 1; - } - if (a->min()[Geom::Y] < b->min()[Geom::Y]) { - return -1; - } - - return 0; -} - -namespace Inkscape { -namespace UI { -namespace Dialog { - - -//######################################################################### -//## E V E N T S -//######################################################################### - -/* - * - * This arranges the selection in a grid pattern. - * - */ - -void GridArrangeTab::arrange() -{ - - int cnt,row_cnt,col_cnt,a,row,col; - double grid_left,grid_top,col_width,row_height,paddingx,paddingy,width, height, new_x, new_y,cx,cy; - double total_col_width,total_row_height; - col_width = 0; - row_height = 0; - total_col_width=0; - total_row_height=0; - - // check for correct numbers in the row- and col-spinners - on_col_spinbutton_changed(); - on_row_spinbutton_changed(); - - // set padding to manual values - paddingx = XPadding.getValue("px"); - paddingy = YPadding.getValue("px"); - - std::vector row_heights; - std::vector col_widths; - std::vector row_ys; - std::vector col_xs; - - int NoOfCols = NoOfColsSpinner.get_value_as_int(); - int NoOfRows = NoOfRowsSpinner.get_value_as_int(); - - width = 0; - for (a=0;agetDesktop(); - sp_desktop_document(desktop)->ensureUpToDate(); - - Inkscape::Selection *selection = sp_desktop_selection (desktop); - const GSList *items = selection ? selection->itemList() : 0; - cnt=0; - for (; items != NULL; items = items->next) { - SPItem *item = SP_ITEM(items->data); - Geom::OptRect b = item->documentVisualBounds(); - if (!b) { - continue; - } - - width = b->dimensions()[Geom::X]; - height = b->dimensions()[Geom::Y]; - - cx = b->midpoint()[Geom::X]; - cy = b->midpoint()[Geom::Y]; - - if (b->min()[Geom::X] < grid_left) { - grid_left = b->min()[Geom::X]; - } - if (b->min()[Geom::Y] < grid_top) { - grid_top = b->min()[Geom::Y]; - } - if (width > col_width) { - col_width = width; - } - if (height > row_height) { - row_height = height; - } - } - - - // 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((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); - - - // 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); - Geom::OptRect b = item->documentVisualBounds(); - if (b) { - width = b->dimensions()[Geom::X]; - height = b->dimensions()[Geom::Y]; - if (width > col_widths[(cnt % NoOfCols)]) { - col_widths[(cnt % NoOfCols)] = width; - } - if (height > row_heights[(cnt / NoOfCols)]) { - row_heights[(cnt / NoOfCols)] = height; - } - } - - cnt++; - } - - - /// Make sure the top and left of the grid dont move by compensating for align values. - if (RowHeightButton.get_active()){ - grid_top = grid_top - (((row_height - row_heights[0]) / 2)*(VertAlign)); - } - if (ColumnWidthButton.get_active()){ - grid_left = grid_left - (((col_width - col_widths[0]) /2)*(HorizAlign)); - } - - #ifdef DEBUG_GRID_ARRANGE - g_print("\n cx = %f cy= %f gridleft=%f",cx,cy,grid_left); - #endif - - // Calculate total widths and heights, allowing for columns and rows non uniformly sized. - - if (ColumnWidthButton.get_active()){ - total_col_width = col_width * NoOfCols; - col_widths.clear(); - for (a=0;avisualBounds(); - // Fit to bbox, calculate padding between rows accordingly. - if ( sel_bbox && !SpaceManualRadioButton.get_active() ){ -#ifdef DEBUG_GRID_ARRANGE -g_print("\n row = %f col = %f selection x= %f selection y = %f", total_row_height,total_col_width, b.extent(Geom::X), b.extent(Geom::Y)); -#endif - paddingx = (sel_bbox->width() - total_col_width) / (NoOfCols -1); - paddingy = (sel_bbox->height() - total_row_height) / (NoOfRows -1); - } - -/* - Horizontal align - Left = 0 - Centre = 1 - Right = 2 - - Vertical align - Top = 0 - Middle = 1 - Bottom = 2 - - X position is calculated by taking the grids left co-ord, adding the distance to the column, - then adding 1/2 the spacing multiplied by the align variable above, - Y position likewise, takes the top of the grid, adds the y to the current row then adds the padding in to align it. - -*/ - - // Calculate row and column x and y coords required to allow for columns and rows which are non uniformly sized. - - for (a=0;adata); - sorted = sorted->next; - } - - for (; current_row != NULL; current_row = current_row->next) { - SPItem *item=SP_ITEM(current_row->data); - Inkscape::XML::Node *repr = item->getRepr(); - Geom::OptRect b = item->documentVisualBounds(); - Geom::Point min; - if (b) { - width = b->dimensions()[Geom::X]; - height = b->dimensions()[Geom::Y]; - min = b->min(); - } else { - width = height = 0; - min = Geom::Point(0, 0); - } - - row = cnt / NoOfCols; - col = cnt % NoOfCols; - - new_x = grid_left + (((col_widths[col] - width)/2)*HorizAlign) + col_xs[col]; - new_y = grid_top + (((row_heights[row] - height)/2)*VertAlign) + row_ys[row]; - - // signs are inverted between x and y due to y inversion - Geom::Point move = Geom::Point(new_x - min[Geom::X], min[Geom::Y] - new_y); - Geom::Affine const affine = Geom::Affine(Geom::Translate(move)); - item->set_i2d_affine(item->i2dt_affine() * affine); - item->doWriteTransform(repr, item->transform, NULL); - SP_OBJECT (current_row->data)->updateRepr(); - cnt +=1; - } - g_slist_free (current_row); - } - - DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_ARRANGE, - _("Arrange in a grid")); - -} - - -//######################################################################### -//## E V E N T S -//######################################################################### - -/** - * changed value in # of columns spinbox. - */ -void GridArrangeTab::on_row_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - SPDesktop *desktop = Parent->getDesktop(); - - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - g_return_if_fail( selection ); - - GSList const *items = selection->itemList(); - int selcount = g_slist_length((GSList *)items); - - double PerCol = ceil(selcount / NoOfColsSpinner.get_value()); - NoOfRowsSpinner.set_value(PerCol); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/NoOfCols", NoOfColsSpinner.get_value()); - updating=false; -} - -/** - * changed value in # of rows spinbox. - */ -void GridArrangeTab::on_col_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - SPDesktop *desktop = Parent->getDesktop(); - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - g_return_if_fail(selection); - - GSList const *items = selection->itemList(); - int selcount = g_slist_length((GSList *)items); - - double PerRow = ceil(selcount / NoOfRowsSpinner.get_value()); - NoOfColsSpinner.set_value(PerRow); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/NoOfCols", PerRow); - - updating=false; -} - -/** - * changed value in x padding spinbox. - */ -void GridArrangeTab::on_xpad_spinbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/XPad", XPadding.getValue("px")); - -} - -/** - * changed value in y padding spinbox. - */ -void GridArrangeTab::on_ypad_spinbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/YPad", YPadding.getValue("px")); -} - - -/** - * checked/unchecked autosize Rows button. - */ -void GridArrangeTab::on_RowSize_checkbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (RowHeightButton.get_active()) { - prefs->setDouble("/dialogs/gridtiler/AutoRowSize", 20); - } else { - prefs->setDouble("/dialogs/gridtiler/AutoRowSize", -20); - } - RowHeightBox.set_sensitive ( !RowHeightButton.get_active()); -} - -/** - * checked/unchecked autosize Rows button. - */ -void GridArrangeTab::on_ColSize_checkbutton_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (ColumnWidthButton.get_active()) { - prefs->setDouble("/dialogs/gridtiler/AutoColSize", 20); - } else { - prefs->setDouble("/dialogs/gridtiler/AutoColSize", -20); - } - ColumnWidthBox.set_sensitive ( !ColumnWidthButton.get_active()); -} - -/** - * changed value in columns spinbox. - */ -void GridArrangeTab::on_rowSize_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/RowHeight", RowHeightSpinner.get_value()); - updating=false; - -} - -/** - * changed value in rows spinbox. - */ -void GridArrangeTab::on_colSize_spinbutton_changed() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - // in turn, prevent listener from responding - updating = true; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setDouble("/dialogs/gridtiler/ColWidth", ColumnWidthSpinner.get_value()); - updating=false; - -} - -/** - * changed Radio button in Spacing group. - */ -void GridArrangeTab::Spacing_button_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - if (SpaceManualRadioButton.get_active()) { - prefs->setDouble("/dialogs/gridtiler/SpacingType", 20); - } else { - prefs->setDouble("/dialogs/gridtiler/SpacingType", -20); - } - - XPadding.set_sensitive ( SpaceManualRadioButton.get_active()); - YPadding.set_sensitive ( SpaceManualRadioButton.get_active()); -} - -/** - * changed Anchor selection widget. - */ -void GridArrangeTab::Align_changed() -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - VertAlign = AlignmentSelector.getVerticalAlignment(); - prefs->setInt("/dialogs/gridtiler/VertAlign", VertAlign); - HorizAlign = AlignmentSelector.getHorizontalAlignment(); - prefs->setInt("/dialogs/gridtiler/HorizAlign", HorizAlign); -} - -/** - * Desktop selection changed - */ -void GridArrangeTab::updateSelection() -{ - // quit if run by the attr_changed listener - if (updating) { - return; - } - - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - // in turn, prevent listener from responding - updating = true; - SPDesktop *desktop = Parent->getDesktop(); - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - GSList const *items = selection ? selection->itemList() : 0; - - if (items) { - int selcount = g_slist_length((GSList *)items); - - if (NoOfColsSpinner.get_value() > 1 && NoOfRowsSpinner.get_value() > 1){ - // Update the number of rows assuming number of columns wanted remains same. - double NoOfRows = ceil(selcount / NoOfColsSpinner.get_value()); - NoOfRowsSpinner.set_value(NoOfRows); - - // if the selection has less than the number set for one row, reduce it appropriately - if (selcount < NoOfColsSpinner.get_value()) { - double NoOfCols = ceil(selcount / NoOfRowsSpinner.get_value()); - NoOfColsSpinner.set_value(NoOfCols); - prefs->setInt("/dialogs/gridtiler/NoOfCols", NoOfCols); - } - } else { - double PerRow = ceil(sqrt(selcount)); - double PerCol = ceil(sqrt(selcount)); - NoOfRowsSpinner.set_value(PerRow); - NoOfColsSpinner.set_value(PerCol); - prefs->setInt("/dialogs/gridtiler/NoOfCols", static_cast(PerCol)); - } - } - - updating = false; -} - - - -/*########################## -## Experimental -##########################*/ - -static void updateSelectionCallback(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, GridArrangeTab *dlg) -{ - dlg->updateSelection(); -} - - -//######################################################################### -//## C O N S T R U C T O R / D E S T R U C T O R -//######################################################################### -/** - * Constructor - */ -GridArrangeTab::GridArrangeTab(ArrangeDialog *parent) - : Parent(parent), - XPadding(_("X:"), _("Horizontal spacing between columns."), UNIT_TYPE_LINEAR, "", "object-columns"), - YPadding(_("Y:"), _("Vertical spacing between rows."), XPadding, "", "object-rows") -{ - // bool used by spin button callbacks to stop loops where they change each other. - updating = false; - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - // could not do this in gtkmm - there's no Gtk::SizeGroup public constructor (!) - GtkSizeGroup *_col1 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - GtkSizeGroup *_col2 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - GtkSizeGroup *_col3 = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL); - - { - // Selection Change signal - g_signal_connect ( G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (updateSelectionCallback), this); - } - - Gtk::Box *contents = this; - -#define MARGIN 2 - - //##Set up the panel - - SPDesktop *desktop = Parent->getDesktop(); - - Inkscape::Selection *selection = desktop ? desktop->selection : 0; - g_return_if_fail( selection ); - int selcount = 1; - if (!selection->isEmpty()) { - GSList const *items = selection->itemList(); - selcount = g_slist_length((GSList *)items); - } - - - /*#### Number of Rows ####*/ - - double PerRow = ceil(sqrt(selcount)); - double PerCol = ceil(sqrt(selcount)); - - #ifdef DEBUG_GRID_ARRANGE - g_print("/n PerRox = %f PerCol = %f selcount = %d",PerRow,PerCol,selcount); - #endif - - NoOfRowsLabel.set_text_with_mnemonic(_("_Rows:")); - NoOfRowsLabel.set_mnemonic_widget(NoOfRowsSpinner); - NoOfRowsBox.pack_start(NoOfRowsLabel, false, false, MARGIN); - - NoOfRowsSpinner.set_digits(0); - NoOfRowsSpinner.set_increments(1, 0); - NoOfRowsSpinner.set_range(1.0, 10000.0); - NoOfRowsSpinner.set_value(PerCol); - NoOfRowsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_col_spinbutton_changed)); - NoOfRowsSpinner.set_tooltip_text(_("Number of rows")); - NoOfRowsBox.pack_start(NoOfRowsSpinner, false, false, MARGIN); - gtk_size_group_add_widget(_col1, (GtkWidget *) NoOfRowsBox.gobj()); - - RowHeightButton.set_label(_("Equal _height")); - RowHeightButton.set_use_underline(true); - double AutoRow = prefs->getDouble("/dialogs/gridtiler/AutoRowSize", 15); - if (AutoRow>0) - AutoRowSize=true; - else - AutoRowSize=false; - RowHeightButton.set_active(AutoRowSize); - - NoOfRowsBox.pack_start(RowHeightButton, false, false, MARGIN); - - RowHeightButton.set_tooltip_text(_("If not set, each row has the height of the tallest object in it")); - RowHeightButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_RowSize_checkbutton_changed)); - - SpinsHBox.pack_start(NoOfRowsBox, false, false, MARGIN); - - - /*#### Label for X ####*/ - padXByYLabel.set_label(" "); - XByYLabelVBox.pack_start(padXByYLabel, false, false, MARGIN); - XByYLabel.set_markup(" × "); - XByYLabelVBox.pack_start(XByYLabel, false, false, MARGIN); - SpinsHBox.pack_start(XByYLabelVBox, false, false, MARGIN); - gtk_size_group_add_widget(_col2, (GtkWidget *) XByYLabelVBox.gobj()); - - /*#### Number of columns ####*/ - - NoOfColsLabel.set_text_with_mnemonic(_("_Columns:")); - NoOfColsLabel.set_mnemonic_widget(NoOfColsSpinner); - NoOfColsBox.pack_start(NoOfColsLabel, false, false, MARGIN); - - NoOfColsSpinner.set_digits(0); - NoOfColsSpinner.set_increments(1, 0); - NoOfColsSpinner.set_range(1.0, 10000.0); - NoOfColsSpinner.set_value(PerRow); - NoOfColsSpinner.signal_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_row_spinbutton_changed)); - NoOfColsSpinner.set_tooltip_text(_("Number of columns")); - NoOfColsBox.pack_start(NoOfColsSpinner, false, false, MARGIN); - gtk_size_group_add_widget(_col3, (GtkWidget *) NoOfColsBox.gobj()); - - ColumnWidthButton.set_label(_("Equal _width")); - ColumnWidthButton.set_use_underline(true); - double AutoCol = prefs->getDouble("/dialogs/gridtiler/AutoColSize", 15); - if (AutoCol>0) - AutoColSize=true; - else - AutoColSize=false; - ColumnWidthButton.set_active(AutoColSize); - NoOfColsBox.pack_start(ColumnWidthButton, false, false, MARGIN); - - ColumnWidthButton.set_tooltip_text(_("If not set, each column has the width of the widest object in it")); - ColumnWidthButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ColSize_checkbutton_changed)); - - SpinsHBox.pack_start(NoOfColsBox, false, false, MARGIN); - - TileBox.pack_start(SpinsHBox, false, false, MARGIN); - - VertAlign = prefs->getInt("/dialogs/gridtiler/VertAlign", 1); - HorizAlign = prefs->getInt("/dialogs/gridtiler/HorizAlign", 1); - - // Anchor selection widget - AlignLabel.set_label("Alignment:"); - AlignLabel.set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER); - AlignmentSelector.setAlignment(HorizAlign, VertAlign); - AlignmentSelector.on_selectionChanged().connect(sigc::mem_fun(*this, &GridArrangeTab::Align_changed)); - TileBox.pack_start(AlignLabel, false, false, MARGIN); - TileBox.pack_start(AlignmentSelector, true, false, MARGIN); - - { - /*#### Radio buttons to control spacing manually or to fit selection bbox ####*/ - SpaceByBBoxRadioButton.set_label(_("_Fit into selection box")); - SpaceByBBoxRadioButton.set_use_underline (true); - SpaceByBBoxRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); - SpacingGroup = SpaceByBBoxRadioButton.get_group(); - - SpacingVBox.pack_start(SpaceByBBoxRadioButton, false, false, MARGIN); - - SpaceManualRadioButton.set_label(_("_Set spacing:")); - SpaceManualRadioButton.set_use_underline (true); - SpaceManualRadioButton.set_group(SpacingGroup); - SpaceManualRadioButton.signal_toggled().connect(sigc::mem_fun(*this, &GridArrangeTab::Spacing_button_changed)); - SpacingVBox.pack_start(SpaceManualRadioButton, false, false, MARGIN); - - TileBox.pack_start(SpacingVBox, false, false, MARGIN); - } - - { - /*#### Padding ####*/ - - YPadding.setDigits(5); - YPadding.setIncrements(0.2, 0); - YPadding.setRange(-10000, 10000); - double yPad = prefs->getDouble("/dialogs/gridtiler/YPad", 15); - YPadding.setValue(yPad, "px"); - YPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_ypad_spinbutton_changed)); - - XPadding.setDigits(5); - XPadding.setIncrements(0.2, 0); - XPadding.setRange(-10000, 10000); - double xPad = prefs->getDouble("/dialogs/gridtiler/XPad", 15); - XPadding.setValue(xPad, "px"); - - XPadding.signal_value_changed().connect(sigc::mem_fun(*this, &GridArrangeTab::on_xpad_spinbutton_changed)); - } - TileBox.pack_start(XPadding, false, false, MARGIN); - TileBox.pack_start(YPadding, false, false, MARGIN); - - contents->pack_start(TileBox); - - double SpacingType = prefs->getDouble("/dialogs/gridtiler/SpacingType", 15); - if (SpacingType>0) { - ManualSpacing=true; - } else { - ManualSpacing=false; - } - SpaceManualRadioButton.set_active(ManualSpacing); - SpaceByBBoxRadioButton.set_active(!ManualSpacing); - XPadding.set_sensitive (ManualSpacing); - YPadding.set_sensitive (ManualSpacing); - - //## The OK button FIXME - /*TileOkButton = addResponseButton(C_("Rows and columns dialog","_Arrange"), GTK_RESPONSE_APPLY); - TileOkButton->set_use_underline(true); - TileOkButton->set_tooltip_text(_("Arrange selected objects"));*/ - - show_all_children(); -} - -} //namespace Dialog -} //namespace UI -} //namespace Inkscape - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/gridarrangetab.h b/src/ui/dialog/gridarrangetab.h deleted file mode 100644 index 16780e55f..000000000 --- a/src/ui/dialog/gridarrangetab.h +++ /dev/null @@ -1,147 +0,0 @@ -/** - * @brief Arranges Objects into a Grid - */ -/* Authors: - * Bob Jamison ( based off trace dialog) - * John Cliff - * Other dudes from The Inkscape Organization - * Abhishek Sharma - * Declara Denis - * - * Copyright (C) 2004 Bob Jamison - * Copyright (C) 2004 John Cliff - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#ifndef INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H -#define INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H - -#include - -#include "ui/dialog/arrangetab.h" - -#include "ui/widget/anchor-selector.h" -#include "ui/widget/scalar-unit.h" -#include "ui/widget/spinbutton.h" - -namespace Inkscape { -namespace UI { -namespace Dialog { - -class ArrangeDialog; - -/** - * Dialog for tiling an object - */ -class GridArrangeTab : public ArrangeTab { -public: - GridArrangeTab(ArrangeDialog *parent); - virtual ~GridArrangeTab() {}; - - /** - * Do the actual work - */ - virtual void arrange(); - - /** - * Respond to selection change - */ - void updateSelection(); - - // Callbacks from spinbuttons - void on_row_spinbutton_changed(); - void on_col_spinbutton_changed(); - void on_xpad_spinbutton_changed(); - void on_ypad_spinbutton_changed(); - void on_RowSize_checkbutton_changed(); - void on_ColSize_checkbutton_changed(); - void on_rowSize_spinbutton_changed(); - void on_colSize_spinbutton_changed(); - void Spacing_button_changed(); - void Align_changed(); - - -private: - GridArrangeTab(GridArrangeTab const &d); // no copy - void operator=(GridArrangeTab const &d); // no assign - - ArrangeDialog *Parent; - - bool userHidden; - bool updating; - - Gtk::VBox TileBox; - Gtk::Button *TileOkButton; - Gtk::Button *TileCancelButton; - - // Number selected label - Gtk::Label SelectionContentsLabel; - - - Gtk::HBox AlignHBox; - Gtk::HBox SpinsHBox; - - // Number per Row - Gtk::VBox NoOfColsBox; - Gtk::Label NoOfColsLabel; - Inkscape::UI::Widget::SpinButton NoOfColsSpinner; - bool AutoRowSize; - Gtk::CheckButton RowHeightButton; - - Gtk::VBox XByYLabelVBox; - Gtk::Label padXByYLabel; - Gtk::Label XByYLabel; - - // Number per Column - Gtk::VBox NoOfRowsBox; - Gtk::Label NoOfRowsLabel; - Inkscape::UI::Widget::SpinButton NoOfRowsSpinner; - bool AutoColSize; - Gtk::CheckButton ColumnWidthButton; - - // Alignment - Gtk::Label AlignLabel; - AnchorSelector AlignmentSelector; - double VertAlign; - double HorizAlign; - - Inkscape::UI::Widget::ScalarUnit XPadding; - Inkscape::UI::Widget::ScalarUnit YPadding; - - // BBox or manual spacing - Gtk::VBox SpacingVBox; - Gtk::RadioButtonGroup SpacingGroup; - Gtk::RadioButton SpaceByBBoxRadioButton; - Gtk::RadioButton SpaceManualRadioButton; - bool ManualSpacing; - - // Row height - Gtk::VBox RowHeightVBox; - Gtk::HBox RowHeightBox; - Gtk::Label RowHeightLabel; - Inkscape::UI::Widget::SpinButton RowHeightSpinner; - - // Column width - Gtk::VBox ColumnWidthVBox; - Gtk::HBox ColumnWidthBox; - Gtk::Label ColumnWidthLabel; - Inkscape::UI::Widget::SpinButton ColumnWidthSpinner; -}; - -} //namespace Dialog -} //namespace UI -} //namespace Inkscape - -#endif /* INKSCAPE_UI_DIALOG_GRID_ARRANGE_TAB_H */ - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp new file mode 100644 index 000000000..a1df794a5 --- /dev/null +++ b/src/ui/dialog/polar-arrange-tab.cpp @@ -0,0 +1,414 @@ +/** + * @brief Arranges Objects into a Circle/Ellipse + */ +/* Authors: + * Declara Denis + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include <2geom/transforms.h> +#include + +#include "ui/dialog/polar-arrange-tab.h" +#include "ui/dialog/tile.h" + +#include "verbs.h" +#include "preferences.h" +#include "inkscape.h" +#include "desktop-handles.h" +#include "selection.h" +#include "document.h" +#include "document-undo.h" +#include "sp-item.h" +#include "widgets/icon.h" +#include "desktop.h" +#include "sp-ellipse.h" +#include "sp-item-transform.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) + : parent(parent_), + parametersTable(3, 3, false), + centerY("", "Y coordinate of the center", UNIT_TYPE_LINEAR), + centerX("", "X coordinate of the center", centerY), + radiusY("", "Y coordinate of the radius", UNIT_TYPE_LINEAR), + radiusX("", "X coordinate of the radius", radiusY), + angleY("", "Starting angle", UNIT_TYPE_RADIAL), + angleX("", "End angle", angleY) +{ + anchorPointLabel.set_text(C_("Polar arrange tab", "Anchor point:")); + anchorPointLabel.set_alignment(Gtk::ALIGN_START); + pack_start(anchorPointLabel, false, false); + + anchorBoundingBoxRadio.set_label(C_("Polar arrange tab", "Object's bounding box:")); + anchorRadioGroup = anchorBoundingBoxRadio.get_group(); + anchorBoundingBoxRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); + pack_start(anchorBoundingBoxRadio, false, false); + + pack_start(anchorSelector, false, false); + + anchorObjectPivotRadio.set_label(C_("Polar arrange tab", "Object's rotational center")); + anchorObjectPivotRadio.set_group(anchorRadioGroup); + anchorObjectPivotRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); + pack_start(anchorObjectPivotRadio, false, false); + + arrangeOnLabel.set_text(C_("Polar arrange tab", "Arrange on:")); + arrangeOnLabel.set_alignment(Gtk::ALIGN_START); + pack_start(arrangeOnLabel, false, false); + + arrangeOnFirstCircleRadio.set_label(C_("Polar arrange tab", "First selected circle/ellipse/arc")); + arrangeRadioGroup = arrangeOnFirstCircleRadio.get_group(); + arrangeOnFirstCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnFirstCircleRadio, false, false); + + arrangeOnLastCircleRadio.set_label(C_("Polar arrange tab", "Last selected circle/ellipse/arc")); + arrangeOnLastCircleRadio.set_group(arrangeRadioGroup); + arrangeOnLastCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnLastCircleRadio, false, false); + + arrangeOnParametersRadio.set_label(C_("Polar arrange tab", "Parameterized:")); + arrangeOnParametersRadio.set_group(arrangeRadioGroup); + arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); + pack_start(arrangeOnParametersRadio, false, false); + + //FIXME: Objects in grid do not line up properly! + centerLabel.set_text(_("Center X/Y:")); + parametersTable.attach(centerLabel, 0, 1, 0, 1, Gtk::FILL); + centerX.setDigits(2); + //centerX.set_size_request(60, -1); + centerX.setIncrements(0.2, 0); + centerX.setRange(-10000, 10000); + centerX.setValue(0, "px"); + centerY.setDigits(2); + //centerY.set_size_request(120, -1); + centerY.setIncrements(0.2, 0); + centerY.setRange(-10000, 10000); + centerY.setValue(0, "px"); + parametersTable.attach(centerX, 1, 2, 0, 1, Gtk::FILL); + parametersTable.attach(centerY, 2, 3, 0, 1, Gtk::FILL); + + radiusLabel.set_text(_("Radius X/Y:")); + parametersTable.attach(radiusLabel, 0, 1, 1, 2, Gtk::FILL); + radiusX.setDigits(2); + //radiusX.set_size_request(60, -1); + radiusX.setIncrements(0.2, 0); + radiusX.setRange(0.001, 10000); + radiusX.setValue(100, "px"); + radiusY.setDigits(2); + //radiusY.set_size_request(120, -1); + radiusY.setIncrements(0.2, 0); + radiusY.setRange(0.001, 10000); + radiusY.setValue(100, "px"); + parametersTable.attach(radiusX, 1, 2, 1, 2, Gtk::FILL); + parametersTable.attach(radiusY, 2, 3, 1, 2, Gtk::FILL); + + angleLabel.set_text(_("Angle X/Y:")); + parametersTable.attach(angleLabel, 0, 1, 2, 3, Gtk::FILL); + angleX.setDigits(2); + //angleX.set_size_request(60, -1); + angleX.setIncrements(0.2, 0); + angleX.setRange(-10000, 10000); + angleX.setValue(0, "°"); + angleY.setDigits(2); + //angleY.set_size_request(120, -1); + angleY.setIncrements(0.2, 0); + angleY.setRange(-10000, 10000); + angleY.setValue(180, "°"); + parametersTable.attach(angleX, 1, 2, 2, 3, Gtk::FILL); + parametersTable.attach(angleY, 2, 3, 2, 3, Gtk::FILL); + pack_start(parametersTable, false, false); + + rotateObjectsCheckBox.set_label(_("Rotate objects")); + rotateObjectsCheckBox.set_active(true); + pack_start(rotateObjectsCheckBox, false, false); + + centerX.set_sensitive(false); + centerY.set_sensitive(false); + angleX.set_sensitive(false); + angleY.set_sensitive(false); + radiusX.set_sensitive(false); + radiusY.set_sensitive(false); +} + +/** + * This function rotates an item around a given point by a given amount + * @param item item to rotate + * @param center center of the rotation to perform + * @param rotation amount to rotate the object by + */ +void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation) +{ + Geom::Translate const s(center); + Geom::Affine affine = Geom::Affine(s).inverse() * Geom::Affine(rotation) * Geom::Affine(s); + + // Save old center + center = item->getCenter(); + + item->set_i2d_affine(item->i2dt_affine() * affine); + item->doWriteTransform(item->getRepr(), item->transform); + + if(item->isCenterSet()) + { + item->setCenter(center * affine); + item->updateRepr(); + } +} + +/** + * Calculates the angle at which to put an object given the total amount + * of objects, the index of the objects as well as the arc start and end + * points + * @param arcBegin angle at which the arc begins + * @param arcEnd angle at which the arc ends + * @param count number of objects in the selection + * @param n index of the object in the selection + */ +float calcAngle(float arcBegin, float arcEnd, int count, int n) +{ + float arcLength = arcEnd - arcBegin; + float delta = std::abs(std::abs(arcLength) - 2*M_PI); + if(delta > 0.01) count--; // If not a complete circle, put an object also at the extremes of the arc; + + float angle = n / (float)count; + // Normalize for arcLength: + angle = angle * arcLength; + angle += arcBegin; + + return angle; +} + +/** + * Calculates the point at which the object needs to be, given the center of the ellipse, + * it's radius (x and y), as well as the angle + */ +Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) +{ + return Geom::Point(cx + cos(angle) * rx, cy + sin(angle) * ry); +} + +/** + * Returns the selected anchor point in document coordinates. If anchor + * is 0 to 8, then a bounding box point has been choosen. If it is 9 however + * the rotational center is chosen. + * @todo still using a hack to get the real coordinate space (subtracting document height + * and inverting axes) + */ +Geom::Point getAnchorPoint(int anchor, SPItem *item) +{ + Geom::Point source; + + Geom::OptRect bbox = item->documentVisualBounds(); + + switch(anchor) + { + case 0: // Top - Left + case 3: // Middle - Left + case 6: // Bottom - Left + source[0] = bbox->min()[Geom::X]; + break; + case 1: // Top - Middle + case 4: // Middle - Middle + case 7: // Bottom - Middle + source[0] = (bbox->min()[Geom::X] + bbox->max()[Geom::X]) / 2.0f; + break; + case 2: // Top - Right + case 5: // Middle - Right + case 8: // Bottom - Right + source[0] = bbox->max()[Geom::X]; + break; + }; + + switch(anchor) + { + case 0: // Top - Left + case 1: // Top - Middle + case 2: // Top - Right + source[1] = bbox->min()[Geom::Y]; + break; + case 3: // Middle - Left + case 4: // Middle - Middle + case 5: // Middle - Right + source[1] = (bbox->min()[Geom::Y] + bbox->max()[Geom::Y]) / 2.0f; + break; + case 6: // Bottom - Left + case 7: // Bottom - Middle + case 8: // Bottom - Right + source[1] = bbox->max()[Geom::Y]; + break; + }; + + // If using center + if(anchor == 9) + source = item->getCenter(); + else + { + // FIXME: + source[1] -= item->document->getHeight(); + source[1] *= -1; + } + + return source; +} + +void moveToPoint(int anchor, SPItem *item, Geom::Point p) +{ + sp_item_move_rel(item, Geom::Translate(p - getAnchorPoint(anchor, item))); +} + +void PolarArrangeTab::arrange() +{ + std::cout << "PolarArrangeTab::arrange()" << std::endl; + + Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); + const GSList *items, *tmp; + tmp = items = 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) + { + if(arrangeOnEllipse) + { + SPItem *item = SP_ITEM(tmp->data); + + if(arrangeOnFirstEllipse) + { + // The first selected ellipse is actually the last one in the list + if(SP_IS_GENERICELLIPSE(item)) + referenceEllipse = SP_GENERICELLIPSE(item); + } else { + // The last selected ellipse is actually the first in list + if(SP_IS_GENERICELLIPSE(item) && referenceEllipse == NULL) + referenceEllipse = SP_GENERICELLIPSE(item); + } + } + tmp = tmp->next; + ++count; + } + + float cx, cy; // Center of the ellipse + float rx, ry; // Radiuses of the ellipse in x and y direction + float arcBeg, arcEnd; // begin and end angles for arcs + Geom::Affine transformation; // Any additional transformation to apply to the objects + + if(arrangeOnEllipse) + { + if(referenceEllipse == NULL) + { + Gtk::MessageDialog dialog(_("Couldn't find an ellipse in selection"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); + dialog.run(); + return; + } else { + cx = referenceEllipse->cx.value; + cy = referenceEllipse->cy.value; + rx = referenceEllipse->rx.value; + ry = referenceEllipse->ry.value; + arcBeg = referenceEllipse->start; + arcEnd = referenceEllipse->end; + + std::cout << "Arc: " << arcBeg << ", " << arcEnd << std::endl; + transformation = referenceEllipse->i2dt_affine(); + + // We decrement the count by 1 as we are not going to lay + // out the reference ellipse + --count; + } + + } else { + // Read options from UI + cx = centerX.getValue("px"); + cy = centerY.getValue("px"); + rx = radiusX.getValue("px"); + ry = radiusY.getValue("px"); + arcBeg = angleX.getValue("rad"); + arcEnd = angleY.getValue("rad"); + transformation.setIdentity(); + referenceEllipse = NULL; + } + + int anchor = 9; + if(anchorBoundingBoxRadio.get_active()) + { + anchor = anchorSelector.getHorizontalAlignment() + + anchorSelector.getVerticalAlignment() * 3; + } + + Geom::Point realCenter = Geom::Point(cx, cy) * transformation; + + tmp = items; + int i = 0; + while(tmp) + { + SPItem *item = SP_ITEM(tmp->data); + + // Ignore the reference ellipse if any + if(item != referenceEllipse) + { + float angle = calcAngle(arcBeg, arcEnd, count, i); + Geom::Point newLocation = calcPoint(cx, cy, rx, ry, angle) * transformation; + + moveToPoint(anchor, item, newLocation); + + if(rotateObjectsCheckBox.get_active()) { + // Calculate the angle by which to rotate each object + angle = -atan2f(newLocation.x() - realCenter.x(), newLocation.y() - realCenter.y()); + rotateAround(item, newLocation, Geom::Rotate(angle)); + } + + std::cout << "object " << i << " out of " << count << ": " << angle << std::endl; + + ++i; + } + tmp = tmp->next; + } + + DocumentUndo::done(sp_desktop_document(parent->getDesktop()), SP_VERB_SELECTION_ARRANGE, + _("Arrange on ellipse")); +} + +void PolarArrangeTab::updateSelection() +{ +} + +void PolarArrangeTab::on_arrange_radio_changed() +{ + bool arrangeParametric = arrangeOnParametersRadio.get_active(); + + centerX.set_sensitive(arrangeParametric); + centerY.set_sensitive(arrangeParametric); + + angleX.set_sensitive(arrangeParametric); + angleY.set_sensitive(arrangeParametric); + + radiusX.set_sensitive(arrangeParametric); + radiusY.set_sensitive(arrangeParametric); +} + +void PolarArrangeTab::on_anchor_radio_changed() +{ + bool anchorBoundingBox = anchorBoundingBoxRadio.get_active(); + + anchorSelector.set_sensitive(anchorBoundingBox); +} + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/polar-arrange-tab.h b/src/ui/dialog/polar-arrange-tab.h new file mode 100644 index 000000000..e62ebd76b --- /dev/null +++ b/src/ui/dialog/polar-arrange-tab.h @@ -0,0 +1,87 @@ +/** + * @brief Arranges Objects into a Circle/Ellipse + */ +/* Authors: + * Declara Denis + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H +#define INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H + +#include + +#include "ui/dialog/arrangetab.h" + +#include "ui/widget/anchor-selector.h" +#include "ui/widget/scalar-unit.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class ArrangeDialog; + +class PolarArrangeTab : public ArrangeTab { +public: + PolarArrangeTab(ArrangeDialog *parent_); + virtual ~PolarArrangeTab() {}; + + /** + * Do the actual work + */ + virtual void arrange(); + + /** + * Respond to selection change + */ + void updateSelection(); + + void on_anchor_radio_changed(); + void on_arrange_radio_changed(); + +private: + PolarArrangeTab(PolarArrangeTab const &d); // no copy + void operator=(PolarArrangeTab const &d); // no assign + + ArrangeDialog *parent; + + Gtk::Label anchorPointLabel; + + Gtk::RadioButtonGroup anchorRadioGroup; + Gtk::RadioButton anchorBoundingBoxRadio; + Gtk::RadioButton anchorObjectPivotRadio; + Inkscape::UI::Widget::AnchorSelector anchorSelector; + + Gtk::Label arrangeOnLabel; + + Gtk::RadioButtonGroup arrangeRadioGroup; + Gtk::RadioButton arrangeOnFirstCircleRadio; + Gtk::RadioButton arrangeOnLastCircleRadio; + Gtk::RadioButton arrangeOnParametersRadio; + + Gtk::Table parametersTable; + + Gtk::Label centerLabel; + Inkscape::UI::Widget::ScalarUnit centerY; + Inkscape::UI::Widget::ScalarUnit centerX; + + Gtk::Label radiusLabel; + Inkscape::UI::Widget::ScalarUnit radiusY; + Inkscape::UI::Widget::ScalarUnit radiusX; + + Gtk::Label angleLabel; + Inkscape::UI::Widget::ScalarUnit angleY; + Inkscape::UI::Widget::ScalarUnit angleX; + + Gtk::CheckButton rotateObjectsCheckBox; + + +}; + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + +#endif /* INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H */ diff --git a/src/ui/dialog/polararrangetab.cpp b/src/ui/dialog/polararrangetab.cpp deleted file mode 100644 index 6968be35a..000000000 --- a/src/ui/dialog/polararrangetab.cpp +++ /dev/null @@ -1,414 +0,0 @@ -/** - * @brief Arranges Objects into a Circle/Ellipse - */ -/* Authors: - * Declara Denis - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#include <2geom/transforms.h> -#include - -#include "ui/dialog/polararrangetab.h" -#include "ui/dialog/tile.h" - -#include "verbs.h" -#include "preferences.h" -#include "inkscape.h" -#include "desktop-handles.h" -#include "selection.h" -#include "document.h" -#include "document-undo.h" -#include "sp-item.h" -#include "widgets/icon.h" -#include "desktop.h" -#include "sp-ellipse.h" -#include "sp-item-transform.h" - -namespace Inkscape { -namespace UI { -namespace Dialog { - -PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) - : parent(parent_), - parametersTable(3, 3, false), - centerY("", "Y coordinate of the center", UNIT_TYPE_LINEAR), - centerX("", "X coordinate of the center", centerY), - radiusY("", "Y coordinate of the radius", UNIT_TYPE_LINEAR), - radiusX("", "X coordinate of the radius", radiusY), - angleY("", "Starting angle", UNIT_TYPE_RADIAL), - angleX("", "End angle", angleY) -{ - anchorPointLabel.set_text(C_("Polar arrange tab", "Anchor point:")); - anchorPointLabel.set_alignment(Gtk::ALIGN_START); - pack_start(anchorPointLabel, false, false); - - anchorBoundingBoxRadio.set_label(C_("Polar arrange tab", "Object's bounding box:")); - anchorRadioGroup = anchorBoundingBoxRadio.get_group(); - anchorBoundingBoxRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); - pack_start(anchorBoundingBoxRadio, false, false); - - pack_start(anchorSelector, false, false); - - anchorObjectPivotRadio.set_label(C_("Polar arrange tab", "Object's rotational center")); - anchorObjectPivotRadio.set_group(anchorRadioGroup); - anchorObjectPivotRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_anchor_radio_changed)); - pack_start(anchorObjectPivotRadio, false, false); - - arrangeOnLabel.set_text(C_("Polar arrange tab", "Arrange on:")); - arrangeOnLabel.set_alignment(Gtk::ALIGN_START); - pack_start(arrangeOnLabel, false, false); - - arrangeOnFirstCircleRadio.set_label(C_("Polar arrange tab", "First selected circle/ellipse/arc")); - arrangeRadioGroup = arrangeOnFirstCircleRadio.get_group(); - arrangeOnFirstCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); - pack_start(arrangeOnFirstCircleRadio, false, false); - - arrangeOnLastCircleRadio.set_label(C_("Polar arrange tab", "Last selected circle/ellipse/arc")); - arrangeOnLastCircleRadio.set_group(arrangeRadioGroup); - arrangeOnLastCircleRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); - pack_start(arrangeOnLastCircleRadio, false, false); - - arrangeOnParametersRadio.set_label(C_("Polar arrange tab", "Parameterized:")); - arrangeOnParametersRadio.set_group(arrangeRadioGroup); - arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); - pack_start(arrangeOnParametersRadio, false, false); - - //FIXME: Objects in grid do not line up properly! - centerLabel.set_text(_("Center X/Y:")); - parametersTable.attach(centerLabel, 0, 1, 0, 1, Gtk::FILL); - centerX.setDigits(2); - //centerX.set_size_request(60, -1); - centerX.setIncrements(0.2, 0); - centerX.setRange(-10000, 10000); - centerX.setValue(0, "px"); - centerY.setDigits(2); - //centerY.set_size_request(120, -1); - centerY.setIncrements(0.2, 0); - centerY.setRange(-10000, 10000); - centerY.setValue(0, "px"); - parametersTable.attach(centerX, 1, 2, 0, 1, Gtk::FILL); - parametersTable.attach(centerY, 2, 3, 0, 1, Gtk::FILL); - - radiusLabel.set_text(_("Radius X/Y:")); - parametersTable.attach(radiusLabel, 0, 1, 1, 2, Gtk::FILL); - radiusX.setDigits(2); - //radiusX.set_size_request(60, -1); - radiusX.setIncrements(0.2, 0); - radiusX.setRange(0.001, 10000); - radiusX.setValue(100, "px"); - radiusY.setDigits(2); - //radiusY.set_size_request(120, -1); - radiusY.setIncrements(0.2, 0); - radiusY.setRange(0.001, 10000); - radiusY.setValue(100, "px"); - parametersTable.attach(radiusX, 1, 2, 1, 2, Gtk::FILL); - parametersTable.attach(radiusY, 2, 3, 1, 2, Gtk::FILL); - - angleLabel.set_text(_("Angle X/Y:")); - parametersTable.attach(angleLabel, 0, 1, 2, 3, Gtk::FILL); - angleX.setDigits(2); - //angleX.set_size_request(60, -1); - angleX.setIncrements(0.2, 0); - angleX.setRange(-10000, 10000); - angleX.setValue(0, "°"); - angleY.setDigits(2); - //angleY.set_size_request(120, -1); - angleY.setIncrements(0.2, 0); - angleY.setRange(-10000, 10000); - angleY.setValue(180, "°"); - parametersTable.attach(angleX, 1, 2, 2, 3, Gtk::FILL); - parametersTable.attach(angleY, 2, 3, 2, 3, Gtk::FILL); - pack_start(parametersTable, false, false); - - rotateObjectsCheckBox.set_label(_("Rotate objects")); - rotateObjectsCheckBox.set_active(true); - pack_start(rotateObjectsCheckBox, false, false); - - centerX.set_sensitive(false); - centerY.set_sensitive(false); - angleX.set_sensitive(false); - angleY.set_sensitive(false); - radiusX.set_sensitive(false); - radiusY.set_sensitive(false); -} - -/** - * This function rotates an item around a given point by a given amount - * @param item item to rotate - * @param center center of the rotation to perform - * @param rotation amount to rotate the object by - */ -void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation) -{ - Geom::Translate const s(center); - Geom::Affine affine = Geom::Affine(s).inverse() * Geom::Affine(rotation) * Geom::Affine(s); - - // Save old center - center = item->getCenter(); - - item->set_i2d_affine(item->i2dt_affine() * affine); - item->doWriteTransform(item->getRepr(), item->transform); - - if(item->isCenterSet()) - { - item->setCenter(center * affine); - item->updateRepr(); - } -} - -/** - * Calculates the angle at which to put an object given the total amount - * of objects, the index of the objects as well as the arc start and end - * points - * @param arcBegin angle at which the arc begins - * @param arcEnd angle at which the arc ends - * @param count number of objects in the selection - * @param n index of the object in the selection - */ -float calcAngle(float arcBegin, float arcEnd, int count, int n) -{ - float arcLength = arcEnd - arcBegin; - float delta = std::abs(std::abs(arcLength) - 2*M_PI); - if(delta > 0.01) count--; // If not a complete circle, put an object also at the extremes of the arc; - - float angle = n / (float)count; - // Normalize for arcLength: - angle = angle * arcLength; - angle += arcBegin; - - return angle; -} - -/** - * Calculates the point at which the object needs to be, given the center of the ellipse, - * it's radius (x and y), as well as the angle - */ -Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) -{ - return Geom::Point(cx + cos(angle) * rx, cy + sin(angle) * ry); -} - -/** - * Returns the selected anchor point in document coordinates. If anchor - * is 0 to 8, then a bounding box point has been choosen. If it is 9 however - * the rotational center is chosen. - * @todo still using a hack to get the real coordinate space (subtracting document height - * and inverting axes) - */ -Geom::Point getAnchorPoint(int anchor, SPItem *item) -{ - Geom::Point source; - - Geom::OptRect bbox = item->documentVisualBounds(); - - switch(anchor) - { - case 0: // Top - Left - case 3: // Middle - Left - case 6: // Bottom - Left - source[0] = bbox->min()[Geom::X]; - break; - case 1: // Top - Middle - case 4: // Middle - Middle - case 7: // Bottom - Middle - source[0] = (bbox->min()[Geom::X] + bbox->max()[Geom::X]) / 2.0f; - break; - case 2: // Top - Right - case 5: // Middle - Right - case 8: // Bottom - Right - source[0] = bbox->max()[Geom::X]; - break; - }; - - switch(anchor) - { - case 0: // Top - Left - case 1: // Top - Middle - case 2: // Top - Right - source[1] = bbox->min()[Geom::Y]; - break; - case 3: // Middle - Left - case 4: // Middle - Middle - case 5: // Middle - Right - source[1] = (bbox->min()[Geom::Y] + bbox->max()[Geom::Y]) / 2.0f; - break; - case 6: // Bottom - Left - case 7: // Bottom - Middle - case 8: // Bottom - Right - source[1] = bbox->max()[Geom::Y]; - break; - }; - - // If using center - if(anchor == 9) - source = item->getCenter(); - else - { - // FIXME: - source[1] -= item->document->getHeight(); - source[1] *= -1; - } - - return source; -} - -void moveToPoint(int anchor, SPItem *item, Geom::Point p) -{ - sp_item_move_rel(item, Geom::Translate(p - getAnchorPoint(anchor, item))); -} - -void PolarArrangeTab::arrange() -{ - std::cout << "PolarArrangeTab::arrange()" << std::endl; - - Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); - const GSList *items, *tmp; - tmp = items = 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) - { - if(arrangeOnEllipse) - { - SPItem *item = SP_ITEM(tmp->data); - - if(arrangeOnFirstEllipse) - { - // The first selected ellipse is actually the last one in the list - if(SP_IS_GENERICELLIPSE(item)) - referenceEllipse = SP_GENERICELLIPSE(item); - } else { - // The last selected ellipse is actually the first in list - if(SP_IS_GENERICELLIPSE(item) && referenceEllipse == NULL) - referenceEllipse = SP_GENERICELLIPSE(item); - } - } - tmp = tmp->next; - ++count; - } - - float cx, cy; // Center of the ellipse - float rx, ry; // Radiuses of the ellipse in x and y direction - float arcBeg, arcEnd; // begin and end angles for arcs - Geom::Affine transformation; // Any additional transformation to apply to the objects - - if(arrangeOnEllipse) - { - if(referenceEllipse == NULL) - { - Gtk::MessageDialog dialog(_("Couldn't find an ellipse in selection"), false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); - dialog.run(); - return; - } else { - cx = referenceEllipse->cx.value; - cy = referenceEllipse->cy.value; - rx = referenceEllipse->rx.value; - ry = referenceEllipse->ry.value; - arcBeg = referenceEllipse->start; - arcEnd = referenceEllipse->end; - - std::cout << "Arc: " << arcBeg << ", " << arcEnd << std::endl; - transformation = referenceEllipse->i2dt_affine(); - - // We decrement the count by 1 as we are not going to lay - // out the reference ellipse - --count; - } - - } else { - // Read options from UI - cx = centerX.getValue("px"); - cy = centerY.getValue("px"); - rx = radiusX.getValue("px"); - ry = radiusY.getValue("px"); - arcBeg = angleX.getValue("rad"); - arcEnd = angleY.getValue("rad"); - transformation.setIdentity(); - referenceEllipse = NULL; - } - - int anchor = 9; - if(anchorBoundingBoxRadio.get_active()) - { - anchor = anchorSelector.getHorizontalAlignment() + - anchorSelector.getVerticalAlignment() * 3; - } - - Geom::Point realCenter = Geom::Point(cx, cy) * transformation; - - tmp = items; - int i = 0; - while(tmp) - { - SPItem *item = SP_ITEM(tmp->data); - - // Ignore the reference ellipse if any - if(item != referenceEllipse) - { - float angle = calcAngle(arcBeg, arcEnd, count, i); - Geom::Point newLocation = calcPoint(cx, cy, rx, ry, angle) * transformation; - - moveToPoint(anchor, item, newLocation); - - if(rotateObjectsCheckBox.get_active()) { - // Calculate the angle by which to rotate each object - angle = -atan2f(newLocation.x() - realCenter.x(), newLocation.y() - realCenter.y()); - rotateAround(item, newLocation, Geom::Rotate(angle)); - } - - std::cout << "object " << i << " out of " << count << ": " << angle << std::endl; - - ++i; - } - tmp = tmp->next; - } - - DocumentUndo::done(sp_desktop_document(parent->getDesktop()), SP_VERB_SELECTION_ARRANGE, - _("Arrange on ellipse")); -} - -void PolarArrangeTab::updateSelection() -{ -} - -void PolarArrangeTab::on_arrange_radio_changed() -{ - bool arrangeParametric = arrangeOnParametersRadio.get_active(); - - centerX.set_sensitive(arrangeParametric); - centerY.set_sensitive(arrangeParametric); - - angleX.set_sensitive(arrangeParametric); - angleY.set_sensitive(arrangeParametric); - - radiusX.set_sensitive(arrangeParametric); - radiusY.set_sensitive(arrangeParametric); -} - -void PolarArrangeTab::on_anchor_radio_changed() -{ - bool anchorBoundingBox = anchorBoundingBoxRadio.get_active(); - - anchorSelector.set_sensitive(anchorBoundingBox); -} - -} //namespace Dialog -} //namespace UI -} //namespace Inkscape - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/polararrangetab.h b/src/ui/dialog/polararrangetab.h deleted file mode 100644 index 24760a8bc..000000000 --- a/src/ui/dialog/polararrangetab.h +++ /dev/null @@ -1,87 +0,0 @@ -/** - * @brief Arranges Objects into a Circle/Ellipse - */ -/* Authors: - * Declara Denis - * - * Released under GNU GPL, read the file 'COPYING' for more information - */ - -#ifndef INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H -#define INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H - -#include - -#include "ui/dialog/arrangetab.h" - -#include "ui/widget/anchor-selector.h" -#include "ui/widget/scalar-unit.h" - -namespace Inkscape { -namespace UI { -namespace Dialog { - -class ArrangeDialog; - -class PolarArrangeTab : public ArrangeTab { -public: - PolarArrangeTab(ArrangeDialog *parent_); - virtual ~PolarArrangeTab() {}; - - /** - * Do the actual work - */ - virtual void arrange(); - - /** - * Respond to selection change - */ - void updateSelection(); - - void on_anchor_radio_changed(); - void on_arrange_radio_changed(); - -private: - PolarArrangeTab(PolarArrangeTab const &d); // no copy - void operator=(PolarArrangeTab const &d); // no assign - - ArrangeDialog *parent; - - Gtk::Label anchorPointLabel; - - Gtk::RadioButtonGroup anchorRadioGroup; - Gtk::RadioButton anchorBoundingBoxRadio; - Gtk::RadioButton anchorObjectPivotRadio; - AnchorSelector anchorSelector; - - Gtk::Label arrangeOnLabel; - - Gtk::RadioButtonGroup arrangeRadioGroup; - Gtk::RadioButton arrangeOnFirstCircleRadio; - Gtk::RadioButton arrangeOnLastCircleRadio; - Gtk::RadioButton arrangeOnParametersRadio; - - Gtk::Table parametersTable; - - Gtk::Label centerLabel; - Inkscape::UI::Widget::ScalarUnit centerY; - Inkscape::UI::Widget::ScalarUnit centerX; - - Gtk::Label radiusLabel; - Inkscape::UI::Widget::ScalarUnit radiusY; - Inkscape::UI::Widget::ScalarUnit radiusX; - - Gtk::Label angleLabel; - Inkscape::UI::Widget::ScalarUnit angleY; - Inkscape::UI::Widget::ScalarUnit angleX; - - Gtk::CheckButton rotateObjectsCheckBox; - - -}; - -} //namespace Dialog -} //namespace UI -} //namespace Inkscape - -#endif /* INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H */ diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index 917544d3d..c967509f9 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -19,8 +19,8 @@ #include "tile.h" #include "verbs.h" -#include "ui/dialog/gridarrangetab.h" -#include "ui/dialog/polararrangetab.h" +#include "ui/dialog/grid-arrange-tab.h" +#include "ui/dialog/polar-arrange-tab.h" namespace Inkscape { namespace UI { diff --git a/src/ui/widget/anchor-selector.cpp b/src/ui/widget/anchor-selector.cpp index 87f50cf5f..82e27ee89 100644 --- a/src/ui/widget/anchor-selector.cpp +++ b/src/ui/widget/anchor-selector.cpp @@ -12,6 +12,10 @@ #include "widgets/icon.h" #include "ui/icon-names.h" +namespace Inkscape { +namespace UI { +namespace Widget { + void AnchorSelector::setupButton(const Glib::ustring& icon, Gtk::ToggleButton& button) { Gtk::Widget* buttonIcon = Gtk::manage(sp_icon_get_icon(icon, Inkscape::ICON_SIZE_SMALL_TOOLBAR)); buttonIcon->show(); @@ -76,3 +80,18 @@ void AnchorSelector::setAlignment(int horizontal, int vertical) _buttons[index].set_active(!_buttons[index].get_active()); } } + +} // namespace Widget +} // namespace UI +} // namespace Inkscape + +/* + 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: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : diff --git a/src/ui/widget/anchor-selector.h b/src/ui/widget/anchor-selector.h index 361528d11..2263438e3 100644 --- a/src/ui/widget/anchor-selector.h +++ b/src/ui/widget/anchor-selector.h @@ -12,6 +12,10 @@ #include +namespace Inkscape { +namespace UI { +namespace Widget { + class AnchorSelector : public Gtk::Alignment { private: @@ -37,4 +41,19 @@ public: virtual ~AnchorSelector(); }; +} // namespace Widget +} // namespace UI +} // namespace Inkscape + #endif /* ANCHOR_SELECTOR_H_ */ + +/* + 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: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : -- cgit v1.2.3 From c620ecb0f432de693f537f020999dfa4316b1859 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Wed, 9 May 2012 17:09:29 +0200 Subject: Removed debug output (bzr r11073.1.32) --- src/ui/dialog/polar-arrange-tab.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp index a1df794a5..32f05c5e8 100644 --- a/src/ui/dialog/polar-arrange-tab.cpp +++ b/src/ui/dialog/polar-arrange-tab.cpp @@ -261,8 +261,6 @@ void moveToPoint(int anchor, SPItem *item, Geom::Point p) void PolarArrangeTab::arrange() { - std::cout << "PolarArrangeTab::arrange()" << std::endl; - Inkscape::Selection *selection = sp_desktop_selection(parent->getDesktop()); const GSList *items, *tmp; tmp = items = selection->itemList(); @@ -313,7 +311,6 @@ void PolarArrangeTab::arrange() arcBeg = referenceEllipse->start; arcEnd = referenceEllipse->end; - std::cout << "Arc: " << arcBeg << ", " << arcEnd << std::endl; transformation = referenceEllipse->i2dt_affine(); // We decrement the count by 1 as we are not going to lay @@ -362,8 +359,6 @@ void PolarArrangeTab::arrange() rotateAround(item, newLocation, Geom::Rotate(angle)); } - std::cout << "object " << i << " out of " << count << ": " << angle << std::endl; - ++i; } tmp = tmp->next; -- cgit v1.2.3 From 48cd3195741c6590d7129da3bae23fd72784d4a4 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sat, 19 May 2012 14:19:14 +0200 Subject: Renamed "arrangetab.h" to "arrange-tab.h" (bzr r11073.1.33) --- src/ui/CMakeLists.txt | 2 +- src/ui/dialog/Makefile_insert | 2 +- src/ui/dialog/arrange-tab.h | 54 +++++++++++++++++++++++++++++++++++++++ src/ui/dialog/arrangetab.h | 54 --------------------------------------- src/ui/dialog/grid-arrange-tab.h | 2 +- src/ui/dialog/polar-arrange-tab.h | 2 +- 6 files changed, 58 insertions(+), 58 deletions(-) create mode 100644 src/ui/dialog/arrange-tab.h delete mode 100644 src/ui/dialog/arrangetab.h diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 7435720fd..2e419bbc3 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -136,7 +136,7 @@ set(ui_SRC dialog/aboutbox.h dialog/align-and-distribute.h - dialog/arrangetab.h + dialog/arrange-tab.h dialog/behavior.h dialog/calligraphic-profile-rename.h dialog/color-item.h diff --git a/src/ui/dialog/Makefile_insert b/src/ui/dialog/Makefile_insert index 53533a08f..5a367248e 100644 --- a/src/ui/dialog/Makefile_insert +++ b/src/ui/dialog/Makefile_insert @@ -5,7 +5,7 @@ ink_common_sources += \ ui/dialog/aboutbox.h \ ui/dialog/align-and-distribute.cpp \ ui/dialog/align-and-distribute.h \ - ui/dialog/arrangetab.h \ + ui/dialog/arrange-tab.h \ ui/dialog/behavior.h \ ui/dialog/calligraphic-profile-rename.h \ ui/dialog/calligraphic-profile-rename.cpp \ diff --git a/src/ui/dialog/arrange-tab.h b/src/ui/dialog/arrange-tab.h new file mode 100644 index 000000000..3ffe1ef4c --- /dev/null +++ b/src/ui/dialog/arrange-tab.h @@ -0,0 +1,54 @@ +/** + * @brief Arrange tools base class + */ +/* Authors: + * * Declara Denis + * Copyright (C) 2012 Authors + * + * Released under GNU GPL. Read the file 'COPYING' for more information. + */ + +#ifndef INKSCAPE_UI_DIALOG_ARRANGE_TAB_H +#define INKSCAPE_UI_DIALOG_ARRANGE_TAB_H + +#include + +namespace Inkscape { +namespace UI { +namespace Dialog { + +/** + * This interface should be implemented by each arrange mode. + * The class is a Gtk::VBox and will be displayed as a tab in + * the dialog + */ +class ArrangeTab : public Gtk::VBox +{ +public: + ArrangeTab() {}; + virtual ~ArrangeTab() {}; + + /** + * Do the actual work! This method is invoked to actually arrange the + * selection + */ + virtual void arrange() = 0; +}; + +} //namespace Dialog +} //namespace UI +} //namespace Inkscape + + +#endif /* INKSCAPE_UI_DIALOG_ARRANGE_TAB_H */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/arrangetab.h b/src/ui/dialog/arrangetab.h deleted file mode 100644 index 3ffe1ef4c..000000000 --- a/src/ui/dialog/arrangetab.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @brief Arrange tools base class - */ -/* Authors: - * * Declara Denis - * Copyright (C) 2012 Authors - * - * Released under GNU GPL. Read the file 'COPYING' for more information. - */ - -#ifndef INKSCAPE_UI_DIALOG_ARRANGE_TAB_H -#define INKSCAPE_UI_DIALOG_ARRANGE_TAB_H - -#include - -namespace Inkscape { -namespace UI { -namespace Dialog { - -/** - * This interface should be implemented by each arrange mode. - * The class is a Gtk::VBox and will be displayed as a tab in - * the dialog - */ -class ArrangeTab : public Gtk::VBox -{ -public: - ArrangeTab() {}; - virtual ~ArrangeTab() {}; - - /** - * Do the actual work! This method is invoked to actually arrange the - * selection - */ - virtual void arrange() = 0; -}; - -} //namespace Dialog -} //namespace UI -} //namespace Inkscape - - -#endif /* INKSCAPE_UI_DIALOG_ARRANGE_TAB_H */ - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/dialog/grid-arrange-tab.h b/src/ui/dialog/grid-arrange-tab.h index 7e90accf1..2744ca87f 100644 --- a/src/ui/dialog/grid-arrange-tab.h +++ b/src/ui/dialog/grid-arrange-tab.h @@ -19,7 +19,7 @@ #include -#include "ui/dialog/arrangetab.h" +#include "ui/dialog/arrange-tab.h" #include "ui/widget/anchor-selector.h" #include "ui/widget/scalar-unit.h" diff --git a/src/ui/dialog/polar-arrange-tab.h b/src/ui/dialog/polar-arrange-tab.h index e62ebd76b..3481bc4a0 100644 --- a/src/ui/dialog/polar-arrange-tab.h +++ b/src/ui/dialog/polar-arrange-tab.h @@ -12,7 +12,7 @@ #include -#include "ui/dialog/arrangetab.h" +#include "ui/dialog/arrange-tab.h" #include "ui/widget/anchor-selector.h" #include "ui/widget/scalar-unit.h" -- cgit v1.2.3 From 24e2360f100a9372e7f2d0af894ec1b2d1357ace Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sat, 19 May 2012 14:51:48 +0200 Subject: Added documentation and made helper functions in polar-arrange-tab.cpp static (bzr r11073.1.34) --- src/ui/dialog/polar-arrange-tab.cpp | 22 ++++++++++++++++------ src/ui/dialog/polar-arrange-tab.h | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp index 32f05c5e8..2056c7820 100644 --- a/src/ui/dialog/polar-arrange-tab.cpp +++ b/src/ui/dialog/polar-arrange-tab.cpp @@ -140,7 +140,7 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) * @param center center of the rotation to perform * @param rotation amount to rotate the object by */ -void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation) +static void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation) { Geom::Translate const s(center); Geom::Affine affine = Geom::Affine(s).inverse() * Geom::Affine(rotation) * Geom::Affine(s); @@ -167,7 +167,7 @@ void rotateAround(SPItem *item, Geom::Point center, Geom::Rotate const &rotation * @param count number of objects in the selection * @param n index of the object in the selection */ -float calcAngle(float arcBegin, float arcEnd, int count, int n) +static float calcAngle(float arcBegin, float arcEnd, int count, int n) { float arcLength = arcEnd - arcBegin; float delta = std::abs(std::abs(arcLength) - 2*M_PI); @@ -182,10 +182,10 @@ float calcAngle(float arcBegin, float arcEnd, int count, int n) } /** - * Calculates the point at which the object needs to be, given the center of the ellipse, + * Calculates the point at which an object needs to be, given the center of the ellipse, * it's radius (x and y), as well as the angle */ -Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) +static Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) { return Geom::Point(cx + cos(angle) * rx, cy + sin(angle) * ry); } @@ -197,7 +197,7 @@ Geom::Point calcPoint(float cx, float cy, float rx, float ry, float angle) * @todo still using a hack to get the real coordinate space (subtracting document height * and inverting axes) */ -Geom::Point getAnchorPoint(int anchor, SPItem *item) +static Geom::Point getAnchorPoint(int anchor, SPItem *item) { Geom::Point source; @@ -254,7 +254,17 @@ Geom::Point getAnchorPoint(int anchor, SPItem *item) return source; } -void moveToPoint(int anchor, SPItem *item, Geom::Point p) +/** + * Moves an SPItem to a given location, the location is based on the given anchor point. + * @param anchor 0 to 8 are the various bounding box points like follows: + * 0 1 2 + * 3 4 5 + * 6 7 8 + * Anchor mode 9 is the rotational center of the object + * @param item Item to move + * @param p point at which to move the object + */ +static void moveToPoint(int anchor, SPItem *item, Geom::Point p) { sp_item_move_rel(item, Geom::Translate(p - getAnchorPoint(anchor, item))); } diff --git a/src/ui/dialog/polar-arrange-tab.h b/src/ui/dialog/polar-arrange-tab.h index 3481bc4a0..019b64511 100644 --- a/src/ui/dialog/polar-arrange-tab.h +++ b/src/ui/dialog/polar-arrange-tab.h @@ -23,13 +23,17 @@ namespace Dialog { class ArrangeDialog; +/** + * PolarArrangeTab is a Tab displayed in the Arrange dialog and contains + * enables the user to arrange objects on a circular or elliptical shape + */ class PolarArrangeTab : public ArrangeTab { public: PolarArrangeTab(ArrangeDialog *parent_); virtual ~PolarArrangeTab() {}; /** - * Do the actual work + * Do the actual arrangement */ virtual void arrange(); @@ -85,3 +89,14 @@ private: } //namespace Inkscape #endif /* INKSCAPE_UI_DIALOG_POLAR_ARRANGE_TAB_H */ + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : -- cgit v1.2.3 From 8d97fe84d570a73ba3b48269308bd360332b8250 Mon Sep 17 00:00:00 2001 From: Denis Declara Date: Sat, 19 May 2012 18:39:38 +0200 Subject: The Polar Arrange Tab of the Arrange Dialog now hides the parametric controls until the user selects the corresponding radio button (bzr r11073.1.35) --- src/ui/dialog/polar-arrange-tab.cpp | 9 ++------- src/ui/dialog/tile.cpp | 9 ++++++++- src/ui/dialog/tile.h | 2 ++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/ui/dialog/polar-arrange-tab.cpp b/src/ui/dialog/polar-arrange-tab.cpp index 2056c7820..623aa4e3e 100644 --- a/src/ui/dialog/polar-arrange-tab.cpp +++ b/src/ui/dialog/polar-arrange-tab.cpp @@ -75,16 +75,13 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) arrangeOnParametersRadio.signal_toggled().connect(sigc::mem_fun(*this, &PolarArrangeTab::on_arrange_radio_changed)); pack_start(arrangeOnParametersRadio, false, false); - //FIXME: Objects in grid do not line up properly! centerLabel.set_text(_("Center X/Y:")); parametersTable.attach(centerLabel, 0, 1, 0, 1, Gtk::FILL); centerX.setDigits(2); - //centerX.set_size_request(60, -1); centerX.setIncrements(0.2, 0); centerX.setRange(-10000, 10000); centerX.setValue(0, "px"); centerY.setDigits(2); - //centerY.set_size_request(120, -1); centerY.setIncrements(0.2, 0); centerY.setRange(-10000, 10000); centerY.setValue(0, "px"); @@ -94,12 +91,10 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) radiusLabel.set_text(_("Radius X/Y:")); parametersTable.attach(radiusLabel, 0, 1, 1, 2, Gtk::FILL); radiusX.setDigits(2); - //radiusX.set_size_request(60, -1); radiusX.setIncrements(0.2, 0); radiusX.setRange(0.001, 10000); radiusX.setValue(100, "px"); radiusY.setDigits(2); - //radiusY.set_size_request(120, -1); radiusY.setIncrements(0.2, 0); radiusY.setRange(0.001, 10000); radiusY.setValue(100, "px"); @@ -109,12 +104,10 @@ PolarArrangeTab::PolarArrangeTab(ArrangeDialog *parent_) angleLabel.set_text(_("Angle X/Y:")); parametersTable.attach(angleLabel, 0, 1, 2, 3, Gtk::FILL); angleX.setDigits(2); - //angleX.set_size_request(60, -1); angleX.setIncrements(0.2, 0); angleX.setRange(-10000, 10000); angleX.setValue(0, "°"); angleY.setDigits(2); - //angleY.set_size_request(120, -1); angleY.setIncrements(0.2, 0); angleY.setRange(-10000, 10000); angleY.setValue(180, "°"); @@ -394,6 +387,8 @@ void PolarArrangeTab::on_arrange_radio_changed() radiusX.set_sensitive(arrangeParametric); radiusY.set_sensitive(arrangeParametric); + + parametersTable.set_visible(arrangeParametric); } void PolarArrangeTab::on_anchor_radio_changed() diff --git a/src/ui/dialog/tile.cpp b/src/ui/dialog/tile.cpp index c967509f9..1ed099120 100644 --- a/src/ui/dialog/tile.cpp +++ b/src/ui/dialog/tile.cpp @@ -41,7 +41,14 @@ ArrangeDialog::ArrangeDialog() _arrangeButton->set_use_underline(true); _arrangeButton->set_tooltip_text(_("Arrange selected objects")); contents->pack_start(_arrangeBox); - show_all_children(); + //show_all_children(); +} + + +void ArrangeDialog::on_show() +{ + UI::Widget::Panel::on_show(); + _polarArrangeTab->on_arrange_radio_changed(); } void ArrangeDialog::_apply() diff --git a/src/ui/dialog/tile.h b/src/ui/dialog/tile.h index d42dd7f65..8d4e9584b 100644 --- a/src/ui/dialog/tile.h +++ b/src/ui/dialog/tile.h @@ -54,6 +54,8 @@ public: */ virtual void _apply(); + virtual void on_show(); + static ArrangeDialog& getInstance() { return *new ArrangeDialog(); } }; -- cgit v1.2.3 From 2b34ad03d59938b3ab142cca56b71366d0cf61ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20dos=20Santos=20Oliveira?= Date: Sun, 6 Oct 2013 22:47:06 -0300 Subject: Running libdepixelize expensive process in a background thread (bzr r12667.1.1) --- src/ui/dialog/pixelartdialog.cpp | 164 ++++++++++++++++++++++++++++----------- 1 file changed, 117 insertions(+), 47 deletions(-) diff --git a/src/ui/dialog/pixelartdialog.cpp b/src/ui/dialog/pixelartdialog.cpp index ff527434e..3f3ebc0b6 100644 --- a/src/ui/dialog/pixelartdialog.cpp +++ b/src/ui/dialog/pixelartdialog.cpp @@ -16,6 +16,16 @@ # include #endif +#ifdef GLIBMM_DISABLE_DEPRECATED +# undef GLIBMM_DISABLE_DEPRECATED +# include +# include +# define GLIBMM_DISABLE_DEPRECATED 1 +#else // GLIBMM_DISABLE_DEPRECATED +# include +# include +#endif // GLIBMM_DISABLE_DEPRECATED + #include "pixelartdialog.h" #include #include @@ -54,18 +64,6 @@ namespace Inkscape { namespace UI { namespace Dialog { -template -T move(T &obj) -{ -#ifdef LIBDEPIXELIZE_ENABLE_CPP11 - return std::move(obj); -#else - T ret; - std::swap(obj, ret); - return ret; -#endif // LIBDEPIXELIZE_ENABLE_CPP11 -} - /** * A dialog for adjusting pixel art -> vector tracing parameters */ @@ -77,6 +75,23 @@ public: ~PixelArtDialogImpl(); private: + struct Input + { + Glib::RefPtr pixbuf; + SVGLength x; + SVGLength y; + }; + struct Output + { + Output(Tracer::Splines splines, SVGLength x, SVGLength y) : + splines(splines), x(x), y(y) + {} + + Tracer::Splines splines; + SVGLength x; + SVGLength y; + }; + void setDesktop(SPDesktop *desktop); void setTargetDesktop(SPDesktop *desktop); @@ -89,7 +104,8 @@ private: Tracer::Kopf2011::Options options(); void vectorize(); - void processLibdepixelize(SPImage *img); + void processLibdepixelize(const Input &image); + void importOutput(const Output &out); void setDefaults(); void updatePreview(); @@ -133,9 +149,21 @@ private: Gtk::RadioButton optimizeRadioButton; #endif // LIBDEPIXELIZE_INKSCAPE_ENABLE_SMOOTH + //############ UI Logic data + SPDesktop *desktop; DesktopTracker deskTrack; sigc::connection desktopChangeConn; + + //############ Threads + void workerThread(); + void onWorkerThreadFinished(); + Glib::Thread *thread; + volatile gint abortThread; // C++11's atomic stuff is sooo much nicer + Glib::Dispatcher dispatcher; + std::vector queue; + std::vector output; + Tracer::Kopf2011::Options lastOptions; }; void PixelArtDialogImpl::setDesktop(SPDesktop *desktop) @@ -288,6 +316,9 @@ PixelArtDialogImpl::PixelArtDialogImpl() : deskTrack.connect(GTK_WIDGET(gobj())); signalResponse().connect(sigc::mem_fun(*this, &PixelArtDialogImpl::responseCallback)); + + dispatcher.connect( + sigc::mem_fun(*this, &PixelArtDialogImpl::onWorkerThreadFinished) ); } void PixelArtDialogImpl::responseCallback(int response_id) @@ -295,7 +326,8 @@ void PixelArtDialogImpl::responseCallback(int response_id) if (response_id == GTK_RESPONSE_OK) { vectorize(); } else if (response_id == GTK_RESPONSE_CANCEL) { - // TODO + // libdepixelize's interface need to be extended to allow aborts + g_atomic_int_set(&abortThread, true); } else if (response_id == GTK_RESPONSE_HELP) { setDefaults(); } else { @@ -340,60 +372,69 @@ void PixelArtDialogImpl::vectorize() return; } - bool found = false; - for ( GSList const *list = desktop->selection->itemList() ; list ; list = list->next ) { if ( !SP_IS_IMAGE(list->data) ) continue; - found = true; + SPImage *img = SP_IMAGE(list->data); + Input input; + input.pixbuf = Glib::wrap(img->pixbuf->getPixbufRaw(), true); + input.x = img->x; + input.y = img->y; + + if ( input.pixbuf->get_width() > 256 + || input.pixbuf->get_height() > 256 ) { + char *msg = _("Image looks too big. Process may take a while and is" + " wise to save your document before continue." + "\n\nContinue the procedure (without saving)?"); + Gtk::MessageDialog dialog(msg, false, Gtk::MESSAGE_WARNING, + Gtk::BUTTONS_OK_CANCEL, true); + + if ( dialog.run() != Gtk::RESPONSE_OK ) + continue; + } - processLibdepixelize(SP_IMAGE(list->data)); + queue.push_back(input); + //processLibdepixelize(SP_IMAGE(list->data)); } - if ( !found ) { + if ( !queue.size() ) { char *msg = _("Select an image to trace"); msgStack->flash(Inkscape::ERROR_MESSAGE, msg); return; } - DocumentUndo::done(desktop->doc(), SP_VERB_SELECTION_PIXEL_ART, - _("Trace pixel art")); + mainCancelButton->set_sensitive(true); + mainOkButton->set_sensitive(false); - // Flush pending updates - desktop->doc()->ensureUpToDate(); + lastOptions = options(); + + g_atomic_int_set(&abortThread, false); + thread = Glib::Thread::create( + sigc::mem_fun(*this, &PixelArtDialogImpl::workerThread) ); } -void PixelArtDialogImpl::processLibdepixelize(SPImage *img) +void PixelArtDialogImpl::processLibdepixelize(const Input &input) { - Tracer::Splines out; - - Glib::RefPtr pixbuf - = Glib::wrap(img->pixbuf->getPixbufRaw(), true); - - if ( pixbuf->get_width() > 256 || pixbuf->get_height() > 256 ) { - char *msg = _("Image looks too big. Process may take a while and is" - " wise to save your document before continue." - "\n\nContinue the procedure (without saving)?"); - Gtk::MessageDialog dialog(msg, false, Gtk::MESSAGE_WARNING, - Gtk::BUTTONS_OK_CANCEL, true); - - if ( dialog.run() != Gtk::RESPONSE_OK ) - return; - } - if ( voronoiRadioButton.get_active() ) { - out = Tracer::Kopf2011::to_voronoi(pixbuf, options()); + output.push_back(Output(Tracer::Kopf2011::to_voronoi(input.pixbuf, + lastOptions), + input.x, input.y)); } else { - out = Tracer::Kopf2011::to_splines(pixbuf, options()); + output.push_back(Output(Tracer::Kopf2011::to_splines(input.pixbuf, + lastOptions), + input.x, input.y)); } +} +void PixelArtDialogImpl::importOutput(const Output &output) +{ Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc(); Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); - for ( Tracer::Splines::iterator it = out.begin(), end = out.end() - ; it != end ; ++it ) { + for ( Tracer::Splines::const_iterator it = output.splines.begin(), + end = output.splines.end() ; it != end ; ++it ) { Inkscape::XML::Node *repr = xml_doc->createElement("svg:path"); { @@ -421,7 +462,7 @@ void PixelArtDialogImpl::processLibdepixelize(SPImage *img) sp_repr_css_attr_unref(css); } - gchar *str = sp_svg_write_path(move(it->pathVector)); + gchar *str = sp_svg_write_path(it->pathVector); repr->setAttribute("d", str); g_free(str); @@ -433,14 +474,20 @@ void PixelArtDialogImpl::processLibdepixelize(SPImage *img) { group->setAttribute("transform", (std::string("translate(") - + sp_svg_length_write_with_units(img->x) - + ' ' + sp_svg_length_write_with_units(img->y) + + sp_svg_length_write_with_units(output.x) + + ' ' + sp_svg_length_write_with_units(output.y) + ')').c_str()); } desktop->currentLayer()->appendChildRepr(group); Inkscape::GC::release(group); + + DocumentUndo::done(desktop->doc(), SP_VERB_SELECTION_PIXEL_ART, + _("Trace pixel art")); + + // Flush pending updates + desktop->doc()->ensureUpToDate(); } void PixelArtDialogImpl::setDefaults() @@ -481,6 +528,29 @@ void PixelArtDialogImpl::updatePreview() pendingPreview = false; } +void PixelArtDialogImpl::workerThread() +{ + for ( std::vector::iterator it = queue.begin(), end = queue.end() + ; it != end && !g_atomic_int_get(&abortThread) ; ++it ) { + processLibdepixelize(*it); + } + queue.clear(); + dispatcher(); +} + +void PixelArtDialogImpl::onWorkerThreadFinished() +{ + thread->join(); + thread = NULL; + for ( std::vector::const_iterator it = output.begin(), + end = output.end() ; it != end ; ++it ) { + importOutput(*it); + } + output.clear(); + mainCancelButton->set_sensitive(false); + mainOkButton->set_sensitive(true); +} + /** * Factory method. Use this to create a new PixelArtDialog */ -- cgit v1.2.3 From 20062e01bfce8a97746e438bc0f7e89ce6400015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vin=C3=ADcius=20dos=20Santos=20Oliveira?= Date: Mon, 7 Oct 2013 00:26:05 -0300 Subject: Removing useless comment (bzr r12667.1.2) --- src/ui/dialog/pixelartdialog.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/dialog/pixelartdialog.cpp b/src/ui/dialog/pixelartdialog.cpp index 3f3ebc0b6..d5313b2c8 100644 --- a/src/ui/dialog/pixelartdialog.cpp +++ b/src/ui/dialog/pixelartdialog.cpp @@ -396,7 +396,6 @@ void PixelArtDialogImpl::vectorize() } queue.push_back(input); - //processLibdepixelize(SP_IMAGE(list->data)); } if ( !queue.size() ) { -- cgit v1.2.3 From 0c59dfecac91c2c606a8172a78bdcad71329e4f1 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 12 Jan 2014 22:00:46 +0100 Subject: fix build with boehm-gc 7.4.0+ (patch by Vladimir Smirnov, slightly modified by me) Fixed bugs: - https://launchpad.net/bugs/1265072 (bzr r12918) --- src/gc-core.h | 2 +- src/gc.cpp | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gc-core.h b/src/gc-core.h index 85fbada60..3957bda1a 100644 --- a/src/gc-core.h +++ b/src/gc-core.h @@ -57,7 +57,7 @@ struct Ops { CleanupFunc *old_func, void **old_data); int (*general_register_disappearing_link)(void **p_ptr, - void *base); + void const *base); int (*unregister_disappearing_link)(void **p_ptr); std::size_t (*get_heap_size)(); std::size_t (*get_free_bytes)(); diff --git a/src/gc.cpp b/src/gc.cpp index 9c59691cb..280a8b1dc 100644 --- a/src/gc.cpp +++ b/src/gc.cpp @@ -70,9 +70,13 @@ void *debug_base(void *ptr) { return base + debug_base_fixup(); } -int debug_general_register_disappearing_link(void **p_ptr, void *base) { - char *real_base=reinterpret_cast(base) - debug_base_fixup(); +int debug_general_register_disappearing_link(void **p_ptr, void const *base) { + char const *real_base = reinterpret_cast(base) - debug_base_fixup(); +#if (GC_MAJOR_VERSION >= 7 && GC_MINOR_VERSION >= 4) return GC_general_register_disappearing_link(p_ptr, real_base); +#else // compatibility with older Boehm GC versions + return GC_general_register_disappearing_link(p_ptr, const_cast(real_base)); +#endif } void dummy_do_init() {} @@ -90,7 +94,7 @@ void dummy_register_finalizer(void *, CleanupFunc, void *, } } -int dummy_general_register_disappearing_link(void **, void *) { return false; } +int dummy_general_register_disappearing_link(void **, void const *) { return false; } int dummy_unregister_disappearing_link(void **/*link*/) { return false; } @@ -112,7 +116,11 @@ Ops enabled_ops = { &GC_malloc_atomic_uncollectable, &GC_base, &GC_register_finalizer_ignore_self, - &GC_general_register_disappearing_link, +#if (GC_MAJOR_VERSION >= 7 && GC_MINOR_VERSION >= 4) + &GC_general_register_disappearing_link, +#else // compatibility with older Boehm GC versions + (int (*)(void**, const void*))(&GC_general_register_disappearing_link), +#endif &GC_unregister_disappearing_link, &GC_get_heap_size, &GC_get_free_bytes, @@ -202,7 +210,7 @@ void stub_register_finalizer_ignore_self(void *, CleanupFunc, void *, die_because_not_initialized(); } -int stub_general_register_disappearing_link(void **, void *) { +int stub_general_register_disappearing_link(void **, void const *) { die_because_not_initialized(); return 0; } -- cgit v1.2.3 From 529a8c8e082f55e197a31a428751392849731674 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 12 Jan 2014 22:32:42 +0100 Subject: lpe knot: code cleanup. mostly adding parens to if-statement predicates that relied on operator precedence (bzr r12919) --- src/live_effects/lpe-knot.cpp | 71 ++++++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp index 8fec69958..e91677e18 100644 --- a/src/live_effects/lpe-knot.cpp +++ b/src/live_effects/lpe-knot.cpp @@ -161,14 +161,14 @@ CrossingPoints::CrossingPoints(std::vector const &paths) : std::vect for( unsigned j=i; j > times; - if ( i==j && ii==jj){ + if ( (i==j) && (ii==jj) ) { // std::cout<<"--(self int)\n"; // std::cout << paths[i][ii].toSBasis()[Geom::X] <<"\n"; // std::cout << paths[i][ii].toSBasis()[Geom::Y] <<"\n"; find_self_intersections( times, paths[i][ii].toSBasis() ); - }else{ + } else { // std::cout<<"--(pair int)\n"; // std::cout << paths[i][ii].toSBasis()[Geom::X] <<"\n"; // std::cout << paths[i][ii].toSBasis()[Geom::Y] <<"\n"; @@ -180,15 +180,17 @@ CrossingPoints::CrossingPoints(std::vector const &paths) : std::vect } for (unsigned k=0; k const &paths) : std::vect } unsigned count = 0; for ( std::map < double, unsigned >::iterator m=cuts.begin(); m!=cuts.end(); ++m ){ - if ( (*this)[m->second].i == i && (*this)[m->second].ti == m->first ){ + if ( ((*this)[m->second].i == i) && ((*this)[m->second].ti == m->first) ){ (*this)[m->second].ni = count; }else{ (*this)[m->second].nj = count; @@ -230,7 +232,7 @@ CrossingPoints::CrossingPoints(std::vector const &paths) : std::vect CrossingPoints::CrossingPoints(std::vector const &input) : std::vector() { - if (input.size()>0 && input.size()%9 ==0){ + if ( (input.size() > 0) && (input.size()%9 == 0) ){ using namespace Geom; for( unsigned n=0; ndist_k){ + if ( (dist < 0) || (dist > dist_k) ) { result = k; dist = dist_k; } @@ -304,28 +307,28 @@ void CrossingPoints::inherit_signs(CrossingPoints const &other, int default_value) { bool topo_changed = false; - for (unsigned n=0; n const &path_in) std::vector dom; dom.push_back(Interval(0., size_nondegenerate(gpaths[i0]))); for (unsigned p = 0; p < crossing_points.size(); p++){ - if (crossing_points[p].i == i0 || crossing_points[p].j == i0){ + if ( (crossing_points[p].i == i0) || (crossing_points[p].j == i0) ) { unsigned i = crossing_points[p].i; unsigned j = crossing_points[p].j; double ti = crossing_points[p].ti; @@ -475,14 +478,14 @@ LPEKnot::doEffect_path (std::vector const &path_in) //If the current path is closed and the last/first point is still there, glue first and last piece. unsigned beg_comp = 0, end_comp = dom.size(); - if ( gpaths[i0].closed() && dom.front().min() == 0 && dom.back().max() == size_nondegenerate(gpaths[i0]) ){ + if ( gpaths[i0].closed() && (dom.front().min() == 0) && (dom.back().max() == size_nondegenerate(gpaths[i0])) ) { if ( dom.size() == 1){ path_out.push_back(gpaths[i0]); continue; }else{ // std::cout<<"fusing first and last component\n"; - beg_comp++; - end_comp--; + ++beg_comp; + --end_comp; Path first = gpaths[i0].portion(dom.back()); //FIXME: STITCH_DISCONTINUOUS should not be necessary (?!?) first.append(gpaths[i0].portion(dom.front()), Path::STITCH_DISCONTINUOUS); @@ -594,19 +597,19 @@ LPEKnot::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector= crossing_points.size()||crossing_points[selectedCrossing].sign > 0){ + if ( (selectedCrossing >= crossing_points.size()) || (crossing_points[selectedCrossing].sign > 0) ) { //svgd = "M -10,0 A 10 10 0 1 0 0,-10 l 5,-1 -1,2"; svgd = "m -7.07,7.07 c 3.9,3.91 10.24,3.91 14.14,0 3.91,-3.9 3.91,-10.24 0,-14.14 -3.9,-3.91 -10.24,-3.91 -14.14,0 l 2.83,-4.24 0.7,2.12"; - }else if (crossing_points[selectedCrossing].sign < 0){ + } else if (crossing_points[selectedCrossing].sign < 0) { //svgd = "M 10,0 A 10 10 0 1 1 0,-10 l -5,-1 1,2"; svgd = "m 7.07,7.07 c -3.9,3.91 -10.24,3.91 -14.14,0 -3.91,-3.9 -3.91,-10.24 0,-14.14 3.9,-3.91 10.24,-3.91 14.14,0 l -2.83,-4.24 -0.7,2.12"; - }else{ + } else { //svgd = "M 10,0 A 10 10 0 1 0 -10,0 A 10 10 0 1 0 10,0 "; svgd = "M 10,0 C 10,5.52 5.52,10 0,10 -5.52,10 -10,5.52 -10,0 c 0,-5.52 4.48,-10 10,-10 5.52,0 10,4.48 10,10 z"; } PathVector pathv = sp_svg_read_pathv(svgd); pathv *= Affine(r,0,0,r,0,0); - pathv+=switcher; + pathv += switcher; hp_vec.push_back(pathv); } -- cgit v1.2.3 From 64e60300f6690bdf1482fa67d368ef98889b7817 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 12 Jan 2014 23:12:14 +0100 Subject: LPE: rename function getHelperPaths --> getCanvasIndicators (the function is not yet called by anyone, but the naming was confusing) (bzr r12920) --- src/live_effects/effect.cpp | 20 +++++++------------- src/live_effects/effect.h | 2 +- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 70ce1e89d..12990ee24 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -486,11 +486,13 @@ Effect::addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item) { } /** - * Return a vector of PathVectors which contain all helperpaths that should be drawn by the effect. - * This is the function called by external code like SPLPEItem. + * Return a vector of PathVectors which contain all canvas indicators for this effect. + * This is the function called by external code to get all canvas indicators (effect and its parameters) + * lpeitem = the item onto which this effect is applied + * @todo change return type to one pathvector, add all paths to one pathvector instead of maintaining a vector of pathvectors */ std::vector -Effect::getHelperPaths(SPLPEItem const* lpeitem) +Effect::getCanvasIndicators(SPLPEItem const* lpeitem) { std::vector hp_vec; @@ -499,18 +501,10 @@ Effect::getHelperPaths(SPLPEItem const* lpeitem) return hp_vec; } - // TODO: we can probably optimize this by using a lot more references - // rather than copying PathVectors all over the place - if (show_orig_path) { - // add original path to helperpaths - SPCurve* curve = SP_SHAPE(lpeitem)->getCurve (); - hp_vec.push_back(curve->get_pathvector()); - } - - // add other helperpaths provided by the effect itself + // add indicators provided by the effect itself addCanvasIndicators(lpeitem, hp_vec); - // add helperpaths provided by the effect's parameters + // add indicators provided by the effect's parameters for (std::vector::iterator p = param_vector.begin(); p != param_vector.end(); ++p) { (*p)->addCanvasIndicators(lpeitem, hp_vec); } diff --git a/src/live_effects/effect.h b/src/live_effects/effect.h index b9d86628f..1da9b4cc9 100644 --- a/src/live_effects/effect.h +++ b/src/live_effects/effect.h @@ -90,7 +90,7 @@ public: // (but spiro lpe still needs it!) virtual LPEPathFlashType pathFlashType() const { return DEFAULT; } void addHandles(KnotHolder *knotholder, SPDesktop *desktop, SPItem *item); - std::vector getHelperPaths(SPLPEItem const* lpeitem); + std::vector getCanvasIndicators(SPLPEItem const* lpeitem); inline bool providesOwnFlashPaths() const { return provides_own_flash_paths || show_orig_path; -- cgit v1.2.3 From 5eb9b4815a12cc0dafd07905f7715a7e15a92b41 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Mon, 13 Jan 2014 00:25:39 +0100 Subject: update 2geom's copy to r2142 (bzr r12921) --- src/2geom/Makefile_insert | 4 +- src/2geom/affine.cpp | 3 +- src/2geom/affine.h | 15 +- src/2geom/angle.h | 18 ++- src/2geom/basic-intersection.cpp | 17 +- src/2geom/bezier-clipping.cpp | 16 +- src/2geom/bezier-utils.cpp | 3 +- src/2geom/circle.cpp | 19 ++- src/2geom/circle.h | 1 + src/2geom/conicsec.cpp | 10 +- src/2geom/convex-cover.cpp | 14 +- src/2geom/convex-cover.h | 7 +- src/2geom/crossing.cpp | 2 +- src/2geom/d2.h | 2 +- src/2geom/ellipse.h | 5 +- src/2geom/elliptical-arc.cpp | 12 +- src/2geom/generic-rect.h | 2 +- src/2geom/interval.h | 4 +- src/2geom/linear.h | 2 +- src/2geom/math-utils.h | 7 +- src/2geom/nearest-point.cpp | 7 +- src/2geom/ord.h | 2 +- src/2geom/path-intersection.cpp | 7 +- src/2geom/path-sink.cpp | 119 ++++++++++++++ src/2geom/path-sink.h | 230 ++++++++++++++++++++++++++++ src/2geom/path.cpp | 9 +- src/2geom/pathvector.h | 5 +- src/2geom/piecewise.h | 15 +- src/2geom/point.cpp | 7 +- src/2geom/point.h | 9 -- src/2geom/recursive-bezier-intersection.cpp | 36 ++--- src/2geom/sbasis-geometric.cpp | 10 +- src/2geom/sbasis-to-bezier.cpp | 123 ++++++++++++++- src/2geom/sbasis-to-bezier.h | 1 + src/2geom/solve-bezier-one-d.cpp | 7 +- src/2geom/solve-bezier-parametric.cpp | 44 ++---- src/2geom/solve-bezier.cpp | 18 +-- src/2geom/svg-elliptical-arc.cpp | 12 +- src/2geom/svg-path-parser.cpp | 77 +++++----- src/2geom/svg-path-parser.h | 7 +- src/2geom/svg-path.cpp | 111 -------------- src/2geom/svg-path.h | 185 ---------------------- src/2geom/toposweep.h | 2 +- src/2geom/transforms.cpp | 1 + src/2geom/utils.cpp | 5 +- src/2geom/utils.h | 2 +- src/display/drawing-shape.cpp | 2 +- src/libnrtype/FontInstance.cpp | 4 +- src/live_effects/lpe-powerstroke.cpp | 4 +- src/sp-ellipse.cpp | 4 +- src/svg/svg-path.cpp | 6 +- src/ui/tool/path-manipulator.cpp | 4 +- 52 files changed, 698 insertions(+), 540 deletions(-) create mode 100644 src/2geom/path-sink.cpp create mode 100644 src/2geom/path-sink.h delete mode 100644 src/2geom/svg-path.cpp delete mode 100644 src/2geom/svg-path.h diff --git a/src/2geom/Makefile_insert b/src/2geom/Makefile_insert index 07e066df5..e77f413cb 100644 --- a/src/2geom/Makefile_insert +++ b/src/2geom/Makefile_insert @@ -71,6 +71,8 @@ 2geom/path.h \ 2geom/path-intersection.cpp \ 2geom/path-intersection.h \ + 2geom/path-sink.cpp \ + 2geom/path-sink.h \ 2geom/pathvector.cpp \ 2geom/pathvector.h \ 2geom/piecewise.cpp \ @@ -110,8 +112,6 @@ 2geom/solver.h \ 2geom/svg-elliptical-arc.cpp \ 2geom/svg-elliptical-arc.h \ - 2geom/svg-path.cpp \ - 2geom/svg-path.h \ 2geom/svg-path-parser.cpp \ 2geom/svg-path-parser.h \ 2geom/sweep.cpp \ diff --git a/src/2geom/affine.cpp b/src/2geom/affine.cpp index 0ef6d2708..738d0fc48 100644 --- a/src/2geom/affine.cpp +++ b/src/2geom/affine.cpp @@ -454,8 +454,7 @@ Eigen::Eigen(Affine const &m) { } } -static void quadratic_roots(double q0, double q1, double q2, int &n, double&r0, double&r1) { - std::vector r; +static void quadratic_roots(const double q0, const double q1, const double q2, int &n, double&r0, double&r1) { if(q2 == 0) { if(q1 == 0) { // zero or infinite roots n = 0; diff --git a/src/2geom/affine.h b/src/2geom/affine.h index b17da1887..af7b39360 100644 --- a/src/2geom/affine.h +++ b/src/2geom/affine.h @@ -75,12 +75,6 @@ public: _c[1] = _c[2] = _c[4] = _c[5] = 0; } - Affine(Affine const &m) { - for(int i = 0; i < 6; i++) { - _c[i] = m[i]; - } - } - /** @brief Create a matrix from its coefficient values. * It's rather inconvenient to directly create matrices in this way. Use transform classes * if your transformation has a geometric interpretation. @@ -88,19 +82,14 @@ public: * @see Scale * @see Rotate * @see HShear - * @see VShear */ + * @see VShear + * @see Zoom */ Affine(Coord c0, Coord c1, Coord c2, Coord c3, Coord c4, Coord c5) { _c[0] = c0; _c[1] = c1; _c[2] = c2; _c[3] = c3; _c[4] = c4; _c[5] = c5; } - Affine &operator=(Affine const &m) { - for(int i = 0; i < 6; i++) - _c[i] = m._c[i]; - return *this; - } - /** @brief Access a coefficient by its index. */ inline Coord operator[](unsigned i) const { return _c[i]; } inline Coord &operator[](unsigned i) { return _c[i]; } diff --git a/src/2geom/angle.h b/src/2geom/angle.h index bdf546989..1faf63c3f 100644 --- a/src/2geom/angle.h +++ b/src/2geom/angle.h @@ -48,6 +48,9 @@ namespace Geom { #ifndef M_PI # define M_PI 3.14159265358979323846 #endif +#ifndef M_1_2PI +# define M_1_2PI 0.159154943091895335768883763373 +#endif /** @brief Wrapper for angular values. * @@ -64,6 +67,7 @@ class Angle > > { public: + Angle() : _angle(0) {} //added default constructor because of cython Angle(Coord v) : _angle(v) { _normalize(); } // this can be called implicitly explicit Angle(Point p) : _angle(atan2(p)) { _normalize(); } Angle(Point a, Point b) : _angle(angle_between(a, b)) { _normalize(); } @@ -85,7 +89,7 @@ public: /** @brief Get the angle as radians. * @return Number in range \f$[-\pi, \pi)\f$. */ Coord radians() const { - return _angle > M_PI ? _angle - 2*M_PI : _angle; + return _angle >= M_PI ? _angle - 2*M_PI : _angle; } /** @brief Get the angle as positive radians. * @return Number in range \f$[0, 2\pi)\f$. */ @@ -95,7 +99,7 @@ public: /** @brief Get the angle as degrees in math convention. * @return Number in range [-180, 180) obtained by scaling the result of radians() * by \f$180/\pi\f$. */ - Coord degrees() const { return radians() / M_PI * 180.0; } + Coord degrees() const { return radians() * (180.0 / M_PI); } /** @brief Get the angle as degrees in clock convention. * This method converts the angle to the "clock convention": angles start from the +Y axis * and grow clockwise. This means that 0 corresponds to \f$\pi/2\f$ radians, @@ -103,7 +107,7 @@ public: * @return A number in the range [0, 360). */ Coord degreesClock() const { - Coord ret = 90.0 - _angle / M_PI * 180.0; + Coord ret = 90.0 - _angle * (180.0 / M_PI); if (ret < 0) ret += 360; return ret; } @@ -114,7 +118,7 @@ public: } /** @brief Create an angle from its measure in degrees. */ static Angle from_degrees(Coord d) { - Angle a(d * M_PI / 180); + Angle a(d * (M_PI / 180.0)); return a; } /** @brief Create an angle from its measure in degrees in clock convention. @@ -123,16 +127,16 @@ public: // first make sure d is in [0, 360) d = std::fmod(d, 360.0); if (d < 0) d += 360.0; - Coord rad = M_PI/2 - d * M_PI / 180.0; + Coord rad = M_PI/2 - d * (M_PI / 180.0); if (rad < 0) rad += 2*M_PI; Angle a; a._angle = rad; return a; } private: - Angle() {} + void _normalize() { - _angle -= floor(_angle / (2*M_PI)) * 2*M_PI; + _angle -= floor(_angle * (1.0/(2*M_PI))) * 2*M_PI; } Coord _angle; // this is always in [0, 2pi) friend class AngleInterval; diff --git a/src/2geom/basic-intersection.cpp b/src/2geom/basic-intersection.cpp index 544bf0dd1..379ec597c 100644 --- a/src/2geom/basic-intersection.cpp +++ b/src/2geom/basic-intersection.cpp @@ -64,15 +64,13 @@ void find_intersections(std::vector< std::pair > & xs, void split(vector const &p, double t, vector &left, vector &right) { const unsigned sz = p.size(); - - Geom::Point **Vtemp = new Geom::Point* [sz]; - - for (unsigned int i = 0; i < sz; ++i) { - Vtemp[i] = new Geom::Point[sz]; - } + //Geom::Point Vtemp[sz][sz]; + vector > Vtemp(sz); + for ( size_t i = 0; i < sz; ++i ) + Vtemp[i].reserve(sz); /* Copy control points */ - std::copy(p.begin(), p.end(), Vtemp[0]); + std::copy(p.begin(), p.end(), Vtemp[0].begin()); /* Triangle computation */ for (unsigned i = 1; i < sz; i++) { @@ -87,11 +85,6 @@ void split(vector const &p, double t, left[j] = Vtemp[j][0]; for (unsigned j = 0; j < sz; j++) right[j] = Vtemp[sz-1-j][j]; - - for (unsigned int i = 0; i < sz; ++i) - delete[] Vtemp[i]; - - delete[] Vtemp; } diff --git a/src/2geom/bezier-clipping.cpp b/src/2geom/bezier-clipping.cpp index fe925cf28..9a055204f 100644 --- a/src/2geom/bezier-clipping.cpp +++ b/src/2geom/bezier-clipping.cpp @@ -473,10 +473,9 @@ void fat_line_bounds (Interval& bound, { bound[0] = 0; bound[1] = 0; - double d; for (size_t i = 0; i < c.size(); ++i) { - d = distance(c[i], l); + const double d = distance(c[i], l); if (bound[0] > d) bound[0] = d; if (bound[1] < d) bound[1] = d; } @@ -509,10 +508,9 @@ void clip_interval (Interval& dom, double n = B.size() - 1; // number of sub-intervals std::vector D; // distance curve control points D.reserve (B.size()); - double d; for (size_t i = 0; i < B.size(); ++i) { - d = distance (B[i], l); + const double d = distance (B[i], l); D.push_back (Point(i/n, d)); } //print(D); @@ -699,8 +697,8 @@ void distance_control_points (std::vector & D, for (size_t j = 0; j < F.size(); ++j) dBF(i,j) = dot (dB[i], F[j]); - size_t k0, kn, l; - double bc, bri; + size_t l; + double bc; Point dij; std::vector d(F.size()); for (size_t i = 0; i <= r; ++i) @@ -709,9 +707,9 @@ void distance_control_points (std::vector & D, { d[j] = 0; } - k0 = std::max(i, n) - n; - kn = std::min(i, n-1); - bri = n / binomial(r,i); + const size_t k0 = std::max(i, n) - n; + const size_t kn = std::min(i, n-1); + const double bri = n / binomial(r,i); for (size_t k = k0; k <= kn; ++k) { //if (k > i || (i-k) > n) continue; diff --git a/src/2geom/bezier-utils.cpp b/src/2geom/bezier-utils.cpp index af07db707..ec17f6869 100644 --- a/src/2geom/bezier-utils.cpp +++ b/src/2geom/bezier-utils.cpp @@ -194,8 +194,6 @@ bezier_fit_cubic_full(Point bezier[], int split_points[], Point const &tHat1, Point const &tHat2, double const error, unsigned const max_beziers) { - int const maxIterations = 4; /* std::max times to try iterating */ - if(!(bezier != NULL) || !(data != NULL) || !(len > 0) || @@ -257,6 +255,7 @@ bezier_fit_cubic_full(Point bezier[], int split_points[], /* If error not too large, then try some reparameterization and iteration. */ if ( 0.0 <= maxErrorRatio && maxErrorRatio <= 3.0 ) { + int const maxIterations = 4; /* std::max times to try iterating */ for (int i = 0; i < maxIterations; i++) { generate_bezier(bezier, data, u, len, tHat1, tHat2, error); reparameterize(data, len, u, bezier); diff --git a/src/2geom/circle.cpp b/src/2geom/circle.cpp index 06eb4c2a1..d021882ea 100644 --- a/src/2geom/circle.cpp +++ b/src/2geom/circle.cpp @@ -88,7 +88,9 @@ void Circle::set(std::vector const& points) model.instance(*this, fitter.result(z)); } - +/** + @param inner a point whose angle with the circle center is inside the angle that the arc spans + */ EllipticalArc * Circle::arc(Point const& initial, Point const& inner, Point const& final, bool _svg_compliant) @@ -98,10 +100,8 @@ Circle::arc(Point const& initial, Point const& inner, Point const& final, return e.arc(initial, inner, final, _svg_compliant); } -void -Circle::getPath(std::vector &path_out) { - Path pb; - +D2 Circle::toSBasis() +{ D2 B; Linear bo = Linear(0, 2 * M_PI); @@ -110,6 +110,15 @@ Circle::getPath(std::vector &path_out) { B = B * m_ray + m_centre; + return B; +} + +void +Circle::getPath(std::vector &path_out) { + Path pb; + + D2 B = toSBasis(); + pb.append(SBasisCurve(B)); path_out.push_back(pb); diff --git a/src/2geom/circle.h b/src/2geom/circle.h index 67a638437..ca9241047 100644 --- a/src/2geom/circle.h +++ b/src/2geom/circle.h @@ -89,6 +89,7 @@ class Circle arc(Point const& initial, Point const& inner, Point const& final, bool _svg_compliant = true); + D2 toSBasis(); void getPath(std::vector &path_out); Point center() const diff --git a/src/2geom/conicsec.cpp b/src/2geom/conicsec.cpp index 7625df2fb..367dc2503 100644 --- a/src/2geom/conicsec.cpp +++ b/src/2geom/conicsec.cpp @@ -211,8 +211,6 @@ RatQuad RatQuad::fromPointsTangents(Point P0, Point dP0, } RatQuad RatQuad::circularArc(Point P0, Point P1, Point P2) { - Line Line0 = Line::from_origin_and_versor(P0, P1 - P0); - Line Line2 = Line::from_origin_and_versor(P2, P1 - P2); return RatQuad(P0, P1, P2, dot(unit_vector(P0 - P1), unit_vector(P0 - P2))); } @@ -583,7 +581,7 @@ xAx xAx::operator*(double const &b) const { LineSegment ls = intersection(Line::from_origin_and_versor(A, dA), bnd); return RatQuad::fromPointsTangents(A, dA, ls.pointAt(0.5), ls[1], dA); } - else if(crs.size() >= 2 and crs.size() < 4) { + else if(crs.size() >= 2 && crs.size() < 4) { Point A = crs[0]; Point C = crs[1]; if(crs.size() == 3) { @@ -607,7 +605,7 @@ xAx xAx::operator*(double const &b) const { Point dA = gradient(A); Point dC = gradient(C); - if(L2sq(dA) <= 1e-10 or L2sq(dC) <= 1e-10) { + if(L2sq(dA) <= 1e-10 || L2sq(dC) <= 1e-10) { return RatQuad::fromPointsTangents(A, C-A, B, C, A-C); } @@ -710,7 +708,7 @@ boost::optional xAx::bottom() const { } Interval xAx::extrema(Rect r) const { - if (c[0] == 0 and c[1] == 0 and c[2] == 0) { + if (c[0] == 0 && c[1] == 0 && c[2] == 0) { Interval ext(valueAt(r.corner(0))); for(int i = 1; i < 4; i++) ext |= Interval(valueAt(r.corner(i))); @@ -725,7 +723,7 @@ Interval xAx::extrema(Rect r) const { k = r[1][1]; ext |= quad_ex(c[0], c[1]*k+c[3], (c[2]*k + c[4])*k + c[5], r[0]); boost::optional B0 = bottom(); - if (B0 and r.contains(*B0)) + if (B0 && r.contains(*B0)) ext.expandTo(0); return ext; } diff --git a/src/2geom/convex-cover.cpp b/src/2geom/convex-cover.cpp index 306060f7c..5e599fdde 100644 --- a/src/2geom/convex-cover.cpp +++ b/src/2geom/convex-cover.cpp @@ -433,7 +433,7 @@ bool same_side(Point L[2], Point xs[4]) { int side = 0; for(int i = 0; i < 4; i++) { int sn = sgn(SignedTriangleArea(L[0], L[1], xs[i])); - if(sn and not side) + if(sn && !side) side = sn; else if(sn != side) return false; } @@ -455,7 +455,7 @@ std::vector > bridges(ConvexHull a, ConvexHull b) { double ap_angle = atan2(a[ai+1] - a[ai]); double bp_angle = atan2(b[bi+1] - b[bi]); Point L[2] = {a[ai], b[bi]}; - while(ai < int(a.size()) or bi < int(b.size())) { + while(ai < int(a.size()) || bi < int(b.size())) { if(ap_angle == bp_angle) { // In the case of parallel support lines, we must consider all four pairs of copodal points { @@ -478,7 +478,7 @@ std::vector > bridges(ConvexHull a, ConvexHull b) { bi++; bp_angle += angle_between(b[bi] - b[bi-1], b[bi+1] - b[bi]); L[1] = b[bi]; - //std::cout << "parallel\n"; + std::cout << "parallel\n"; } else if(ap_angle < bp_angle) { ai++; ap_angle += angle_between(a[ai] - a[ai-1], a[ai+1] - a[ai]); @@ -559,7 +559,7 @@ T idx_to_pair(pair p, int idx) { ConvexHull merge(ConvexHull a, ConvexHull b) { ConvexHull ret; - //std::cout << "---\n"; + std::cout << "---\n"; std::vector > bpair = bridges(a, b); // Given our list of bridges {(pb1, qb1), ..., (pbk, qbk)} @@ -574,10 +574,10 @@ ConvexHull merge(ConvexHull a, ConvexHull b) { for(unsigned k = 0; k < bpair.size(); k++) { unsigned limit = idx_to_pair(bpair[k], state); - /*std::cout << bpair[k].first << " , " << bpair[k].second << "; " + std::cout << bpair[k].first << " , " << bpair[k].second << "; " << idx << ", " << limit << ", s: " << state - << " \n";*/ + << " \n"; while(idx <= limit) { ret.boundary.push_back(chs[state][idx++]); } @@ -681,7 +681,7 @@ Point const * ConvexHull::furthest(Point direction) const { // is currently n*O(furthest) double ConvexHull::narrowest_diameter(Point &a, Point &b, Point &c) { Point tb = boundary.back(); - double d = INFINITY; + double d = std::numeric_limits::max(); for(unsigned i = 0; i < boundary.size(); i++) { Point tc = boundary[i]; Point n = -rot90(tb-tc); diff --git a/src/2geom/convex-cover.h b/src/2geom/convex-cover.h index a5f95a5fb..d290b7e80 100644 --- a/src/2geom/convex-cover.h +++ b/src/2geom/convex-cover.h @@ -84,8 +84,9 @@ public: public: ConvexHull() {} - ConvexHull(std::vector const & points) { - boundary = points; + ConvexHull(std::vector const & points) : + boundary (points) + { graham(); } @@ -163,7 +164,7 @@ unsigned find_bottom_right(ConvexHull const &a); /*** Arbitrary transform operator. * Take a convex hull and apply an arbitrary convexity preserving transform. - * we should be concerned about singular transforms here. + * we should be concerned about singular tranforms here. */ template ConvexHull operator*(ConvexHull const &p, T const &m) { ConvexHull pr; diff --git a/src/2geom/crossing.cpp b/src/2geom/crossing.cpp index 379eb4b00..13affa8e9 100644 --- a/src/2geom/crossing.cpp +++ b/src/2geom/crossing.cpp @@ -154,7 +154,7 @@ Crossings reverse_tb(Crossings const &cr, unsigned split, std::vector ma Crossings ret; for(Crossings::const_iterator i = cr.begin(); i != cr.end(); ++i) { double mx = max[i->b - split]; - //std::cout << i->b << "\n"; + std::cout << i->b << "\n"; ret.push_back(Crossing(i->ta, i->tb > mx+0.01 ? (1 - (i->tb - mx) + mx) : mx - i->tb, !i->dir)); } diff --git a/src/2geom/d2.h b/src/2geom/d2.h index ef88b2d68..5fc955854 100644 --- a/src/2geom/d2.h +++ b/src/2geom/d2.h @@ -150,7 +150,7 @@ template inline bool are_near(D2 const &a, D2 const &b, double tol) { boost::function_requires >(); - return are_near(a[0], b[0]) && are_near(a[1], b[1]); + return are_near(a[0], b[0], tol) && are_near(a[1], b[1], tol); } //IMPL: AddableConcept diff --git a/src/2geom/ellipse.h b/src/2geom/ellipse.h index 297254366..c971c6065 100644 --- a/src/2geom/ellipse.h +++ b/src/2geom/ellipse.h @@ -49,7 +49,10 @@ class Circle; class Ellipse { public: - Ellipse() + Ellipse(): + m_centre(), + m_ray(), + m_angle(0) {} Ellipse(double cx, double cy, double rx, double ry, double a) diff --git a/src/2geom/elliptical-arc.cpp b/src/2geom/elliptical-arc.cpp index d2cb0b707..c96d5f1a6 100644 --- a/src/2geom/elliptical-arc.cpp +++ b/src/2geom/elliptical-arc.cpp @@ -115,9 +115,11 @@ Rect EllipticalArc::boundsExact() const if ( arc_extremes[2] < arc_extremes[3] ) std::swap(arc_extremes[2], arc_extremes[3]); - for (unsigned i = 0; i < 4; ++i) { - if (containsAngle(extremes[i])) { - arc_extremes[i] = valueAtAngle(extremes[i], (i >> 1) ? Y : X); + if ( !are_near(initialPoint(), finalPoint()) ) { + for (unsigned i = 0; i < 4; ++i) { + if (containsAngle(extremes[i])) { + arc_extremes[i] = valueAtAngle(extremes[i], (i >> 1) ? Y : X); + } } } @@ -264,7 +266,7 @@ std::vector EllipticalArc::roots(Coord v, Dim2 d) const } double rotx, roty; - sincos(_rot_angle, roty, rotx); + sincos(_rot_angle, roty, rotx); /// \todo sin and cos are calculated in many places in this function, optimize this a bit! if (d == X) roty = -roty; double rxrotx = ray(X) * rotx; @@ -569,7 +571,7 @@ std::vector EllipticalArc::allNearestPoints( Point const& p, double from double mindistsq1 = std::numeric_limits::max(); double mindistsq2 = std::numeric_limits::max(); double dsq; - unsigned int mi1, mi2; + unsigned int mi1 = 0, mi2 = 0; for ( unsigned int i = 0; i < real_sol.size(); ++i ) { dsq = distanceSq(p, pointAtAngle(real_sol[i])); diff --git a/src/2geom/generic-rect.h b/src/2geom/generic-rect.h index eb9705a4b..bb6f2d2b8 100644 --- a/src/2geom/generic-rect.h +++ b/src/2geom/generic-rect.h @@ -261,7 +261,7 @@ public: expandBy(amount, amount); } /** @brief Expand the rectangle in both directions. - * Note that this is different from scaling. Negative values will shrink the + * Note that this is different from scaling. Negative values wil shrink the * rectangle. If -x is larger than * half of the width, the X interval will contain only the X coordinate * of the midpoint; same for height. */ diff --git a/src/2geom/interval.h b/src/2geom/interval.h index b1fac04d9..1714435be 100644 --- a/src/2geom/interval.h +++ b/src/2geom/interval.h @@ -114,9 +114,9 @@ public: /** @brief Check whether the interior of the interval includes the given interval. * Interior means all numbers in the interval except its ends. */ bool interiorContains(Interval const &val) const { return min() < val.min() && val.max() < max(); } - /** @brief Check whether the interiors of the intervals have any common elements. */ + /** @brief Check whether the interiors of the intervals have any common elements. A single point in common is not considered an intersection. */ bool interiorIntersects(Interval const &val) const { - return interiorContains(val.min()) || interiorContains(val.max()) || val.interiorContains(*this); + return std::max(min(), val.min()) < std::min(max(), val.max()); } /// @} diff --git a/src/2geom/linear.h b/src/2geom/linear.h index 6e5132e12..8c154364e 100644 --- a/src/2geom/linear.h +++ b/src/2geom/linear.h @@ -55,7 +55,7 @@ class SBasis; class Linear{ public: double a[2]; - Linear() {} + Linear() {a[0]=0; a[1]=0;} Linear(double aa, double b) {a[0] = aa; a[1] = b;} Linear(double aa) {a[0] = aa; a[1] = aa;} diff --git a/src/2geom/math-utils.h b/src/2geom/math-utils.h index 77280aa50..83c7b4f5e 100644 --- a/src/2geom/math-utils.h +++ b/src/2geom/math-utils.h @@ -40,6 +40,7 @@ #include // sincos is usually only available in math.h #include #include // for std::pair +#include namespace Geom { @@ -49,6 +50,8 @@ namespace Geom { * @return -1 when x is negative, 1 when positive, and 0 if equal to 0. */ template inline int sgn(const T& x) { return (x < 0 ? -1 : (x > 0 ? 1 : 0) ); +// can we 'optimize' this with: +// return ( (T(0) < x) - (x < T(0)) ); } template inline T sqr(const T& x) {return x * x;} @@ -111,7 +114,7 @@ inline void sincos(double angle, double &sin_, double &cos_) { #elif defined (SOLARIS_2_8) && __GNUC__ == 3 && __GNUC_MINOR__ == 2 # define IS_NAN(_a) (isnan(_a)) /* GNU definition */ #else -# define IS_NAN(_a) (std::isnan(_a)) +# define IS_NAN(_a) (boost::math::isnan(_a)) #endif /* If the above doesn't work, then try (a != a). */ @@ -130,7 +133,7 @@ inline void sincos(double angle, double &sin_, double &cos_) { #include #define IS_FINITE(_a) (finite(_a) && !IS_NAN(_a)) #else -# define IS_FINITE(_a) (std::isfinite(_a)) +# define IS_FINITE(_a) (boost::math::isfinite(_a)) #endif } // end namespace Geom diff --git a/src/2geom/nearest-point.cpp b/src/2geom/nearest-point.cpp index 68a863434..75e1ebaad 100644 --- a/src/2geom/nearest-point.cpp +++ b/src/2geom/nearest-point.cpp @@ -61,15 +61,14 @@ double nearest_point( Point const& p, } if (c.isConstant()) return from; SBasis dd = dot(c - p, dc); - //std::cout << dd << std::endl; + std::cout << dd << std::endl; std::vector zeros = Geom::roots(dd); double closest = from; double min_dist_sq = L2sq(c(from) - p); - double distsq; - for ( unsigned int i = 0; i < zeros.size(); ++i ) + for ( size_t i = 0; i < zeros.size(); ++i ) { - distsq = L2sq(c(zeros[i]) - p); + double distsq = L2sq(c(zeros[i]) - p); if ( min_dist_sq > L2sq(c(zeros[i]) - p) ) { closest = zeros[i]; diff --git a/src/2geom/ord.h b/src/2geom/ord.h index ce524ebf7..0add83da4 100644 --- a/src/2geom/ord.h +++ b/src/2geom/ord.h @@ -43,7 +43,7 @@ enum Cmp { EQUAL_TO=0 }; -inline Cmp operator-(Cmp x) { +static inline Cmp operator-(Cmp x) { switch(x) { case LESS_THAN: return GREATER_THAN; diff --git a/src/2geom/path-intersection.cpp b/src/2geom/path-intersection.cpp index 494a25843..ff24b92eb 100644 --- a/src/2geom/path-intersection.cpp +++ b/src/2geom/path-intersection.cpp @@ -113,11 +113,12 @@ int winding(Path const &path, Point p) { */ bool path_direction(Path const &p) { if(p.empty()) return false; + + /*goto doh; //could probably be more efficient, but this is a quick job double y = p.initialPoint()[Y]; double x = p.initialPoint()[X]; Cmp res = cmp(p[0].finalPoint()[Y], y); - /*goto doh; for(unsigned i = 1; i < p.size(); i++) { Cmp final_to_ray = cmp(p[i].finalPoint()[Y], y); Cmp initial_to_ray = cmp(p[i].initialPoint()[Y], y); @@ -271,9 +272,9 @@ intersect_polish_root (Curve const &A, double &s, Curve const &B, double &t) } #ifdef HAVE_GSL - int status; - size_t iter = 0; if(0) { // the GSL version is more accurate, but taints this with GPL + int status; + size_t iter = 0; const size_t n = 2; struct rparams p = {A, B}; gsl_multiroot_function f = {&intersect_polish_f, n, &p}; diff --git a/src/2geom/path-sink.cpp b/src/2geom/path-sink.cpp new file mode 100644 index 000000000..6acd9508c --- /dev/null +++ b/src/2geom/path-sink.cpp @@ -0,0 +1,119 @@ +/* + * callback interface for SVG path data + * + * Copyright 2007 MenTaLguY + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, output to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#include <2geom/sbasis-to-bezier.h> +#include <2geom/path-sink.h> +#include <2geom/exception.h> + +namespace Geom { + +void output(Curve const &curve, PathSink &sink) { + std::vector pts; + sbasis_to_bezier(pts, curve.toSBasis(), 2); //TODO: use something better! + sink.curveTo(pts[0], pts[1], pts[2]); +} + +void output(HLineSegment const &curve, PathSink &sink) { + sink.hlineTo(curve.finalPoint()[X]); +} + +void output(VLineSegment const &curve, PathSink &sink) { + sink.vlineTo(curve.finalPoint()[Y]); +} + +void output(LineSegment const &curve, PathSink &sink) { + sink.lineTo(curve[1]); +} + +void output(CubicBezier const &curve, PathSink &sink) { + sink.curveTo(curve[1], curve[2], curve[3]); +} + +void output(QuadraticBezier const &curve, PathSink &sink) { + sink.quadTo(curve[1], curve[2]); +} + +void output(SVGEllipticalArc const &curve, PathSink &sink) { + sink.arcTo( curve.ray(X), curve.ray(Y), curve.rotationAngle(), + curve.largeArc(), curve.sweep(), + curve.finalPoint() ); +} + +template +bool output_as(Curve const &curve, PathSink &sink) { + T const *t = dynamic_cast(&curve); + if (t) { + output(*t, sink); + return true; + } else { + return false; + } +} + +void PathSink::path(Path const &path) { + flush(); + moveTo(path.front().initialPoint()); + + Path::const_iterator iter; + for (iter = path.begin(); iter != path.end(); ++iter) { + output_as(*iter, *this) || + output_as(*iter, *this) || + output_as(*iter, *this) || + output_as(*iter, *this) || + output_as(*iter, *this) || + output_as(*iter, *this) || + output_as(*iter, *this); + } + + if (path.closed()) { + closePath(); + } + flush(); +} + +void PathSink::pathvector(PathVector const &pv) { + flush(); + for (PathVector::const_iterator i = pv.begin(); i != pv.end(); ++i) { + path(*i); + } +} + +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/2geom/path-sink.h b/src/2geom/path-sink.h new file mode 100644 index 000000000..949369b80 --- /dev/null +++ b/src/2geom/path-sink.h @@ -0,0 +1,230 @@ +/** + * \file + * \brief callback interface for SVG path data + *//* + * Copyright 2007 MenTaLguY + * + * This library is free software; you can redistribute it and/or + * modify it either under the terms of the GNU Lesser General Public + * License version 2.1 as published by the Free Software Foundation + * (the "LGPL") or, at your option, under the terms of the Mozilla + * Public License Version 1.1 (the "MPL"). If you do not alter this + * notice, a recipient may use your version of this file under either + * the MPL or the LGPL. + * + * You should have received a copy of the LGPL along with this library + * in the file COPYING-LGPL-2.1; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * You should have received a copy of the MPL along with this library + * in the file COPYING-MPL-1.1 + * + * The contents of this file are subject to the Mozilla Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY + * OF ANY KIND, either express or implied. See the LGPL or the MPL for + * the specific language governing rights and limitations. + * + */ + +#ifndef SEEN_SVG_PATH_H +#define SEEN_SVG_PATH_H + +#include <2geom/pathvector.h> +#include <2geom/curves.h> +#include + +namespace Geom { + + +/** @brief Callback interface for processing path data. + * + * PathSink provides an interface that allows one to easily write + * code which processes path data, for instance when converting + * between path formats used by different graphics libraries. + * + * To store a path in a new format, implement the virtual methods + * for segments in a derived class and call path() or pathvector(). + */ +class PathSink { +public: + /** Move to a different point without creating a segment. + * Usually starts a new subpath. */ + virtual void moveTo(Point const &p) = 0; + /// Output a horizontal line segment. Only the X coordinate of the final point is given. + virtual void hlineTo(Coord v) = 0; + /// Output a vertical line segment. Only the Y coordinate of the final point is given. + virtual void vlineTo(Coord v) = 0; + /// Output a line segment. + virtual void lineTo(Point const &p) = 0; + /// Output a quadratic Bezier segment. + virtual void curveTo(Point const &c0, Point const &c1, Point const &p) = 0; + /// Output a cubic Bezier segment. + virtual void quadTo(Point const &c, Point const &p) = 0; + /** Output an elliptical arc segment. + * See the EllipticalArc class for the documentation of parameters. */ + virtual void arcTo(double rx, double ry, double angle, + bool large_arc, bool sweep, Point const &p) = 0; + + /// Close the current path with a line segment. + virtual void closePath() = 0; + /** Flush any internal state of the generator. + * + * This call should implicitly finish the current subpath. + * Calling this method should be idempotent, because the default + * implementations of path() and pathvector() will be call it + * multiple times in a row. */ + virtual void flush() = 0; + + /** Undo the last segment. + * This method is optional. + * @return true true if a segment was erased, false otherwise. */ + virtual bool backspace() { return false; } + + // these have a default implementation + /** Output a subpath. + * Calls the appropriate segment methods according to the contents + * of the passed subpath. You can override this function. */ + virtual void path(Path const &p); + /** Output a path. + * Calls the appropriate segment methods according to the contents + * of the passed path. You can override this function. */ + virtual void pathvector(PathVector const &v); + + virtual ~PathSink() {} +}; + +template +class PathIteratorSink : public PathSink { +public: + explicit PathIteratorSink(OutputIterator out) + : _in_path(false), _out(out) {} + + void moveTo(Point const &p) { + flush(); + _path.start(p); + _start_p = p; + _in_path = true; + } +//TODO: what if _in_path = false? + + void hlineTo(Coord v) { + // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" + if (!_in_path) { + moveTo(_start_p); + } + _path.template appendNew(Point(v, _path.finalPoint()[Y])); + } + + void vlineTo(Coord v) { + // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" + if (!_in_path) { + moveTo(_start_p); + } + _path.template appendNew(Point(_path.finalPoint()[X], v)); + } + + void lineTo(Point const &p) { + // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" + if (!_in_path) { + moveTo(_start_p); + } + _path.template appendNew(p); + } + + void quadTo(Point const &c, Point const &p) { + // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" + if (!_in_path) { + moveTo(_start_p); + } + _path.template appendNew(c, p); + } + + void curveTo(Point const &c0, Point const &c1, Point const &p) { + // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" + if (!_in_path) { + moveTo(_start_p); + } + _path.template appendNew(c0, c1, p); + } + + void arcTo(double rx, double ry, double angle, + bool large_arc, bool sweep, Point const &p) + { + // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" + if (!_in_path) { + moveTo(_start_p); + } + _path.template appendNew(rx, ry, angle, + large_arc, sweep, p); + } + + bool backspace() + { + if (_in_path && _path.size() > 0) { + _path.erase_last(); + return true; + } + return false; + } + + void append(Path const &other, Path::Stitching stitching = Path::NO_STITCHING) + { + if (!_in_path) { + moveTo(other.initialPoint()); + } + _path.append(other, stitching); + } + + void closePath() { + _path.close(); + flush(); + } + + void flush() { + if (_in_path) { + _in_path = false; + *_out++ = _path; + _path.clear(); + _path.close(false); + } + } + + void path(Path const &other) + { + flush(); + *_out++ = other; + } + +protected: + bool _in_path; + OutputIterator _out; + Path _path; + Point _start_p; +}; + +typedef std::back_insert_iterator > iter; + +class PathBuilder : public PathIteratorSink { +private: + std::vector _pathset; +public: + PathBuilder() : PathIteratorSink(iter(_pathset)) {} + std::vector const &peek() const {return _pathset;} +}; + +} + +#endif +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/2geom/path.cpp b/src/2geom/path.cpp index 857028ccd..93def6c55 100644 --- a/src/2geom/path.cpp +++ b/src/2geom/path.cpp @@ -347,16 +347,15 @@ void Path::do_update(Sequence::iterator first_replaced, } void Path::do_append(Curve *c) { - boost::shared_ptr curve(c); if ( get_curves().front().get() == final_ ) { - final_->setPoint(1, curve->initialPoint()); + final_->setPoint(1, c->initialPoint()); } else { - if (curve->initialPoint() != finalPoint()) { + if (c->initialPoint() != finalPoint()) { THROW_CONTINUITYERROR(); } } - get_curves().insert(get_curves().end()-1, curve); - final_->setPoint(0, curve->finalPoint()); + get_curves().insert(get_curves().end()-1, boost::shared_ptr(c)); + final_->setPoint(0, c->finalPoint()); } void Path::stitch(Sequence::iterator first_replaced, diff --git a/src/2geom/pathvector.h b/src/2geom/pathvector.h index 791cb0703..e875e915f 100644 --- a/src/2geom/pathvector.h +++ b/src/2geom/pathvector.h @@ -108,7 +108,10 @@ struct PathVectorPosition { // pathvector[path_nr].pointAt(t) is the position unsigned int path_nr; double t; - PathVectorPosition() {} + PathVectorPosition() : + path_nr(0), + t(0) + {} PathVectorPosition(unsigned int path_nr, double t) : path_nr(path_nr), t(t) {} }; diff --git a/src/2geom/piecewise.h b/src/2geom/piecewise.h index e3b4d3456..ab8417254 100644 --- a/src/2geom/piecewise.h +++ b/src/2geom/piecewise.h @@ -34,6 +34,7 @@ #include #include +#include #include #include <2geom/concepts.h> #include <2geom/math-utils.h> @@ -92,8 +93,8 @@ class Piecewise { inline void reserve(unsigned i) { segs.reserve(i); cuts.reserve(i + 1); } - inline T operator[](unsigned i) const { return segs[i]; } - inline T &operator[](unsigned i) { return segs[i]; } + inline T const& operator[](unsigned i) const { return segs[i]; } + inline T& operator[](unsigned i) { return segs[i]; } inline output_type operator()(double t) const { return valueAt(t); } inline output_type valueAt(double t) const { unsigned n = segN(t); @@ -139,6 +140,13 @@ class Piecewise { push_seg(s); push_cut(to); } +#ifdef CPP11 + inline void push(T &&s, double to) { + assert(cuts.size() - segs.size() == 1); + push_seg(s); + push_cut(to); + } +#endif //Convenience/implementation hiding function to add cuts. inline void push_cut(double c) { ASSERT_INVARIANTS(cuts.empty() || c > cuts.back()); @@ -146,6 +154,9 @@ class Piecewise { } //Convenience/implementation hiding function to add segments. inline void push_seg(const T &s) { segs.push_back(s); } +#ifdef CPP11 + inline void push_seg(T &&s) { segs.emplace_back(s); } +#endif /**Returns the segment index which corresponds to a 'global' piecewise time. * Also takes optional low/high parameters to expedite the search for the segment. diff --git a/src/2geom/point.cpp b/src/2geom/point.cpp index 3ad9dd1fd..b0b00b5da 100644 --- a/src/2geom/point.cpp +++ b/src/2geom/point.cpp @@ -57,11 +57,10 @@ namespace Geom { * @code p += q; p -= q; r = p + q; r = p - q; p *= s; p /= s; q = p * s; q = s * p; q = p / s; - p *= m; p /= m; q = p * m; q = m * p; q = p / m; + p *= m; q = p * m; q = m * p; @endcode * It is possible to left-multiply a point by a matrix, even though mathematically speaking * this is undefined. The result is a point identical to that obtained by right-multiplying. - * Division of points by matrices is defined as multiplication by their inverses. * * @ingroup Primitives */ @@ -127,7 +126,7 @@ Coord L1(Point const &p) { } /** @brief Compute the infinity norm (maximum norm) of @a p. - * @return \f$\max(p_X, p_Y)\f$ + * @return \f$\max(|p_X|, |p_Y|)\f$ * @relates Point */ Coord LInfty(Point const &p) { Coord const a(fabs(p[0])); @@ -231,7 +230,7 @@ Point constrain_angle(Point const &A, Point const &B, unsigned int n, Point cons return A + dir * Rotate(k * 2.0 * M_PI / (double)n) * L2(diff); } -} //namespace Geom +} // end namespace Geom /* Local Variables: diff --git a/src/2geom/point.h b/src/2geom/point.h index 0eb771874..23dcfd54f 100644 --- a/src/2geom/point.h +++ b/src/2geom/point.h @@ -78,15 +78,6 @@ public: _pt[X] = p[X]; _pt[Y] = p[Y]; } - Point(Point const &p) { - for (unsigned i = 0; i < 2; ++i) - _pt[i] = p._pt[i]; - } - Point &operator=(Point const &p) { - for (unsigned i = 0; i < 2; ++i) - _pt[i] = p._pt[i]; - return *this; - } /** @brief Construct a point from its polar coordinates. * The angle is specified in radians, in the mathematical convention (increasing * counter-clockwise from +X). */ diff --git a/src/2geom/recursive-bezier-intersection.cpp b/src/2geom/recursive-bezier-intersection.cpp index 7db0438a7..0c7977970 100644 --- a/src/2geom/recursive-bezier-intersection.cpp +++ b/src/2geom/recursive-bezier-intersection.cpp @@ -81,14 +81,13 @@ const double INV_EPS = (1L<<14); */ void OldBezier::split(double t, OldBezier &left, OldBezier &right) const { const unsigned sz = p.size(); - - Geom::Point **Vtemp = new Geom::Point* [sz]; - - for (unsigned int i = 0; i < sz; ++i) - Vtemp[i] = new Geom::Point[sz]; + //Geom::Point Vtemp[sz][sz]; + std::vector< std::vector< Geom::Point > > Vtemp; + for (size_t i = 0; i < sz; ++i ) + Vtemp[i].reserve(sz); /* Copy control points */ - std::copy(p.begin(), p.end(), Vtemp[0]); + std::copy(p.begin(), p.end(), Vtemp[0].begin()); /* Triangle computation */ for (unsigned i = 1; i < sz; i++) { @@ -103,11 +102,6 @@ void OldBezier::split(double t, OldBezier &left, OldBezier &right) const { left.p[j] = Vtemp[j][0]; for (unsigned j = 0; j < sz; j++) right.p[j] = Vtemp[sz-1-j][j]; - - for (unsigned int i = 0; i < sz; ++i) - delete[] Vtemp[i]; - - delete[] Vtemp; } #if 0 @@ -134,17 +128,15 @@ Point OldBezier::operator()(double t) const { #endif // suggested by Sederberg. -Point OldBezier::operator()(double t) const { - int n = p.size()-1; - double u, bc, tn, tmp; - int i; +Point OldBezier::operator()(double const t) const { + size_t const n = p.size()-1; Point r; for(int dim = 0; dim < 2; dim++) { - u = 1.0 - t; - bc = 1; - tn = 1; - tmp = p[0][dim]*u; - for(i=1; i= : need boundary case - return not( ( minax > maxbx ) || ( minay > maxby ) - || ( minbx > maxax ) || ( minby > maxay ) ); + return !( ( minax > maxbx ) || ( minay > maxby ) + || ( minbx > maxax ) || ( minby > maxay ) ); } /* diff --git a/src/2geom/sbasis-geometric.cpp b/src/2geom/sbasis-geometric.cpp index 74827e27c..4c474f7f0 100644 --- a/src/2geom/sbasis-geometric.cpp +++ b/src/2geom/sbasis-geometric.cpp @@ -1,4 +1,5 @@ /** Geometric operators on D2 (1D->2D). + * Copyright 2012 JBC Engelen * Copyright 2007 JF Barraud * Copyright 2007 N Hurst * @@ -18,7 +19,6 @@ #include <2geom/sbasis-geometric.h> #include <2geom/sbasis.h> #include <2geom/sbasis-math.h> -//#include <2geom/solver.h> #include <2geom/sbasis-geometric.h> //namespace Geom{ @@ -363,7 +363,6 @@ Geom::length(Piecewise > const &M, Piecewise Geom::curvature(D2 const &M, double tol) { D2 dM=derivative(M); - Piecewise result; Piecewise > unitv = unitVector(dM,tol); Piecewise dMlength = dot(Piecewise >(dM),unitv); Piecewise k = cross(derivative(unitv),unitv); @@ -436,11 +435,10 @@ Geom::arc_length_parametrization(Piecewise > const &M, unsigned order, double tol){ Piecewise > result; - for (unsigned i=0; i > uniform_seg=arc_length_parametrization(M[i],order,tol); - result.concat(uniform_seg); + for (unsigned i=0; i diff --git a/src/2geom/sbasis-to-bezier.cpp b/src/2geom/sbasis-to-bezier.cpp index 8e47580ce..bd88f93c0 100644 --- a/src/2geom/sbasis-to-bezier.cpp +++ b/src/2geom/sbasis-to-bezier.cpp @@ -35,7 +35,7 @@ #include <2geom/sbasis-to-bezier.h> #include <2geom/d2.h> #include <2geom/choose.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include <2geom/exception.h> #include @@ -180,6 +180,118 @@ void sbasis_to_bezier (std::vector & bz, D2 const& sb, size_t sz) } } +/** Changes the basis of p to be Bernstein. + \param p the D2 Symmetric basis polynomial + \returns the D2 Bernstein basis cubic polynomial + +Bezier is always cubic. +For general asymmetric case, fit the SBasis function value at midpoint +For parallel, symmetric case, find the point of closest approach to the midpoint +For parallel, anti-symmetric case, fit the SBasis slope at midpoint +*/ +void sbasis_to_cubic_bezier (std::vector & bz, D2 const& sb) +{ + double delx[2], dely[2]; + double xprime[2], yprime[2]; + double midx = 0; + double midy = 0; + double numer; + double denom; + double div; + + if ((sb[X].size() == 0) || (sb[Y].size() == 0)) { + THROW_RANGEERROR("size of sb is too small"); + } + + bz.resize(4, Point(0,0)); + bz[0][X] = sb[X][0][0]; + bz[0][Y] = sb[Y][0][0]; + bz[3][X] = sb[X][0][1]; + bz[3][Y] = sb[Y][0][1]; + +// calculate first derivatives of x and y wrt t + + for (int i = 0; i < 2; ++i) { + xprime[i] = sb[X][0][1] - sb[X][0][0]; + yprime[i] = sb[Y][0][1] - sb[Y][0][0]; + } + if (sb[X].size() > 0) { + xprime[0] += sb[X][1][0]; + xprime[1] -= sb[X][1][1]; + } + if (sb[Y].size() > 0) { + yprime[0] += sb[Y][1][0]; + yprime[1] -= sb[Y][1][1]; + } + +// calculate midpoint at t = 0.5 + + div = 2; + for (size_t i = 0; i < sb[X].size(); ++i) { + midx += (sb[X][i][0] + sb[X][i][1])/div; + div *= 4; + } + midx = 8*midx - 4*bz[0][X] - 4*bz[3][X]; + + div = 2; + for (size_t i = 0; i < sb[Y].size(); ++i) { + midy += (sb[Y][i][0] + sb[Y][i][1])/div; + div *= 4; + } + midy = 8*midy - 4*bz[0][Y] - 4*bz[3][Y]; + +// calculate Bezier control arms + + if (std::abs(xprime[1]*yprime[0] - yprime[1]*xprime[0]) > 1.e-5) { // general case : fit mid fxn value + denom = xprime[1]*yprime[0] - yprime[1]*xprime[0]; + for (int i = 0; i < 2; ++i) { + numer = xprime[1 - i]*midy - yprime[1 - i]*midx; + delx[i] = xprime[i]*numer/denom/3; + dely[i] = yprime[i]*numer/denom/3; + } + } + else if ((xprime[0]*xprime[1] < 0) || (yprime[0]*yprime[1] < 0)) { // symmetric case : use distance of closest approach + numer = midx*xprime[0] + midy*yprime[0]; + denom = 6.0*(xprime[0]*xprime[0] + yprime[0]*yprime[0]); + delx[0] = xprime[0]*numer/denom; + dely[0] = yprime[0]*numer/denom; + delx[1] = -delx[0]; + dely[1] = -dely[0]; + } + else { // anti-symmetric case : fit mid slope + // calculate slope at t = 0.5 + midx = 0; + div = 1; + for (size_t i = 0; i < sb[X].size(); ++i) { + midx += (sb[X][i][1] - sb[X][i][0])/div; + div *= 4; + } + midy = 0; + div = 1; + for (size_t i = 0; i < sb[Y].size(); ++i) { + midy += (sb[Y][i][1] - sb[Y][i][0])/div; + div *= 4; + } + if (midx*yprime[0] != midy*xprime[0]) { + denom = midx*yprime[0] - midy*xprime[0]; + numer = midx*(bz[3][Y] - bz[0][Y]) - midy*(bz[3][X] - bz[0][X]); + for (int i = 0; i < 2; ++i) { + delx[i] = xprime[0]*numer/denom; + dely[i] = yprime[0]*numer/denom; + } + } + else { // linear case + for (int i = 0; i < 2; ++i) { + delx[i] = (bz[3][X] - bz[0][X])/3; + dely[i] = (bz[3][Y] - bz[0][Y])/3; + } + } + } + bz[1][X] = bz[0][X] + delx[0]; + bz[1][Y] = bz[0][Y] + dely[0]; + bz[2][X] = bz[3][X] - delx[1]; + bz[2][Y] = bz[3][Y] - dely[1]; +} /** Changes the basis of p to be sbasis. \param p the Bernstein basis polynomial @@ -347,12 +459,13 @@ void build_from_sbasis(Geom::PathBuilder &pb, D2 const &B, double tol, b if (!B.isFinite()) { THROW_EXCEPTION("assertion failed: B.isFinite()"); } - if(tail_error(B, 2) < tol || sbasis_size(B) == 2) { // nearly cubic enough + if(tail_error(B, 3) < tol || sbasis_size(B) == 2) { // nearly cubic enough if( !only_cubicbeziers && (sbasis_size(B) <= 1) ) { pb.lineTo(B.at1()); } else { std::vector bez; - sbasis_to_bezier(bez, B, 4); +// sbasis_to_bezier(bez, B, 4); + sbasis_to_cubic_bezier(bez, B); pb.curveTo(bez[1], bez[2], bez[3]); } } else { @@ -372,7 +485,7 @@ path_from_sbasis(D2 const &B, double tol, bool only_cubicbeziers) { PathBuilder pb; pb.moveTo(B.at0()); build_from_sbasis(pb, B, tol, only_cubicbeziers); - pb.finish(); + pb.flush(); return pb.peek().front(); } @@ -414,7 +527,7 @@ path_from_piecewise(Geom::Piecewise > const &B, double to build_from_sbasis(pb, B[i], tol, only_cubicbeziers); } } - pb.finish(); + pb.flush(); return pb.peek(); } diff --git a/src/2geom/sbasis-to-bezier.h b/src/2geom/sbasis-to-bezier.h index b386bd520..07511f4a4 100644 --- a/src/2geom/sbasis-to-bezier.h +++ b/src/2geom/sbasis-to-bezier.h @@ -46,6 +46,7 @@ class PathBuilder; void sbasis_to_bezier (Bezier & bz, SBasis const& sb, size_t sz = 0); void sbasis_to_bezier (std::vector & bz, D2 const& sb, size_t sz = 0); +void sbasis_to_cubic_bezier (std::vector & bz, D2 const& sb); void bezier_to_sbasis (SBasis & sb, Bezier const& bz); void bezier_to_sbasis (D2 & sb, std::vector const& bz); void build_from_sbasis(PathBuilder &pb, D2 const &B, double tol, bool only_cubicbeziers); diff --git a/src/2geom/solve-bezier-one-d.cpp b/src/2geom/solve-bezier-one-d.cpp index f14f701d0..3d87d4926 100644 --- a/src/2geom/solve-bezier-one-d.cpp +++ b/src/2geom/solve-bezier-one-d.cpp @@ -92,11 +92,10 @@ void Bernsteins::find_bernstein_roots(double const *w, /* The control points */ int old_sign = SGN(w[0]); //std::cout << "w[0] = " << w[0] << std::endl; - int sign; for (size_t i = 1; i < N; i++) { //std::cout << "w[" << i << "] = " << w[i] << std::endl; - sign = SGN(w[i]); + int sign = SGN(w[i]); if (sign != 0) { if (sign != old_sign && old_sign != 0) @@ -128,14 +127,14 @@ void Bernsteins::find_bernstein_roots(double const *w, /* The control points */ double s = 0, t = 1; double e = 1e-10; int side = 0; - double r, fr, fs = w[0], ft = w[degree]; + double r, fs = w[0], ft = w[degree]; for (size_t n = 0; n < 100; ++n) { r = (fs*t - ft*s) / (fs - ft); if (fabs(t-s) < e * fabs(t+s)) break; - fr = horner(w, r); + double fr = horner(w, r); if (fr * ft > 0) { diff --git a/src/2geom/solve-bezier-parametric.cpp b/src/2geom/solve-bezier-parametric.cpp index ed693c584..9b0feaee4 100644 --- a/src/2geom/solve-bezier-parametric.cpp +++ b/src/2geom/solve-bezier-parametric.cpp @@ -68,20 +68,16 @@ find_parametric_bezier_roots(Geom::Point const *w, /* The control points */ break; } - /* - * Otherwise, solve recursively after subdividing control polygon - * New left and right control polygons - */ - Geom::Point *Left = new Geom::Point[degree+1]; - Geom::Point *Right = new Geom::Point[degree+1]; - - Bezier(w, degree, 0.5, Left, Right); - total_subs ++; - find_parametric_bezier_roots(Left, degree, solutions, depth+1); - find_parametric_bezier_roots(Right, degree, solutions, depth+1); + /* Otherwise, solve recursively after subdividing control polygon */ + + //Geom::Point Left[degree+1], /* New left and right */ + // Right[degree+1]; /* control polygons */ + std::vector Left( degree+1 ), Right(degree+1); - delete[] Left; - delete[] Right; + Bezier(w, degree, 0.5, Left.data(), Right.data()); + total_subs ++; + find_parametric_bezier_roots(Left.data(), degree, solutions, depth+1); + find_parametric_bezier_roots(Right.data(), degree, solutions, depth+1); } @@ -130,7 +126,8 @@ control_poly_flat_enough(Geom::Point const *V, /* Control points */ const double abSquared = (a * a) + (b * b); - double distance[degree]; /* Distances from pts to line */ + //double distance[degree]; /* Distances from pts to line */ + std::vector distance(degree); /* Distances from pts to line */ for (unsigned i = 1; i < degree; i++) { /* Compute distance from each of the points to that line */ double & dist(distance[i-1]); @@ -198,13 +195,13 @@ Bezier(Geom::Point const *V, /* Control pts */ Geom::Point *Left, /* RETURN left half ctl pts */ Geom::Point *Right) /* RETURN right half ctl pts */ { - Geom::Point **Vtemp = new Geom::Point* [degree+1]; - - for (unsigned int i = 0; i < degree+1; ++i) - Vtemp[i] = new Geom::Point[degree+1]; + //Geom::Point Vtemp[degree+1][degree+1]; + std::vector > Vtemp(degree+1); + for ( size_t i = 0; i < degree + 1; ++i ) + Vtemp.reserve(degree+1); /* Copy control points */ - std::copy(V, V+degree+1, Vtemp[0]); + std::copy(V, V+degree+1, Vtemp[0].begin()); /* Triangle computation */ for (unsigned i = 1; i <= degree; i++) { @@ -218,14 +215,7 @@ Bezier(Geom::Point const *V, /* Control pts */ for (unsigned j = 0; j <= degree; j++) Right[j] = Vtemp[degree-j][j]; - Geom::Point return_value = Vtemp[degree][0]; - - for (unsigned int i = 0; i < degree+1; ++i) - delete[] Vtemp[i]; - - delete[] Vtemp; - - return return_value; + return (Vtemp[degree][0]); } }; diff --git a/src/2geom/solve-bezier.cpp b/src/2geom/solve-bezier.cpp index 09f8d9289..adf3c9ac0 100644 --- a/src/2geom/solve-bezier.cpp +++ b/src/2geom/solve-bezier.cpp @@ -80,7 +80,7 @@ void convex_hull_marching(Bezier src_bz, Bezier bz, double left_t, double right_t) { - while(bz.order() > 0 and bz[0] == 0) { + while(bz.order() > 0 && bz[0] == 0) { std::cout << "deflate\n"; bz = bz.deflate(); solutions.push_back(left_t); @@ -89,12 +89,11 @@ void convex_hull_marching(Bezier src_bz, Bezier bz, int old_sign = SGN(bz[0]); - int sign; double left_bound = 0; double dt = 0; for (size_t i = 1; i < bz.size(); i++) { - sign = SGN(bz[i]); + int sign = SGN(bz[i]); if (sign != old_sign) { dt = double(i) / bz.order(); @@ -113,7 +112,7 @@ void convex_hull_marching(Bezier src_bz, Bezier bz, double new_left_t = left_bound * (right_t - left_t) + left_t; std::cout << "new_left_t = " << new_left_t << std::endl; Bezier bzr = subRight(src_bz, new_left_t); - while(bzr.order() > 0 and bzr[0] == 0) { + while(bzr.order() > 0 && bzr[0] == 0) { std::cout << "deflate\n"; bzr = bzr.deflate(); solutions.push_back(new_left_t); @@ -124,7 +123,7 @@ void convex_hull_marching(Bezier src_bz, Bezier bz, new_left_t, right_t); } else { std::cout << "epsilon reached\n"; - while(bzr.order() > 0 and fabs(bzr[0]) <= 1e-10) { + while(bzr.order() > 0 && fabs(bzr[0]) <= 1e-10) { std::cout << "deflate\n"; bzr = bzr.deflate(); std::cout << bzr << std::endl; @@ -182,11 +181,10 @@ void Bernsteins::find_bernstein_roots(Bezier bz, int old_sign = SGN(bz[0]); //std::cout << "w[0] = " << bz[0] << std::endl; - int sign; for (size_t i = 1; i < bz.size(); i++) { //std::cout << "w[" << i << "] = " << w[i] << std::endl; - sign = SGN(bz[i]); + int sign = SGN(bz[i]); if (sign != 0) { if (sign != old_sign && old_sign != 0) @@ -259,7 +257,7 @@ void Bernsteins::find_bernstein_roots(Bezier bz, debug(std::cout << "Solution is exactly on the subdivision point.\n"); debug(std::cout << Left << " , " << Right << std::endl); Left = reverse(Left); - while(Right.order() > 0 and fabs(Right[0]) <= 1e-10) { + while(Right.order() > 0 && fabs(Right[0]) <= 1e-10) { debug(std::cout << "deflate\n"); Right = Right.deflate(); Left = Left.deflate(); @@ -293,7 +291,7 @@ double Bernsteins::secant(Bezier bz) { double s = 0, t = 1; double e = 1e-14; int side = 0; - double r, fr, fs = bz.at0(), ft = bz.at1(); + double r, fs = bz.at0(), ft = bz.at1(); for (size_t n = 0; n < 100; ++n) { @@ -305,7 +303,7 @@ double Bernsteins::secant(Bezier bz) { return r; } - fr = horner(bz, r); + double fr = horner(bz, r); if (fr * ft > 0) { diff --git a/src/2geom/svg-elliptical-arc.cpp b/src/2geom/svg-elliptical-arc.cpp index 14a4b4f16..96a4f99d8 100644 --- a/src/2geom/svg-elliptical-arc.cpp +++ b/src/2geom/svg-elliptical-arc.cpp @@ -218,15 +218,23 @@ bool make_elliptical_arc::make_elliptiarc() if (svg_compliant_flag()) { +#ifdef CPP11 + std::unique_ptr arc( e.arc(initial_point, inner_point, final_point, true) ); +#else std::auto_ptr arc( e.arc(initial_point, inner_point, final_point, true) ); +#endif ea = *arc; } else { try { - std::auto_ptr eap( - e.arc(initial_point, inner_point, final_point, false) ); +#ifdef CPP11 + std::unique_ptr +#else + std::auto_ptr +#endif + eap( e.arc(initial_point, inner_point, final_point, false) ); ea = *eap; } catch(RangeError const &exc) diff --git a/src/2geom/svg-path-parser.cpp b/src/2geom/svg-path-parser.cpp index 60a734ece..fa31b57b5 100644 --- a/src/2geom/svg-path-parser.cpp +++ b/src/2geom/svg-path-parser.cpp @@ -1,4 +1,5 @@ -#line 1 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" + +#line 1 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" /** * \file * \brief parse SVG path specifications @@ -46,7 +47,7 @@ namespace { class Parser { public: - Parser(SVGPathSink &sink) : _absolute(false), _sink(sink) {} + Parser(PathSink &sink) : _absolute(false), _sink(sink) {} void parse(char const *str) throw(SVGPathParseError); @@ -57,7 +58,7 @@ private: Point _cubic_tangent; Point _quad_tangent; std::vector _params; - SVGPathSink &_sink; + PathSink &_sink; void _reset() { _absolute = false; @@ -140,7 +141,7 @@ private: }; -#line 144 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.cpp" +#line 145 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.cpp" static const char _svg_path_actions[] = { 0, 1, 0, 1, 1, 1, 2, 1, 3, 1, 4, 1, 5, 1, 15, 1, @@ -956,7 +957,7 @@ static const short _svg_path_indicies[] = { 1, 0 }; -static const short _svg_path_trans_targs_wi[] = { +static const short _svg_path_trans_targs[] = { 270, 0, 1, 2, 193, 3, 4, 5, 194, 3, 4, 5, 194, 5, 194, 6, 7, 8, 195, 9, 204, 7, 8, 195, @@ -1048,7 +1049,7 @@ static const short _svg_path_trans_targs_wi[] = { 268, 269 }; -static const char _svg_path_trans_actions_wi[] = { +static const char _svg_path_trans_actions[] = { 15, 0, 0, 0, 0, 9, 47, 47, 47, 0, 1, 1, 1, 0, 0, 0, 3, 17, 3, 17, 0, 0, 1, 0, @@ -1145,7 +1146,8 @@ static const int svg_path_first_final = 270; static const int svg_path_en_main = 1; -#line 144 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" + +#line 144 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" void Parser::parse(char const *str) @@ -1158,12 +1160,12 @@ throw(SVGPathParseError) _reset(); -#line 1162 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.cpp" +#line 1164 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.cpp" { cs = svg_path_start; } -#line 1167 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.cpp" +#line 1169 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.cpp" { int _klen; unsigned int _trans; @@ -1192,7 +1194,7 @@ _resume: else if ( (*p) > *_mid ) _lower = _mid + 1; else { - _trans += (_mid - _keys); + _trans += (unsigned int)(_mid - _keys); goto _match; } } @@ -1215,7 +1217,7 @@ _resume: else if ( (*p) > _mid[1] ) _lower = _mid + 2; else { - _trans += ((_mid - _keys)>>1); + _trans += (unsigned int)((_mid - _keys)>>1); goto _match; } } @@ -1224,25 +1226,25 @@ _resume: _match: _trans = _svg_path_indicies[_trans]; - cs = _svg_path_trans_targs_wi[_trans]; + cs = _svg_path_trans_targs[_trans]; - if ( _svg_path_trans_actions_wi[_trans] == 0 ) + if ( _svg_path_trans_actions[_trans] == 0 ) goto _again; - _acts = _svg_path_actions + _svg_path_trans_actions_wi[_trans]; + _acts = _svg_path_actions + _svg_path_trans_actions[_trans]; _nacts = (unsigned int) *_acts++; while ( _nacts-- > 0 ) { switch ( *_acts++ ) { case 0: -#line 156 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 156 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { start = p; } break; case 1: -#line 160 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 160 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { char const *end=p; std::string buf(start, end); @@ -1251,55 +1253,55 @@ _match: } break; case 2: -#line 167 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 167 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _push(1.0); } break; case 3: -#line 171 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 171 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _push(0.0); } break; case 4: -#line 175 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 175 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _absolute = true; } break; case 5: -#line 179 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 179 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _absolute = false; } break; case 6: -#line 183 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 183 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _moveTo(_pop_point()); } break; case 7: -#line 187 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 187 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _lineTo(_pop_point()); } break; case 8: -#line 191 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 191 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _hlineTo(Point(_pop_coord(X), _current[Y])); } break; case 9: -#line 195 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 195 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _vlineTo(Point(_current[X], _pop_coord(Y))); } break; case 10: -#line 199 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 199 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); Point c1 = _pop_point(); @@ -1308,7 +1310,7 @@ _match: } break; case 11: -#line 206 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 206 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); Point c1 = _pop_point(); @@ -1316,7 +1318,7 @@ _match: } break; case 12: -#line 212 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 212 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); Point c = _pop_point(); @@ -1324,14 +1326,14 @@ _match: } break; case 13: -#line 218 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 218 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { Point p = _pop_point(); _quadTo(_quad_tangent, p); } break; case 14: -#line 223 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 223 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { Point point = _pop_point(); bool sweep = _pop_flag(); @@ -1344,16 +1346,16 @@ _match: } break; case 15: -#line 234 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" +#line 234 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" { _closePath(); } break; case 16: -#line 370 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" - {goto _out;} +#line 370 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" + {{p++; goto _out; }} break; -#line 1357 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.cpp" +#line 1359 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.cpp" } } @@ -1364,7 +1366,8 @@ _again: goto _resume; _out: {} } -#line 380 "/opt/shared/work/programming/eclipse/eclipse_3.4/lib2geom/src/2geom/svg-path-parser.rl" + +#line 380 "/home/tweenk/src/lib2geom/src/2geom/svg-path-parser.rl" if ( cs < svg_path_first_final ) { @@ -1374,12 +1377,12 @@ _again: } -void parse_svg_path(char const *str, SVGPathSink &sink) +void parse_svg_path(char const *str, PathSink &sink) throw(SVGPathParseError) { Parser parser(sink); parser.parse(str); - sink.finish(); + sink.flush(); } } @@ -1393,4 +1396,4 @@ throw(SVGPathParseError) fill-column:99 End: */ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : diff --git a/src/2geom/svg-path-parser.h b/src/2geom/svg-path-parser.h index 365287d8c..163fbe5c4 100644 --- a/src/2geom/svg-path-parser.h +++ b/src/2geom/svg-path-parser.h @@ -38,11 +38,11 @@ #include #include <2geom/exception.h> #include <2geom/point.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> namespace Geom { -void parse_svg_path(char const *str, SVGPathSink &sink) throw(SVGPathParseError); +void parse_svg_path(char const *str, PathSink &sink) throw(SVGPathParseError); inline std::vector parse_svg_path(char const *str) throw(SVGPathParseError) { typedef std::vector Subpaths; @@ -50,13 +50,14 @@ inline std::vector parse_svg_path(char const *str) throw(SVGPathParseError Subpaths subpaths; Inserter iter(subpaths); - SVGPathGenerator generator(iter); + PathIteratorSink generator(iter); parse_svg_path(str, generator); return subpaths; } inline std::vector read_svgd_f(FILE * fi) throw(SVGPathParseError) { + /// @bug The 10kB length limit should be removed char input[1024 * 10]; fgets(input, 1024 * 10, fi); return parse_svg_path(input); diff --git a/src/2geom/svg-path.cpp b/src/2geom/svg-path.cpp deleted file mode 100644 index d459b3e1b..000000000 --- a/src/2geom/svg-path.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * callback interface for SVG path data - * - * Copyright 2007 MenTaLguY - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, output to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - */ - -#include <2geom/sbasis-to-bezier.h> -#include <2geom/svg-path.h> -#include <2geom/exception.h> - -namespace Geom { - -void output(Curve const &curve, SVGPathSink &sink) { - std::vector pts; - sbasis_to_bezier(pts, curve.toSBasis(), 2); //TODO: use something better! - sink.curveTo(pts[0], pts[1], pts[2]); -} - -void output(HLineSegment const &curve, SVGPathSink &sink) { - sink.hlineTo(curve.finalPoint()[X]); -} - -void output(VLineSegment const &curve, SVGPathSink &sink) { - sink.vlineTo(curve.finalPoint()[Y]); -} - -void output(LineSegment const &curve, SVGPathSink &sink) { - sink.lineTo(curve[1]); -} - -void output(CubicBezier const &curve, SVGPathSink &sink) { - sink.curveTo(curve[1], curve[2], curve[3]); -} - -void output(QuadraticBezier const &curve, SVGPathSink &sink) { - sink.quadTo(curve[1], curve[2]); -} - -void output(SVGEllipticalArc const &curve, SVGPathSink &sink) { - sink.arcTo( curve.ray(X), curve.ray(Y), curve.rotationAngle(), - curve.largeArc(), curve.sweep(), - curve.finalPoint() ); -} - -template -bool output_as(Curve const &curve, SVGPathSink &sink) { - T const *t = dynamic_cast(&curve); - if (t) { - output(*t, sink); - return true; - } else { - return false; - } -} - -void output_svg_path(Path &path, SVGPathSink &sink) { - sink.moveTo(path.front().initialPoint()); - - Path::iterator iter; - for ( iter = path.begin() ; iter != path.end() ; ++iter ) { - output_as(*iter, sink) || - output_as(*iter, sink) || - output_as(*iter, sink) || - output_as(*iter, sink) || - output_as(*iter, sink) || - output_as(*iter, sink) || - output_as(*iter, sink); - } - - if (path.closed()) { - sink.closePath(); - } - sink.finish(); -} - -} - -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/2geom/svg-path.h b/src/2geom/svg-path.h deleted file mode 100644 index c22f65d11..000000000 --- a/src/2geom/svg-path.h +++ /dev/null @@ -1,185 +0,0 @@ -/** - * \file - * \brief callback interface for SVG path data - * - * Copyright 2007 MenTaLguY - * - * This library is free software; you can redistribute it and/or - * modify it either under the terms of the GNU Lesser General Public - * License version 2.1 as published by the Free Software Foundation - * (the "LGPL") or, at your option, under the terms of the Mozilla - * Public License Version 1.1 (the "MPL"). If you do not alter this - * notice, a recipient may use your version of this file under either - * the MPL or the LGPL. - * - * You should have received a copy of the LGPL along with this library - * in the file COPYING-LGPL-2.1; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * You should have received a copy of the MPL along with this library - * in the file COPYING-MPL-1.1 - * - * The contents of this file are subject to the Mozilla Public License - * Version 1.1 (the "License"); you may not use this file except in - * compliance with the License. You may obtain a copy of the License at - * http://www.mozilla.org/MPL/ - * - * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY - * OF ANY KIND, either express or implied. See the LGPL or the MPL for - * the specific language governing rights and limitations. - * - */ - -#ifndef SEEN_SVG_PATH_H -#define SEEN_SVG_PATH_H - -#include <2geom/path.h> -#include <2geom/curves.h> -#include - -namespace Geom { - -class SVGPathSink { -public: - virtual void moveTo(Point p) = 0; - virtual void hlineTo(Coord v) = 0; - virtual void vlineTo(Coord v) = 0; - virtual void lineTo(Point p) = 0; - virtual void curveTo(Point c0, Point c1, Point p) = 0; - virtual void quadTo(Point c, Point p) = 0; - virtual void arcTo(double rx, double ry, double angle, - bool large_arc, bool sweep, Point p) = 0; - - /** Undo the last lineTo, curveTo, etc. call. */ - virtual void backspace() = 0; - - virtual void closePath() = 0; - virtual void finish() = 0; - virtual ~SVGPathSink() {} -}; - -void output_svg_path(Path &path, SVGPathSink &sink); - -template -class SVGPathGenerator : public SVGPathSink { -public: - explicit SVGPathGenerator(OutputIterator out) - : _in_path(false), _out(out) {} - - void moveTo(Point p) { - finish(); - _path.start(p); - _start_p = p; - _in_path = true; - } -//TODO: what if _in_path = false? - - void hlineTo(Coord v) { - // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" - if (!_in_path) { - moveTo(_start_p); - } - _path.template appendNew(Point(v, _path.finalPoint()[Y])); - } - - void vlineTo(Coord v) { - // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" - if (!_in_path) { - moveTo(_start_p); - } - _path.template appendNew(Point(_path.finalPoint()[X], v)); - } - - void lineTo(Point p) { - // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" - if (!_in_path) { - moveTo(_start_p); - } - _path.template appendNew(p); - } - - void quadTo(Point c, Point p) { - // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" - if (!_in_path) { - moveTo(_start_p); - } - _path.template appendNew(c, p); - } - - void curveTo(Point c0, Point c1, Point p) { - // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" - if (!_in_path) { - moveTo(_start_p); - } - _path.template appendNew(c0, c1, p); - } - - void arcTo(double rx, double ry, double angle, - bool large_arc, bool sweep, Point p) - { - // check for implicit moveto, like in: "M 1,1 L 2,2 z l 2,2 z" - if (!_in_path) { - moveTo(_start_p); - } - _path.template appendNew(rx, ry, angle, - large_arc, sweep, p); - } - - void backspace() - { - if (_in_path && _path.size() > 0) { - _path.erase_last(); - } - } - - void append(Path const &other, Path::Stitching stitching = Path::NO_STITCHING) - { - if (!_in_path) { - moveTo(other.initialPoint()); - } - _path.append(other, stitching); - } - - void closePath() { - _path.close(); - finish(); - } - - void finish() { - if (_in_path) { - _in_path = false; - *_out = _path; - _path.clear(); - _path.close(false); - } - } - -protected: - bool _in_path; - OutputIterator _out; - Path _path; - Point _start_p; -}; - -typedef std::back_insert_iterator > iter; - -class PathBuilder : public SVGPathGenerator { -private: - std::vector _pathset; -public: - PathBuilder() : SVGPathGenerator(iter(_pathset)) {} - std::vector const &peek() const {return _pathset;} -}; - -} - -#endif -/* - Local Variables: - mode:c++ - c-file-style:"stroustrup" - c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) - indent-tabs-mode:nil - fill-column:99 - End: -*/ -// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/2geom/toposweep.h b/src/2geom/toposweep.h index 428115dd3..b6a55b154 100644 --- a/src/2geom/toposweep.h +++ b/src/2geom/toposweep.h @@ -193,7 +193,7 @@ Areas filter_areas(PathVector const &ps, Areas const & areas, Z const &z) { if(areas[i].size() < 2) continue; //find a representative section unsigned rj = 0; - bool rev = are_near(areas[i][0]->fp, areas[i][1]->tp); + //bool rev = are_near(areas[i][0]->fp, areas[i][1]->tp); for(unsigned j = 1; j < areas[i].size(); j++) if(sorty(*areas[i][rj], *areas[i][j])) rj = j; if(sortx(*areas[i][rj], *areas[i][(rj+areas[i].size() - 1) % areas[i].size()])) { diff --git a/src/2geom/transforms.cpp b/src/2geom/transforms.cpp index 65df9b22f..091079d5a 100644 --- a/src/2geom/transforms.cpp +++ b/src/2geom/transforms.cpp @@ -164,6 +164,7 @@ void check_transforms() // notice that the first column is always the same and enumerates all transform types, // while the second one changes to each transform type in turn. + // cppcheck-suppress redundantAssignment m = t * t; m = t * s; m = t * r; m = t * h; m = t * v; m = t * z; m = s * t; m = s * s; m = s * r; m = s * h; m = s * v; m = s * z; m = r * t; m = r * s; m = r * r; m = r * h; m = r * v; m = r * z; diff --git a/src/2geom/utils.cpp b/src/2geom/utils.cpp index a40b7253d..83d93cc87 100644 --- a/src/2geom/utils.cpp +++ b/src/2geom/utils.cpp @@ -37,16 +37,15 @@ namespace Geom { // return a vector that contains all the binomial coefficients of degree n -void binomial_coefficients(std::vector& bc, size_t n) +void binomial_coefficients(std::vector& bc, std::size_t n) { size_t s = n+1; bc.clear(); bc.resize(s); bc[0] = 1; - size_t k; for (size_t i = 1; i < n; ++i) { - k = i >> 1; + size_t k = i >> 1; if (i & 1u) { bc[k+1] = bc[k] << 1; diff --git a/src/2geom/utils.h b/src/2geom/utils.h index 6a72d42c4..fe955dd41 100644 --- a/src/2geom/utils.h +++ b/src/2geom/utils.h @@ -41,7 +41,7 @@ namespace Geom { // proper logical xor inline bool logical_xor (bool a, bool b) { return (a || b) && !(a && b); } -void binomial_coefficients(std::vector& bc, size_t n); +void binomial_coefficients(std::vector& bc, std::size_t n); struct EmptyClass {}; diff --git a/src/display/drawing-shape.cpp b/src/display/drawing-shape.cpp index e80f12486..03d7f51b5 100644 --- a/src/display/drawing-shape.cpp +++ b/src/display/drawing-shape.cpp @@ -12,7 +12,7 @@ #include #include <2geom/curves.h> #include <2geom/pathvector.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include <2geom/svg-path-parser.h> #include "display/cairo-utils.h" diff --git a/src/libnrtype/FontInstance.cpp b/src/libnrtype/FontInstance.cpp index 38a105459..434f3ee47 100644 --- a/src/libnrtype/FontInstance.cpp +++ b/src/libnrtype/FontInstance.cpp @@ -21,7 +21,7 @@ #include FT_TRUETYPE_TABLES_H #include #include <2geom/pathvector.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include "libnrtype/font-glyph.h" #include "libnrtype/font-instance.h" #include "livarot/Path.h" @@ -618,7 +618,7 @@ void font_instance::LoadGlyph(int glyph_id) doAdd=true; } #endif - path_builder.finish(); + path_builder.flush(); if ( doAdd ) { Geom::PathVector pv = path_builder.peek(); diff --git a/src/live_effects/lpe-powerstroke.cpp b/src/live_effects/lpe-powerstroke.cpp index 0533c1ed6..acf8ab6a5 100644 --- a/src/live_effects/lpe-powerstroke.cpp +++ b/src/live_effects/lpe-powerstroke.cpp @@ -24,7 +24,7 @@ #include <2geom/bezier-utils.h> #include <2geom/svg-elliptical-arc.h> #include <2geom/sbasis-to-bezier.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include <2geom/path-intersection.h> #include <2geom/crossing.h> #include <2geom/ellipse.h> @@ -537,7 +537,7 @@ static Geom::Path path_from_piecewise_fix_cusps( Geom::Piecewise #include <2geom/transforms.h> #include <2geom/pathvector.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include "document.h" #include "sp-ellipse.h" #include "preferences.h" @@ -441,7 +441,7 @@ void SPGenericEllipse::set_shape() pb.closePath(); } else { // arc only - pb.finish(); + pb.flush(); } curve = new SPCurve(pb.peek()); diff --git a/src/svg/svg-path.cpp b/src/svg/svg-path.cpp index 135f9ff75..59dad9ead 100644 --- a/src/svg/svg-path.cpp +++ b/src/svg/svg-path.cpp @@ -40,7 +40,7 @@ #include <2geom/path.h> #include <2geom/curves.h> #include <2geom/sbasis-to-bezier.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include <2geom/svg-path-parser.h> #include <2geom/exception.h> #include <2geom/angle.h> @@ -59,13 +59,13 @@ Geom::PathVector sp_svg_read_pathv(char const * str) typedef std::back_insert_iterator Inserter; Inserter iter(pathv); - Geom::SVGPathGenerator generator(iter); + Geom::PathIteratorSink generator(iter); try { Geom::parse_svg_path(str, generator); } catch (Geom::SVGPathParseError &e) { - generator.finish(); + generator.flush(); // This warning is extremely annoying when testing //g_warning("Malformed SVG path, truncated path up to where error was found.\n Input path=\"%s\"\n Parsed path=\"%s\"", str, sp_svg_write_path(pathv)); } diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp index ec58e2141..338499672 100644 --- a/src/ui/tool/path-manipulator.cpp +++ b/src/ui/tool/path-manipulator.cpp @@ -18,7 +18,7 @@ #include #include <2geom/bezier-curve.h> #include <2geom/bezier-utils.h> -#include <2geom/svg-path.h> +#include <2geom/path-sink.h> #include #include "ui/tool/path-manipulator.h" #include "desktop.h" @@ -1202,7 +1202,7 @@ void PathManipulator::_createGeometryFromControlPoints(bool alert_LPE) } ++spi; } - builder.finish(); + builder.flush(); Geom::PathVector pathv = builder.peek() * (_edit_transform * _i2d_transform).inverse(); _spcurve->set_pathvector(pathv); if (alert_LPE) { -- cgit v1.2.3 From 2919a4d76fb8e60bbfefecedbeac05749b5ca805 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Mon, 13 Jan 2014 12:24:07 +0100 Subject: Prevent segfault if 'tableValues' is empty. (bzr r12922) --- src/display/nr-filter-component-transfer.cpp | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/display/nr-filter-component-transfer.cpp b/src/display/nr-filter-component-transfer.cpp index 3bc00d2d7..dd90193fe 100644 --- a/src/display/nr-filter-component-transfer.cpp +++ b/src/display/nr-filter-component-transfer.cpp @@ -254,16 +254,21 @@ void FilterComponentTransfer::render_cairo(FilterSlot &slot) // parameters: R = 0, G = 1, B = 2, A = 3 // Cairo: R = 2, G = 1, B = 0, A = 3 + // If tableValues is empty, use identity. for (unsigned i = 0; i < 3; ++i) { guint32 color = 2 - i; switch (type[i]) { case COMPONENTTRANSFER_TYPE_TABLE: - ink_cairo_surface_filter(out, out, - ComponentTransferTable(color, tableValues[i])); + if(!tableValues[i].empty()) { + ink_cairo_surface_filter(out, out, + ComponentTransferTable(color, tableValues[i])); + } break; case COMPONENTTRANSFER_TYPE_DISCRETE: - ink_cairo_surface_filter(out, out, - ComponentTransferDiscrete(color, tableValues[i])); + if(!tableValues[i].empty()) { + ink_cairo_surface_filter(out, out, + ComponentTransferDiscrete(color, tableValues[i])); + } break; case COMPONENTTRANSFER_TYPE_LINEAR: ink_cairo_surface_filter(out, out, @@ -284,12 +289,16 @@ void FilterComponentTransfer::render_cairo(FilterSlot &slot) // fast paths for alpha channel switch (type[3]) { case COMPONENTTRANSFER_TYPE_TABLE: - ink_cairo_surface_filter(out, out, - ComponentTransferTable(tableValues[3])); + if(!tableValues[3].empty()) { + ink_cairo_surface_filter(out, out, + ComponentTransferTable(tableValues[3])); + } break; case COMPONENTTRANSFER_TYPE_DISCRETE: - ink_cairo_surface_filter(out, out, - ComponentTransferDiscrete(tableValues[3])); + if(!tableValues[3].empty()) { + ink_cairo_surface_filter(out, out, + ComponentTransferDiscrete(tableValues[3])); + } break; case COMPONENTTRANSFER_TYPE_LINEAR: ink_cairo_surface_filter(out, out, -- cgit v1.2.3 From 71abe5b8c4ed9e53a6a7299e4abc0deeb2c586a7 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Mon, 13 Jan 2014 13:55:24 +0100 Subject: Add GUI for feComponentTransfer filter primitive. (bzr r12923) --- src/filters/componenttransfer-funcnode.cpp | 25 ++- src/ui/dialog/filter-effects-dialog.cpp | 246 +++++++++++++++++++++++++---- src/ui/dialog/filter-effects-dialog.h | 5 +- 3 files changed, 231 insertions(+), 45 deletions(-) diff --git a/src/filters/componenttransfer-funcnode.cpp b/src/filters/componenttransfer-funcnode.cpp index 7c7375802..d8c5b0d49 100644 --- a/src/filters/componenttransfer-funcnode.cpp +++ b/src/filters/componenttransfer-funcnode.cpp @@ -205,14 +205,18 @@ void SPFeFuncNode::set(unsigned int key, gchar const *value) { } /** - * * Receives update notifications. - * */ + * Receives update notifications. + */ void SPFeFuncNode::update(SPCtx *ctx, guint flags) { + std::cout << "SPFeFuncNode::update" << std::endl; if (flags & SP_OBJECT_MODIFIED_FLAG) { - /* do something to trigger redisplay, updates? */ - //TODO - //this->readAttr( "azimuth" ); - //this->readAttr( "elevation" ); + this->readAttr( "type" ); + this->readAttr( "tableValues" ); + this->readAttr( "slope" ); + this->readAttr( "intercept" ); + this->readAttr( "amplitude" ); + this->readAttr( "exponent" ); + this->readAttr( "offset" ); } SPObject::update(ctx, flags); @@ -222,18 +226,11 @@ void SPFeFuncNode::update(SPCtx *ctx, guint flags) { * Writes its settings to an incoming repr object, if any. */ Inkscape::XML::Node* SPFeFuncNode::write(Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags) { + std::cout << "SPFeFuncNode::write" << std::endl; if (!repr) { repr = this->getRepr()->duplicate(doc); } - /* - TODO: I'm not sure what to do here... - - if (fefuncnode->azimuth_set) - sp_repr_set_css_double(repr, "azimuth", fefuncnode->azimuth); - if (fefuncnode->elevation_set) - sp_repr_set_css_double(repr, "elevation", fefuncnode->elevation);*/ - SPObject::write(doc, repr, flags); return repr; diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index 38e05a1c7..6a3a4c3f1 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -47,6 +47,7 @@ #include "filters/blend.h" #include "filters/colormatrix.h" #include "filters/componenttransfer.h" +#include "filters/componenttransfer-funcnode.h" #include "filters/composite.h" #include "filters/convolvematrix.h" #include "filters/displacementmap.h" @@ -369,6 +370,36 @@ public: } }; +// Used for tableValue in feComponentTransfer +class EntryAttr : public Gtk::Entry, public AttrWidget +{ +public: + EntryAttr(const SPAttributeEnum a, char* tip_text) + : AttrWidget(a) + { + signal_changed().connect(signal_attr_changed().make_slot()); + if (tip_text) { + set_tooltip_text(tip_text); + } + } + + // No validity checking is done + Glib::ustring get_as_attribute() const + { + return get_text(); + } + + void set_from_attribute(SPObject* o) + { + const gchar* val = attribute_value(o); + if(val) { + set_text( val ); + } else { + set_text( "" ); + } + } +}; + /* Displays/Edits the matrix for feConvolveMatrix or feColorMatrix */ class FilterEffectsDialog::MatrixAttr : public Gtk::Frame, public AttrWidget { @@ -746,7 +777,7 @@ public: _groups[i] = new Gtk::VBox; b.pack_start(*_groups[i], false, false); } - _current_type = 0; + //_current_type = 0; If set to 0 then update_and_show() fails to update properly. } ~Settings() @@ -766,9 +797,9 @@ public: for(unsigned i = 0; i < _groups.size(); ++i) _groups[i]->hide(); } - if(t >= 0) - _groups[t]->show_all(); - + if(t >= 0) { + _groups[t]->show(); // Do not use show_all(), it shows children than should be hidden + } _dialog.set_attrs_locked(true); for(unsigned i = 0; i < _attrwidgets[_current_type].size(); ++i) _attrwidgets[_current_type][i]->set_from_attribute(ob); @@ -800,7 +831,10 @@ public: // LightSource LightSourceControl* add_lightsource(); - // CheckBox + // Component Transfer Values + ComponentTransferValues* add_componenttransfervalues(const Glib::ustring& label, SPFeFuncNode::Channel channel); + + // CheckButton CheckButtonAttr* add_checkbutton(bool def, const SPAttributeEnum attr, const Glib::ustring& label, const Glib::ustring& tv, const Glib::ustring& fv, char* tip_text = NULL) { @@ -938,6 +972,18 @@ public: add_attr_widget(combo->get_attrwidget()); return combo->get_attrwidget(); } + + // Entry + EntryAttr* add_entry(const SPAttributeEnum attr, + const Glib::ustring& label, + char* tip_text = NULL) + { + EntryAttr* entry = new EntryAttr(attr, tip_text); + add_widget(entry, label); + add_attr_widget(entry); + return entry; + } + private: void add_attr_widget(AttrWidget* a) { @@ -973,6 +1019,154 @@ private: int _current_type, _max_types; }; +// Displays sliders and/or tables for feComponentTransfer +class FilterEffectsDialog::ComponentTransferValues : public Gtk::Frame, public AttrWidget +{ +public: + ComponentTransferValues(FilterEffectsDialog& d, SPFeFuncNode::Channel channel) + : AttrWidget(SP_ATTR_INVALID), + _dialog(d), + _settings(d, _box, sigc::mem_fun(*this, &ComponentTransferValues::set_func_attr), COMPONENTTRANSFER_TYPE_ERROR), + _type(ComponentTransferTypeConverter, SP_ATTR_TYPE, false), + _channel(channel), + _funcNode(NULL) + { + set_shadow_type(Gtk::SHADOW_IN); + add(_box); + _box.add(_type); + _box.reorder_child(_type, 0); + _type.signal_changed().connect(sigc::mem_fun(*this, &ComponentTransferValues::on_type_changed)); + + _settings.type(COMPONENTTRANSFER_TYPE_LINEAR); + _settings.add_spinscale(1, SP_ATTR_SLOPE, _("Slope"), -10, 10, 0.1, 0.01, 2); + _settings.add_spinscale(0, SP_ATTR_INTERCEPT, _("Intercept"), -10, 10, 0.1, 0.01, 2); + + _settings.type(COMPONENTTRANSFER_TYPE_GAMMA); + _settings.add_spinscale(1, SP_ATTR_AMPLITUDE, _("Amplitude"), 0, 10, 0.1, 0.01, 2); + _settings.add_spinscale(1, SP_ATTR_EXPONENT, _("Exponent"), 0, 10, 0.1, 0.01, 2); + _settings.add_spinscale(0, SP_ATTR_OFFSET, _("Offset"), -10, 10, 0.1, 0.01, 2); + + _settings.type(COMPONENTTRANSFER_TYPE_TABLE); + _settings.add_entry(SP_ATTR_TABLEVALUES, _("Table")); + + _settings.type(COMPONENTTRANSFER_TYPE_DISCRETE); + _settings.add_entry(SP_ATTR_TABLEVALUES, _("Discrete")); + + //_settings.type(COMPONENTTRANSFER_TYPE_IDENTITY); + _settings.type(-1); // Force update_and_show() to show/hide windows correctly + } + + // FuncNode can be in any order so we must search to find correct one. + SPFeFuncNode* find_node(SPFeComponentTransfer* ct) + { + SPObject* node = ct->children; + SPFeFuncNode* funcNode = NULL; + bool found = false; + for(;node;node=node->next){ + funcNode = SP_FEFUNCNODE(node); + if( funcNode->channel == _channel ) { + found = true; + break; + } + } + if( !found ) + funcNode = NULL; + + return funcNode; + } + + void set_func_attr(const AttrWidget* input) + { + _dialog.set_attr( _funcNode, input->get_attribute(), input->get_as_attribute().c_str()); + } + + // Set new type and update widget visibility + virtual void set_from_attribute(SPObject* o) + { + // See componenttransfer.cpp + if(SP_IS_FECOMPONENTTRANSFER(o)) { + SPFeComponentTransfer* ct = SP_FECOMPONENTTRANSFER(o); + + _funcNode = find_node(ct); + if( _funcNode ) { + _type.set_from_attribute( _funcNode ); + } else { + // Create + SPFilterPrimitive* prim = _dialog._primitive_list.get_selected(); + if(prim) { + Inkscape::XML::Document *xml_doc = prim->document->getReprDoc(); + Inkscape::XML::Node *repr = NULL; + switch(_channel) { + case SPFeFuncNode::R: + repr = xml_doc->createElement("svg:feFuncR"); + break; + case SPFeFuncNode::G: + repr = xml_doc->createElement("svg:feFuncG"); + break; + case SPFeFuncNode::B: + repr = xml_doc->createElement("svg:feFuncB"); + break; + case SPFeFuncNode::A: + repr = xml_doc->createElement("svg:feFuncA"); + break; + } + + //XML Tree being used directly here while it shouldn't be. + prim->getRepr()->appendChild(repr); + Inkscape::GC::release(repr); + + // Now we should find it! + _funcNode = find_node(ct); + if( _funcNode ) { + _funcNode->setAttribute( "type", "identity" ); + } else { + //std::cout << "ERROR ERROR: feFuncX not found!" << std::endl; + } + } + } + + update(); + } + } + +private: + void on_type_changed() + { + SPFilterPrimitive* prim = _dialog._primitive_list.get_selected(); + if(prim) { + + _funcNode->getRepr()->setAttribute( "type", _type.get_as_attribute().c_str() ); + + SPFilter* filter = _dialog._filter_modifier.get_selected_filter(); + filter->requestModified(SP_OBJECT_MODIFIED_FLAG); + + DocumentUndo::done(prim->document, SP_VERB_DIALOG_FILTER_EFFECTS, _("New transfer function type")); + update(); + } + } + + void update() + { + SPFilterPrimitive* prim = _dialog._primitive_list.get_selected(); + if(prim && _funcNode) { + _settings.show_and_update(_type.get_active_data()->id, _funcNode); + } + } + +public: + virtual Glib::ustring get_as_attribute() const + { + return ""; + } + + FilterEffectsDialog& _dialog; + Gtk::VBox _box; + Settings _settings; + ComboBoxEnum _type; + SPFeFuncNode::Channel _channel; // RGBA + SPFeFuncNode* _funcNode; +}; + // Settings for the three light source objects class FilterEffectsDialog::LightSourceControl : public AttrWidget { @@ -1012,6 +1206,9 @@ public: _settings.add_spinscale(1, SP_ATTR_SPECULAREXPONENT, _("Specular Exponent"), 1, 100, 1, 1, 0, _("Exponent value controlling the focus for the light source")); //TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option. _settings.add_spinscale(100, SP_ATTR_LIMITINGCONEANGLE, _("Cone Angle"), 1, 100, 1, 1, 0, _("This is the angle between the spot light axis (i.e. the axis between the light source and the point to which it is pointing at) and the spot light cone. No light is projected outside this cone.")); + + _settings.type(-1); // Force update_and_show() to show/hide windows correctly + } Gtk::VBox& get_box() @@ -1102,6 +1299,16 @@ private: bool _locked; }; + // ComponentTransferValues +FilterEffectsDialog::ComponentTransferValues* FilterEffectsDialog::Settings::add_componenttransfervalues(const Glib::ustring& label, SPFeFuncNode::Channel channel) + { + ComponentTransferValues* ct = new ComponentTransferValues(_dialog, channel); + add_widget(ct, label); + add_attr_widget(ct); + return ct; + } + + FilterEffectsDialog::LightSourceControl* FilterEffectsDialog::Settings::add_lightsource() { LightSourceControl* ls = new LightSourceControl(_dialog); @@ -2527,7 +2734,6 @@ FilterEffectsDialog::FilterEffectsDialog() _sizegroup->set_ignore_hidden(); _add_primitive_type.remove_row(NR_FILTER_TILE); - _add_primitive_type.remove_row(NR_FILTER_COMPONENTTRANSFER); // Initialize widget hierarchy #if WITH_GTKMM_3_0 @@ -2629,15 +2835,10 @@ void FilterEffectsDialog::init_settings_widgets() colmat->signal_attr_changed().connect(sigc::mem_fun(*this, &FilterEffectsDialog::update_color_matrix)); _settings->type(NR_FILTER_COMPONENTTRANSFER); - _settings->add_notimplemented(); - /* - //TRANSLATORS: for info on "Slope" and "Intercept", see http://id.mind.net/~zona/mmts/functionInstitute/linearFunctions/lsif.html - _settings->add_combo(COMPONENTTRANSFER_TYPE_IDENTITY, SP_ATTR_TYPE, _("Type"), ComponentTransferTypeConverter); - _ct_slope = _settings->add_spinscale(1, SP_ATTR_SLOPE, _("Slope"), -10, 10, 0.1, 0.01, 2); - _ct_intercept = _settings->add_spinscale(0, SP_ATTR_INTERCEPT, _("Intercept"), -10, 10, 0.1, 0.01, 2); - _ct_amplitude = _settings->add_spinscale(1, SP_ATTR_AMPLITUDE, _("Amplitude"), 0, 10, 0.1, 0.01, 2); - _ct_exponent = _settings->add_spinscale(1, SP_ATTR_EXPONENT, _("Exponent"), 0, 10, 0.1, 0.01, 2); - _ct_offset = _settings->add_spinscale(0, SP_ATTR_OFFSET, _("Offset"), -10, 10, 0.1, 0.01, 2);*/ + _settings->add_componenttransfervalues(_("R:"), SPFeFuncNode::R); + _settings->add_componenttransfervalues(_("G:"), SPFeFuncNode::G); + _settings->add_componenttransfervalues(_("B:"), SPFeFuncNode::B); + _settings->add_componenttransfervalues(_("A:"), SPFeFuncNode::A); _settings->type(NR_FILTER_COMPOSITE); _settings->add_combo(COMPOSITE_OVER, SP_ATTR_OPERATOR, _("Operator:"), CompositeOperatorConverter); @@ -2953,21 +3154,6 @@ void FilterEffectsDialog::update_settings_sensitivity() _k3->set_sensitive(use_k); _k4->set_sensitive(use_k); -// Component transfer not yet implemented -/* - if(SP_IS_FECOMPONENTTRANSFER(prim)) { - SPFeComponentTransfer* ct = SP_FECOMPONENTTRANSFER(prim); - const bool linear = ct->type == COMPONENTTRANSFER_TYPE_LINEAR; - const bool gamma = ct->type == COMPONENTTRANSFER_TYPE_GAMMA; - - _ct_table->set_sensitive(ct->type == COMPONENTTRANSFER_TYPE_TABLE || ct->type == COMPONENTTRANSFER_TYPE_DISCRETE); - _ct_slope->set_sensitive(linear); - _ct_intercept->set_sensitive(linear); - _ct_amplitude->set_sensitive(gamma); - _ct_exponent->set_sensitive(gamma); - _ct_offset->set_sensitive(gamma); - } -*/ } void FilterEffectsDialog::update_color_matrix() diff --git a/src/ui/dialog/filter-effects-dialog.h b/src/ui/dialog/filter-effects-dialog.h index a2a2a3c6e..ccf79e60d 100644 --- a/src/ui/dialog/filter-effects-dialog.h +++ b/src/ui/dialog/filter-effects-dialog.h @@ -282,6 +282,7 @@ private: class Settings; class MatrixAttr; class ColorMatrixValues; + class ComponentTransferValues; class LightSourceControl; Settings* _settings; Settings* _filter_general_settings; @@ -290,6 +291,9 @@ private: // Color Matrix ColorMatrixValues* _color_matrix_values; + // Component Transfer + ComponentTransferValues* _component_transfer_values; + // Convolve Matrix MatrixAttr* _convolve_matrix; DualSpinButton* _convolve_order; @@ -297,7 +301,6 @@ private: // For controlling setting sensitivity Gtk::Widget* _k1, *_k2, *_k3, *_k4; - Gtk::Widget* _ct_table, *_ct_slope, *_ct_intercept, *_ct_amplitude, *_ct_exponent, *_ct_offset; // To prevent unwanted signals bool _locked; -- cgit v1.2.3 From 1261aa2ea7b3a229f7606dde8ddb7dc73752a1bc Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Tue, 14 Jan 2014 10:55:26 -0500 Subject: Fix bug #1239779 by removing caching for symbols. Fixed bugs: - https://launchpad.net/bugs/1239779 (bzr r12924) --- src/ui/dialog/symbols.cpp | 65 ++++++++++++++--------------------------------- src/ui/dialog/symbols.h | 7 +++-- 2 files changed, 22 insertions(+), 50 deletions(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index fb353fec1..2f2652bb1 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -73,8 +73,6 @@ namespace Inkscape { namespace UI { -static Cache::SvgPreview svg_preview_cache; - namespace Dialog { // See: http://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeModelColumnRecord.html @@ -276,7 +274,7 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : instanceConns.push_back(documentReplacedConn); get_symbols(); - draw_symbols( currentDocument ); /* Defaults to current document */ + add_symbols( currentDocument ); /* Defaults to current document */ sigc::connection desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &SymbolsDialog::setTargetDesktop) ); @@ -329,7 +327,7 @@ void SymbolsDialog::rebuild() { addSymbol->set_sensitive( false ); removeSymbol->set_sensitive( false ); } - draw_symbols( symbolDocument ); + add_symbols( symbolDocument ); } void SymbolsDialog::insertSymbol() { @@ -651,18 +649,18 @@ gchar const* SymbolsDialog::style_from_use( gchar const* id, SPDocument* documen return style; } -void SymbolsDialog::draw_symbols( SPDocument* symbolDocument ) { +void SymbolsDialog::add_symbols( SPDocument* symbolDocument ) { GSList* l = symbols_in_doc( symbolDocument ); for( ; l != NULL; l = l->next ) { SPObject* symbol = SP_OBJECT(l->data); if (SP_IS_SYMBOL(symbol)) { - draw_symbol( symbol ); + add_symbol( symbol ); } } } -void SymbolsDialog::draw_symbol( SPObject* symbol ) { +void SymbolsDialog::add_symbol( SPObject* symbol ) { SymbolColumns* columns = getColumns(); @@ -672,7 +670,7 @@ void SymbolsDialog::draw_symbol( SPObject* symbol ) { title = id; } - Glib::RefPtr pixbuf = create_symbol_image(id, symbol ); + Glib::RefPtr pixbuf = draw_symbol( symbol ); if( pixbuf ) { Gtk::ListStore::iterator row = store->append(); @@ -694,7 +692,7 @@ void SymbolsDialog::draw_symbol( SPObject* symbol ) { * the temporary document is rendered. */ Glib::RefPtr -SymbolsDialog::create_symbol_image(gchar const *symbol_id, SPObject *symbol) +SymbolsDialog::draw_symbol(SPObject *symbol) { // Create a copy repr of the symbol with id="the_symbol" Inkscape::XML::Document *xml_doc = previewDocument->getReprDoc(); @@ -713,7 +711,8 @@ SymbolsDialog::create_symbol_image(gchar const *symbol_id, SPObject *symbol) if( !style ) { // If no default style in , look in documents. if( symbol->document == currentDocument ) { - style = style_from_use( symbol_id, symbol->document ); + gchar const *id = symbol->getRepr()->attribute("id"); + style = style_from_use( id, symbol->document ); } else { style = symbol->document->getReprRoot()->attribute("style"); } @@ -722,9 +721,7 @@ SymbolsDialog::create_symbol_image(gchar const *symbol_id, SPObject *symbol) if( !style ) style = "fill:#bbbbbb;stroke:#808080"; // This is for display in Symbols dialog only - if( style ) { - repr->setAttribute( "style", style ); - } + if( style ) repr->setAttribute( "style", style ); // BUG: Symbols don't work if defined outside of . Causes Inkscape // crash when trying to read in such a file. @@ -733,7 +730,7 @@ SymbolsDialog::create_symbol_image(gchar const *symbol_id, SPObject *symbol) Inkscape::GC::release(repr); // Uncomment this to get the previewDocument documents saved (useful for debugging) - // FILE *fp = fopen (g_strconcat(symbol_id, ".svg", NULL), "w"); + // FILE *fp = fopen (g_strconcat(id, ".svg", NULL), "w"); // sp_repr_save_stream(previewDocument->getReprDoc(), fp); // fclose (fp); @@ -746,55 +743,31 @@ SymbolsDialog::create_symbol_image(gchar const *symbol_id, SPObject *symbol) previewDocument->getRoot()->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG); previewDocument->ensureUpToDate(); - // if( object_temp == NULL || !SP_IS_ITEM(object_temp) ) { - // //std::cout << " previewDocument broken?" << std::endl; - // //return 0; - // } - SPItem *item = SP_ITEM(object_temp); - unsigned psize = SYMBOL_ICON_SIZES[in_sizes]; - /* Update to renderable state */ - Glib::ustring key = svg_preview_cache.cache_key(previewDocument->getURI(), symbol_id, psize); - //std::cout << " Key: " << key << std::endl; - Glib::RefPtr pixbuf(NULL); - GdkPixbuf *pixbuf_gobj = svg_preview_cache.get_preview_from_cache(key); - if (pixbuf_gobj) { - g_object_ref(pixbuf_gobj); // the reference in svg_preview_cache will get destroyed when it's freed - pixbuf = Glib::wrap(pixbuf_gobj); - } + // We could use cache here, but it doesn't really work with the structure + // of this user interface and we've already cached the pixbuf in the gtklist // Find object's bbox in document. // Note symbols can have own viewport... ignore for now. //Geom::OptRect dbox = item->geometricBounds(); Geom::OptRect dbox = item->documentVisualBounds(); - if (!dbox) { - //std::cout << " No dbox" << std::endl; - return pixbuf; - } - - if (!pixbuf) { + if (dbox) { /* Scale symbols to fit */ double scale = 1.0; double width = dbox->width(); double height = dbox->height(); - if( width == 0.0 ) { - width = 1.0; - } - if( height == 0.0 ) { - height = 1.0; - } - if( fitSymbol->get_active() ) { - /* Fit */ - scale = psize/std::max(width,height); - } + if( width == 0.0 ) width = 1.0; + if( height == 0.0 ) height = 1.0; + + if( fitSymbol->get_active() ) + scale = psize / std::max(width, height); pixbuf = Glib::wrap(render_pixbuf(renderDrawing, scale, *dbox, psize)); - svg_preview_cache.set_preview_in_cache(key, pixbuf->gobj()); } return pixbuf; diff --git a/src/ui/dialog/symbols.h b/src/ui/dialog/symbols.h index 074af6764..8021fb0c1 100644 --- a/src/ui/dialog/symbols.h +++ b/src/ui/dialog/symbols.h @@ -79,8 +79,8 @@ private: void iconDragDataGet(const Glib::RefPtr& context, Gtk::SelectionData& selection_data, guint info, guint time); void get_symbols(); - void draw_symbols( SPDocument* symbol_document ); - void draw_symbol( SPObject* symbol_document ); + void add_symbols( SPDocument* symbol_document ); + void add_symbol( SPObject* symbol_document ); SPDocument* symbols_preview_doc(); GSList* symbols_in_doc_recursive(SPObject *r, GSList *l); @@ -89,8 +89,7 @@ private: GSList* use_in_doc( SPDocument* document ); gchar const* style_from_use( gchar const* id, SPDocument* document); - Glib::RefPtr - create_symbol_image(gchar const *symbol_name, SPObject *symbol); + Glib::RefPtr draw_symbol(SPObject *symbol); /* Keep track of all symbol template documents */ std::map symbolSets; -- cgit v1.2.3 From 906dd648455cac4c5c48fcb11c6bcc6ba9c02edb Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Tue, 14 Jan 2014 11:12:30 -0500 Subject: Merge in patch from bug #1267842 to fix Inkex module open order. Fixed bugs: - https://launchpad.net/bugs/1267842 (bzr r12925) --- share/extensions/inkex.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py index 5333ef52b..1203a4606 100755 --- a/share/extensions/inkex.py +++ b/share/extensions/inkex.py @@ -151,15 +151,31 @@ class Effect: """Collect command line arguments""" self.options, self.args = self.OptionParser.parse_args(args) - def parse(self,file=None): + def parse(self, filename=None): """Parse document in specified file or on stdin""" - try: + + # First try to open the file from the function argument + if filename != None: try: - stream = open(file,'r') - except: - stream = open(self.svg_file,'r') - except: + stream = open(filename, 'r') + except Exception: + errormsg(_("Unable to open specified file: %s") % filename) + sys.exit() + + # If it wasn't specified, try to open the file specified as + # an object member + elif self.svg_file != None: + try: + stream = open(self.svg_file, 'r') + except Exception: + errormsg(_("Unable to open specified file: %s") % self.svg_file) + sys.exit() + + # Finally, if the filename was not specified anywhere, use + # standard input stream + else: stream = sys.stdin + p = etree.XMLParser(huge_tree=True) self.document = etree.parse(stream, parser=p) self.original_document = copy.deepcopy(self.document) -- cgit v1.2.3 From e5bf7dcf9275a4b3da6375262fbe5992a1b66238 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Tue, 14 Jan 2014 11:25:49 -0500 Subject: Merge in patch from mathog in Bug #1241797 Fixed bugs: - https://launchpad.net/bugs/1241797 (bzr r12926) --- src/libuemf/uemf.c | 42 +++++++++++++++++++++++++++++++++++++++--- src/libuemf/uemf.h | 53 ++++++++++++++++++++++++++++------------------------- 2 files changed, 67 insertions(+), 28 deletions(-) diff --git a/src/libuemf/uemf.c b/src/libuemf/uemf.c index 220c88545..3079c5095 100644 --- a/src/libuemf/uemf.c +++ b/src/libuemf/uemf.c @@ -1535,15 +1535,15 @@ int drawing_size( return(0); } + /** - \brief Set a U_COLORREF value from separeate R,G,B values. - Or use macro directly: cr = U_RGB(r,g,b). + \brief Set a U_COLORREF value from separate R,G,B values. \param red Red component \param green Green component \param blue Blue component */ -U_COLORREF colorref_set( +U_COLORREF colorref3_set( uint8_t red, uint8_t green, uint8_t blue @@ -1552,6 +1552,42 @@ U_COLORREF colorref_set( return(cr); } +/** + \brief Set a U_COLORREF value from separate R,G,B, and Reserved values. + \param red Red component + \param green Green component + \param blue Blue component + \param blue Reserved component + +*/ +U_COLORREF colorref4_set( + uint8_t red, + uint8_t green, + uint8_t blue, + uint8_t Reserved + ){ + U_COLORREF cr = (U_COLORREF){red , green, blue, Reserved}; + return(cr); +} + +/** + \brief Set a U_RGBQUAD value from separate R,G,B, Reserved values. + \param red Red component + \param green Green component + \param blue Blue component + \param reserved Reserved component + +*/ +U_RGBQUAD rgbquad_set( + uint8_t red, + uint8_t green, + uint8_t blue, + uint8_t reserved + ){ + U_RGBQUAD cr = (U_RGBQUAD){blue , green, red, reserved}; + return(cr); +} + /** \brief Set rect and rectl objects from Upper Left and Lower Right corner points. \param ul upper left corner of rectangle diff --git a/src/libuemf/uemf.h b/src/libuemf/uemf.h index 1ff6ead60..00c605d02 100644 --- a/src/libuemf/uemf.h +++ b/src/libuemf/uemf.h @@ -1096,34 +1096,35 @@ extern "C" { /** \defgroup Common_macros Common Macros @{ */ -// Color U_BGR(A), byte order lo to hi: {B,G,R,A} corresponding to U_RGBQUAD. Set/Get Macros. +// Note, many of these were originally defined using C99 (type){val,val,val} format, but that turned out to +// have incompatibilities with C++, so use functions as the basis to avoid this. + +// Set/Get for U_RGBQUAD Colors, which are stored in byte order: {B,G,R,A}. // These are used in EMF structures and the byte order must be the same in memory or on disk. -#define U_BGR(r,g,b) (U_RGBQUAD){b,g,r,0} //!< Set any BGR color with an {r,g,b} triplet -#define U_BGRA(r,g,b,a) (U_RGBQUAD){b,g,r,a} //!< Set any BGRA color with an {r,g,b,a} quad -#define U_WHITE U_BGR(255,255,255) //!< Set BGR white. -#define U_BLACK U_BGR(0,0,0) //!< Set BGR black. -#define U_BGRAGetR(rgb) (rgb.Red ) //!< Color BGR Get Red Macro. -#define U_BGRAGetG(rgb) (rgb.Green ) //!< Color BGR Get Green Macro. -#define U_BGRAGetB(rgb) (rgb.Blue ) //!< Color BGR Get Blue Macro. -#define U_BGRAGetA(rgb) (rgb.Reserved) //!< Color BGR Get A/reserved Macro. - -#define U_PALETTERGB(r,g,b) U_RGB(r,g,b,0x02)) //!< Set any Palette RGB color. -#define U_PALETTEINDEX(i) ((U_COLORREF)(0x01000000 | (uint16_t)(i)))\ - //!< Get RGB from Palette by index. - -// Color U_RGB(A), byte order lo to hi: {R,G,B,A} corresponding to U_COLORREF. Set/Get Macros. +#define U_BGR(r,g,b) rgbquad_set(r, g, b, 0) //!< Set any BGR color with an {r,g,b} triplet +#define U_BGRA(r,g,b,a) rgbquad_set(r, g, b, a) //!< Set any BGRA color with an {r,g,b,a} quad +#define U_WHITE U_BGR(255,255,255) //!< Set BGR white. +#define U_BLACK U_BGR(0,0,0) //!< Set BGR black. +#define U_BGRAGetR(rgb) (rgb.Red ) //!< Color BGR Red. +#define U_BGRAGetG(rgb) (rgb.Green ) //!< Color BGR Green. +#define U_BGRAGetB(rgb) (rgb.Blue ) //!< Color BGR Blue. +#define U_BGRAGetA(rgb) (rgb.Reserved) //!< Color BGRA A/reserved + + +// Set/Get for U_COLORREF Color, which are stored in byte order:: {R,G,B,A}. // These are used in EMF structures and the byte order must be the same in memory or on disk. -// These MAY be used in PNG and other libraries if these enforce byte order in memory,otherwise +// These MAY be used in PNG and other libraries if these enforce byte order in memory, otherwise // U_swap4 may need to also be employed. +// + +#define colorref_set colorref3_set //!< Most frequent usage is 3 colors, so set the unqualified one to that +#define U_RGB(r,g,b) colorref3_set(r, g, b) //!< Set any RGB color with an {r,g,b} triplet +#define U_RGBA(r,g,b,a) colorref4_set(r, g, b, a) //!< Set any RGBA color with an {r,g,b,a} quad +#define U_RGBAGetR(rgb) (rgb.Red ) //!< Color RGB Red. +#define U_RGBAGetG(rgb) (rgb.Green ) //!< Color RGB Green +#define U_RGBAGetB(rgb) (rgb.Blue ) //!< Color RGB Blue +#define U_RGBAGetA(rgb) (rgb.Reserved) //!< Color RGBA A/reserved -/// Set any RGB color with an {r,g,b} triplet -#define U_RGB(r,g,b) (U_COLORREF){(uint8_t)(r), (uint8_t)(g), (uint8_t)(b), 0} -/// Set any RGBA color with an {r,g,b,a} quad -#define U_RGBA(r,g,b,a) (U_COLORREF){(uint8_t)(r), (uint8_t)(g), (uint8_t)(b), (uint8_t)(a)} -#define U_RGBAGetR(rgb) ((U_COLORREF)rgb).Red //!< Color RGB Get Red Macro. -#define U_RGBAGetG(rgb) ((U_COLORREF)rgb).Green //!< Color RGB Get Green Macro. -#define U_RGBAGetB(rgb) ((U_COLORREF)rgb).Blue //!< Color RGB Get Blue Macro. -#define U_RGBAGetA(rgb) ((U_COLORREF)rgb).Reserved //!< Color RGBA Get A/reserved Macro. // color type conversions #define U_RGB2BGR(rgb) (U_RGBQUAD){ U_RGBAGetB(rgb),U_RGBAGetG(rgb),U_RGBAGetR(rgb),0} //!< Set any BGR color from an RGB color @@ -2652,7 +2653,9 @@ U_POINT16 point16_set(int16_t x, int16_t y); U_PANOSE panose_set(uint8_t bFamilyType, uint8_t bSerifStyle, uint8_t bWeight, uint8_t bProportion, uint8_t bContrast, uint8_t bStrokeVariation, uint8_t bArmStyle, uint8_t bLetterform, uint8_t bMidline, uint8_t bXHeight ); -U_COLORREF colorref_set(uint8_t red, uint8_t green, uint8_t blue); +U_COLORREF colorref3_set(uint8_t red, uint8_t green, uint8_t blue); +U_COLORREF colorref4_set(uint8_t red, uint8_t green, uint8_t blue, uint8_t reserved); +U_RGBQUAD rgbquad_set(uint8_t red,uint8_t green, uint8_t blue, uint8_t reserved); U_LOGBRUSH logbrush_set(uint32_t lbStyle, U_COLORREF lbColor, int32_t lbHatch); U_XFORM xform_set(U_FLOAT eM11, U_FLOAT eM12, U_FLOAT eM21, U_FLOAT eM22, U_FLOAT eDx, U_FLOAT eDy); U_XFORM xform_alt_set(U_FLOAT scale, U_FLOAT ratio, U_FLOAT rot, U_FLOAT axisrot, U_FLOAT eDx, U_FLOAT eDy); -- cgit v1.2.3 From 350a2607bc209f01ef9611f5eb12783214f6b483 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Tue, 14 Jan 2014 18:09:01 +0000 Subject: autogen.sh: Improve portability (bzr r12927) --- autogen.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autogen.sh b/autogen.sh index a4b1f4234..fcac2d4de 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,4 +1,4 @@ -#!/bin/bash -e +#!/bin/sh # This script does all the magic calls to automake/autoconf and # friends that are needed to configure a cvs checkout. As described in -- cgit v1.2.3 From 744053120dad8edd7085dda1a02e9f9ecd65d701 Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Tue, 14 Jan 2014 10:46:05 -0800 Subject: Fix bzr revision number in version string (LP #1071923) Patch from David Evans. (bzr r12928) --- CMakeScripts/inkscape-version.cmake | 2 +- src/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeScripts/inkscape-version.cmake b/CMakeScripts/inkscape-version.cmake index 1d98a5799..a72946ac5 100644 --- a/CMakeScripts/inkscape-version.cmake +++ b/CMakeScripts/inkscape-version.cmake @@ -11,7 +11,7 @@ set(INKSCAPE_REVISION "unknown") if(EXISTS ${INKSCAPE_SOURCE_DIR}/.bzr/) execute_process(COMMAND - bzr revno ${INKSCAPE_SOURCE_DIR} + bzr revno --tree ${INKSCAPE_SOURCE_DIR} OUTPUT_VARIABLE INKSCAPE_REVISION OUTPUT_STRIP_TRAILING_WHITESPACE) endif() diff --git a/src/Makefile.am b/src/Makefile.am index 2f91c3c24..7fbc135c5 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -223,7 +223,7 @@ endif # someone updates the BZR working directory. inkscape-version.cpp: $(inkscape_version_deps) VER_PREFIX="$(VERSION)";\ - VER_BZRREV=" r`bzr revno`"; \ + VER_BZRREV=" r`bzr revno --tree`"; \ if test ! -z "`bzr status -S -V $(srcdir)`"; then \ VER_CUSTOM=" custom"; \ fi; \ -- cgit v1.2.3 From 53fe5bb2f9a2f4956ad63ac42df2047a8b8705ec Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Tue, 14 Jan 2014 19:05:56 +0000 Subject: fix warnings on compilers that provide unordered_set (bzr r12929) --- configure.ac | 22 ++++++++++++++++++++-- src/util/unordered-containers.h | 18 +++++++++++++++++- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index e39c54db7..dbffcfbde 100644 --- a/configure.ac +++ b/configure.ac @@ -148,19 +148,37 @@ if test "$GCC" = "yes"; then fi # Detect a working version of unordered containers. +# First try looking for native support (C++11 feature) +AC_MSG_CHECKING([native support for unordered_set]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], +[[ + std::unordered_set i, j; + i = j; +]])], +[native_unordered_set_works=yes], [native_unordered_set_works=no]) + +if test "x$native_unordered_set_works" = "xyes"; then + AC_MSG_RESULT([ok]) + AC_DEFINE(HAVE_NATIVE_UNORDERED_SET, 1, [Has working native unordered_set]) +else + AC_MSG_RESULT([not working]) +fi + AC_MSG_CHECKING([TR1 unordered_set usability]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ std::tr1::unordered_set i, j; i = j; ]])], -[unordered_set_works=yes], [unordered_set_works=no]) -if test "x$unordered_set_works" = "xyes"; then +[tr1_unordered_set_works=yes], [tr1_unordered_set_works=no]) + +if test "x$tr1_unordered_set_works" = "xyes"; then AC_MSG_RESULT([ok]) AC_DEFINE(HAVE_TR1_UNORDERED_SET, 1, [Has working standard TR1 unordered_set]) else AC_MSG_RESULT([not working]) fi + AC_CHECK_HEADER([boost/unordered_set.hpp], [AC_DEFINE(HAVE_BOOST_UNORDERED_SET, 1, [Boost unordered_set (Boost >= 1.36)])], []) AC_CHECK_HEADER([ext/hash_set], [AC_DEFINE(HAVE_EXT_HASH_SET, 1, [Legacy GNU ext/hash_set])], []) diff --git a/src/util/unordered-containers.h b/src/util/unordered-containers.h index 70d36c4dc..98c2fa3c9 100644 --- a/src/util/unordered-containers.h +++ b/src/util/unordered-containers.h @@ -19,8 +19,24 @@ #include #ifndef DOXYGEN_SHOULD_SKIP_THIS -#if defined(HAVE_TR1_UNORDERED_SET) +#if defined(HAVE_NATIVE_UNORDERED_SET) +# include +# include +# define INK_UNORDERED_SET std::unordered_set +# define INK_UNORDERED_MAP std::unordered_map +# define INK_HASH std::hash + +namespace std { +template <> +struct hash : public std::unary_function { + std::size_t operator()(Glib::ustring const &s) const { + return hash()(s.raw()); + } +}; +} // namespace std + +#elif defined(HAVE_TR1_UNORDERED_SET) # include # include # define INK_UNORDERED_SET std::tr1::unordered_set -- cgit v1.2.3 From bfc7eb940ec9472a1a01af0f3622f8419bd30051 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Tue, 14 Jan 2014 21:24:09 +0000 Subject: multi-path-manipulator: strip dead code (bzr r12930) --- src/ui/tool/multi-path-manipulator.cpp | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/ui/tool/multi-path-manipulator.cpp b/src/ui/tool/multi-path-manipulator.cpp index 1c683f717..65987ad52 100644 --- a/src/ui/tool/multi-path-manipulator.cpp +++ b/src/ui/tool/multi-path-manipulator.cpp @@ -30,17 +30,6 @@ #include -#ifdef USE_GNU_HASHES -namespace __gnu_cxx { -template<> -struct hash { - size_t operator()(Inkscape::UI::NodeList::iterator const &n) const { - return reinterpret_cast(n.ptr()); - } -}; -} // namespace __gnu_cxx -#endif // USE_GNU_HASHES - namespace Inkscape { namespace UI { -- cgit v1.2.3 From 35649d3846d690ad444db4645156995baba945ff Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Tue, 14 Jan 2014 23:02:41 +0100 Subject: Fix for Bug #1268778 (Move cursor disappears after clicking on Select Tool (F1) twice). Fixed bugs: - https://launchpad.net/bugs/1268778 (bzr r12931) --- src/desktop.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/desktop.cpp b/src/desktop.cpp index 195127ca1..bc917c6f3 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -657,19 +657,18 @@ SPDesktop::change_document (SPDocument *theDocument) /** * Replaces the currently active tool with a new one. */ -void SPDesktop::set_event_context2(const std::string& toolName) { - Inkscape::UI::Tools::ToolBase* new_tool = ToolFactory::instance().createObject(toolName); - new_tool->desktop = this; - new_tool->message_context = new Inkscape::MessageContext(this->messageStack()); - +void SPDesktop::set_event_context2(const std::string& toolName) +{ Inkscape::UI::Tools::ToolBase* old_tool = event_context; - event_context = new_tool; - - if (old_tool) { - old_tool->finish(); - delete old_tool; - } - + if (old_tool) { + old_tool->finish(); + delete old_tool; + } + + Inkscape::UI::Tools::ToolBase* new_tool = ToolFactory::instance().createObject(toolName); + new_tool->desktop = this; + new_tool->message_context = new Inkscape::MessageContext(this->messageStack()); + event_context = new_tool; new_tool->setup(); // Make sure no delayed snapping events are carried over after switching tools @@ -677,7 +676,7 @@ void SPDesktop::set_event_context2(const std::string& toolName) { // tool should take care of this by itself) sp_event_context_discard_delayed_snap_event(event_context); - _event_context_changed_signal.emit(this, event_context); + _event_context_changed_signal.emit(this, event_context); } /** -- cgit v1.2.3 From c31b1410b8b7d9059561e8102a38402a999f4aef Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Wed, 15 Jan 2014 13:21:45 +0100 Subject: Additional fix for Bug #1268778 (Move cursor disappears after clicking on Select Tool (F1) twice). Fixed bugs: - https://launchpad.net/bugs/1268778 (bzr r12932) --- src/desktop.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/desktop.cpp b/src/desktop.cpp index bc917c6f3..bf3b70d43 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -660,9 +660,16 @@ SPDesktop::change_document (SPDocument *theDocument) void SPDesktop::set_event_context2(const std::string& toolName) { Inkscape::UI::Tools::ToolBase* old_tool = event_context; + if (old_tool) { - old_tool->finish(); - delete old_tool; + if (toolName.compare(old_tool->pref_observer->observed_path) != 0) { + //g_message("Old tool: %s", old_tool->pref_observer->observed_path.c_str()); + //g_message("New tool: %s", toolName.c_str()); + old_tool->finish(); + delete old_tool; + } else { + return; + } } Inkscape::UI::Tools::ToolBase* new_tool = ToolFactory::instance().createObject(toolName); -- cgit v1.2.3 From 89a93a3c248c4fd116235137fffd50b192861821 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Wed, 15 Jan 2014 12:26:03 +0000 Subject: drop useless checks for hard Cairo version dependency (bzr r12933) --- src/extension/internal/cairo-ps-out.cpp | 4 ---- src/extension/internal/cairo-render-context.cpp | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/extension/internal/cairo-ps-out.cpp b/src/extension/internal/cairo-ps-out.cpp index 5f535dc64..055a30add 100644 --- a/src/extension/internal/cairo-ps-out.cpp +++ b/src/extension/internal/cairo-ps-out.cpp @@ -328,9 +328,7 @@ CairoPsOutput::init (void) "" SP_MODULE_KEY_PRINT_CAIRO_PS "\n" "\n" "<_item value='PS3'>" N_("PostScript level 3") "\n" -#if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 5, 2)) "<_item value='PS2'>" N_("PostScript level 2") "\n" -#endif "\n" "false\n" "false\n" @@ -369,9 +367,7 @@ CairoEpsOutput::init (void) "" SP_MODULE_KEY_PRINT_CAIRO_EPS "\n" "\n" "<_item value='PS3'>" N_("PostScript level 3") "\n" -#if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 5, 2)) "<_item value='PS2'>" N_("PostScript level 2") "\n" -#endif "\n" "false\n" "false\n" diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 4f9273cbb..47de62ac0 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -803,9 +803,7 @@ CairoRenderContext::setupSurface(double width, double height) #ifdef CAIRO_HAS_PDF_SURFACE case CAIRO_SURFACE_TYPE_PDF: surface = cairo_pdf_surface_create_for_stream(Inkscape::Extension::Internal::_write_callback, _stream, width, height); -#if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)) cairo_pdf_surface_restrict_to_version(surface, (cairo_pdf_version_t)_pdf_level); -#endif break; #endif #ifdef CAIRO_HAS_PS_SURFACE @@ -814,10 +812,8 @@ CairoRenderContext::setupSurface(double width, double height) if(CAIRO_STATUS_SUCCESS != cairo_surface_status(surface)) { return FALSE; } -#if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 5, 2)) cairo_ps_surface_restrict_to_level(surface, (cairo_ps_level_t)_ps_level); cairo_ps_surface_set_eps(surface, (cairo_bool_t) _eps); -#endif // Cairo calculates the bounding box itself, however we want to override this. See Launchpad bug #380501 #if (CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 11, 2)) // cairo_ps_dsc_comment(surface, os_bbox.str().c_str()); -- cgit v1.2.3 From 9d40e9669a1024b7caed1db4c5ff99e06c96a57f Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Wed, 15 Jan 2014 16:26:12 +0100 Subject: Fix for Bug #1236282 (add full keyboard navigation support for new templates dialog). Fixed bugs: - https://launchpad.net/bugs/1236282 (bzr r12934) --- src/ui/dialog/new-from-template.cpp | 7 +++++-- src/ui/dialog/new-from-template.h | 3 +++ src/ui/dialog/template-load-tab.cpp | 7 ++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/ui/dialog/new-from-template.cpp b/src/ui/dialog/new-from-template.cpp index 177f15195..71d1c22d0 100644 --- a/src/ui/dialog/new-from-template.cpp +++ b/src/ui/dialog/new-from-template.cpp @@ -44,10 +44,13 @@ NewFromTemplate::NewFromTemplate() void NewFromTemplate::_createFromTemplate() { _main_widget.createTemplate(); - - response(0); + _onClose(); } +void NewFromTemplate::_onClose() +{ + response(0); +} void NewFromTemplate::load_new_from_template() { diff --git a/src/ui/dialog/new-from-template.h b/src/ui/dialog/new-from-template.h index 8ebcb2863..2b40af2a6 100644 --- a/src/ui/dialog/new-from-template.h +++ b/src/ui/dialog/new-from-template.h @@ -23,6 +23,8 @@ namespace UI { class NewFromTemplate : public Gtk::Dialog { + +friend class TemplateLoadTab; public: static void load_new_from_template(); @@ -32,6 +34,7 @@ private: TemplateLoadTab _main_widget; void _createFromTemplate(); + void _onClose(); }; } diff --git a/src/ui/dialog/template-load-tab.cpp b/src/ui/dialog/template-load-tab.cpp index 057eff337..1b9b734fc 100644 --- a/src/ui/dialog/template-load-tab.cpp +++ b/src/ui/dialog/template-load-tab.cpp @@ -10,6 +10,7 @@ #include "template-widget.h" #include "template-load-tab.h" +#include "new-from-template.h" #include #include @@ -31,10 +32,8 @@ #include "xml/document.h" #include "xml/node.h" - namespace Inkscape { namespace UI { - TemplateLoadTab::TemplateLoadTab() : _current_keyword("") @@ -84,7 +83,9 @@ void TemplateLoadTab::createTemplate() void TemplateLoadTab::_onRowActivated(const Gtk::TreeModel::Path &, Gtk::TreeViewColumn*) { - _info_widget->create(); + createTemplate(); + NewFromTemplate* parent = static_cast (this->get_toplevel()); + parent->_onClose(); } void TemplateLoadTab::_displayTemplateInfo() -- cgit v1.2.3 From 88d24fc0c21e087b6c460a0c1b58aac556c666e1 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 15 Jan 2014 17:33:48 +0100 Subject: Revert r12544. Fixes bug 1256449 (Clipping missing on Cairo-based exports). Note: 523285 is not a bug. (bzr r12935) --- src/extension/internal/cairo-renderer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp index 0a4c86f0b..6fbc85c05 100644 --- a/src/extension/internal/cairo-renderer.cpp +++ b/src/extension/internal/cairo-renderer.cpp @@ -580,9 +580,9 @@ void CairoRenderer::renderItem(CairoRenderContext *ctx, SPItem *item) setStateForItem(ctx, item); CairoRenderState *state = ctx->getCurrentState(); - state->need_layer = ( state->mask || state->opacity != 1.0 ); + state->need_layer = ( state->mask || state->clip_path || state->opacity != 1.0 ); - // Draw item on a temporary surface so a mask or opacity can be applied to it. + // Draw item on a temporary surface so a mask, clip-path, or opacity can be applied to it. if (state->need_layer) { state->merge_opacity = FALSE; ctx->pushLayer(); @@ -591,7 +591,7 @@ void CairoRenderer::renderItem(CairoRenderContext *ctx, SPItem *item) sp_item_invoke_render(item, ctx); if (state->need_layer) - ctx->popLayer(); + ctx->popLayer(); // This applies clipping/masking ctx->popState(); } -- cgit v1.2.3 From 82f4d9a7537fdb3267bf5570cd34aef0692b0f9f Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Wed, 15 Jan 2014 14:22:31 -0500 Subject: for rubberband outline, add shading instead of XOR (Bug 1266308) Fixed bugs: - https://launchpad.net/bugs/1266308 (bzr r12936) --- src/display/sodipodi-ctrlrect.cpp | 13 ++++++++++++- src/rubberband.cpp | 1 + src/selcue.cpp | 1 + src/ui/tools/text-tool.cpp | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/display/sodipodi-ctrlrect.cpp b/src/display/sodipodi-ctrlrect.cpp index c350e4614..e6e427047 100644 --- a/src/display/sodipodi-ctrlrect.cpp +++ b/src/display/sodipodi-ctrlrect.cpp @@ -142,7 +142,18 @@ void CtrlRect::render(SPCanvasBuf *buf) ink_cairo_set_source_rgba32(buf->ct, _border_color); cairo_stroke(buf->ct); - if (_shadow_size > 0) { + if (_shadow_size == 1) { // highlight the border by drawing it in _shadow_color + if (_dashed) { + cairo_set_dash(buf->ct, dashes, 2, 4); + cairo_rectangle(buf->ct, 0.5 + area[X].min(), 0.5 + area[Y].min(), + area[X].max() - area[X].min(), area[Y].max() - area[Y].min()); + } else { + cairo_rectangle(buf->ct, -0.5 + area[X].min(), -0.5 + area[Y].min(), + area[X].max() - area[X].min(), area[Y].max() - area[Y].min()); + } + ink_cairo_set_source_rgba32(buf->ct, _shadow_color); + cairo_stroke(buf->ct); + } else if (_shadow_size > 1) { // fill the shadow ink_cairo_set_source_rgba32(buf->ct, _shadow_color); cairo_rectangle(buf->ct, 1 + area[X].max(), area[Y].min() + _shadow_size, _shadow_size, area[Y].max() - area[Y].min() + 1); // right shadow diff --git a/src/rubberband.cpp b/src/rubberband.cpp index 08492837a..6ec4b3e45 100644 --- a/src/rubberband.cpp +++ b/src/rubberband.cpp @@ -99,6 +99,7 @@ void Inkscape::Rubberband::move(Geom::Point const &p) if (_mode == RUBBERBAND_MODE_RECT) { if (_rect == NULL) { _rect = static_cast(sp_canvas_item_new(sp_desktop_controls(_desktop), SP_TYPE_CTRLRECT, NULL)); + _rect->setShadow(1, 0xffffffff); } _rect->setRectangle(Geom::Rect(_start, _end)); diff --git a/src/selcue.cpp b/src/selcue.cpp index 3f8a93e21..805629636 100644 --- a/src/selcue.cpp +++ b/src/selcue.cpp @@ -177,6 +177,7 @@ void Inkscape::SelCue::_newItemBboxes() SP_CTRLRECT(box)->setRectangle(*b); SP_CTRLRECT(box)->setColor(0x000000a0, 0, 0); SP_CTRLRECT(box)->setDashed(true); + SP_CTRLRECT(box)->setShadow(1, 0xffffffff); sp_canvas_item_move_to_z(box, 0); } diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp index 2927606a7..c73164c09 100644 --- a/src/ui/tools/text-tool.cpp +++ b/src/ui/tools/text-tool.cpp @@ -154,6 +154,7 @@ void TextTool::setup() { this->indicator = sp_canvas_item_new(sp_desktop_controls(desktop), SP_TYPE_CTRLRECT, NULL); SP_CTRLRECT(this->indicator)->setRectangle(Geom::Rect(Geom::Point(0, 0), Geom::Point(100, 100))); SP_CTRLRECT(this->indicator)->setColor(0x0000ff7f, false, 0); + SP_CTRLRECT(this->indicator)->setShadow(1, 0xffffff7f); sp_canvas_item_hide(this->indicator); this->frame = sp_canvas_item_new(sp_desktop_controls(desktop), SP_TYPE_CTRLRECT, NULL); -- cgit v1.2.3 From d1a182e5e94e5967d1ef19519e25e41ed81f3e9e Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Wed, 15 Jan 2014 22:08:27 +0100 Subject: i18n. New from Template entries now translatable (see Bug #383844). POT file and French translation updated. Fixed bugs: - https://launchpad.net/bugs/383844 (bzr r12937) --- po/POTFILES.in | 1 + po/fr.po | 11688 +++++++++++++++------------------- po/inkscape.pot | 2219 ++++--- share/palettes/README | 9 +- share/templates/Makefile.am | 65 +- share/templates/README | 6 + share/templates/i18n.py | 20 + src/ui/dialog/template-load-tab.cpp | 10 +- 8 files changed, 6482 insertions(+), 7536 deletions(-) create mode 100755 share/templates/i18n.py diff --git a/po/POTFILES.in b/po/POTFILES.in index 3a1bfbfbb..06d49864f 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -6,6 +6,7 @@ inkscape.desktop.in share/filters/filters.svg.h share/palettes/palettes.h share/patterns/patterns.svg.h +share/templates/templates.h src/box3d.cpp src/color-profile.cpp src/context-fns.cpp diff --git a/po/fr.po b/po/fr.po index 16e0ffdd3..5b8f9b7bb 100644 --- a/po/fr.po +++ b/po/fr.po @@ -13,13 +13,12 @@ # Florent Becker # Sophie Gousset # Nicolas Dufour , 2008-2012. -#: ../share/filters/filters.svg.h:1 msgid "" msgstr "" "Project-Id-Version: inkscape\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2013-11-07 15:09+0100\n" -"PO-Revision-Date: 2013-06-27 21:38+0100\n" +"POT-Creation-Date: 2014-01-15 19:06+0100\n" +"PO-Revision-Date: 2014-01-15 22:00+0100\n" "Last-Translator: Nicolas Dufour \n" "Language-Team: \n" "Language: \n" @@ -204,8 +203,7 @@ msgstr "Zèbre" #: ../share/filters/filters.svg.h:1 msgid "Irregular vertical dark stripes (loses object's own color)" -msgstr "" -"Bandes verticales sombres et irrégulières (l'objet perd sa propre couleur)" +msgstr "Bandes verticales sombres et irrégulières (l'objet perd sa propre couleur)" #: ../share/filters/filters.svg.h:1 msgid "Clouds" @@ -458,7 +456,8 @@ msgstr "Texture de métal luisant" msgid "Leaves" msgstr "Feuilles" -#: ../share/filters/filters.svg.h:1 ../share/extensions/pathscatter.inx.h:1 +#: ../share/filters/filters.svg.h:1 +#: ../share/extensions/pathscatter.inx.h:1 msgid "Scatter" msgstr "Éparpiller" @@ -481,9 +480,7 @@ msgstr "Cire d'abeille irisée" #: ../share/filters/filters.svg.h:1 msgid "Waxy texture which keeps its iridescence through color fill change" -msgstr "" -"Texture cireuse conservant ses reflets irisés au travers de variations de " -"couleur de remplissage" +msgstr "Texture cireuse conservant ses reflets irisés au travers de variations de couleur de remplissage" #: ../share/filters/filters.svg.h:1 msgid "Eroded Metal" @@ -491,8 +488,7 @@ msgstr "Métal érodé" #: ../share/filters/filters.svg.h:1 msgid "Eroded metal texture with ridges, grooves, holes and bumps" -msgstr "" -"Texture de métal érodé, avec des arêtes, des sillons, des trous et des bosses" +msgstr "Texture de métal érodé, avec des arêtes, des sillons, des trous et des bosses" #: ../share/filters/filters.svg.h:1 msgid "Cracked Lava" @@ -524,8 +520,7 @@ msgstr "Mur de pierres" #: ../share/filters/filters.svg.h:1 msgid "Stone wall texture to use with not too saturated colors" -msgstr "" -"Texture en mur de pierre à utiliser avec des couleurs pas trop saturées" +msgstr "Texture en mur de pierre à utiliser avec des couleurs pas trop saturées" #: ../share/filters/filters.svg.h:1 msgid "Silk Carpet" @@ -556,10 +551,8 @@ msgid "Metallized Paint" msgstr "Peinture métallisée" #: ../share/filters/filters.svg.h:1 -msgid "" -"Metallized effect with a soft lighting, slightly translucent at the edges" -msgstr "" -"Effet métallisé avec une lumière douce, légèrement translucide sur les bords" +msgid "Metallized effect with a soft lighting, slightly translucent at the edges" +msgstr "Effet métallisé avec une lumière douce, légèrement translucide sur les bords" #: ../share/filters/filters.svg.h:1 msgid "Dragee" @@ -614,9 +607,7 @@ msgstr "Cubes" #: ../share/filters/filters.svg.h:1 msgid "Scattered cubes; adjust the Morphology primitive to vary size" -msgstr "" -"Cubes éparpillés ; pour changer la taille des cubes, ajuster la primitive " -"Morphologie" +msgstr "Cubes éparpillés ; pour changer la taille des cubes, ajuster la primitive Morphologie" #: ../share/filters/filters.svg.h:1 msgid "Peel Off" @@ -664,20 +655,15 @@ msgstr "Papier à grain" #: ../share/filters/filters.svg.h:1 msgid "Aquarelle paper effect which can be used for pictures as for objects" -msgstr "" -"Effet de papier à aquarelle, utilisable autant pour les images que pour les " -"objets" +msgstr "Effet de papier à aquarelle, utilisable autant pour les images que pour les objets" #: ../share/filters/filters.svg.h:1 msgid "Rough and Glossy" msgstr "Plastique chiffonné" #: ../share/filters/filters.svg.h:1 -msgid "" -"Crumpled glossy paper effect which can be used for pictures as for objects" -msgstr "" -"Effet de papier brillant froissé, utilisable autant pour les images que pour " -"les objets" +msgid "Crumpled glossy paper effect which can be used for pictures as for objects" +msgstr "Effet de papier brillant froissé, utilisable autant pour les images que pour les objets" #: ../share/filters/filters.svg.h:1 msgid "In and Out" @@ -716,11 +702,8 @@ msgid "Electronic Microscopy" msgstr "Microscope électronique" #: ../share/filters/filters.svg.h:1 -msgid "" -"Bevel, crude light, discoloration and glow like in electronic microscopy" -msgstr "" -"Un biseau, lumière brute, décoloration et lueur comme avec un microscope " -"électronique" +msgid "Bevel, crude light, discoloration and glow like in electronic microscopy" +msgstr "Un biseau, lumière brute, décoloration et lueur comme avec un microscope électronique" #: ../share/filters/filters.svg.h:1 msgid "Tartan" @@ -736,9 +719,7 @@ msgstr "Liquide agité" #: ../share/filters/filters.svg.h:1 msgid "Colorizable filling with flow inside like transparency" -msgstr "" -"Remplissage qu'il est possible de colorer, avec une transparence s'écoulant " -"à l'intérieur" +msgstr "Remplissage qu'il est possible de colorer, avec une transparence s'écoulant à l'intérieur" #: ../share/filters/filters.svg.h:1 msgid "Soft Focus Lens" @@ -785,8 +766,7 @@ msgid "Torn Edges" msgstr "Pourtour déchiré" #: ../share/filters/filters.svg.h:1 -msgid "" -"Displace the outside of shapes and pictures without altering their content" +msgid "Displace the outside of shapes and pictures without altering their content" msgstr "Déplace l'extérieur des formes et images sans en altérer le contenu" #: ../share/filters/filters.svg.h:1 @@ -802,12 +782,8 @@ msgid "Evanescent" msgstr "Évanescence" #: ../share/filters/filters.svg.h:1 -msgid "" -"Blur the contents of objects, preserving the outline and adding progressive " -"transparency at edges" -msgstr "" -"Rend flou le contenu des objets, mais préserve le contour et ajoute une " -"transparence progressive aux bords" +msgid "Blur the contents of objects, preserving the outline and adding progressive transparency at edges" +msgstr "Rend flou le contenu des objets, mais préserve le contour et ajoute une transparence progressive aux bords" #: ../share/filters/filters.svg.h:1 msgid "Chalk and Sponge" @@ -815,9 +791,7 @@ msgstr "Éponge et craie" #: ../share/filters/filters.svg.h:1 msgid "Low turbulence gives sponge look and high turbulence chalk" -msgstr "" -"Une agitation légère donne l'aspect d'une éponge et une agitation forte de " -"la craie" +msgstr "Une agitation légère donne l'aspect d'une éponge et une agitation forte de la craie" #: ../share/filters/filters.svg.h:1 msgid "People" @@ -840,11 +814,8 @@ msgid "Garden of Delights" msgstr "Jardin des délices" #: ../share/filters/filters.svg.h:1 -msgid "" -"Phantasmagorical turbulent wisps, like Hieronymus Bosch's Garden of Delights" -msgstr "" -"Volutes agitées et fantasmagoriques, comme Le Jardin des délices de " -"Jérôme Bosch" +msgid "Phantasmagorical turbulent wisps, like Hieronymus Bosch's Garden of Delights" +msgstr "Volutes agitées et fantasmagoriques, comme Le Jardin des délices de Jérôme Bosch" #: ../share/filters/filters.svg.h:1 msgid "Cutout Glow" @@ -852,9 +823,7 @@ msgstr "Découpe et flou" #: ../share/filters/filters.svg.h:1 msgid "In and out glow with a possible offset and colorizable flood" -msgstr "" -"Lueur intérieure et extérieure avec possibilité de décaler et colorer le " -"remplissage" +msgstr "Lueur intérieure et extérieure avec possibilité de décaler et colorer le remplissage" #: ../share/filters/filters.svg.h:1 msgid "Dark Emboss" @@ -862,8 +831,7 @@ msgstr "Bosselage sombre" #: ../share/filters/filters.svg.h:1 msgid "Emboss effect : 3D relief where white is replaced by black" -msgstr "" -"Effet d'embossage : relief 3D avec lequel le blanc est remplacé par du noir" +msgstr "Effet d'embossage : relief 3D avec lequel le blanc est remplacé par du noir" #: ../share/filters/filters.svg.h:1 msgid "Bubbly Bumps Matte" @@ -871,9 +839,7 @@ msgstr "Bosselage bulleux mat" #: ../share/filters/filters.svg.h:1 msgid "Same as Bubbly Bumps but with a diffuse light instead of a specular one" -msgstr "" -"Identique à Bosselage bulleux, mais avec une lumière diffuse et non pas " -"spéculaire" +msgstr "Identique à Bosselage bulleux, mais avec une lumière diffuse et non pas spéculaire" #: ../share/filters/filters.svg.h:1 msgid "Blotting Paper" @@ -904,11 +870,8 @@ msgid "Felt" msgstr "Feutre" #: ../share/filters/filters.svg.h:1 -msgid "" -"Felt like texture with color turbulence and slightly darker at the edges" -msgstr "" -"Texture de feutre avec de la turbulence de couleur et légèrement plus sombre " -"sur les bords" +msgid "Felt like texture with color turbulence and slightly darker at the edges" +msgstr "Texture de feutre avec de la turbulence de couleur et légèrement plus sombre sur les bords" #: ../share/filters/filters.svg.h:1 msgid "Ink Paint" @@ -924,9 +887,7 @@ msgstr "Arc-en-ciel teinté" #: ../share/filters/filters.svg.h:1 msgid "Smooth rainbow colors melted along the edges and colorizable" -msgstr "" -"Couleurs arc-en-ciel douces, fondues le long des bords, et qu'il est " -"possible de colorer" +msgstr "Couleurs arc-en-ciel douces, fondues le long des bords, et qu'il est possible de colorer" #: ../share/filters/filters.svg.h:1 msgid "Melted Rainbow" @@ -942,8 +903,7 @@ msgstr "Métal souple" #: ../share/filters/filters.svg.h:1 msgid "Bright, polished uneven metal casting, colorizable" -msgstr "" -"Moulage de métal irrégulier, poli et brillant, qu'il est possible de colorer" +msgstr "Moulage de métal irrégulier, poli et brillant, qu'il est possible de colorer" #: ../share/filters/filters.svg.h:1 msgid "Wavy Tartan" @@ -951,8 +911,7 @@ msgstr "Écossais ondoyant" #: ../share/filters/filters.svg.h:1 msgid "Tartan pattern with a wavy displacement and bevel around the edges" -msgstr "" -"Motif écossais avec des déplacements ondulés et un biseau autour des bords" +msgstr "Motif écossais avec des déplacements ondulés et un biseau autour des bords" #: ../share/filters/filters.svg.h:1 msgid "3D Marble" @@ -1022,8 +981,10 @@ msgstr "Lumière noire" #: ../src/extension/internal/filter/paint.h:717 #: ../src/extension/internal/filter/shadows.h:73 #: ../src/extension/internal/filter/transparency.h:345 -#: ../src/ui/dialog/clonetiler.cpp:832 ../src/ui/dialog/clonetiler.cpp:983 -#: ../src/ui/dialog/document-properties.cpp:153 +#: ../src/filter-enums.cpp:67 +#: ../src/ui/dialog/clonetiler.cpp:832 +#: ../src/ui/dialog/clonetiler.cpp:983 +#: ../src/ui/dialog/document-properties.cpp:154 #: ../share/extensions/color_blackandwhite.inx.h:2 #: ../share/extensions/color_brighter.inx.h:2 #: ../share/extensions/color_custom.inx.h:15 @@ -1086,20 +1047,15 @@ msgstr "Ombrages 3D non réalistes" #: ../share/filters/filters.svg.h:1 msgid "Comics shader with creamy waves transparency" -msgstr "" -"Ombrage de bande dessinée avec une transparence en ondulations crémeuses" +msgstr "Ombrage de bande dessinée avec une transparence en ondulations crémeuses" #: ../share/filters/filters.svg.h:1 msgid "Chewing Gum" msgstr "Chewing-gum" #: ../share/filters/filters.svg.h:1 -msgid "" -"Creates colorizable blotches which smoothly flow over the edges of the lines " -"at their crossings" -msgstr "" -"Crée des taches qu'il est possible de colorer, avec un écoulement homogène " -"sur les croisements des lignes" +msgid "Creates colorizable blotches which smoothly flow over the edges of the lines at their crossings" +msgstr "Crée des taches qu'il est possible de colorer, avec un écoulement homogène sur les croisements des lignes" #: ../share/filters/filters.svg.h:1 msgid "Dark And Glow" @@ -1107,8 +1063,7 @@ msgstr "Ombre et lumière" #: ../share/filters/filters.svg.h:1 msgid "Darkens the edge with an inner blur and adds a flexible glow" -msgstr "" -"Assombrit les bords avec un flou intérieur et ajoute une lueur flexible" +msgstr "Assombrit les bords avec un flou intérieur et ajoute une lueur flexible" #: ../share/filters/filters.svg.h:1 msgid "Warped Rainbow" @@ -1116,9 +1071,7 @@ msgstr "Arc-en-ciel déformé" #: ../share/filters/filters.svg.h:1 msgid "Smooth rainbow colors warped along the edges and colorizable" -msgstr "" -"Couleurs arc-en-ciel douces déformées le long des bords et qu'il est " -"possible de colorer" +msgstr "Couleurs arc-en-ciel douces déformées le long des bords et qu'il est possible de colorer" #: ../share/filters/filters.svg.h:1 msgid "Rough and Dilate" @@ -1134,9 +1087,7 @@ msgstr "Vieille carte postale" #: ../share/filters/filters.svg.h:1 msgid "Slightly posterize and draw edges like on old printed postcards" -msgstr "" -"Légère postérisation et contours dessinés, comme sur une vieille carte " -"postale imprimée" +msgstr "Légère postérisation et contours dessinés, comme sur une vieille carte postale imprimée" #: ../share/filters/filters.svg.h:1 msgid "Dots Transparency" @@ -1159,11 +1110,8 @@ msgid "Smear Transparency" msgstr "Transparence barbouillée" #: ../share/filters/filters.svg.h:1 -msgid "" -"Paint objects with a transparent turbulence which turns around color edges" -msgstr "" -"Peint des objets avec une turbulence transparente tournant autour des bords " -"colorés" +msgid "Paint objects with a transparent turbulence which turns around color edges" +msgstr "Peint des objets avec une turbulence transparente tournant autour des bords colorés" #: ../share/filters/filters.svg.h:1 msgid "Thick Paint" @@ -1186,12 +1134,8 @@ msgid "Embossed Leather" msgstr "Cuir repoussé" #: ../share/filters/filters.svg.h:1 -msgid "" -"Combine a HSL edges detection bump with a leathery or woody and colorizable " -"texture" -msgstr "" -"Combine un bosselage de type détection de contours TSL avec une texture de " -"cuir ou de bois qu'il est possible de colorer" +msgid "Combine a HSL edges detection bump with a leathery or woody and colorizable texture" +msgstr "Combine un bosselage de type détection de contours TSL avec une texture de cuir ou de bois qu'il est possible de colorer" #: ../share/filters/filters.svg.h:1 msgid "Carnaval" @@ -1206,23 +1150,16 @@ msgid "Plastify" msgstr "Plastifier" #: ../share/filters/filters.svg.h:1 -msgid "" -"HSL edges detection bump with a wavy reflective surface effect and variable " -"crumple" -msgstr "" -"Combine un bosselage de type détection de contours TSL avec un effet de " -"surface ondulant et réflectif et un froissement variable" +msgid "HSL edges detection bump with a wavy reflective surface effect and variable crumple" +msgstr "Combine un bosselage de type détection de contours TSL avec un effet de surface ondulant et réflectif et un froissement variable" #: ../share/filters/filters.svg.h:1 msgid "Plaster" msgstr "Plâtre" #: ../share/filters/filters.svg.h:1 -msgid "" -"Combine a HSL edges detection bump with a matte and crumpled surface effect" -msgstr "" -"Combine un bosselage de type détection de contours TSL avec un effet de " -"surface mat et froissé" +msgid "Combine a HSL edges detection bump with a matte and crumpled surface effect" +msgstr "Combine un bosselage de type détection de contours TSL avec un effet de surface mat et froissé" #: ../share/filters/filters.svg.h:1 msgid "Rough Transparency" @@ -1230,8 +1167,7 @@ msgstr "Transparence agitée" #: ../share/filters/filters.svg.h:1 msgid "Adds a turbulent transparency which displaces pixels at the same time" -msgstr "" -"Ajoute une transparence agitée qui déplace plusieurs pixels en même temps" +msgstr "Ajoute une transparence agitée qui déplace plusieurs pixels en même temps" #: ../share/filters/filters.svg.h:1 msgid "Gouache" @@ -1247,8 +1183,7 @@ msgstr "Gravure transparente" #: ../share/filters/filters.svg.h:1 msgid "Gives a transparent engraving effect with rough line and filling" -msgstr "" -"Donne un effet de gravure transparente avec un trait agité et un remplissage" +msgstr "Donne un effet de gravure transparente avec un trait agité et un remplissage" #: ../share/filters/filters.svg.h:1 msgid "Alpha Draw Liquid" @@ -1256,9 +1191,7 @@ msgstr "Dessin transparent liquide" #: ../share/filters/filters.svg.h:1 msgid "Gives a transparent fluid drawing effect with rough line and filling" -msgstr "" -"Donne un effet de dessin liquide et transparent avec un trait agité et un " -"remplissage" +msgstr "Donne un effet de dessin liquide et transparent avec un trait agité et un remplissage" #: ../share/filters/filters.svg.h:1 msgid "Liquid Drawing" @@ -1282,18 +1215,15 @@ msgstr "Acrylique épaisse" #: ../share/filters/filters.svg.h:1 msgid "Thick acrylic paint texture with high texture depth" -msgstr "" -"Texture de peinture acrylique épaisse avec beaucoup de profondeur de texture" +msgstr "Texture de peinture acrylique épaisse avec beaucoup de profondeur de texture" #: ../share/filters/filters.svg.h:1 msgid "Alpha Engraving B" msgstr "Gravure transparente B" #: ../share/filters/filters.svg.h:1 -msgid "" -"Gives a controllable roughness engraving effect to bitmaps and materials" -msgstr "" -"Donne un effet de gravure agitée contrôlable aux bitmaps et aux matières" +msgid "Gives a controllable roughness engraving effect to bitmaps and materials" +msgstr "Donne un effet de gravure agitée contrôlable aux bitmaps et aux matières" #: ../share/filters/filters.svg.h:1 msgid "Lapping" @@ -1318,21 +1248,15 @@ msgstr "Remplissage et transparence" #: ../share/filters/filters.svg.h:1 msgid "Convert to a colorizable transparent positive or negative" -msgstr "" -"Convertit en un positif ou un négatif transparent qu'il est possible de " -"colorer" +msgstr "Convertit en un positif ou un négatif transparent qu'il est possible de colorer" #: ../share/filters/filters.svg.h:1 msgid "Saturation Map" msgstr "Carte de saturation" #: ../share/filters/filters.svg.h:1 -msgid "" -"Creates an approximative semi-transparent and colorizable image of the " -"saturation levels" -msgstr "" -"Crée une image approximative, semi-transparente et à colorer, des niveaux de " -"saturation" +msgid "Creates an approximative semi-transparent and colorizable image of the saturation levels" +msgstr "Crée une image approximative, semi-transparente et à colorer, des niveaux de saturation" #: ../share/filters/filters.svg.h:1 msgid "Riddled" @@ -1348,9 +1272,7 @@ msgstr "Vernis ridé" #: ../share/filters/filters.svg.h:1 msgid "Thick glossy and translucent paint texture with high depth" -msgstr "" -"Texture de peinture épaisse, brillante et translucide, avec beaucoup de " -"profondeur" +msgstr "Texture de peinture épaisse, brillante et translucide, avec beaucoup de profondeur" #: ../share/filters/filters.svg.h:1 msgid "Canvas Bumps" @@ -1366,9 +1288,7 @@ msgstr "Bosselage toilé mat" #: ../share/filters/filters.svg.h:1 msgid "Same as Canvas Bumps but with a diffuse light instead of a specular one" -msgstr "" -"Identique à Bosselage toilé, mais avec une lumière diffuse et non pas " -"spéculaire" +msgstr "Identique à Bosselage toilé, mais avec une lumière diffuse et non pas spéculaire" #: ../share/filters/filters.svg.h:1 msgid "Canvas Bumps Alpha" @@ -1425,9 +1345,7 @@ msgstr "Papier aluminium" #: ../share/filters/filters.svg.h:1 msgid "Metallic foil effect combining two lighting types and variable crumple" -msgstr "" -"Effet de papier d'aluminium combinant deux types de lumières et un " -"froissement variable" +msgstr "Effet de papier d'aluminium combinant deux types de lumières et un froissement variable" #: ../share/filters/filters.svg.h:1 msgid "Soft Colors" @@ -1435,9 +1353,7 @@ msgstr "Couleurs douces" #: ../share/filters/filters.svg.h:1 msgid "Adds a colorizable edges glow inside objects and pictures" -msgstr "" -"Ajoute une lueur pouvant être colorée sur le bord intérieur des objets et " -"images" +msgstr "Ajoute une lueur pouvant être colorée sur le bord intérieur des objets et images" #: ../share/filters/filters.svg.h:1 msgid "Relief Print" @@ -1445,8 +1361,7 @@ msgstr "Impression en relief" #: ../share/filters/filters.svg.h:1 msgid "Bumps effect with a bevel, color flood and complex lighting" -msgstr "" -"Biseau avec des bosselages, du remplissage de couleur et une lumière complexe" +msgstr "Biseau avec des bosselages, du remplissage de couleur et une lumière complexe" #: ../share/filters/filters.svg.h:1 msgid "Growing Cells" @@ -1454,9 +1369,7 @@ msgstr "Cellules vivantes" #: ../share/filters/filters.svg.h:1 msgid "Random rounded living cells like fill" -msgstr "" -"Remplissage avec des formes rondes et aléatoires ressemblant à des cellules " -"vivantes" +msgstr "Remplissage avec des formes rondes et aléatoires ressemblant à des cellules vivantes" #: ../share/filters/filters.svg.h:1 msgid "Fluorescence" @@ -1569,11 +1482,8 @@ msgid "Swirl" msgstr "Tourbillon" #: ../share/filters/filters.svg.h:1 -msgid "" -"Paint objects with a transparent turbulence which wraps around color edges" -msgstr "" -"Peint des objets avec une turbulence transparente tournant autour des bords " -"colorés" +msgid "Paint objects with a transparent turbulence which wraps around color edges" +msgstr "Peint des objets avec une turbulence transparente tournant autour des bords colorés" #: ../share/filters/filters.svg.h:1 msgid "Pointillism" @@ -1621,12 +1531,8 @@ msgid "Blur Double" msgstr "Flou double" #: ../share/filters/filters.svg.h:1 -msgid "" -"Overlays two copies with different blur amounts and modifiable blend and " -"composite" -msgstr "" -"Superpose deux copies avec un nouveau de flou différent et des primitives " -"fondu et composite modifiables" +msgid "Overlays two copies with different blur amounts and modifiable blend and composite" +msgstr "Superpose deux copies avec un nouveau de flou différent et des primitives fondu et composite modifiables" #: ../share/filters/filters.svg.h:1 msgid "Image Drawing Basic" @@ -1680,8 +1586,7 @@ msgstr "Monochrome transparent craquelé" #: ../share/filters/filters.svg.h:1 msgid "Basic noise fill texture; adjust color in Flood" -msgstr "" -"Texture de remplissage agité de base ; ajuster la couleur avec Remplissage" +msgstr "Texture de remplissage agité de base ; ajuster la couleur avec Remplissage" #: ../share/filters/filters.svg.h:1 msgid "Alpha Turbulent" @@ -1961,8 +1866,7 @@ msgstr "Simuler CMJ" #: ../share/filters/filters.svg.h:1 msgid "Render Cyan, Magenta and Yellow channels with a colorizable background" -msgstr "" -"Rendu des canaux cyan, magenta et jaune avec un fond que l'on peut colorer" +msgstr "Rendu des canaux cyan, magenta et jaune avec un fond que l'on peut colorer" #: ../share/filters/filters.svg.h:1 #, fuzzy @@ -3328,56 +3232,378 @@ msgstr "Textile (bitmap)" msgid "Old paint (bitmap)" msgstr "Peinture vieillie (bitmap)" -#: ../src/arc-context.cpp:265 -msgid "" -"Ctrl: make circle or integer-ratio ellipse, snap arc/segment angle" +#: ../share/templates/templates.h:1 +msgid "A4 Landscape Page" +msgstr "Page A4 paysage" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 landscape sheet" +msgstr "Feuille A4 vierge, au format paysage" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty landscape" +msgstr "Feuille de papier A4 vierge au format paysage" + +#: ../share/templates/templates.h:1 +msgid "A4 Page" +msgstr "Page A4" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 sheet" +msgstr "Feuille A4 vierge" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty" +msgstr "Feuille de papier A4 vierge" + +#: ../share/templates/templates.h:1 +msgid "Black Opaque" +msgstr "Opaque noire" + +#: ../share/templates/templates.h:1 +msgid "Empty black page" +msgstr "Page noire vierge" + +#: ../share/templates/templates.h:1 +msgid "black opaque empty" +msgstr "noir opaque vierge" + +#: ../share/templates/templates.h:1 +msgid "White Opaque" +msgstr "Opaque blanche" + +#: ../share/templates/templates.h:1 +msgid "Empty white page" +msgstr "Page blanche vierge" + +#: ../share/templates/templates.h:1 +msgid "white opaque empty" +msgstr "blanche opaque vierge" + +#: ../share/templates/templates.h:1 +msgid "Business Card 85x54mm" +msgstr "Carte de visite 85x54 mm" + +#: ../share/templates/templates.h:1 +msgid "Empty business card template." +msgstr "Modèle de carte de visite vierge." + +#: ../share/templates/templates.h:1 +msgid "business card empty 85x54" +msgstr "carte de visite vierge 85x54" + +#: ../share/templates/templates.h:1 +msgid "Business Card 90x50mm" +msgstr "Carte de visite 90x50 mm" + +#: ../share/templates/templates.h:1 +msgid "business card empty 90x50" +msgstr "carte de visite vierge 90x50" + +#: ../share/templates/templates.h:1 +msgid "CD Cover 300dpi" +msgstr "Pochette de CD 300 ppp" + +#: ../share/templates/templates.h:1 +msgid "Empty CD box cover." +msgstr "Pochette de boîte de CD vierge." + +#: ../share/templates/templates.h:1 +msgid "CD cover disc disk 300dpi box" +msgstr "CD pochette disque 300 boîtes" + +#: ../share/templates/templates.h:1 +msgid "CD Label 120x120 " msgstr "" -"Ctrl : dessiner des cercles ou des ellipses de ratio entier, forcer " -"la modification des angles des arcs/camemberts par incréments" -#: ../src/arc-context.cpp:266 ../src/rect-context.cpp:293 -msgid "Shift: draw around the starting point" -msgstr "Maj : dessiner autour du point de départ" +#: ../share/templates/templates.h:1 +msgid "Simple CD Label template with disc's pattern." +msgstr "" -#: ../src/arc-context.cpp:435 -#, c-format -msgid "" -"Ellipse: %s × %s (constrained to ratio %d:%d); with Shift " -"to draw around the starting point" +#: ../share/templates/templates.h:1 +msgid "CD label 120x120 disc disk" msgstr "" -"Ellipse : %s × %s; (contrainte de ratio %d:%d); Maj pour " -"dessiner autour du point de départ" -#: ../src/arc-context.cpp:437 -#, c-format -msgid "" -"Ellipse: %s × %s; with Ctrl to make square or integer-" -"ratio ellipse; with Shift to draw around the starting point" +#: ../share/templates/templates.h:1 +msgid "DVD Cover Regular 300dpi " msgstr "" -"Ellipse : %s × %s; Ctrl pour dessiner des cercles ou des " -"ellipses de ratio entier, Maj pour dessiner autour du point de départ" -#: ../src/arc-context.cpp:460 -msgid "Create ellipse" -msgstr "Créer une ellipse" +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD covers." +msgstr "" -#: ../src/box3d-context.cpp:375 ../src/box3d-context.cpp:382 -#: ../src/box3d-context.cpp:389 ../src/box3d-context.cpp:396 -#: ../src/box3d-context.cpp:403 ../src/box3d-context.cpp:410 -msgid "Change perspective (angle of PLs)" -msgstr "Changer la perspective (angle des LP)" +#: ../share/templates/templates.h:1 +msgid "DVD cover regular 300dpi" +msgstr "" -#. status text -#: ../src/box3d-context.cpp:588 -msgid "3D Box; with Shift to extrude along the Z axis" -msgstr "Boîte 3D. Utiliser Maj pour extruder suivant Z" +#: ../share/templates/templates.h:1 +msgid "DVD Cover Slim 300dpi " +msgstr "" -#: ../src/box3d-context.cpp:614 -msgid "Create 3D box" -msgstr "Créer une boîte 3D" +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD slim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover slim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Superslim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD superslim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover superslim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Ultraslim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD ultraslim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover ultraslim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1024x768" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty desktop size sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 1024x768 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1600x1200" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 1600x1200 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 640x480" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 640x480 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 800x600" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 800x600 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Fontforge Glyph" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "font fontforge glyph 1000x1000" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 16x16" +msgstr "Icône 16x16" + +#: ../share/templates/templates.h:1 +msgid "Small 16x16 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 16x16 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 32x32" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "32x32 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 32x32 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 48x48" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "48x48 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 48x48 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 64x64" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "64x64 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 64x64 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +#, fuzzy +msgid "Letter Landscape" +msgstr "Letter Paysage" + +#: ../share/templates/templates.h:1 +msgid "Standard letter landscape sheet - 792x612" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "letter landscape 792x612 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +#, fuzzy +msgid "Letter" +msgstr "Lettre :" + +#: ../share/templates/templates.h:1 +msgid "Standard letter sheet - 612x792" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "letter 612x792 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "No Borders" +msgstr "Sans bordure" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no borders" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "no borders empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "No Layers" +msgstr "Sans calque" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no layers" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "no layers empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video HDTV 1920x1080" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "HDTV video template for 1920x1080 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "HDTV video empty 1920x1080" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video NTSC 720x486" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "NTSC video template for 720x486 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "NTSC video empty 720x486" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video PAL 728x576" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "PAL video template for 728x576 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "PAL video empty 728x576" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 468x60" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty 468x60 web banner template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "web banner 468x60 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 728x90" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty 728x90 web banner template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "web banner 728x90 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +#, fuzzy +msgid "LaTeX Beamer" +msgstr "Impression LaTeX" + +#: ../share/templates/templates.h:1 +msgid "LaTeX beamer template with helping grid." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "LaTex LaTeX latex grid beamer" +msgstr "" + +#: ../share/templates/templates.h:1 +#, fuzzy +msgid "Typography Canvas" +msgstr "1 - Paramétrer le canevas typographique" + +#: ../share/templates/templates.h:1 +msgid "Empty typography canvas with helping guidelines." +msgstr "" + +#: ../share/templates/templates.h:1 +#, fuzzy +msgid "guidelines typography canvas" +msgstr "1 - Paramétrer le canevas typographique" #. 3D box -#: ../src/box3d.cpp:259 ../src/box3d.cpp:1329 +#: ../src/box3d.cpp:259 +#: ../src/box3d.cpp:1329 #: ../src/ui/dialog/inkscape-preferences.cpp:398 msgid "3D Box" msgstr "Boîte 3D" @@ -3387,21 +3613,25 @@ msgstr "Boîte 3D" msgid "Color profiles directory (%s) is unavailable." msgstr "Le dossier des palettes (%s) est indisponible." -#: ../src/color-profile.cpp:909 ../src/color-profile.cpp:926 +#: ../src/color-profile.cpp:909 +#: ../src/color-profile.cpp:926 msgid "(invalid UTF-8 string)" msgstr "(chaîne UTF-8 invalide)" -#: ../src/color-profile.cpp:911 ../src/filter-enums.cpp:94 +#: ../src/color-profile.cpp:911 +#: ../src/filter-enums.cpp:119 #: ../src/live_effects/lpe-ruler.cpp:32 -#: ../src/ui/dialog/filter-effects-dialog.cpp:518 +#: ../src/ui/dialog/filter-effects-dialog.cpp:549 #: ../src/ui/dialog/inkscape-preferences.cpp:332 #: ../src/ui/dialog/inkscape-preferences.cpp:641 #: ../src/ui/dialog/inkscape-preferences.cpp:1259 -#: ../src/ui/dialog/inkscape-preferences.cpp:1423 -#: ../src/ui/dialog/inkscape-preferences.cpp:1821 -#: ../src/ui/dialog/input.cpp:742 ../src/ui/dialog/input.cpp:743 -#: ../src/ui/dialog/input.cpp:1571 ../src/ui/dialog/input.cpp:1625 -#: ../src/verbs.cpp:2352 ../src/widgets/gradient-toolbar.cpp:1129 +#: ../src/ui/dialog/inkscape-preferences.cpp:1830 +#: ../src/ui/dialog/input.cpp:742 +#: ../src/ui/dialog/input.cpp:743 +#: ../src/ui/dialog/input.cpp:1571 +#: ../src/ui/dialog/input.cpp:1625 +#: ../src/verbs.cpp:2352 +#: ../src/widgets/gradient-toolbar.cpp:1130 #: ../src/widgets/pencil-toolbar.cpp:184 #: ../src/widgets/stroke-marker-selector.cpp:388 #: ../share/extensions/gcodetools_area.inx.h:48 @@ -3410,65 +3640,27 @@ msgstr "(chaîne UTF-8 invalide)" #: ../share/extensions/gcodetools_graffiti.inx.h:37 #: ../share/extensions/gcodetools_lathe.inx.h:41 #: ../share/extensions/gcodetools_path_to_gcode.inx.h:30 -#: ../share/extensions/grid_polar.inx.h:4 ../share/extensions/scour.inx.h:18 +#: ../share/extensions/grid_polar.inx.h:4 +#: ../share/extensions/plotter.inx.h:15 +#: ../share/extensions/scour.inx.h:18 msgid "None" msgstr "Aucun" -#: ../src/connector-context.cpp:544 -msgid "Creating new connector" -msgstr "Création d'un nouveau connecteur" - -#: ../src/connector-context.cpp:799 -msgid "Connector endpoint drag cancelled." -msgstr "Déplacement de fin de connecteur annulé." - -#: ../src/connector-context.cpp:846 -msgid "Reroute connector" -msgstr "Rerouter un connecteur" - -#: ../src/connector-context.cpp:1013 -msgid "Create connector" -msgstr "Créer un connecteur" - -#: ../src/connector-context.cpp:1036 -msgid "Finishing connector" -msgstr "Tracé du connecteur terminé" - -#: ../src/connector-context.cpp:1272 -msgid "Connector endpoint: drag to reroute or connect to new shapes" -msgstr "" -"Fin de connecteur : déplacer pour rerouter ou connecter à de " -"nouvelles formes" - -#: ../src/connector-context.cpp:1412 -msgid "Select at least one non-connector object." -msgstr "Sélectionner au moins un objet non connecteur." - -#: ../src/connector-context.cpp:1417 ../src/widgets/connector-toolbar.cpp:326 -msgid "Make connectors avoid selected objects" -msgstr "Faire que les connecteurs évitent les objets sélectionnés" - -#: ../src/connector-context.cpp:1418 ../src/widgets/connector-toolbar.cpp:336 -msgid "Make connectors ignore selected objects" -msgstr "Faire que les connecteurs ignorent les objets sélectionnés" - -#: ../src/context-fns.cpp:36 ../src/context-fns.cpp:65 +#: ../src/context-fns.cpp:36 +#: ../src/context-fns.cpp:65 msgid "Current layer is hidden. Unhide it to be able to draw on it." -msgstr "" -"Le calque courant est caché. Le rendre visible pour pouvoir y " -"dessiner." +msgstr "Le calque courant est caché. Le rendre visible pour pouvoir y dessiner." -#: ../src/context-fns.cpp:42 ../src/context-fns.cpp:71 +#: ../src/context-fns.cpp:42 +#: ../src/context-fns.cpp:71 msgid "Current layer is locked. Unlock it to be able to draw on it." -msgstr "" -"Le calque courant est verrouillé. Le déverrouiller pour pouvoir y " -"dessiner." +msgstr "Le calque courant est verrouillé. Le déverrouiller pour pouvoir y dessiner." -#: ../src/desktop.cpp:925 +#: ../src/desktop.cpp:858 msgid "No previous zoom." msgstr "Plus de zoom précédent." -#: ../src/desktop.cpp:946 +#: ../src/desktop.cpp:879 msgid "No next zoom." msgstr "Plus de zoom suivant." @@ -3480,41 +3672,48 @@ msgstr "Créer un guide" msgid "Move guide" msgstr "Déplacer le guide" -#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:535 +#: ../src/desktop-events.cpp:477 +#: ../src/desktop-events.cpp:536 #: ../src/ui/dialog/guides.cpp:144 msgid "Delete guide" msgstr "Supprimer le guide" -#: ../src/desktop-events.cpp:515 +#: ../src/desktop-events.cpp:516 #, c-format msgid "Guideline: %s" msgstr "Ligne de guide : %s" -#: ../src/display/canvas-axonomgrid.cpp:317 ../src/display/canvas-grid.cpp:693 +#: ../src/display/canvas-axonomgrid.cpp:317 +#: ../src/display/canvas-grid.cpp:693 msgid "Grid _units:" msgstr "_Unités de la grille :" -#: ../src/display/canvas-axonomgrid.cpp:319 ../src/display/canvas-grid.cpp:695 +#: ../src/display/canvas-axonomgrid.cpp:319 +#: ../src/display/canvas-grid.cpp:695 msgid "_Origin X:" msgstr "_Origine X :" -#: ../src/display/canvas-axonomgrid.cpp:319 ../src/display/canvas-grid.cpp:695 +#: ../src/display/canvas-axonomgrid.cpp:319 +#: ../src/display/canvas-grid.cpp:695 #: ../src/ui/dialog/inkscape-preferences.cpp:735 #: ../src/ui/dialog/inkscape-preferences.cpp:760 msgid "X coordinate of grid origin" msgstr "Coordonnée X de l'origine de la grille" -#: ../src/display/canvas-axonomgrid.cpp:321 ../src/display/canvas-grid.cpp:697 +#: ../src/display/canvas-axonomgrid.cpp:321 +#: ../src/display/canvas-grid.cpp:697 msgid "O_rigin Y:" msgstr "O_rigine Y :" -#: ../src/display/canvas-axonomgrid.cpp:321 ../src/display/canvas-grid.cpp:697 +#: ../src/display/canvas-axonomgrid.cpp:321 +#: ../src/display/canvas-grid.cpp:697 #: ../src/ui/dialog/inkscape-preferences.cpp:736 #: ../src/ui/dialog/inkscape-preferences.cpp:761 msgid "Y coordinate of grid origin" msgstr "Coordonnée Y de l'origine de la grille" -#: ../src/display/canvas-axonomgrid.cpp:323 ../src/display/canvas-grid.cpp:701 +#: ../src/display/canvas-axonomgrid.cpp:323 +#: ../src/display/canvas-grid.cpp:701 msgid "Spacing _Y:" msgstr "Espacement _Y :" @@ -3545,37 +3744,45 @@ msgstr "Angle Z :" msgid "Angle of z-axis" msgstr "Angle de l'axe z" -#: ../src/display/canvas-axonomgrid.cpp:331 ../src/display/canvas-grid.cpp:705 +#: ../src/display/canvas-axonomgrid.cpp:331 +#: ../src/display/canvas-grid.cpp:705 msgid "Minor grid line _color:" msgstr "_Couleur de la grille principale :" -#: ../src/display/canvas-axonomgrid.cpp:331 ../src/display/canvas-grid.cpp:705 +#: ../src/display/canvas-axonomgrid.cpp:331 +#: ../src/display/canvas-grid.cpp:705 #: ../src/ui/dialog/inkscape-preferences.cpp:719 msgid "Minor grid line color" msgstr "Couleur de la grille secondaire" -#: ../src/display/canvas-axonomgrid.cpp:331 ../src/display/canvas-grid.cpp:705 +#: ../src/display/canvas-axonomgrid.cpp:331 +#: ../src/display/canvas-grid.cpp:705 msgid "Color of the minor grid lines" msgstr "Couleur des lignes de la grille secondaire" -#: ../src/display/canvas-axonomgrid.cpp:336 ../src/display/canvas-grid.cpp:710 +#: ../src/display/canvas-axonomgrid.cpp:336 +#: ../src/display/canvas-grid.cpp:710 msgid "Ma_jor grid line color:" msgstr "Couleur de la grille _principale :" -#: ../src/display/canvas-axonomgrid.cpp:336 ../src/display/canvas-grid.cpp:710 +#: ../src/display/canvas-axonomgrid.cpp:336 +#: ../src/display/canvas-grid.cpp:710 #: ../src/ui/dialog/inkscape-preferences.cpp:721 msgid "Major grid line color" msgstr "Couleur de la grille principale" -#: ../src/display/canvas-axonomgrid.cpp:337 ../src/display/canvas-grid.cpp:711 +#: ../src/display/canvas-axonomgrid.cpp:337 +#: ../src/display/canvas-grid.cpp:711 msgid "Color of the major (highlighted) grid lines" msgstr "Couleur des lignes de la grille principale (mise en valeur)" -#: ../src/display/canvas-axonomgrid.cpp:341 ../src/display/canvas-grid.cpp:715 +#: ../src/display/canvas-axonomgrid.cpp:341 +#: ../src/display/canvas-grid.cpp:715 msgid "_Major grid line every:" msgstr "_Grille principale toutes les :" -#: ../src/display/canvas-axonomgrid.cpp:341 ../src/display/canvas-grid.cpp:715 +#: ../src/display/canvas-axonomgrid.cpp:341 +#: ../src/display/canvas-grid.cpp:715 msgid "lines" msgstr "lignes" @@ -3596,36 +3803,24 @@ msgid "_Enabled" msgstr "_Activé" #: ../src/display/canvas-grid.cpp:342 -msgid "" -"Determines whether to snap to this grid or not. Can be 'on' for invisible " -"grids." -msgstr "" -"Cocher pour activer le magnétisme de la grille. Fonctionne aussi avec une " -"grille invisible." +msgid "Determines whether to snap to this grid or not. Can be 'on' for invisible grids." +msgstr "Cocher pour activer le magnétisme de la grille. Fonctionne aussi avec une grille invisible." #: ../src/display/canvas-grid.cpp:346 msgid "Snap to visible _grid lines only" msgstr "Aimanter seulement aux lignes visibles de la _grille" #: ../src/display/canvas-grid.cpp:347 -msgid "" -"When zoomed out, not all grid lines will be displayed. Only the visible ones " -"will be snapped to" -msgstr "" -"Lorsque le niveau de zoom est diminué, les lignes des grilles ne sont pas " -"toutes affichées. Seules celles qui sont visibles seront aimantées." +msgid "When zoomed out, not all grid lines will be displayed. Only the visible ones will be snapped to" +msgstr "Lorsque le niveau de zoom est diminué, les lignes des grilles ne sont pas toutes affichées. Seules celles qui sont visibles seront aimantées." #: ../src/display/canvas-grid.cpp:351 msgid "_Visible" msgstr "_Visible" #: ../src/display/canvas-grid.cpp:352 -msgid "" -"Determines whether the grid is displayed or not. Objects are still snapped " -"to invisible grids." -msgstr "" -"Détermine si la grille est affichée ou pas. Le magnétisme fonctionne même " -"avec une grille invisible." +msgid "Determines whether the grid is displayed or not. Objects are still snapped to invisible grids." +msgstr "Détermine si la grille est affichée ou pas. Le magnétisme fonctionne même avec une grille invisible." #: ../src/display/canvas-grid.cpp:699 msgid "Spacing _X:" @@ -3647,13 +3842,13 @@ msgstr "Afficher des point_s plutôt que des lignes" #: ../src/display/canvas-grid.cpp:733 msgid "If set, displays dots at gridpoints instead of gridlines" -msgstr "" -"Cocher pour afficher des points sur les points entiers de la grille au lieu " -"de lignes" +msgstr "Cocher pour afficher des points sur les points entiers de la grille au lieu de lignes" #. TRANSLATORS: undefined target for snapping -#: ../src/display/snap-indicator.cpp:72 ../src/display/snap-indicator.cpp:75 -#: ../src/display/snap-indicator.cpp:179 ../src/display/snap-indicator.cpp:182 +#: ../src/display/snap-indicator.cpp:72 +#: ../src/display/snap-indicator.cpp:75 +#: ../src/display/snap-indicator.cpp:179 +#: ../src/display/snap-indicator.cpp:182 msgid "UNDEFINED" msgstr "INDÉFINI" @@ -3797,11 +3992,13 @@ msgstr "Centre de boîte englobante" msgid "Bounding box side midpoint" msgstr "Milieu de bord de boîte englobante" -#: ../src/display/snap-indicator.cpp:194 ../src/ui/tool/node.cpp:1315 +#: ../src/display/snap-indicator.cpp:194 +#: ../src/ui/tool/node.cpp:1315 msgid "Smooth node" msgstr "Nœuds doux" -#: ../src/display/snap-indicator.cpp:197 ../src/ui/tool/node.cpp:1314 +#: ../src/display/snap-indicator.cpp:197 +#: ../src/ui/tool/node.cpp:1314 msgid "Cusp node" msgstr "Point de rebroussement" @@ -3876,116 +4073,20 @@ msgstr "Document d'information %1" msgid "Unnamed document %d" msgstr "Document sans nom %d" -#. We hit green anchor, closing Green-Blue-Red -#: ../src/draw-context.cpp:490 -msgid "Path is closed." -msgstr "Le chemin est fermé." - -#. We hit bot start and end of single curve, closing paths -#: ../src/draw-context.cpp:505 -msgid "Closing path." -msgstr "Fermeture de chemin." - -#: ../src/draw-context.cpp:607 -msgid "Draw path" -msgstr "Dessiner un chemin" - -#: ../src/draw-context.cpp:764 -msgid "Creating single dot" -msgstr "Création d'un point isolé" - -#: ../src/draw-context.cpp:765 -msgid "Create single dot" -msgstr "Créer un point isolé" - -#. 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/dropper-context.cpp:279 -#, c-format -msgid " alpha %.3g" -msgstr " alpha %.3g" - -#. where the color is picked, to show in the statusbar -#: ../src/dropper-context.cpp:281 -#, c-format -msgid ", averaged with radius %d" -msgstr ", valeur moyenne dans un rayon de %d" - -#: ../src/dropper-context.cpp:281 -msgid " under cursor" -msgstr " sous le curseur" - -#. message, to show in the statusbar -#: ../src/dropper-context.cpp:283 -msgid "Release mouse to set color." -msgstr "Relâcher la souris pour appliquer la couleur." - -#: ../src/dropper-context.cpp:283 ../src/tools-switch.cpp:108 -msgid "" -"Click to set fill, Shift+click to set stroke; drag to " -"average color in area; with Alt to pick inverse color; Ctrl+C " -"to copy the color under mouse to clipboard" -msgstr "" -"Cliquer pour appliquer au remplissage, Maj+clic pour appliquer " -"au contour; cliquer-déplacer pour capturer la couleur moyenne sur une " -"zone; à combiner avec Alt pour capturer la couleur inverse; Ctrl" -"+C pour copier la couleur sous le curseur de la souris vers le presse-" -"papiers " - -#: ../src/dropper-context.cpp:331 -msgid "Set picked color" -msgstr "Appliquer la couleur capturée" - -#: ../src/dyna-draw-context.cpp:539 -msgid "" -"Guide path selected; start drawing along the guide with Ctrl" -msgstr "" -"Guide sélectionné; commencer à dessiner le long du guide avec " -"Ctrl" - -#: ../src/dyna-draw-context.cpp:541 -msgid "Select a guide path to track with Ctrl" -msgstr "Choisir un chemin comme guide avec Ctrl" - -#: ../src/dyna-draw-context.cpp:676 -msgid "Tracking: connection to guide path lost!" -msgstr "Suivi : Connexion avec le guide perdue !" - -#: ../src/dyna-draw-context.cpp:676 -msgid "Tracking a guide path" -msgstr "Suivi d'un chemin guide" - -#: ../src/dyna-draw-context.cpp:679 -msgid "Drawing a calligraphic stroke" -msgstr "Tracé calligraphique en cours" - -#: ../src/dyna-draw-context.cpp:980 -msgid "Draw calligraphic stroke" -msgstr "Créer un tracé calligraphique" - -#: ../src/eraser-context.cpp:433 -msgid "Drawing an eraser stroke" -msgstr "Coup de gomme en cours" - -#: ../src/eraser-context.cpp:766 -msgid "Draw eraser stroke" -msgstr "Donner un coup de gomme" - -#: ../src/event-context.cpp:708 -#, fuzzy -msgid "Space+mouse move to pan canvas" -msgstr "Espace+déplacer avec la souris pour bouger la zone de travail" - #: ../src/event-log.cpp:37 msgid "[Unchanged]" msgstr "[Inchangé]" #. Edit -#: ../src/event-log.cpp:275 ../src/event-log.cpp:278 ../src/verbs.cpp:2390 +#: ../src/event-log.cpp:275 +#: ../src/event-log.cpp:278 +#: ../src/verbs.cpp:2390 msgid "_Undo" msgstr "Ann_uler" -#: ../src/event-log.cpp:285 ../src/event-log.cpp:289 ../src/verbs.cpp:2392 +#: ../src/event-log.cpp:285 +#: ../src/event-log.cpp:289 +#: ../src/verbs.cpp:2392 msgid "_Redo" msgstr "Réta_blir" @@ -4013,27 +4114,21 @@ msgstr " description : " msgid " (No preferences)" msgstr " (Pas de préférences)" -#: ../src/extension/effect.h:70 ../src/verbs.cpp:2163 +#: ../src/extension/effect.h:70 +#: ../src/verbs.cpp:2163 msgid "Extensions" msgstr "Extensions" #. This is some filler text, needs to change before relase #: ../src/extension/error-file.cpp:52 msgid "" -"One or more extensions failed to load\n" +"One or more extensions failed to load\n" "\n" -"The failed extensions have been skipped. Inkscape will continue to run " -"normally but those extensions will be unavailable. For details to " -"troubleshoot this problem, please refer to the error log located at: " +"The failed extensions have been skipped. Inkscape will continue to run normally but those extensions will be unavailable. For details to troubleshoot this problem, please refer to the error log located at: " msgstr "" -"Le chargement d'une ou plusieurs " -"extensions a échoué\n" +"Le chargement d'une ou plusieurs extensions a échoué\n" "\n" -"Les extensions défectueuses ont été ignorées. Inkscape va continuer à " -"fonctionner normalement, mais ces extensions seront indisponibles. Pour plus " -"de détails concernant ce problème, référez-vous à l'historique (log) des " -"messages d'erreur : " +"Les extensions défectueuses ont été ignorées. Inkscape va continuer à fonctionner normalement, mais ces extensions seront indisponibles. Pour plus de détails concernant ce problème, référez-vous à l'historique (log) des messages d'erreur : " #: ../src/extension/error-file.cpp:66 msgid "Show dialog on startup" @@ -4047,12 +4142,8 @@ msgstr "'%s' en cours..." #. static int i = 0; #. std::cout << "Checking module[" << i++ << "]: " << name << std::endl; #: ../src/extension/extension.cpp:263 -msgid "" -" This is caused by an improper .inx file for this extension. An improper ." -"inx file could have been caused by a faulty installation of Inkscape." -msgstr "" -" C'est le résultat d'un fichier .inx incorrect pour cette extension. Un " -"fichier .inx incorrect peut être du à un problème d'installation d'Inkscape." +msgid " This is caused by an improper .inx file for this extension. An improper .inx file could have been caused by a faulty installation of Inkscape." +msgstr " C'est le résultat d'un fichier .inx incorrect pour cette extension. Un fichier .inx incorrect peut être du à un problème d'installation d'Inkscape." #: ../src/extension/extension.cpp:266 msgid "an ID was not defined for it." @@ -4114,40 +4205,22 @@ msgid "Deactivated" msgstr "Désactivée" #: ../src/extension/extension.cpp:804 -msgid "" -"Currently there is no help available for this Extension. Please look on the " -"Inkscape website or ask on the mailing lists if you have questions regarding " -"this extension." -msgstr "" -"Aucune aide n'est actuellement disponible pour cette extension. Veuillez " -"vous référer au site internet d'Inkscape ou aux listes de diffusion pour " -"toute question relative à celle-ci." +msgid "Currently there is no help available for this Extension. Please look on the Inkscape website or ask on the mailing lists if you have questions regarding this extension." +msgstr "Aucune aide n'est actuellement disponible pour cette extension. Veuillez vous référer au site internet d'Inkscape ou aux listes de diffusion pour toute question relative à celle-ci." #: ../src/extension/implementation/script.cpp:1037 -msgid "" -"Inkscape has received additional data from the script executed. The script " -"did not return an error, but this may indicate the results will not be as " -"expected." -msgstr "" -"Inkscape a reçu des données additionnelles du script exécuté. Le script n'a " -"pas retourné d'erreur, mais ceci peut indiquer que les résultats ne sont pas " -"ceux attendus." +msgid "Inkscape has received additional data from the script executed. The script did not return an error, but this may indicate the results will not be as expected." +msgstr "Inkscape a reçu des données additionnelles du script exécuté. Le script n'a pas retourné d'erreur, mais ceci peut indiquer que les résultats ne sont pas ceux attendus." #: ../src/extension/init.cpp:296 msgid "Null external module directory name. Modules will not be loaded." -msgstr "" -"Le nom de dossier des modules externes est vide. Les modules ne seront pas " -"chargés." +msgstr "Le nom de dossier des modules externes est vide. Les modules ne seront pas chargés." #: ../src/extension/init.cpp:310 #: ../src/extension/internal/filter/filter-file.cpp:59 #, c-format -msgid "" -"Modules directory (%s) is unavailable. External modules in that directory " -"will not be loaded." -msgstr "" -"Le dossier des modules (%s) est indisponible. Les modules externes de ce " -"dossier ne seront pas chargés." +msgid "Modules directory (%s) is unavailable. External modules in that directory will not be loaded." +msgstr "Le dossier des modules (%s) est indisponible. Les modules externes de ce dossier ne seront pas chargés." #: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:39 msgid "Adaptive Threshold" @@ -4158,9 +4231,10 @@ msgstr "Seuil adaptatif" #: ../src/extension/internal/bitmap/sample.cpp:41 #: ../src/extension/internal/bluredge.cpp:138 #: ../src/ui/dialog/object-attributes.cpp:68 -#: ../src/ui/dialog/object-attributes.cpp:76 +#: ../src/ui/dialog/object-attributes.cpp:77 #: ../src/widgets/calligraphy-toolbar.cpp:447 -#: ../src/widgets/eraser-toolbar.cpp:145 ../src/widgets/spray-toolbar.cpp:128 +#: ../src/widgets/eraser-toolbar.cpp:145 +#: ../src/widgets/spray-toolbar.cpp:128 #: ../src/widgets/tweak-toolbar.cpp:142 #: ../share/extensions/foldablebox.inx.h:2 msgid "Width:" @@ -4170,14 +4244,14 @@ msgstr "Épaisseur :" #: ../src/extension/internal/bitmap/raise.cpp:43 #: ../src/extension/internal/bitmap/sample.cpp:42 #: ../src/ui/dialog/object-attributes.cpp:69 -#: ../src/ui/dialog/object-attributes.cpp:77 +#: ../src/ui/dialog/object-attributes.cpp:78 #: ../share/extensions/foldablebox.inx.h:3 msgid "Height:" msgstr "Hauteur :" #. Label #: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:43 -#: ../src/widgets/gradient-toolbar.cpp:1173 +#: ../src/widgets/gradient-toolbar.cpp:1174 #: ../src/widgets/gradient-vector.cpp:926 #: ../share/extensions/printing_marks.inx.h:12 msgid "Offset:" @@ -4235,9 +4309,10 @@ msgstr "Ajouter du bruit" #: ../src/extension/internal/filter/color.h:1497 #: ../src/extension/internal/filter/color.h:1585 #: ../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:2627 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/extension/internal/filter/morphology.h:60 +#: ../src/rdf.cpp:244 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 #: ../src/ui/dialog/object-attributes.cpp:49 #: ../share/extensions/jessyInk_effects.inx.h:5 #: ../share/extensions/jessyInk_export.inx.h:3 @@ -4289,7 +4364,7 @@ msgstr "Flou" #: ../src/extension/internal/bitmap/oilPaint.cpp:39 #: ../src/extension/internal/bitmap/sharpen.cpp:40 #: ../src/extension/internal/bitmap/unsharpmask.cpp:43 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2684 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2885 msgid "Radius:" msgstr "Rayon :" @@ -4378,8 +4453,7 @@ msgstr "Colorer" #: ../src/extension/internal/bitmap/colorize.cpp:58 msgid "Colorize selected bitmap(s) with specified color, using given opacity" -msgstr "" -"Colorer les bitmaps sélectionnés avec la couleur et l'opacité spécifiées" +msgstr "Colorer les bitmaps sélectionnés avec la couleur et l'opacité spécifiées" #: ../src/extension/internal/bitmap/contrast.cpp:40 #: ../src/extension/internal/filter/color.h:1114 @@ -4457,8 +4531,7 @@ msgstr "Embosser" #: ../src/extension/internal/bitmap/emboss.cpp:47 msgid "Emboss selected bitmap(s); highlight edges with 3D effect" -msgstr "" -"Gaufrer les bitmaps sélectionnés ; surligne les contours avec un effet 3D" +msgstr "Gaufrer les bitmaps sélectionnés ; surligne les contours avec un effet 3D" #: ../src/extension/internal/bitmap/enhance.cpp:35 msgid "Enhance" @@ -4524,13 +4597,8 @@ msgid "Gamma Correction:" msgstr "Correction gamma :" #: ../src/extension/internal/bitmap/levelChannel.cpp:73 -msgid "" -"Level the specified channel of selected bitmap(s) by scaling values falling " -"between the given ranges to the full color range" -msgstr "" -"Niveler la composante spécifiée des bitmaps sélectionnés en mettant à " -"l'échelle les valeurs se situant dans l'intervalle donné pour les élargir à " -"la gamme complète de couleur" +msgid "Level the specified channel of selected bitmap(s) by scaling values falling between the given ranges to the full color range" +msgstr "Niveler la composante spécifiée des bitmaps sélectionnés en mettant à l'échelle les valeurs se situant dans l'intervalle donné pour les élargir à la gamme complète de couleur" #: ../src/extension/internal/bitmap/level.cpp:41 #: ../src/extension/internal/filter/color.h:742 @@ -4541,24 +4609,16 @@ msgid "Level" msgstr "Niveau" #: ../src/extension/internal/bitmap/level.cpp:51 -msgid "" -"Level selected bitmap(s) by scaling values falling between the given ranges " -"to the full color range" -msgstr "" -"Niveler les bitmaps sélectionnés en mettant à l'échelle les valeurs se " -"situant dans l'intervalle donné pour les élargir à la gamme complète de " -"couleur" +msgid "Level selected bitmap(s) by scaling values falling between the given ranges to the full color range" +msgstr "Niveler les bitmaps sélectionnés en mettant à l'échelle les valeurs se situant dans l'intervalle donné pour les élargir à la gamme complète de couleur" #: ../src/extension/internal/bitmap/medianFilter.cpp:37 msgid "Median" msgstr "Médiane" #: ../src/extension/internal/bitmap/medianFilter.cpp:45 -msgid "" -"Replace each pixel component with the median color in a circular neighborhood" -msgstr "" -"Remplace chaque composante des pixels de l'image par la couleur médiane dans " -"un voisinage circulaire" +msgid "Replace each pixel component with the median color in a circular neighborhood" +msgstr "Remplace chaque composante des pixels de l'image par la couleur médiane dans un voisinage circulaire" #: ../src/extension/internal/bitmap/modulate.cpp:40 msgid "HSB Adjust" @@ -4577,10 +4637,8 @@ msgid "Brightness:" msgstr "Brillance :" #: ../src/extension/internal/bitmap/modulate.cpp:50 -msgid "" -"Adjust the amount of hue, saturation, and brightness in selected bitmap(s)" -msgstr "" -"Moduler la teinte, la saturation et la luminosité des bitmaps sélectionnés." +msgid "Adjust the amount of hue, saturation, and brightness in selected bitmap(s)" +msgstr "Moduler la teinte, la saturation et la luminosité des bitmaps sélectionnés." #: ../src/extension/internal/bitmap/negate.cpp:36 msgid "Negate" @@ -4595,12 +4653,8 @@ msgid "Normalize" msgstr "Normaliser" #: ../src/extension/internal/bitmap/normalize.cpp:43 -msgid "" -"Normalize selected bitmap(s), expanding color range to the full possible " -"range of color" -msgstr "" -"Normaliser les bitmaps sélectionnés, étend la gamme des couleurs présente à " -"la gamme complète de couleur" +msgid "Normalize selected bitmap(s), expanding color range to the full possible range of color" +msgstr "Normaliser les bitmaps sélectionnés, étend la gamme des couleurs présente à la gamme complète de couleur" #: ../src/extension/internal/bitmap/oilPaint.cpp:37 msgid "Oil Paint" @@ -4608,21 +4662,20 @@ msgstr "Peinture à l'huile" #: ../src/extension/internal/bitmap/oilPaint.cpp:45 msgid "Stylize selected bitmap(s) so that they appear to be painted with oils" -msgstr "" -"Styliser les bitmaps sélectionnés en leur donnant l'apparence d'une peinture " -"à l'huile" +msgstr "Styliser les bitmaps sélectionnés en leur donnant l'apparence d'une peinture à l'huile" #: ../src/extension/internal/bitmap/opacity.cpp:38 #: ../src/extension/internal/filter/blurs.h:333 #: ../src/extension/internal/filter/transparency.h:279 -#: ../src/ui/dialog/clonetiler.cpp:840 ../src/ui/dialog/clonetiler.cpp:993 +#: ../src/ui/dialog/clonetiler.cpp:840 +#: ../src/ui/dialog/clonetiler.cpp:993 #: ../src/widgets/tweak-toolbar.cpp:348 #: ../share/extensions/interp_att_g.inx.h:16 msgid "Opacity" msgstr "Opacité" #: ../src/extension/internal/bitmap/opacity.cpp:40 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2674 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2875 #: ../src/widgets/dropper-toolbar.cpp:107 msgid "Opacity:" msgstr "Opacité :" @@ -4640,11 +4693,8 @@ msgid "Raised" msgstr "En relief" #: ../src/extension/internal/bitmap/raise.cpp:50 -msgid "" -"Alter lightness the edges of selected bitmap(s) to create a raised appearance" -msgstr "" -"Changer la luminosité des bitmaps sélectionnés pour les faire apparaître " -"« en relief »" +msgid "Alter lightness the edges of selected bitmap(s) to create a raised appearance" +msgstr "Changer la luminosité des bitmaps sélectionnés pour les faire apparaître « en relief »" #: ../src/extension/internal/bitmap/reduceNoise.cpp:40 msgid "Reduce Noise" @@ -4658,21 +4708,16 @@ msgid "Order:" msgstr "Ordre :" #: ../src/extension/internal/bitmap/reduceNoise.cpp:48 -msgid "" -"Reduce noise in selected bitmap(s) using a noise peak elimination filter" -msgstr "" -"Réduire le bruit dans les bitmaps sélectionnés en éliminant les pics de bruit" +msgid "Reduce noise in selected bitmap(s) using a noise peak elimination filter" +msgstr "Réduire le bruit dans les bitmaps sélectionnés en éliminant les pics de bruit" #: ../src/extension/internal/bitmap/sample.cpp:39 msgid "Resample" msgstr "Ré-échantillonnage" #: ../src/extension/internal/bitmap/sample.cpp:48 -msgid "" -"Alter the resolution of selected image by resizing it to the given pixel size" -msgstr "" -"Changer la résolution de l'image en la redimensionnant avec la taille de " -"pixel donnée." +msgid "Alter the resolution of selected image by resizing it to the given pixel size" +msgstr "Changer la résolution de l'image en la redimensionnant avec la taille de pixel donnée." #: ../src/extension/internal/bitmap/shade.cpp:40 msgid "Shade" @@ -4706,20 +4751,15 @@ msgstr "Solariser" #: ../src/extension/internal/bitmap/solarize.cpp:47 msgid "Solarize selected bitmap(s), like overexposing photographic film" -msgstr "" -"Solariser les bitmaps sélectionnés, donne un effet de pellicule surexposée" +msgstr "Solariser les bitmaps sélectionnés, donne un effet de pellicule surexposée" #: ../src/extension/internal/bitmap/spread.cpp:37 msgid "Dither" msgstr "Dispersion" #: ../src/extension/internal/bitmap/spread.cpp:45 -msgid "" -"Randomly scatter pixels in selected bitmap(s), within the given radius of " -"the original position" -msgstr "" -"Disperser au hasard les pixels des bitmaps sélectionnés, dans le rayon donné " -"de la position originale" +msgid "Randomly scatter pixels in selected bitmap(s), within the given radius of the original position" +msgstr "Disperser au hasard les pixels des bitmaps sélectionnés, dans le rayon donné de la position originale" #: ../src/extension/internal/bitmap/swirl.cpp:39 msgid "Degrees:" @@ -4750,9 +4790,7 @@ msgstr "Masque de netteté" #: ../src/extension/internal/bitmap/unsharpmask.cpp:52 msgid "Sharpen selected bitmap(s) using unsharp mask algorithms" -msgstr "" -"Rendre plus nets les bitmaps sélectionnés en utilisant des algorithmes de " -"netteté de type « unsharp mask »" +msgstr "Rendre plus nets les bitmaps sélectionnés en utilisant des algorithmes de netteté de type « unsharp mask »" #: ../src/extension/internal/bitmap/wave.cpp:38 msgid "Wave" @@ -4789,7 +4827,8 @@ msgstr "Nombre de copies contractées/dilatées de l'objet à créer" #: ../src/extension/internal/bluredge.cpp:143 #: ../share/extensions/extrude.inx.h:5 #: ../share/extensions/generate_voronoi.inx.h:9 -#: ../share/extensions/interp.inx.h:7 ../share/extensions/motion.inx.h:4 +#: ../share/extensions/interp.inx.h:7 +#: ../share/extensions/motion.inx.h:4 #: ../share/extensions/pathalongpath.inx.h:18 #: ../share/extensions/pathscatter.inx.h:20 #: ../share/extensions/voronoi2svg.inx.h:13 @@ -4802,100 +4841,100 @@ msgid "PostScript" msgstr "PostScript" #: ../src/extension/internal/cairo-ps-out.cpp:329 -#: ../src/extension/internal/cairo-ps-out.cpp:370 +#: ../src/extension/internal/cairo-ps-out.cpp:368 msgid "Restrict to PS level:" msgstr "Restreindre à la version de PostScript :" #: ../src/extension/internal/cairo-ps-out.cpp:330 -#: ../src/extension/internal/cairo-ps-out.cpp:371 +#: ../src/extension/internal/cairo-ps-out.cpp:369 msgid "PostScript level 3" msgstr "PostScript niveau 3" -#: ../src/extension/internal/cairo-ps-out.cpp:332 -#: ../src/extension/internal/cairo-ps-out.cpp:373 +#: ../src/extension/internal/cairo-ps-out.cpp:331 +#: ../src/extension/internal/cairo-ps-out.cpp:370 msgid "PostScript level 2" msgstr "PostScript niveau 2" -#: ../src/extension/internal/cairo-ps-out.cpp:335 -#: ../src/extension/internal/cairo-ps-out.cpp:376 +#: ../src/extension/internal/cairo-ps-out.cpp:333 +#: ../src/extension/internal/cairo-ps-out.cpp:372 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250 #: ../src/extension/internal/emf-inout.cpp:3551 #: ../src/extension/internal/wmf-inout.cpp:3236 msgid "Convert texts to paths" msgstr "Convertir les textes en chemins" -#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:334 msgid "PS+LaTeX: Omit text in PS, and create LaTeX file" msgstr "PS+LaTeX : exclure le texte du fichier PS, et créer un fichier LaTeX" -#: ../src/extension/internal/cairo-ps-out.cpp:337 -#: ../src/extension/internal/cairo-ps-out.cpp:378 +#: ../src/extension/internal/cairo-ps-out.cpp:335 +#: ../src/extension/internal/cairo-ps-out.cpp:374 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:252 msgid "Rasterize filter effects" msgstr "Rastériser les effets de filtre" -#: ../src/extension/internal/cairo-ps-out.cpp:338 -#: ../src/extension/internal/cairo-ps-out.cpp:379 +#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:375 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:253 msgid "Resolution for rasterization (dpi):" msgstr "Résolution pour la rastérisation (ppp) :" -#: ../src/extension/internal/cairo-ps-out.cpp:339 -#: ../src/extension/internal/cairo-ps-out.cpp:380 +#: ../src/extension/internal/cairo-ps-out.cpp:337 +#: ../src/extension/internal/cairo-ps-out.cpp:376 msgid "Output page size" msgstr "Dimensions de la page" -#: ../src/extension/internal/cairo-ps-out.cpp:340 -#: ../src/extension/internal/cairo-ps-out.cpp:381 +#: ../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 msgid "Use document's page size" msgstr "Utiliser les dimensions de la page du document" -#: ../src/extension/internal/cairo-ps-out.cpp:341 -#: ../src/extension/internal/cairo-ps-out.cpp:382 +#: ../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 msgid "Use exported object's size" msgstr "Utiliser la taille de l'objet exporté" -#: ../src/extension/internal/cairo-ps-out.cpp:343 +#: ../src/extension/internal/cairo-ps-out.cpp:341 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258 msgid "Bleed/margin (mm):" msgstr "Fond perdu/marge (mm) :" -#: ../src/extension/internal/cairo-ps-out.cpp:344 -#: ../src/extension/internal/cairo-ps-out.cpp:385 +#: ../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 msgid "Limit export to the object with ID:" msgstr "Limiter l'exportation à l'objet ayant l'Id :" -#: ../src/extension/internal/cairo-ps-out.cpp:348 +#: ../src/extension/internal/cairo-ps-out.cpp:346 #: ../share/extensions/ps_input.inx.h:2 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" -#: ../src/extension/internal/cairo-ps-out.cpp:349 +#: ../src/extension/internal/cairo-ps-out.cpp:347 msgid "PostScript File" msgstr "Fichier PostScript" -#: ../src/extension/internal/cairo-ps-out.cpp:368 +#: ../src/extension/internal/cairo-ps-out.cpp:366 #: ../share/extensions/eps_input.inx.h:3 msgid "Encapsulated PostScript" msgstr "PostScript encapsulé" -#: ../src/extension/internal/cairo-ps-out.cpp:377 +#: ../src/extension/internal/cairo-ps-out.cpp:373 msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file" msgstr "EPS+LaTeX : exclure le texte du fichier EPS, et créer un fichier LaTeX" -#: ../src/extension/internal/cairo-ps-out.cpp:384 +#: ../src/extension/internal/cairo-ps-out.cpp:380 msgid "Bleed/margin (mm)" msgstr "Fond perdu/marge (mm)" -#: ../src/extension/internal/cairo-ps-out.cpp:389 +#: ../src/extension/internal/cairo-ps-out.cpp:385 #: ../share/extensions/eps_input.inx.h:2 msgid "Encapsulated PostScript (*.eps)" msgstr "PostScript encapsulé (*.eps)" -#: ../src/extension/internal/cairo-ps-out.cpp:390 +#: ../src/extension/internal/cairo-ps-out.cpp:386 msgid "Encapsulated PostScript File" msgstr "Fichier PostScript Encapsulé" @@ -5201,12 +5240,8 @@ msgid "Strength" msgstr "Force" #: ../src/extension/internal/filter/blurs.h:135 -msgid "" -"Removes or decreases glows and jaggeries around objects edges after applying " -"some filters" -msgstr "" -"Supprime ou diminue l'éclat et l'agitation qui apparaissent autour des bords " -"lors de l'application de certains effets" +msgid "Removes or decreases glows and jaggeries around objects edges after applying some filters" +msgstr "Supprime ou diminue l'éclat et l'agitation qui apparaissent autour des bords lors de l'application de certains effets" #: ../src/extension/internal/filter/blurs.h:185 msgid "Cross Blur" @@ -5250,7 +5285,8 @@ msgstr "Obscurcir" #: ../src/extension/internal/filter/color.h:1594 #: ../src/extension/internal/filter/paint.h:703 #: ../src/extension/internal/filter/transparency.h:62 -#: ../src/filter-enums.cpp:53 ../src/ui/dialog/input.cpp:382 +#: ../src/filter-enums.cpp:53 +#: ../src/ui/dialog/input.cpp:382 msgid "Screen" msgstr "Superposition" @@ -5327,7 +5363,7 @@ msgstr "Érosion" #: ../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:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "Background color" msgstr "Couleur de fond" @@ -5351,7 +5387,8 @@ msgstr "Type de fondu :" #: ../src/extension/internal/filter/paint.h:702 #: ../src/extension/internal/filter/textures.h:77 #: ../src/extension/internal/filter/transparency.h:61 -#: ../src/filter-enums.cpp:51 ../src/ui/dialog/inkscape-preferences.cpp:642 +#: ../src/filter-enums.cpp:51 +#: ../src/ui/dialog/inkscape-preferences.cpp:642 msgid "Normal" msgstr "Normal" @@ -5388,7 +5425,8 @@ msgstr "Source du bosselage" #: ../src/extension/internal/filter/color.h:637 #: ../src/extension/internal/filter/color.h:821 #: ../src/extension/internal/filter/transparency.h:132 -#: ../src/filter-enums.cpp:100 ../src/flood-context.cpp:194 +#: ../src/filter-enums.cpp:125 +#: ../src/ui/tools/flood-tool.cpp:198 #: ../src/widgets/sp-color-icc-selector.cpp:355 #: ../src/widgets/sp-color-scales.cpp:429 #: ../src/widgets/sp-color-scales.cpp:430 @@ -5401,7 +5439,8 @@ msgstr "Rouge" #: ../src/extension/internal/filter/color.h:638 #: ../src/extension/internal/filter/color.h:822 #: ../src/extension/internal/filter/transparency.h:133 -#: ../src/filter-enums.cpp:101 ../src/flood-context.cpp:195 +#: ../src/filter-enums.cpp:126 +#: ../src/ui/tools/flood-tool.cpp:199 #: ../src/widgets/sp-color-icc-selector.cpp:356 #: ../src/widgets/sp-color-scales.cpp:432 #: ../src/widgets/sp-color-scales.cpp:433 @@ -5414,7 +5453,8 @@ msgstr "Vert" #: ../src/extension/internal/filter/color.h:639 #: ../src/extension/internal/filter/color.h:823 #: ../src/extension/internal/filter/transparency.h:134 -#: ../src/filter-enums.cpp:102 ../src/flood-context.cpp:196 +#: ../src/filter-enums.cpp:127 +#: ../src/ui/tools/flood-tool.cpp:200 #: ../src/widgets/sp-color-icc-selector.cpp:357 #: ../src/widgets/sp-color-scales.cpp:435 #: ../src/widgets/sp-color-scales.cpp:436 @@ -5438,7 +5478,8 @@ msgid "Diffuse" msgstr "Diffus" #: ../src/extension/internal/filter/bumps.h:98 -#: ../src/extension/internal/filter/bumps.h:329 ../src/libgdl/gdl-dock.c:199 +#: ../src/extension/internal/filter/bumps.h:329 +#: ../src/libgdl/gdl-dock.c:199 #: ../src/libgdl/gdl-dock-placeholder.c:175 #: ../src/widgets/rect-toolbar.cpp:338 #: ../share/extensions/interp_att_g.inx.h:11 @@ -5452,10 +5493,12 @@ msgstr "Hauteur" #: ../src/extension/internal/filter/color.h:1113 #: ../src/extension/internal/filter/paint.h:86 #: ../src/extension/internal/filter/paint.h:592 -#: ../src/extension/internal/filter/paint.h:707 ../src/flood-context.cpp:199 +#: ../src/extension/internal/filter/paint.h:707 +#: ../src/ui/tools/flood-tool.cpp:203 #: ../src/widgets/sp-color-icc-selector.cpp:366 #: ../src/widgets/sp-color-scales.cpp:461 -#: ../src/widgets/sp-color-scales.cpp:462 ../src/widgets/tweak-toolbar.cpp:332 +#: ../src/widgets/sp-color-scales.cpp:462 +#: ../src/widgets/tweak-toolbar.cpp:332 #: ../share/extensions/color_randomize.inx.h:5 msgid "Lightness" msgstr "Luminosité" @@ -5492,13 +5535,13 @@ msgstr "Options de lumière distante" #: ../src/extension/internal/filter/bumps.h:110 #: ../src/extension/internal/filter/bumps.h:332 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Azimuth" msgstr "Azimut" #: ../src/extension/internal/filter/bumps.h:111 #: ../src/extension/internal/filter/bumps.h:333 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Elevation" msgstr "Élévation" @@ -5567,7 +5610,8 @@ msgstr "Fond :" #: ../src/extension/internal/filter/bumps.h:322 #: ../src/extension/internal/filter/transparency.h:57 -#: ../src/filter-enums.cpp:29 ../src/sp-image.cpp:616 +#: ../src/filter-enums.cpp:29 +#: ../src/sp-image.cpp:616 msgid "Image" msgstr "Image" @@ -5606,14 +5650,14 @@ msgstr "Type de transparence :" #: ../src/extension/internal/filter/bumps.h:353 #: ../src/extension/internal/filter/morphology.h:176 -#: ../src/filter-enums.cpp:74 +#: ../src/filter-enums.cpp:88 msgid "Atop" msgstr "Atop" #: ../src/extension/internal/filter/bumps.h:354 #: ../src/extension/internal/filter/distort.h:70 #: ../src/extension/internal/filter/morphology.h:174 -#: ../src/filter-enums.cpp:72 +#: ../src/filter-enums.cpp:86 msgid "In" msgstr "In" @@ -5650,19 +5694,23 @@ msgstr "Peinture par canal" #: ../src/extension/internal/filter/color.h:156 #: ../src/extension/internal/filter/color.h:257 -#: ../src/extension/internal/filter/paint.h:87 ../src/flood-context.cpp:198 +#: ../src/extension/internal/filter/paint.h:87 +#: ../src/filter-enums.cpp:66 #: ../src/ui/dialog/inkscape-preferences.cpp:941 +#: ../src/ui/tools/flood-tool.cpp:202 #: ../src/widgets/sp-color-icc-selector.cpp:362 #: ../src/widgets/sp-color-icc-selector.cpp:367 #: ../src/widgets/sp-color-scales.cpp:458 -#: ../src/widgets/sp-color-scales.cpp:459 ../src/widgets/tweak-toolbar.cpp:316 +#: ../src/widgets/sp-color-scales.cpp:459 +#: ../src/widgets/tweak-toolbar.cpp:316 #: ../share/extensions/color_randomize.inx.h:4 msgid "Saturation" msgstr "Saturation" #: ../src/extension/internal/filter/color.h:160 #: ../src/extension/internal/filter/transparency.h:135 -#: ../src/filter-enums.cpp:103 ../src/flood-context.cpp:200 +#: ../src/filter-enums.cpp:128 +#: ../src/ui/tools/flood-tool.cpp:204 msgid "Alpha" msgstr "Opacité" @@ -5708,30 +5756,38 @@ msgstr "Fondu 2 :" msgid "Blend image or object with a flood color" msgstr "Mélange un image ou un objet avec une couleur de remplissage" -#: ../src/extension/internal/filter/color.h:424 ../src/filter-enums.cpp:22 +#: ../src/extension/internal/filter/color.h:424 +#: ../src/filter-enums.cpp:22 msgid "Component Transfer" msgstr "Transfert de composantes" -#: ../src/extension/internal/filter/color.h:427 ../src/filter-enums.cpp:82 +#: ../src/extension/internal/filter/color.h:427 +#: ../src/filter-enums.cpp:107 msgid "Identity" msgstr "Identité" #: ../src/extension/internal/filter/color.h:428 -#: ../src/extension/internal/filter/paint.h:498 ../src/filter-enums.cpp:83 +#: ../src/extension/internal/filter/paint.h:498 +#: ../src/filter-enums.cpp:108 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1050 msgid "Table" msgstr "Table" #: ../src/extension/internal/filter/color.h:429 -#: ../src/extension/internal/filter/paint.h:499 ../src/filter-enums.cpp:84 +#: ../src/extension/internal/filter/paint.h:499 +#: ../src/filter-enums.cpp:109 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1053 msgid "Discrete" msgstr "Discret" -#: ../src/extension/internal/filter/color.h:430 ../src/filter-enums.cpp:85 +#: ../src/extension/internal/filter/color.h:430 +#: ../src/filter-enums.cpp:110 #: ../src/live_effects/lpe-powerstroke.cpp:188 msgid "Linear" msgstr "Linéaire" -#: ../src/extension/internal/filter/color.h:431 ../src/filter-enums.cpp:86 +#: ../src/extension/internal/filter/color.h:431 +#: ../src/filter-enums.cpp:111 msgid "Gamma" msgstr "Gamma" @@ -5913,10 +5969,13 @@ msgstr "Ombres" #. initialise your parameters here: #: ../src/extension/internal/filter/color.h:1044 -#: ../src/extension/internal/filter/paint.h:356 ../src/filter-enums.cpp:32 -#: ../src/live_effects/effect.cpp:97 ../src/live_effects/lpe-offset.cpp:31 +#: ../src/extension/internal/filter/paint.h:356 +#: ../src/filter-enums.cpp:32 +#: ../src/live_effects/effect.cpp:97 +#: ../src/live_effects/lpe-offset.cpp:31 #: ../src/live_effects/lpe-parallel.cpp:50 -#: ../src/widgets/gradient-toolbar.cpp:1173 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1047 +#: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset" msgstr "Offset" @@ -5946,7 +6005,8 @@ msgstr "Décalage rouge" #: ../src/extension/internal/filter/color.h:1307 #: ../src/extension/internal/filter/color.h:1310 #: ../src/extension/internal/filter/color.h:1313 -#: ../src/ui/dialog/input.cpp:1616 ../src/ui/dialog/layers.cpp:917 +#: ../src/ui/dialog/input.cpp:1616 +#: ../src/ui/dialog/layers.cpp:917 msgid "X" msgstr "X" @@ -5969,12 +6029,8 @@ msgid "Blue offset" msgstr "Décalage bleu" #: ../src/extension/internal/filter/color.h:1215 -msgid "" -"Nudge RGB channels separately and blend them to different types of " -"backgrounds" -msgstr "" -"Décale les canaux RVB séparément en les fondant dans différents types " -"d'arrière-plans" +msgid "Nudge RGB channels separately and blend them to different types of backgrounds" +msgstr "Décale les canaux RVB séparément en les fondant dans différents types d'arrière-plans" #: ../src/extension/internal/filter/color.h:1302 msgid "Nudge CMY" @@ -5993,12 +6049,8 @@ msgid "Yellow offset" msgstr "Décalage jaune" #: ../src/extension/internal/filter/color.h:1327 -msgid "" -"Nudge CMY channels separately and blend them to different types of " -"backgrounds" -msgstr "" -"Décale les canaux CMY séparément en les fondant dans différents types " -"d'arrière-plans" +msgid "Nudge CMY channels separately and blend them to different types of backgrounds" +msgstr "Décale les canaux CMY séparément en les fondant dans différents types d'arrière-plans" #: ../src/extension/internal/filter/color.h:1408 msgid "Quadritone fantasy" @@ -6074,12 +6126,8 @@ msgid "Hue distribution (°):" msgstr "Distribution de la teinte (°) :" #: ../src/extension/internal/filter/color.h:1619 -msgid "" -"Create a custom tritone palette with additional glow, blend modes and hue " -"moving" -msgstr "" -"Crée une palette à trois tons paramétrable avec lueur, modes de fondu et " -"déplacement de teinte" +msgid "Create a custom tritone palette with additional glow, blend modes and hue moving" +msgstr "Crée une palette à trois tons paramétrable avec lueur, modes de fondu et déplacement de teinte" #: ../src/extension/internal/filter/distort.h:67 msgid "Felt Feather" @@ -6087,7 +6135,7 @@ msgstr "Estompage du pourtour" #: ../src/extension/internal/filter/distort.h:71 #: ../src/extension/internal/filter/morphology.h:175 -#: ../src/filter-enums.cpp:73 +#: ../src/filter-enums.cpp:87 msgid "Out" msgstr "Out" @@ -6126,8 +6174,9 @@ msgstr "Bruit fractal" #: ../src/extension/internal/filter/distort.h:85 #: ../src/extension/internal/filter/distort.h:194 #: ../src/extension/internal/filter/overlays.h:62 -#: ../src/extension/internal/filter/paint.h:693 ../src/filter-enums.cpp:35 -#: ../src/filter-enums.cpp:117 +#: ../src/extension/internal/filter/paint.h:693 +#: ../src/filter-enums.cpp:35 +#: ../src/filter-enums.cpp:142 msgid "Turbulence" msgstr "Turbulence" @@ -6193,9 +6242,7 @@ msgstr "Personnel" #: ../src/extension/internal/filter/filter-file.cpp:47 msgid "Null external module directory name. Filters will not be loaded." -msgstr "" -"Le nom de dossier des modules externes est vide. Les filtres ne seront pas " -"chargés." +msgstr "Le nom de dossier des modules externes est vide. Les filtres ne seront pas chargés." #: ../src/extension/internal/filter/image.h:49 msgid "Edge Detect" @@ -6206,8 +6253,8 @@ msgid "Detect:" msgstr "Détecter :" #: ../src/extension/internal/filter/image.h:52 -#: ../src/ui/dialog/template-load-tab.cpp:100 -#: ../src/ui/dialog/template-load-tab.cpp:135 +#: ../src/ui/dialog/template-load-tab.cpp:105 +#: ../src/ui/dialog/template-load-tab.cpp:142 msgid "All" msgstr "Tout" @@ -6246,8 +6293,10 @@ msgid "Open" msgstr "Overt" #: ../src/extension/internal/filter/morphology.h:65 -#: ../src/libgdl/gdl-dock.c:191 ../src/libgdl/gdl-dock-placeholder.c:167 -#: ../src/widgets/rect-toolbar.cpp:321 ../src/widgets/spray-toolbar.cpp:128 +#: ../src/libgdl/gdl-dock.c:191 +#: ../src/libgdl/gdl-dock-placeholder.c:167 +#: ../src/widgets/rect-toolbar.cpp:321 +#: ../src/widgets/spray-toolbar.cpp:128 #: ../src/widgets/tweak-toolbar.cpp:142 #: ../share/extensions/interp_att_g.inx.h:10 msgid "Width" @@ -6283,12 +6332,12 @@ msgid "Composite type:" msgstr "Type de composite :" #: ../src/extension/internal/filter/morphology.h:173 -#: ../src/filter-enums.cpp:71 +#: ../src/filter-enums.cpp:85 msgid "Over" msgstr "Over" #: ../src/extension/internal/filter/morphology.h:177 -#: ../src/filter-enums.cpp:75 +#: ../src/filter-enums.cpp:89 msgid "XOR" msgstr "XOR" @@ -6355,12 +6404,14 @@ msgstr "Remplissage turbulent" #: ../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:87 #: ../src/ui/dialog/tracedialog.cpp:747 #: ../share/extensions/color_custom.inx.h:2 #: ../share/extensions/color_HSL_adjust.inx.h:2 #: ../share/extensions/color_randomize.inx.h:2 -#: ../share/extensions/dots.inx.h:2 ../share/extensions/dxf_input.inx.h:2 +#: ../share/extensions/dots.inx.h:2 +#: ../share/extensions/dxf_input.inx.h:2 #: ../share/extensions/dxf_outlines.inx.h:2 #: ../share/extensions/gcodetools_area.inx.h:29 #: ../share/extensions/gcodetools_engraving.inx.h:7 @@ -6374,8 +6425,10 @@ msgstr "Remplissage turbulent" #: ../share/extensions/lorem_ipsum.inx.h:2 #: ../share/extensions/pathalongpath.inx.h:2 #: ../share/extensions/pathscatter.inx.h:2 -#: ../share/extensions/radiusrand.inx.h:2 ../share/extensions/scour.inx.h:2 -#: ../share/extensions/split.inx.h:2 ../share/extensions/voronoi2svg.inx.h:2 +#: ../share/extensions/radiusrand.inx.h:2 +#: ../share/extensions/scour.inx.h:2 +#: ../share/extensions/split.inx.h:2 +#: ../share/extensions/voronoi2svg.inx.h:2 #: ../share/extensions/web-set-att.inx.h:2 #: ../share/extensions/webslicer_create_group.inx.h:2 #: ../share/extensions/webslicer_export.inx.h:2 @@ -6477,20 +6530,19 @@ msgstr "Longueur" #: ../src/extension/internal/filter/paint.h:247 msgid "Convert image to an engraving made of vertical and horizontal lines" -msgstr "" -"Convertit l'image en une gravure composée de lignes verticales et " -"horizontales" +msgstr "Convertit l'image en une gravure composée de lignes verticales et horizontales" #: ../src/extension/internal/filter/paint.h:331 #: ../src/ui/dialog/align-and-distribute.cpp:1004 -#: ../src/widgets/desktop-widget.cpp:2007 +#: ../src/widgets/desktop-widget.cpp:1998 msgid "Drawing" msgstr "Dessin" #: ../src/extension/internal/filter/paint.h:335 #: ../src/extension/internal/filter/paint.h:496 #: ../src/extension/internal/filter/paint.h:590 -#: ../src/extension/internal/filter/paint.h:976 ../src/splivarot.cpp:2224 +#: ../src/extension/internal/filter/paint.h:976 +#: ../src/splivarot.cpp:2207 msgid "Simplify" msgstr "Simplifier" @@ -6761,7 +6813,8 @@ msgstr "Tache d'encre sur du tissu ou du papier à grain" msgid "Blend" msgstr "Fondre" -#: ../src/extension/internal/filter/transparency.h:55 ../src/rdf.cpp:261 +#: ../src/extension/internal/filter/transparency.h:55 +#: ../src/rdf.cpp:261 msgid "Source:" msgstr "Source :" @@ -6771,10 +6824,13 @@ msgid "Background" msgstr "Fond" #: ../src/extension/internal/filter/transparency.h:59 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2624 -#: ../src/ui/dialog/input.cpp:1088 ../src/widgets/eraser-toolbar.cpp:123 -#: ../src/widgets/pencil-toolbar.cpp:156 ../src/widgets/spray-toolbar.cpp:198 -#: ../src/widgets/tweak-toolbar.cpp:268 ../share/extensions/extrude.inx.h:2 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2830 +#: ../src/ui/dialog/input.cpp:1088 +#: ../src/widgets/eraser-toolbar.cpp:123 +#: ../src/widgets/pencil-toolbar.cpp:156 +#: ../src/widgets/spray-toolbar.cpp:198 +#: ../src/widgets/tweak-toolbar.cpp:268 +#: ../share/extensions/extrude.inx.h:2 #: ../share/extensions/triangle.inx.h:8 msgid "Mode:" msgstr "Mode :" @@ -6802,8 +6858,7 @@ msgstr "Opacité globale" #: ../src/extension/internal/filter/transparency.h:218 msgid "Make the lightest parts of the object progressively transparent" -msgstr "" -"Rend les parties les plus claires de l'objet progressivement transparentes" +msgstr "Rend les parties les plus claires de l'objet progressivement transparentes" #: ../src/extension/internal/filter/transparency.h:291 msgid "Set opacity and strength of opacity boundaries" @@ -6821,39 +6876,60 @@ msgstr "Découpe" msgid "Repaint anything visible monochrome" msgstr "Recouvre l'objet d'une couleur monochrome" -#: ../src/extension/internal/gdkpixbuf-input.cpp:152 +#: ../src/extension/internal/gdkpixbuf-input.cpp:169 #, c-format msgid "%s bitmap image import" msgstr "Import d'une image matricielle %s" -#: ../src/extension/internal/gdkpixbuf-input.cpp:158 +#: ../src/extension/internal/gdkpixbuf-input.cpp:176 msgid "Link or embed image:" msgstr "Lier ou incorporer l'image :" -#: ../src/extension/internal/gdkpixbuf-input.cpp:159 +#: ../src/extension/internal/gdkpixbuf-input.cpp:177 +#: ../src/ui/dialog/inkscape-preferences.cpp:1445 msgid "Embed" msgstr "Incorporer" -#: ../src/extension/internal/gdkpixbuf-input.cpp:160 ../src/sp-anchor.cpp:119 +#: ../src/extension/internal/gdkpixbuf-input.cpp:178 +#: ../src/sp-anchor.cpp:119 +#: ../src/ui/dialog/inkscape-preferences.cpp:1445 msgid "Link" msgstr "Lier" -#: ../src/extension/internal/gdkpixbuf-input.cpp:162 -msgid "" -"Embed results in stand-alone, larger SVG files. Link references a file " -"outside this SVG document and all files must be moved together." +#: ../src/extension/internal/gdkpixbuf-input.cpp:180 +msgid "Embed results in stand-alone, larger SVG files. Link references a file outside this SVG document and all files must be moved together." +msgstr "Incorporer génère un fichier SVG unique, mais plus volumineux. Lier crée une référence vers un fichier externe au document SVG qui doit être déplacé avec le fichier SVG." + +#: ../src/extension/internal/gdkpixbuf-input.cpp:182 +msgid "Scale image preference (image-rendering):" msgstr "" -"Incorporer génère un fichier SVG unique, mais plus volumineux. Lier crée une " -"référence vers un fichier externe au document SVG qui doit être déplacé avec " -"le fichier SVG." -#: ../src/extension/internal/gdkpixbuf-input.cpp:163 -msgid "Hide the dialog next time and always apply the same action." +#: ../src/extension/internal/gdkpixbuf-input.cpp:183 +#: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, fuzzy +msgid "None (auto)" +msgstr "Aucun (défaut)" + +#: ../src/extension/internal/gdkpixbuf-input.cpp:184 +#: ../src/ui/dialog/inkscape-preferences.cpp:1452 +msgid "Smooth (optimizeQuality)" msgstr "" -"Masquer cette boîte de dialogue la prochaine fois et toujours appliquer la " -"même action." -#: ../src/extension/internal/gdkpixbuf-input.cpp:163 +#: ../src/extension/internal/gdkpixbuf-input.cpp:185 +#: ../src/ui/dialog/inkscape-preferences.cpp:1452 +msgid "Blocky (optimizeSpeed)" +msgstr "" + +#: ../src/extension/internal/gdkpixbuf-input.cpp:187 +msgid "When an image is upscaled, apply smoothing or keep blocky (pixelated). (Will not work in all browsers.)" +msgstr "" + +#: ../src/extension/internal/gdkpixbuf-input.cpp:189 +#, fuzzy +msgid "Hide the dialog next time and always apply the same actions." +msgstr "Masquer cette boîte de dialogue la prochaine fois et toujours appliquer la même action." + +#: ../src/extension/internal/gdkpixbuf-input.cpp:189 msgid "Don't ask again" msgstr "Ne plus demander" @@ -6869,7 +6945,8 @@ msgstr "Dégradé GIMP (*.ggr)" msgid "Gradients used in GIMP" msgstr "Dégradés utilisés dans GIMP" -#: ../src/extension/internal/grid.cpp:210 ../src/ui/widget/panel.cpp:117 +#: ../src/extension/internal/grid.cpp:210 +#: ../src/ui/widget/panel.cpp:117 msgid "Grid" msgstr "Grille" @@ -6914,7 +6991,8 @@ msgstr "Décalage vertical :" #: ../share/extensions/render_barcode.inx.h:5 #: ../share/extensions/render_barcode_qrcode.inx.h:18 #: ../share/extensions/render_gear_rack.inx.h:5 -#: ../share/extensions/render_gears.inx.h:11 ../share/extensions/rtree.inx.h:4 +#: ../share/extensions/render_gears.inx.h:11 +#: ../share/extensions/rtree.inx.h:4 #: ../share/extensions/spirograph.inx.h:10 #: ../share/extensions/svgcalendar.inx.h:38 #: ../share/extensions/triangle.inx.h:14 @@ -6923,9 +7001,9 @@ msgid "Render" msgstr "Rendu" #: ../src/extension/internal/grid.cpp:221 -#: ../src/ui/dialog/document-properties.cpp:151 +#: ../src/ui/dialog/document-properties.cpp:152 #: ../src/ui/dialog/inkscape-preferences.cpp:776 -#: ../src/widgets/toolbox.cpp:1824 +#: ../src/widgets/toolbox.cpp:1825 msgid "Grids" msgstr "Grilles" @@ -7018,12 +7096,8 @@ msgstr "Précision de l'approximation sur les mailles de dégradés :" #: ../src/extension/internal/pdf-input-cairo.cpp:111 #: ../src/extension/internal/pdfinput/pdf-input.cpp:125 -msgid "" -"Note: setting the precision too high may result in a large SVG file " -"and slow performance." -msgstr "" -"Note : avec une précision trop haute, vous risquez d'obtenir des " -"fichiers SVG très gros et de ralentir le programme." +msgid "Note: setting the precision too high may result in a large SVG file and slow performance." +msgstr "Note : avec une précision trop haute, vous risquez d'obtenir des fichiers SVG très gros et de ralentir le programme." #: ../src/extension/internal/pdf-input-cairo.cpp:121 #: ../src/extension/internal/pdfinput/pdf-input.cpp:135 @@ -7046,9 +7120,7 @@ msgstr "Importer le texte en tant que texte" #: ../src/extension/internal/pdf-input-cairo.cpp:129 #: ../src/extension/internal/pdfinput/pdf-input.cpp:143 msgid "Replace PDF fonts by closest-named installed fonts" -msgstr "" -"Remplace les polices du PDF par les polices installées dont le nom est le " -"plus proche" +msgstr "Remplace les polices du PDF par les polices installées dont le nom est le plus proche" #: ../src/extension/internal/pdf-input-cairo.cpp:132 #: ../src/extension/internal/pdfinput/pdf-input.cpp:146 @@ -7120,9 +7192,7 @@ msgstr "Adobe Illustrator 9.0 et supérieur (*.ai)" #: ../src/extension/internal/pdfinput/pdf-input.cpp:787 msgid "Open files saved in Adobe Illustrator 9.0 and newer versions" -msgstr "" -"Ouvrir des fichiers créés avec Adobe Illustrator version 9.0 et les versions " -"plus récentes" +msgstr "Ouvrir des fichiers créés avec Adobe Illustrator version 9.0 et les versions plus récentes" #: ../src/extension/internal/pov-out.cpp:715 msgid "PovRay Output" @@ -7176,7 +7246,8 @@ msgstr "Format Scalable Vector Graphic défini par le W3C" msgid "SVGZ Input" msgstr "Entrée SVGZ" -#: ../src/extension/internal/svgz.cpp:52 ../src/extension/internal/svgz.cpp:66 +#: ../src/extension/internal/svgz.cpp:52 +#: ../src/extension/internal/svgz.cpp:66 msgid "Compressed Inkscape SVG (*.svgz)" msgstr "SVG Inkscape compressé (*.svgz)" @@ -7184,7 +7255,8 @@ msgstr "SVG Inkscape compressé (*.svgz)" msgid "SVG file format compressed with GZip" msgstr "Format de fichier SVG compressé avec Gzip" -#: ../src/extension/internal/svgz.cpp:61 ../src/extension/internal/svgz.cpp:75 +#: ../src/extension/internal/svgz.cpp:61 +#: ../src/extension/internal/svgz.cpp:75 msgid "SVGZ Output" msgstr "Sortie SVGZ" @@ -7297,11 +7369,10 @@ msgstr "Aperçu en direct" msgid "Is the effect previewed live on canvas?" msgstr "Prévisualiser l'effet en direct sur la zone de travail ?" -#: ../src/extension/system.cpp:125 ../src/extension/system.cpp:127 +#: ../src/extension/system.cpp:125 +#: ../src/extension/system.cpp:127 msgid "Format autodetect failed. The file is being opened as SVG." -msgstr "" -"Échec de la détection automatique du format. Le fichier est ouvert en tant " -"que SVG." +msgstr "Échec de la détection automatique du format. Le fichier est ouvert en tant que SVG." #: ../src/file.cpp:181 msgid "default.svg" @@ -7309,10 +7380,10 @@ msgstr "default.fr.svg" #: ../src/file.cpp:320 msgid "Broken links have been changed to point to existing files." -msgstr "" -"Les liens brisés ont été modifiés pour pointer vers des fichiers existant." +msgstr "Les liens brisés ont été modifiés pour pointer vers des fichiers existant." -#: ../src/file.cpp:331 ../src/file.cpp:1259 +#: ../src/file.cpp:331 +#: ../src/file.cpp:1247 #, c-format msgid "Failed to load the requested file %s" msgstr "Échec du chargement du fichier %s" @@ -7322,117 +7393,113 @@ msgid "Document not saved yet. Cannot revert." msgstr "Document non enregistré. Impossible de le recharger." #: ../src/file.cpp:363 -#, c-format -msgid "Changes will be lost! Are you sure you want to reload document %s?" -msgstr "" -"Les changements seront perdus ! Êtes-vous sûr de vouloir recharger le " -"document %s ?" +#, fuzzy +msgid "Changes will be lost! Are you sure you want to reload document %1?" +msgstr "Les changements seront perdus ! Êtes-vous sûr de vouloir recharger le document %s ?" -#: ../src/file.cpp:392 +#: ../src/file.cpp:389 msgid "Document reverted." msgstr "Document rechargé." -#: ../src/file.cpp:394 +#: ../src/file.cpp:391 msgid "Document not reverted." msgstr "Document non rechargé." -#: ../src/file.cpp:544 +#: ../src/file.cpp:541 msgid "Select file to open" msgstr "Sélectionner un fichier à ouvrir" -#: ../src/file.cpp:626 +#: ../src/file.cpp:623 msgid "Clean up document" msgstr "Nettoyer le document" -#: ../src/file.cpp:633 +#: ../src/file.cpp:630 #, c-format msgid "Removed %i unused definition in <defs>." msgid_plural "Removed %i unused definitions in <defs>." -msgstr[0] "" -"Suppression de %i définition inutilisée dans les <defs>." -msgstr[1] "" -"Suppression de %i définitions inutilisées dans les <defs>." +msgstr[0] "Suppression de %i définition inutilisée dans les <defs>." +msgstr[1] "Suppression de %i définitions inutilisées dans les <defs>." -#: ../src/file.cpp:638 +#: ../src/file.cpp:635 msgid "No unused definitions in <defs>." msgstr "Aucune définition inutilisée dans les <defs>." -#: ../src/file.cpp:670 +#: ../src/file.cpp:667 #, c-format -msgid "" -"No Inkscape extension found to save document (%s). This may have been " -"caused by an unknown filename extension." -msgstr "" -"Aucune extension Inkscape pour enregistrer le document (%s) n'a été trouvée. " -"Cela peut venir d'une extension de fichier inconnue." - -#: ../src/file.cpp:671 ../src/file.cpp:679 ../src/file.cpp:687 -#: ../src/file.cpp:693 ../src/file.cpp:698 +msgid "No Inkscape extension found to save document (%s). This may have been caused by an unknown filename extension." +msgstr "Aucune extension Inkscape pour enregistrer le document (%s) n'a été trouvée. Cela peut venir d'une extension de fichier inconnue." + +#: ../src/file.cpp:668 +#: ../src/file.cpp:676 +#: ../src/file.cpp:684 +#: ../src/file.cpp:690 +#: ../src/file.cpp:695 msgid "Document not saved." msgstr "Document non enregistré." -#: ../src/file.cpp:678 +#: ../src/file.cpp:675 #, c-format -msgid "" -"File %s is write protected. Please remove write protection and try again." -msgstr "" -"Le fichier %s est protégé en écriture. Veuillez supprimer cette protection " -"et recommencer." +msgid "File %s is write protected. Please remove write protection and try again." +msgstr "Le fichier %s est protégé en écriture. Veuillez supprimer cette protection et recommencer." -#: ../src/file.cpp:686 +#: ../src/file.cpp:683 #, c-format msgid "File %s could not be saved." msgstr "Le fichier %s n'a pas pu être enregistré." -#: ../src/file.cpp:716 ../src/file.cpp:718 +#: ../src/file.cpp:713 +#: ../src/file.cpp:715 msgid "Document saved." msgstr "Document enregistré." #. We are saving for the first time; create a unique default filename -#: ../src/file.cpp:866 ../src/file.cpp:1422 -#, c-format -msgid "drawing%s" +#: ../src/file.cpp:858 +#, fuzzy +msgid "drawing" msgstr "dessin%s" -#: ../src/file.cpp:872 -#, c-format -msgid "drawing-%d%s" -msgstr "dessin-%d%s" - -#: ../src/file.cpp:876 -#, c-format -msgid "%s" -msgstr "%s" +#: ../src/file.cpp:863 +#, fuzzy +msgid "drawing-%1" +msgstr "dessin%s" -#: ../src/file.cpp:891 +#: ../src/file.cpp:880 msgid "Select file to save a copy to" msgstr "Sélectionner le fichier dans lequel enregistrer une copie" -#: ../src/file.cpp:893 +#: ../src/file.cpp:882 msgid "Select file to save to" msgstr "Sélectionner le fichier dans lequel enregistrer" -#: ../src/file.cpp:999 ../src/file.cpp:1001 +#: ../src/file.cpp:987 +#: ../src/file.cpp:989 msgid "No changes need to be saved." msgstr "Aucun changement à enregistrer." -#: ../src/file.cpp:1020 +#: ../src/file.cpp:1008 msgid "Saving document..." msgstr "Enregistrement du document..." -#: ../src/file.cpp:1256 ../src/ui/dialog/ocaldialogs.cpp:1244 +#: ../src/file.cpp:1244 +#: ../src/ui/dialog/inkscape-preferences.cpp:1439 +#: ../src/ui/dialog/ocaldialogs.cpp:1246 msgid "Import" msgstr "Importer" -#: ../src/file.cpp:1306 +#: ../src/file.cpp:1294 msgid "Select file to import" msgstr "Sélectionner un fichier à importer" -#: ../src/file.cpp:1444 +#: ../src/file.cpp:1410 +#, c-format +msgid "drawing%s" +msgstr "dessin%s" + +#: ../src/file.cpp:1432 msgid "Select file to export to" msgstr "Sélectionner un fichier vers lequel exporter" -#: ../src/file.cpp:1697 +#: ../src/file.cpp:1685 msgid "Import Clip Art" msgstr "Importer un Clip Art" @@ -7460,7 +7527,8 @@ msgstr "Carte de déplacement" msgid "Flood" msgstr "Remplissage" -#: ../src/filter-enums.cpp:30 ../share/extensions/text_merge.inx.h:1 +#: ../src/filter-enums.cpp:30 +#: ../share/extensions/text_merge.inx.h:1 msgid "Merge" msgstr "Fusionner" @@ -7496,145 +7564,161 @@ msgstr "Remplissage" msgid "Stroke Paint" msgstr "Remplissage du contour" +#. New in Compositing and Blending Level 1 +#: ../src/filter-enums.cpp:58 +#, fuzzy +msgid "Overlay" +msgstr "Superpositions" + +#: ../src/filter-enums.cpp:59 +#, fuzzy +msgid "Color Dodge" +msgstr "Couleur seulement" + +#: ../src/filter-enums.cpp:60 +#, fuzzy +msgid "Color Burn" +msgstr "Barres de couleur" + #: ../src/filter-enums.cpp:61 +#, fuzzy +msgid "Hard Light" +msgstr "Lumière crue" + +#: ../src/filter-enums.cpp:62 +#, fuzzy +msgid "Soft Light" +msgstr "Lumière spot (cône de lumière)" + +#: ../src/filter-enums.cpp:63 +#: ../src/splivarot.cpp:88 +#: ../src/splivarot.cpp:94 +msgid "Difference" +msgstr "Différence" + +#: ../src/filter-enums.cpp:64 +#: ../src/live_effects/lpe-boolops.cpp:28 +#: ../src/splivarot.cpp:100 +msgid "Exclusion" +msgstr "Exclusion" + +#: ../src/filter-enums.cpp:65 +#: ../src/ui/tools/flood-tool.cpp:201 +#: ../src/widgets/sp-color-icc-selector.cpp:361 +#: ../src/widgets/sp-color-icc-selector.cpp:365 +#: ../src/widgets/sp-color-scales.cpp:455 +#: ../src/widgets/sp-color-scales.cpp:456 +#: ../src/widgets/tweak-toolbar.cpp:300 +#: ../share/extensions/color_randomize.inx.h:3 +msgid "Hue" +msgstr "Teinte" + +#: ../src/filter-enums.cpp:68 +msgid "Luminosity" +msgstr "" + +#: ../src/filter-enums.cpp:75 msgid "Matrix" msgstr "Matrice" -#: ../src/filter-enums.cpp:62 +#: ../src/filter-enums.cpp:76 msgid "Saturate" msgstr "Saturation" -#: ../src/filter-enums.cpp:63 +#: ../src/filter-enums.cpp:77 msgid "Hue Rotate" msgstr "Décalage de teinte" -#: ../src/filter-enums.cpp:64 +#: ../src/filter-enums.cpp:78 msgid "Luminance to Alpha" msgstr "Luminance vers opacité" #. File -#: ../src/filter-enums.cpp:70 ../src/verbs.cpp:2355 +#: ../src/filter-enums.cpp:84 +#: ../src/verbs.cpp:2355 #: ../share/extensions/jessyInk_mouseHandler.inx.h:3 #: ../share/extensions/jessyInk_transitions.inx.h:7 msgid "Default" msgstr "Défaut" -#: ../src/filter-enums.cpp:76 +#. New CSS +#: ../src/filter-enums.cpp:92 +#, fuzzy +msgid "Clear" +msgstr "Effa_cer" + +#: ../src/filter-enums.cpp:93 +#, fuzzy +msgid "Copy" +msgstr "Co_pier" + +#: ../src/filter-enums.cpp:94 +#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1628 +msgid "Destination" +msgstr "Destination" + +#: ../src/filter-enums.cpp:95 +#, fuzzy +msgid "Destination Over" +msgstr "Destination" + +#: ../src/filter-enums.cpp:96 +#, fuzzy +msgid "Destination In" +msgstr "Destination" + +#: ../src/filter-enums.cpp:97 +#, fuzzy +msgid "Destination Out" +msgstr "Destination" + +#: ../src/filter-enums.cpp:98 +#, fuzzy +msgid "Destination Atop" +msgstr "Destination" + +#: ../src/filter-enums.cpp:99 +#, fuzzy +msgid "Lighter" +msgstr "Éclaircir" + +#: ../src/filter-enums.cpp:101 msgid "Arithmetic" msgstr "Arithmetic" -#: ../src/filter-enums.cpp:92 ../src/selection-chemistry.cpp:532 +#: ../src/filter-enums.cpp:117 +#: ../src/selection-chemistry.cpp:533 msgid "Duplicate" msgstr "Dupliquer" -#: ../src/filter-enums.cpp:93 +#: ../src/filter-enums.cpp:118 msgid "Wrap" msgstr "Retour à la ligne" -#: ../src/filter-enums.cpp:109 +#: ../src/filter-enums.cpp:134 msgid "Erode" msgstr "Contracter" -#: ../src/filter-enums.cpp:110 +#: ../src/filter-enums.cpp:135 msgid "Dilate" msgstr "Dilater" -#: ../src/filter-enums.cpp:116 +#: ../src/filter-enums.cpp:141 msgid "Fractal Noise" msgstr "Bruit fractal" -#: ../src/filter-enums.cpp:123 +#: ../src/filter-enums.cpp:148 msgid "Distant Light" msgstr "Lumière distante (rayons parallèles)" -#: ../src/filter-enums.cpp:124 +#: ../src/filter-enums.cpp:149 msgid "Point Light" msgstr "Lumière ponctuelle (rayons omnidirectionnels)" -#: ../src/filter-enums.cpp:125 +#: ../src/filter-enums.cpp:150 msgid "Spot Light" msgstr "Lumière spot (cône de lumière)" -#: ../src/flood-context.cpp:193 -msgid "Visible Colors" -msgstr "Couleurs visibles" - -#: ../src/flood-context.cpp:197 ../src/widgets/sp-color-icc-selector.cpp:361 -#: ../src/widgets/sp-color-icc-selector.cpp:365 -#: ../src/widgets/sp-color-scales.cpp:455 -#: ../src/widgets/sp-color-scales.cpp:456 ../src/widgets/tweak-toolbar.cpp:300 -#: ../share/extensions/color_randomize.inx.h:3 -msgid "Hue" -msgstr "Teinte" - -#: ../src/flood-context.cpp:211 -msgctxt "Flood autogap" -msgid "None" -msgstr "Aucun" - -#: ../src/flood-context.cpp:212 -msgctxt "Flood autogap" -msgid "Small" -msgstr "Petit" - -#: ../src/flood-context.cpp:213 -msgctxt "Flood autogap" -msgid "Medium" -msgstr "Moyen" - -#: ../src/flood-context.cpp:214 -msgctxt "Flood autogap" -msgid "Large" -msgstr "Grand" - -#: ../src/flood-context.cpp:436 -msgid "Too much inset, the result is empty." -msgstr "Trop de contraction, le résultat est vide." - -#: ../src/flood-context.cpp:477 -#, c-format -msgid "" -"Area filled, path with %d node created and unioned with selection." -msgid_plural "" -"Area filled, path with %d nodes created and unioned with selection." -msgstr[0] "" -"Zone remplie, création d'un chemin de %d nœud, ajouté à la sélection." -msgstr[1] "" -"Zone remplie, création d'un chemin de %d nœuds, ajouté à la sélection." - -#: ../src/flood-context.cpp:483 -#, c-format -msgid "Area filled, path with %d node created." -msgid_plural "Area filled, path with %d nodes created." -msgstr[0] "Zone remplie, création d'un chemin avec %d nœud." -msgstr[1] "Zone remplie, création d'un chemin avec %d nœuds." - -#: ../src/flood-context.cpp:751 ../src/flood-context.cpp:1061 -msgid "Area is not bounded, cannot fill." -msgstr "Zone non bornée, impossible de remplir." - -#: ../src/flood-context.cpp:1066 -msgid "" -"Only the visible part of the bounded area was filled. If you want to " -"fill all of the area, undo, zoom out, and fill again." -msgstr "" -"Seule la partie visible de la zone a été remplie. Pour remplir toute " -"la zone, annulez, dézoomez et remplissez à nouveau." - -#: ../src/flood-context.cpp:1084 ../src/flood-context.cpp:1235 -msgid "Fill bounded area" -msgstr "Remplissage d'une zone bornée" - -#: ../src/flood-context.cpp:1100 -msgid "Set style on object" -msgstr "Appliquer un style à l'objet" - -#: ../src/flood-context.cpp:1160 -msgid "Draw over areas to add to fill, hold Alt for touch fill" -msgstr "" -"Dessiner au-dessus d'une zone pour la remplir, avec Alt pour " -"remplir au toucher" - #: ../src/gradient-chemistry.cpp:1568 msgid "Invert gradient colors" msgstr "Inverser les couleurs du dégradé" @@ -7643,149 +7727,64 @@ msgstr "Inverser les couleurs du dégradé" msgid "Reverse gradient" msgstr "Inverser le dégradé" -#: ../src/gradient-chemistry.cpp:1608 ../src/widgets/gradient-selector.cpp:228 +#: ../src/gradient-chemistry.cpp:1608 +#: ../src/widgets/gradient-selector.cpp:245 msgid "Delete swatch" msgstr "Supprimer l'échantillon" -#: ../src/gradient-context.cpp:101 ../src/gradient-drag.cpp:96 +#: ../src/gradient-drag.cpp:96 +#: ../src/ui/tools/gradient-tool.cpp:104 msgid "Linear gradient start" msgstr "Début de dégradé linéaire" #. POINT_LG_BEGIN -#: ../src/gradient-context.cpp:102 ../src/gradient-drag.cpp:97 +#: ../src/gradient-drag.cpp:97 +#: ../src/ui/tools/gradient-tool.cpp:105 msgid "Linear gradient end" msgstr "Fin de dégradé linéaire" -#: ../src/gradient-context.cpp:103 ../src/gradient-drag.cpp:98 +#: ../src/gradient-drag.cpp:98 +#: ../src/ui/tools/gradient-tool.cpp:106 msgid "Linear gradient mid stop" msgstr "Stop médian de dégradé linéaire" -#: ../src/gradient-context.cpp:104 ../src/gradient-drag.cpp:99 +#: ../src/gradient-drag.cpp:99 +#: ../src/ui/tools/gradient-tool.cpp:107 msgid "Radial gradient center" msgstr "Centre de dégradé radial" -#: ../src/gradient-context.cpp:105 ../src/gradient-context.cpp:106 -#: ../src/gradient-drag.cpp:100 ../src/gradient-drag.cpp:101 +#: ../src/gradient-drag.cpp:100 +#: ../src/gradient-drag.cpp:101 +#: ../src/ui/tools/gradient-tool.cpp:108 +#: ../src/ui/tools/gradient-tool.cpp:109 msgid "Radial gradient radius" msgstr "Rayon de dégradé radial" -#: ../src/gradient-context.cpp:107 ../src/gradient-drag.cpp:102 +#: ../src/gradient-drag.cpp:102 +#: ../src/ui/tools/gradient-tool.cpp:110 msgid "Radial gradient focus" msgstr "Foyer de dégradé radial" #. POINT_RG_FOCUS -#: ../src/gradient-context.cpp:108 ../src/gradient-context.cpp:109 -#: ../src/gradient-drag.cpp:103 ../src/gradient-drag.cpp:104 +#: ../src/gradient-drag.cpp:103 +#: ../src/gradient-drag.cpp:104 +#: ../src/ui/tools/gradient-tool.cpp:111 +#: ../src/ui/tools/gradient-tool.cpp:112 msgid "Radial gradient mid stop" msgstr "Stop médian de dégradé radial" -#. TRANSLATORS: %s will be substituted with the point name (see previous messages); This is part of a compound message -#: ../src/gradient-context.cpp:132 ../src/mesh-context.cpp:129 -#, c-format -msgid "%s selected" -msgstr "%s sélectionné" - -#. TRANSLATORS: Mind the space in front. This is part of a compound message -#: ../src/gradient-context.cpp:134 ../src/gradient-context.cpp:143 -#, c-format -msgid " out of %d gradient handle" -msgid_plural " out of %d gradient handles" -msgstr[0] " sur %d poignée de dégradé" -msgstr[1] " sur %d poignées de dégradé" - -#. TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message -#: ../src/gradient-context.cpp:135 ../src/gradient-context.cpp:144 -#: ../src/gradient-context.cpp:151 ../src/mesh-context.cpp:132 -#: ../src/mesh-context.cpp:143 ../src/mesh-context.cpp:151 -#, c-format -msgid " on %d selected object" -msgid_plural " on %d selected objects" -msgstr[0] " dans %d objet sélectionné" -msgstr[1] " dans %d objets sélectionnés" - -#. TRANSLATORS: This is a part of a compound message (out of two more indicating: grandint handle count & object count) -#: ../src/gradient-context.cpp:141 ../src/mesh-context.cpp:139 -#, c-format -msgid "" -"One handle merging %d stop (drag with Shift to separate) selected" -msgid_plural "" -"One handle merging %d stops (drag with Shift to separate) selected" -msgstr[0] "" -"Une poignée de dégradé rassemblant %d stops (cliquer-glissser avec Maj pour les séparer) sélectionnée" -msgstr[1] "" -"Une poignée de dégradé rassemblant %d stops (cliquer-glissser avec Maj pour les séparer) sélectionnée" - -#. TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count) -#: ../src/gradient-context.cpp:149 -#, c-format -msgid "%d gradient handle selected out of %d" -msgid_plural "%d gradient handles selected out of %d" -msgstr[0] "%d poignée de dégradé sélectionnée sur %d" -msgstr[1] "%d poignées de dégradé sélectionnées sur %d" - -#. TRANSLATORS: The plural refers to number of selected objects -#: ../src/gradient-context.cpp:156 -#, c-format -msgid "No gradient handles selected out of %d on %d selected object" -msgid_plural "" -"No gradient handles selected out of %d on %d selected objects" -msgstr[0] "Aucune poignée sélectionnée sur %d dans %d objet sélectionné" -msgstr[1] "" -"Aucune poignée sélectionnée sur %d dans %d objets sélectionnés" - -#: ../src/gradient-context.cpp:366 ../src/gradient-context.cpp:464 -#: ../src/ui/dialog/swatches.cpp:203 ../src/widgets/gradient-vector.cpp:814 -msgid "Add gradient stop" -msgstr "Ajouter un stop au dégradé" - -#: ../src/gradient-context.cpp:439 -msgid "Simplify gradient" -msgstr "Simplifier le dégradé" - -#: ../src/gradient-context.cpp:515 -msgid "Create default gradient" -msgstr "Créer un dégradé par défaut" - -#: ../src/gradient-context.cpp:574 ../src/mesh-context.cpp:569 -msgid "Draw around handles to select them" -msgstr "Dessiner autour des poignées pour les sélectionner" - -#: ../src/gradient-context.cpp:697 -msgid "Ctrl: snap gradient angle" -msgstr "" -"Ctrl : pour forcer la modification de l'inclinaison du dégradé par " -"incréments" - -#: ../src/gradient-context.cpp:698 -msgid "Shift: draw gradient around the starting point" -msgstr "Maj : pour dessiner le dégradé autour du point de départ" - -#: ../src/gradient-context.cpp:952 ../src/mesh-context.cpp:992 -#, c-format -msgid "Gradient for %d object; with Ctrl to snap angle" -msgid_plural "Gradient for %d objects; with Ctrl to snap angle" -msgstr[0] "" -"Dégradé appliqué à %d objet; déplacer avec Ctrl pour forcer la " -"modification de l'inclinaison par incréments" -msgstr[1] "" -"Dégradé appliqué à %d objets; déplacer avec Ctrl pour forcer " -"la modification de l'inclinaison par incréments" - -#: ../src/gradient-context.cpp:956 ../src/mesh-context.cpp:996 -msgid "Select objects on which to create gradient." -msgstr "Sélectionner des objets auxquels appliquer un dégradé." - -#: ../src/gradient-drag.cpp:105 ../src/mesh-context.cpp:102 +#: ../src/gradient-drag.cpp:105 +#: ../src/ui/tools/mesh-tool.cpp:105 msgid "Mesh gradient corner" msgstr "coin de filet de dégradé" -#: ../src/gradient-drag.cpp:106 ../src/mesh-context.cpp:103 +#: ../src/gradient-drag.cpp:106 +#: ../src/ui/tools/mesh-tool.cpp:106 msgid "Mesh gradient handle" msgstr "poignée de filet de dégradé" -#: ../src/gradient-drag.cpp:107 ../src/mesh-context.cpp:104 +#: ../src/gradient-drag.cpp:107 +#: ../src/ui/tools/mesh-tool.cpp:107 msgid "Mesh gradient tensor" msgstr "tenseur de filet de dégradé" @@ -7801,55 +7800,36 @@ msgstr "Fusionner les poignées de dégradé" msgid "Move gradient handle" msgstr "Déplacer la poignée de dégradé" -#: ../src/gradient-drag.cpp:1162 ../src/widgets/gradient-vector.cpp:847 +#: ../src/gradient-drag.cpp:1162 +#: ../src/widgets/gradient-vector.cpp:847 msgid "Delete gradient stop" msgstr "Supprimer un stop de dégradé" #: ../src/gradient-drag.cpp:1425 #, c-format -msgid "" -"%s %d for: %s%s; drag with Ctrl to snap offset; click with Ctrl" -"+Alt to delete stop" -msgstr "" -"%s %d pour %s%s; déplacer avec Ctrl pour faire varier le décalage par " -"incréments; cliquer avec Ctrl+Alt pour supprimer le stop" +msgid "%s %d for: %s%s; drag with Ctrl to snap offset; click with Ctrl+Alt to delete stop" +msgstr "%s %d pour %s%s; déplacer avec Ctrl pour faire varier le décalage par incréments; cliquer avec Ctrl+Alt pour supprimer le stop" -#: ../src/gradient-drag.cpp:1429 ../src/gradient-drag.cpp:1436 +#: ../src/gradient-drag.cpp:1429 +#: ../src/gradient-drag.cpp:1436 msgid " (stroke)" msgstr " (contour)" #: ../src/gradient-drag.cpp:1433 #, c-format -msgid "" -"%s for: %s%s; drag with Ctrl to snap angle, with Ctrl+Alt to " -"preserve angle, with Ctrl+Shift to scale around center" -msgstr "" -"%s pour %s%s; cliquer-déplacer avec Ctrl pour faire varier l'angle " -"par incréments; Ctrl+Alt pour préserver l'angle, avec Ctrl+Maj " -"pour redimensionner autour du centre" +msgid "%s for: %s%s; drag with Ctrl to snap angle, with Ctrl+Alt to preserve angle, with Ctrl+Shift to scale around center" +msgstr "%s pour %s%s; cliquer-déplacer avec Ctrl pour faire varier l'angle par incréments; Ctrl+Alt pour préserver l'angle, avec Ctrl+Maj pour redimensionner autour du centre" #: ../src/gradient-drag.cpp:1441 -msgid "" -"Radial gradient center and focus; drag with Shift to " -"separate focus" -msgstr "" -"Dégradé radial, centre et foyer; déplacer avec Maj pour " -"séparer le foyer" +msgid "Radial gradient center and focus; drag with Shift to separate focus" +msgstr "Dégradé radial, centre et foyer; déplacer avec Maj pour séparer le foyer" #: ../src/gradient-drag.cpp:1444 #, c-format -msgid "" -"Gradient point shared by %d gradient; drag with Shift to " -"separate" -msgid_plural "" -"Gradient point shared by %d gradients; drag with Shift to " -"separate" -msgstr[0] "" -"Point de dégradé partagé entre %d dégradé; déplacer avec Maj " -"pour séparer " -msgstr[1] "" -"Point de dégradé partagé entre %d dégradés; déplacer avec Maj " -"pour séparer " +msgid "Gradient point shared by %d gradient; drag with Shift to separate" +msgid_plural "Gradient point shared by %d gradients; drag with Shift to separate" +msgstr[0] "Point de dégradé partagé entre %d dégradé; déplacer avec Maj pour séparer " +msgstr[1] "Point de dégradé partagé entre %d dégradés; déplacer avec Maj pour séparer " #: ../src/gradient-drag.cpp:2372 msgid "Move gradient handle(s)" @@ -7865,13 +7845,11 @@ msgstr "Supprimer un stop de dégradé" #: ../src/inkscape.cpp:341 msgid "Autosave failed! Cannot create directory %1." -msgstr "" -"Échec de l'enregistrement automatique. Création du dossier %1 impossible." +msgstr "Échec de l'enregistrement automatique. Création du dossier %1 impossible." #: ../src/inkscape.cpp:350 msgid "Autosave failed! Cannot open directory %1." -msgstr "" -"Échec de l'enregistrement automatique. Ouverture du dossier %1 impossible." +msgstr "Échec de l'enregistrement automatique. Ouverture du dossier %1 impossible." #: ../src/inkscape.cpp:366 msgid "Autosaving documents..." @@ -7879,16 +7857,13 @@ msgstr "Enregistrement automatique du document..." #: ../src/inkscape.cpp:439 msgid "Autosave failed! Could not find inkscape extension to save document." -msgstr "" -"Échec de l'enregistrement automatique ! Impossible de trouver l'extension " -"Inkscape pour enregistrer le document." +msgstr "Échec de l'enregistrement automatique ! Impossible de trouver l'extension Inkscape pour enregistrer le document." -#: ../src/inkscape.cpp:442 ../src/inkscape.cpp:449 +#: ../src/inkscape.cpp:442 +#: ../src/inkscape.cpp:449 #, c-format msgid "Autosave failed! File %s could not be saved." -msgstr "" -"Échec de l'enregistrement automatique ! Le fichier %s n'a pas pu être " -"enregistré." +msgstr "Échec de l'enregistrement automatique ! Le fichier %s n'a pas pu être enregistré." #: ../src/inkscape.cpp:464 msgid "Autosave complete." @@ -7904,12 +7879,8 @@ msgid "Inkscape encountered an internal error and will close now.\n" msgstr "Inkscape a subi une erreur interne et va se fermer maintenant.\n" #: ../src/inkscape.cpp:745 -msgid "" -"Automatic backups of unsaved documents were done to the following " -"locations:\n" -msgstr "" -"Les enregistrements automatiques des documents non enregistrés ont été " -"effectués à cet emplacement :\n" +msgid "Automatic backups of unsaved documents were done to the following locations:\n" +msgstr "Les enregistrements automatiques des documents non enregistrés ont été effectués à cet emplacement :\n" #: ../src/inkscape.cpp:746 msgid "Automatic backup of the following documents failed:\n" @@ -7951,12 +7922,15 @@ msgstr "Verbe « %s » inconnu" msgid "Open _Recent" msgstr "Documents _récents" -#: ../src/interface.cpp:1012 ../src/interface.cpp:1098 -#: ../src/interface.cpp:1201 ../src/ui/widget/selected-style.cpp:528 +#: ../src/interface.cpp:1012 +#: ../src/interface.cpp:1098 +#: ../src/interface.cpp:1201 +#: ../src/ui/widget/selected-style.cpp:528 msgid "Drop color" msgstr "Déposer la couleur" -#: ../src/interface.cpp:1051 ../src/interface.cpp:1161 +#: ../src/interface.cpp:1051 +#: ../src/interface.cpp:1161 msgid "Drop color on gradient" msgstr "Déposer la couleur dans le dégradé" @@ -7979,8 +7953,7 @@ msgstr "Déposer une image bitmap" #: ../src/interface.cpp:1389 #, c-format msgid "" -"A file named \"%s\" already exists. Do " -"you want to replace it?\n" +"A file named \"%s\" already exists. Do you want to replace it?\n" "\n" "The file already exists in \"%s\". Replacing it will overwrite its contents." msgstr "" @@ -7989,7 +7962,16 @@ msgstr "" "\n" "Le fichier existe déjà dans « %s ». Le remplacer écrase son contenu." -#: ../src/interface.cpp:1396 ../share/extensions/web-set-att.inx.h:21 +#: ../src/interface.cpp:1395 +#: ../src/ui/dialog/export.cpp:1298 +#: ../src/widgets/desktop-widget.cpp:1127 +#: ../src/widgets/desktop-widget.cpp:1189 +#, fuzzy +msgid "_Cancel" +msgstr "Annuler" + +#: ../src/interface.cpp:1396 +#: ../share/extensions/web-set-att.inx.h:21 #: ../share/extensions/web-transmit-att.inx.h:19 msgid "Replace" msgstr "Remplacer" @@ -8004,7 +7986,8 @@ msgid "Enter group #%1" msgstr "Entrer dans le groupe #%1" #. Item dialog -#: ../src/interface.cpp:1644 ../src/verbs.cpp:2851 +#: ../src/interface.cpp:1644 +#: ../src/verbs.cpp:2853 msgid "_Object Properties..." msgstr "Propriétés de l'_objet..." @@ -8072,7 +8055,8 @@ msgid "Release C_lip" msgstr "Retirer _la découpe" #. Group -#: ../src/interface.cpp:1786 ../src/verbs.cpp:2490 +#: ../src/interface.cpp:1786 +#: ../src/verbs.cpp:2490 msgid "_Group" msgstr "_Grouper" @@ -8081,7 +8065,8 @@ msgid "Create link" msgstr "Créer un lien" #. Ungroup -#: ../src/interface.cpp:1888 ../src/verbs.cpp:2492 +#: ../src/interface.cpp:1888 +#: ../src/verbs.cpp:2492 msgid "_Ungroup" msgstr "_Dégrouper" @@ -8116,7 +8101,8 @@ msgstr "Éditer avec un logiciel externe..." #. Trace Bitmap #. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize) -#: ../src/interface.cpp:1982 ../src/verbs.cpp:2553 +#: ../src/interface.cpp:1982 +#: ../src/verbs.cpp:2553 msgid "_Trace Bitmap..." msgstr "Vec_toriser le bitmap..." @@ -8137,17 +8123,21 @@ msgstr "Extraire une image..." #. Item dialog #. Fill and Stroke dialog -#: ../src/interface.cpp:2157 ../src/interface.cpp:2177 ../src/verbs.cpp:2816 +#: ../src/interface.cpp:2157 +#: ../src/interface.cpp:2177 +#: ../src/verbs.cpp:2816 msgid "_Fill and Stroke..." msgstr "_Remplissage et contour..." #. Edit Text dialog -#: ../src/interface.cpp:2183 ../src/verbs.cpp:2833 +#: ../src/interface.cpp:2183 +#: ../src/verbs.cpp:2835 msgid "_Text and Font..." msgstr "_Texte et police..." #. Spellcheck dialog -#: ../src/interface.cpp:2189 ../src/verbs.cpp:2841 +#: ../src/interface.cpp:2189 +#: ../src/verbs.cpp:2843 msgid "Check Spellin_g..." msgstr "Vérification ortho_graphique..." @@ -8170,15 +8160,11 @@ msgstr "Déplacer le motif de remplissage à l'intérieur de l'objet" #: ../src/knotholder.cpp:264 msgid "Scale the pattern fill; uniformly if with Ctrl" -msgstr "" -"Redimensionner le motif de remplissage ; uniformiser en maintenant la " -"touche Ctrl" +msgstr "Redimensionner le motif de remplissage ; uniformiser en maintenant la touche Ctrl" #: ../src/knotholder.cpp:268 msgid "Rotate the pattern fill; with Ctrl to snap angle" -msgstr "" -"Tourner le motif de remplissage ; Ctrl pour tourner par " -"incréments" +msgstr "Tourner le motif de remplissage ; Ctrl pour tourner par incréments" #: ../src/libgdl/gdl-dock-bar.c:105 msgid "Master" @@ -8196,7 +8182,8 @@ msgstr "Style de barre détachable" msgid "Dockbar style to show items on it" msgstr "Style de barre d'attache pour l'affichage de ses éléments" -#: ../src/libgdl/gdl-dock.c:176 ../src/ui/dialog/inkscape-preferences.cpp:631 +#: ../src/libgdl/gdl-dock.c:176 +#: ../src/ui/dialog/inkscape-preferences.cpp:631 #: ../src/ui/dialog/inkscape-preferences.cpp:674 msgid "Floating" msgstr "Flottant" @@ -8205,7 +8192,8 @@ msgstr "Flottant" msgid "Whether the dock is floating in its own window" msgstr "Détermine si le point d'attache flotte dans sa propre fenêtre" -#: ../src/libgdl/gdl-dock.c:184 ../src/libgdl/gdl-dock-master.c:141 +#: ../src/libgdl/gdl-dock.c:184 +#: ../src/libgdl/gdl-dock-master.c:141 msgid "Default title" msgstr "Titre par défaut" @@ -8243,7 +8231,8 @@ msgid "Dock #%d" msgstr "Point d'attache #%d" #. Name -#: ../src/libgdl/gdl-dock-item.c:298 ../src/widgets/ruler.cpp:191 +#: ../src/libgdl/gdl-dock-item.c:298 +#: ../src/widgets/ruler.cpp:191 #: ../src/widgets/text-toolbar.cpp:1421 #: ../share/extensions/gcodetools_graffiti.inx.h:9 #: ../share/extensions/gcodetools_orientation_points.inx.h:2 @@ -8260,32 +8249,24 @@ msgstr "Redimensionnable" #: ../src/libgdl/gdl-dock-item.c:315 msgid "If set, the dock item can be resized when docked in a GtkPanel widget" -msgstr "" -"Si coché, l'élément détachable peut être redimensionné quand il est attaché " -"à un widget GtkPanel" +msgstr "Si coché, l'élément détachable peut être redimensionné quand il est attaché à un widget GtkPanel" #: ../src/libgdl/gdl-dock-item.c:322 msgid "Item behavior" msgstr "Comportement de l'élément" #: ../src/libgdl/gdl-dock-item.c:323 -msgid "" -"General behavior for the dock item (i.e. whether it can float, if it's " -"locked, etc.)" -msgstr "" -"Comportement général de l'élément détachable (par ex, s'il peut flotter, " -"s'il est verouillé, etc...)" +msgid "General behavior for the dock item (i.e. whether it can float, if it's locked, etc.)" +msgstr "Comportement général de l'élément détachable (par ex, s'il peut flotter, s'il est verouillé, etc...)" -#: ../src/libgdl/gdl-dock-item.c:331 ../src/libgdl/gdl-dock-master.c:148 +#: ../src/libgdl/gdl-dock-item.c:331 +#: ../src/libgdl/gdl-dock-master.c:148 msgid "Locked" msgstr "Verrouillé" #: ../src/libgdl/gdl-dock-item.c:332 -msgid "" -"If set, the dock item cannot be dragged around and it doesn't show a grip" -msgstr "" -"Si coché, l'élément détachable ne peut pas être déplacé et il n'affiche pas " -"de poignée" +msgid "If set, the dock item cannot be dragged around and it doesn't show a grip" +msgstr "Si coché, l'élément détachable ne peut pas être déplacé et il n'affiche pas de poignée" #: ../src/libgdl/gdl-dock-item.c:340 msgid "Preferred width" @@ -8305,28 +8286,19 @@ msgstr "Hauteur préférée pour l'élément détachable" #: ../src/libgdl/gdl-dock-item.c:716 #, c-format -msgid "" -"You can't add a dock object (%p of type %s) inside a %s. Use a GdlDock or " -"some other compound dock object." -msgstr "" -"Vous ne pouvez pas ajouter d'objet d'attache (%p de type %s) dans un %s. " -"Utilisez un GdlDock ou un autre objet d'attache composite." +msgid "You can't add a dock object (%p of type %s) inside a %s. Use a GdlDock or some other compound dock object." +msgstr "Vous ne pouvez pas ajouter d'objet d'attache (%p de type %s) dans un %s. Utilisez un GdlDock ou un autre objet d'attache composite." #: ../src/libgdl/gdl-dock-item.c:723 #, c-format -msgid "" -"Attempting to add a widget with type %s to a %s, but it can only contain one " -"widget at a time; it already contains a widget of type %s" -msgstr "" -"Tentative d'ajout d'un gadget de %s à un %s, mais il ne peut contenir qu'un " -"gadget à la fois ; il contient déjà un gadget detype %s" +msgid "Attempting to add a widget with type %s to a %s, but it can only contain one widget at a time; it already contains a widget of type %s" +msgstr "Tentative d'ajout d'un gadget de %s à un %s, mais il ne peut contenir qu'un gadget à la fois ; il contient déjà un gadget detype %s" -#: ../src/libgdl/gdl-dock-item.c:1471 ../src/libgdl/gdl-dock-item.c:1521 +#: ../src/libgdl/gdl-dock-item.c:1471 +#: ../src/libgdl/gdl-dock-item.c:1521 #, c-format msgid "Unsupported docking strategy %s in dock object of type %s" -msgstr "" -"La stratégie d'attache %s n'est pas supportée pour l'objet d'attache de type " -"%s" +msgstr "La stratégie d'attache %s n'est pas supportée pour l'objet d'attache de type %s" #. UnLock menuitem #: ../src/libgdl/gdl-dock-item.c:1629 @@ -8370,45 +8342,34 @@ msgid "Default title for newly created floating docks" msgstr "Titre par défaut pour les nouveaux points d'attache flottants" #: ../src/libgdl/gdl-dock-master.c:149 -msgid "" -"If is set to 1, all the dock items bound to the master are locked; if it's " -"0, all are unlocked; -1 indicates inconsistency among the items" -msgstr "" -"Si la valeur est 1, tous les éléments détachables liés au maître sont " -"verrouillés ; si la valeur est 0, tous sont déverrouillés, -1 indique des " -"états hétérogènes pour les éléments" +msgid "If is set to 1, all the dock items bound to the master are locked; if it's 0, all are unlocked; -1 indicates inconsistency among the items" +msgstr "Si la valeur est 1, tous les éléments détachables liés au maître sont verrouillés ; si la valeur est 0, tous sont déverrouillés, -1 indique des états hétérogènes pour les éléments" -#: ../src/libgdl/gdl-dock-master.c:157 ../src/libgdl/gdl-switcher.c:737 +#: ../src/libgdl/gdl-dock-master.c:157 +#: ../src/libgdl/gdl-switcher.c:737 msgid "Switcher Style" msgstr "Style de commutation" -#: ../src/libgdl/gdl-dock-master.c:158 ../src/libgdl/gdl-switcher.c:738 +#: ../src/libgdl/gdl-dock-master.c:158 +#: ../src/libgdl/gdl-switcher.c:738 msgid "Switcher buttons style" msgstr "Style des boutons de commutation" #: ../src/libgdl/gdl-dock-master.c:783 #, c-format -msgid "" -"master %p: unable to add object %p[%s] to the hash. There already is an " -"item with that name (%p)." -msgstr "" -"maître %p: impossible d'ajouter l'objet %p[%s] dans la table. Il y a déjà un " -"élément avec ce nom (%p)." +msgid "master %p: unable to add object %p[%s] to the hash. There already is an item with that name (%p)." +msgstr "maître %p: impossible d'ajouter l'objet %p[%s] dans la table. Il y a déjà un élément avec ce nom (%p)." #: ../src/libgdl/gdl-dock-master.c:955 #, c-format -msgid "" -"The new dock controller %p is automatic. Only manual dock objects should be " -"named controller." -msgstr "" -"Le nouveau contrôleur d'attache %p est automatique. Seuls les ojbets " -"d'attache manuels peuvent être nommés contrôleurs." +msgid "The new dock controller %p is automatic. Only manual dock objects should be named controller." +msgstr "Le nouveau contrôleur d'attache %p est automatique. Seuls les ojbets d'attache manuels peuvent être nommés contrôleurs." #: ../src/libgdl/gdl-dock-notebook.c:132 #: ../src/ui/dialog/align-and-distribute.cpp:1003 -#: ../src/ui/dialog/document-properties.cpp:149 +#: ../src/ui/dialog/document-properties.cpp:150 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1551 -#: ../src/widgets/desktop-widget.cpp:2003 +#: ../src/widgets/desktop-widget.cpp:1994 #: ../share/extensions/voronoi2svg.inx.h:9 msgid "Page" msgstr "Page" @@ -8418,9 +8379,9 @@ msgid "The index of the current page" msgstr "L'index de la page courante" #: ../src/libgdl/gdl-dock-object.c:125 -#: ../src/ui/dialog/inkscape-preferences.cpp:1486 +#: ../src/ui/dialog/inkscape-preferences.cpp:1495 #: ../src/ui/widget/page-sizer.cpp:258 -#: ../src/widgets/gradient-selector.cpp:157 +#: ../src/widgets/gradient-selector.cpp:158 #: ../src/widgets/sp-xmlview-attr-list.cpp:54 msgid "Name" msgstr "Nom" @@ -8463,37 +8424,26 @@ msgstr "Maître d'attache auquel cet objet d'attache est lié" #: ../src/libgdl/gdl-dock-object.c:463 #, c-format -msgid "" -"Call to gdl_dock_object_dock in a dock object %p (object type is %s) which " -"hasn't implemented this method" -msgstr "" -"Appel à gdl_dock_object_dock dans un objet d'attache %p (le type d'objet est " -"%s) qui n'a pas implémenté cette méthode" +msgid "Call to gdl_dock_object_dock in a dock object %p (object type is %s) which hasn't implemented this method" +msgstr "Appel à gdl_dock_object_dock dans un objet d'attache %p (le type d'objet est %s) qui n'a pas implémenté cette méthode" #: ../src/libgdl/gdl-dock-object.c:602 #, c-format -msgid "" -"Dock operation requested in a non-bound object %p. The application might " -"crash" -msgstr "" -"Opération d'attache demandée sur un ojbet %p non-lié. L'application pourrait " -"planter" +msgid "Dock operation requested in a non-bound object %p. The application might crash" +msgstr "Opération d'attache demandée sur un ojbet %p non-lié. L'application pourrait planter" #: ../src/libgdl/gdl-dock-object.c:609 #, c-format msgid "Cannot dock %p to %p because they belong to different masters" -msgstr "" -"Impossible d'attacher %p à %p car ils appartiennent à des maîtres différents" +msgstr "Impossible d'attacher %p à %p car ils appartiennent à des maîtres différents" #: ../src/libgdl/gdl-dock-object.c:651 #, c-format -msgid "" -"Attempt to bind to %p an already bound dock object %p (current master: %p)" -msgstr "" -"Tentative d'attacher à %p un objet d'attache %p déjà lié par ailleurs " -"(maître actuel: %p)" +msgid "Attempt to bind to %p an already bound dock object %p (current master: %p)" +msgstr "Tentative d'attacher à %p un objet d'attache %p déjà lié par ailleurs (maître actuel: %p)" -#: ../src/libgdl/gdl-dock-paned.c:130 ../src/widgets/ruler.cpp:229 +#: ../src/libgdl/gdl-dock-paned.c:130 +#: ../src/widgets/ruler.cpp:229 msgid "Position" msgstr "Position" @@ -8506,12 +8456,8 @@ msgid "Sticky" msgstr "Collé" #: ../src/libgdl/gdl-dock-placeholder.c:142 -msgid "" -"Whether the placeholder will stick to its host or move up the hierarchy when " -"the host is redocked" -msgstr "" -"Détermine si l'élément substituable restera attaché à son hôte ou remontera " -"dans la hiérarchie quand l'hôte est réattaché" +msgid "Whether the placeholder will stick to its host or move up the hierarchy when the host is redocked" +msgstr "Détermine si l'élément substituable restera attaché à son hôte ou remontera dans la hiérarchie quand l'hôte est réattaché" #: ../src/libgdl/gdl-dock-placeholder.c:149 msgid "Host" @@ -8526,12 +8472,8 @@ msgid "Next placement" msgstr "Placement suivant" #: ../src/libgdl/gdl-dock-placeholder.c:158 -msgid "" -"The position an item will be docked to our host if a request is made to dock " -"to us" -msgstr "" -"La position où un élément sera attaché à l'hôte si une demande d'attachement " -"est faite" +msgid "The position an item will be docked to our host if a request is made to dock to us" +msgstr "La position où un élément sera attaché à l'hôte si une demande d'attachement est faite" #: ../src/libgdl/gdl-dock-placeholder.c:168 msgid "Width for the widget when it's attached to the placeholder" @@ -8547,9 +8489,7 @@ msgstr "Niveau supérieur flottant" #: ../src/libgdl/gdl-dock-placeholder.c:183 msgid "Whether the placeholder is standing in for a floating toplevel dock" -msgstr "" -"Détermine si l'élément substituable réserve la place pour un point d'attache " -"flottant de niveau supérieur" +msgstr "Détermine si l'élément substituable réserve la place pour un point d'attache flottant de niveau supérieur" #: ../src/libgdl/gdl-dock-placeholder.c:189 msgid "X Coordinate" @@ -8569,9 +8509,7 @@ msgstr "Coordonnée Y du point d'attache quand il est flottant" #: ../src/libgdl/gdl-dock-placeholder.c:499 msgid "Attempt to dock a dock object to an unbound placeholder" -msgstr "" -"Tentative d'attachement d'un objet d'attache sur un élément substituable non " -"lié" +msgstr "Tentative d'attachement d'un objet d'attache sur un élément substituable non lié" #: ../src/libgdl/gdl-dock-placeholder.c:611 #, c-format @@ -8580,12 +8518,8 @@ msgstr "Signal de détachement reçu d'un objet (%p) qui n'est pas notre hôte % #: ../src/libgdl/gdl-dock-placeholder.c:636 #, c-format -msgid "" -"Something weird happened while getting the child placement for %p from " -"parent %p" -msgstr "" -"Quelque chose de bizarre est arrivé en essayant d'obtenir le placement du " -"fils %p auprès du parent %p" +msgid "Something weird happened while getting the child placement for %p from parent %p" +msgstr "Quelque chose de bizarre est arrivé en essayant d'obtenir le placement du fils %p auprès du parent %p" #: ../src/libgdl/gdl-dock-tablabel.c:126 msgid "Dockitem which 'owns' this tablabel" @@ -8620,7 +8554,8 @@ msgstr "Cercle par trois points" msgid "Dynamic stroke" msgstr "Contour dynamique" -#: ../src/live_effects/effect.cpp:93 ../share/extensions/extrude.inx.h:1 +#: ../src/live_effects/effect.cpp:93 +#: ../share/extensions/extrude.inx.h:1 msgid "Extrude" msgstr "Extrusion" @@ -8728,7 +8663,8 @@ msgstr "Règle" msgid "Power stroke" msgstr "Contour dynamique" -#: ../src/live_effects/effect.cpp:124 ../src/selection-chemistry.cpp:2789 +#: ../src/live_effects/effect.cpp:124 +#: ../src/selection-chemistry.cpp:2790 msgid "Clone original path" msgstr "Cloner le chemin original" @@ -8737,12 +8673,8 @@ msgid "Is visible?" msgstr "Visible ?" #: ../src/live_effects/effect.cpp:286 -msgid "" -"If unchecked, the effect remains applied to the object but is temporarily " -"disabled on canvas" -msgstr "" -"Si décochée, l'effet est appliqué à l'objet mais est temporairement " -"désactivé sur la zone de travail" +msgid "If unchecked, the effect remains applied to the object but is temporarily disabled on canvas" +msgstr "Si décochée, l'effet est appliqué à l'objet mais est temporairement désactivé sur la zone de travail" #: ../src/live_effects/effect.cpp:307 msgid "No effect" @@ -8751,20 +8683,16 @@ msgstr "Pas d'effet" #: ../src/live_effects/effect.cpp:354 #, c-format msgid "Please specify a parameter path for the LPE '%s' with %d mouse clicks" -msgstr "" -"Veuillez spécifier un chemin paramètre pour l'effet de chemin '%s' avec %d " -"clics de souris" +msgstr "Veuillez spécifier un chemin paramètre pour l'effet de chemin '%s' avec %d clics de souris" -#: ../src/live_effects/effect.cpp:632 +#: ../src/live_effects/effect.cpp:626 #, c-format msgid "Editing parameter %s." msgstr "Édition du paramètre %s." -#: ../src/live_effects/effect.cpp:637 +#: ../src/live_effects/effect.cpp:631 msgid "None of the applied path effect's parameters can be edited on-canvas." -msgstr "" -"Aucun des paramètres d'effet de chemin ne peuvent être modifiés sur la zone " -"de travail." +msgstr "Aucun des paramètres d'effet de chemin ne peuvent être modifiés sur la zone de travail." #: ../src/live_effects/lpe-angle_bisector.cpp:45 #: ../src/live_effects/lpe-parallel.cpp:51 @@ -8813,7 +8741,8 @@ msgstr "Chemin le long duquel le chemin original sera courbé" #: ../src/live_effects/lpe-bendpath.cpp:54 #: ../src/live_effects/lpe-patternalongpath.cpp:62 -#: ../src/ui/dialog/export.cpp:288 ../src/ui/dialog/transformation.cpp:80 +#: ../src/ui/dialog/export.cpp:288 +#: ../src/ui/dialog/transformation.cpp:80 #: ../src/ui/widget/page-sizer.cpp:236 msgid "_Width:" msgstr "_Largeur :" @@ -8865,11 +8794,8 @@ msgstr "" msgid "Identity B" msgstr "Identité" -#: ../src/live_effects/lpe-boolops.cpp:28 ../src/splivarot.cpp:100 -msgid "Exclusion" -msgstr "Exclusion" - -#: ../src/live_effects/lpe-boolops.cpp:29 ../src/splivarot.cpp:70 +#: ../src/live_effects/lpe-boolops.cpp:29 +#: ../src/splivarot.cpp:70 #: ../src/splivarot.cpp:76 msgid "Union" msgstr "Union" @@ -8987,48 +8913,32 @@ msgid "Sta_rt edge variance:" msgstr "Va_riance du bord de départ :" #: ../src/live_effects/lpe-curvestitch.cpp:43 -msgid "" -"The amount of random jitter to move the start points of the stitches inside " -"& outside the guide path" -msgstr "" -"La quantité de perturbation aléatoire dans la position des points de départ " -"des liaisons, à l'intérieur et à l'extérieur du guide" +msgid "The amount of random jitter to move the start points of the stitches inside & outside the guide path" +msgstr "La quantité de perturbation aléatoire dans la position des points de départ des liaisons, à l'intérieur et à l'extérieur du guide" #: ../src/live_effects/lpe-curvestitch.cpp:44 msgid "Sta_rt spacing variance:" msgstr "Va_riance de l'espacement de départ :" #: ../src/live_effects/lpe-curvestitch.cpp:44 -msgid "" -"The amount of random shifting to move the start points of the stitches back " -"& forth along the guide path" -msgstr "" -"La quantité de perturbation aléatoire dans la position des extrémités de " -"chaque point de départ des liaisons, le long du guide" +msgid "The amount of random shifting to move the start points of the stitches back & forth along the guide path" +msgstr "La quantité de perturbation aléatoire dans la position des extrémités de chaque point de départ des liaisons, le long du guide" #: ../src/live_effects/lpe-curvestitch.cpp:45 msgid "End ed_ge variance:" msgstr "Variance du bord de _fin :" #: ../src/live_effects/lpe-curvestitch.cpp:45 -msgid "" -"The amount of randomness that moves the end points of the stitches inside & " -"outside the guide path" -msgstr "" -"La quantité de perturbation aléatoire dans la position des extrémités de " -"chaque point de fin des liaisons, à l'intérieur et à l'extérieur du guide" +msgid "The amount of randomness that moves the end points of the stitches inside & outside the guide path" +msgstr "La quantité de perturbation aléatoire dans la position des extrémités de chaque point de fin des liaisons, à l'intérieur et à l'extérieur du guide" #: ../src/live_effects/lpe-curvestitch.cpp:46 msgid "End spa_cing variance:" msgstr "Variance de l'espa_cement de fin :" #: ../src/live_effects/lpe-curvestitch.cpp:46 -msgid "" -"The amount of random shifting to move the end points of the stitches back & " -"forth along the guide path" -msgstr "" -"La quantité de perturbation aléatoire dans la position des extrémités de " -"chaque point de fin des liaisons, le long du guide" +msgid "The amount of random shifting to move the end points of the stitches back & forth along the guide path" +msgstr "La quantité de perturbation aléatoire dans la position des extrémités de chaque point de fin des liaisons, le long du guide" #: ../src/live_effects/lpe-curvestitch.cpp:47 msgid "Scale _width:" @@ -9044,9 +8954,7 @@ msgstr "R_edimensionner l'épaisseur en fonction de la longueur" #: ../src/live_effects/lpe-curvestitch.cpp:48 msgid "Scale the width of the stitch path relative to its length" -msgstr "" -"Redimensionner l'épaisseur du chemin de liaison proportionnellement à sa " -"longueur" +msgstr "Redimensionner l'épaisseur du chemin de liaison proportionnellement à sa longueur" #: ../src/live_effects/lpe-dynastroke.cpp:35 #, fuzzy @@ -9104,12 +9012,13 @@ msgstr "" #: ../src/live_effects/lpe-dynastroke.cpp:53 #: ../src/live_effects/lpe-tangent_to_curve.cpp:61 #: ../src/widgets/calligraphy-toolbar.cpp:480 -#: ../share/extensions/motion.inx.h:3 ../share/extensions/restack.inx.h:10 +#: ../share/extensions/motion.inx.h:3 +#: ../share/extensions/restack.inx.h:10 msgid "Angle:" msgstr "Angle :" #: ../src/live_effects/lpe-dynastroke.cpp:53 -msgid "direction of thickest strokes (opposite = thinest)" +msgid "direction of thickest strokes (opposite = thinnest)" msgstr "" #. modulo_pi(_("modulo pi"), _("Give forward and backward moves in one direction the same thickness "), "modulo_pi", &wr, this, false), @@ -9139,7 +9048,7 @@ msgid "Grow for:" msgstr "Croissance :" #: ../src/live_effects/lpe-dynastroke.cpp:57 -msgid "Make the stroke thiner near it's start" +msgid "Make the stroke thinner near it's start" msgstr "" #: ../src/live_effects/lpe-dynastroke.cpp:58 @@ -9148,7 +9057,7 @@ msgid "Fade for:" msgstr "Décolorer en :" #: ../src/live_effects/lpe-dynastroke.cpp:58 -msgid "Make the stroke thiner near it's end" +msgid "Make the stroke thinner near it's end" msgstr "" #: ../src/live_effects/lpe-dynastroke.cpp:59 @@ -9177,8 +9086,7 @@ msgstr "Chemin supérieur de l'enveloppe :" #: ../src/live_effects/lpe-envelope.cpp:31 msgid "Top path along which to bend the original path" -msgstr "" -"Chemin supérieur de l'enveloppe le long duquel le chemin original sera courbé" +msgstr "Chemin supérieur de l'enveloppe le long duquel le chemin original sera courbé" #: ../src/live_effects/lpe-envelope.cpp:32 msgid "Right bend path:" @@ -9186,8 +9094,7 @@ msgstr "Chemin droit de l'enveloppe :" #: ../src/live_effects/lpe-envelope.cpp:32 msgid "Right path along which to bend the original path" -msgstr "" -"Chemin droit de l'enveloppe le long duquel le chemin original sera courbé" +msgstr "Chemin droit de l'enveloppe le long duquel le chemin original sera courbé" #: ../src/live_effects/lpe-envelope.cpp:33 msgid "Bottom bend path:" @@ -9195,8 +9102,7 @@ msgstr "Chemin inférieur de l'enveloppe :" #: ../src/live_effects/lpe-envelope.cpp:33 msgid "Bottom path along which to bend the original path" -msgstr "" -"Chemin inférieur de l'enveloppe le long duquel le chemin original sera courbé" +msgstr "Chemin inférieur de l'enveloppe le long duquel le chemin original sera courbé" #: ../src/live_effects/lpe-envelope.cpp:34 msgid "Left bend path:" @@ -9204,8 +9110,7 @@ msgstr "Chemin gauche de l'enveloppe :" #: ../src/live_effects/lpe-envelope.cpp:34 msgid "Left path along which to bend the original path" -msgstr "" -"Chemin gauche de l'enveloppe le long duquel le chemin original sera courbé" +msgstr "Chemin gauche de l'enveloppe le long duquel le chemin original sera courbé" #: ../src/live_effects/lpe-envelope.cpp:35 msgid "E_nable left & right paths" @@ -9244,12 +9149,8 @@ msgid "_Phi:" msgstr "_Phi :" #: ../src/live_effects/lpe-gears.cpp:215 -msgid "" -"Tooth pressure angle (typically 20-25 deg). The ratio of teeth not in " -"contact." -msgstr "" -"Angle de contact des dents (en général de 20 à 25 degrés). Représente la " -"fraction des dents qui ne sont pas en contact." +msgid "Tooth pressure angle (typically 20-25 deg). The ratio of teeth not in contact." +msgstr "Angle de contact des dents (en général de 20 à 25 degrés). Représente la fraction des dents qui ne sont pas en contact." #: ../src/live_effects/lpe-interpolate.cpp:31 msgid "Trajectory:" @@ -9265,82 +9166,71 @@ msgstr "I_ncrément :" #: ../src/live_effects/lpe-interpolate.cpp:32 msgid "Determines the number of steps from start to end path." -msgstr "" -"Définit le nombre d'étapes entre le chemin de début et le chemin de fin." +msgstr "Définit le nombre d'étapes entre le chemin de début et le chemin de fin." #: ../src/live_effects/lpe-interpolate.cpp:33 msgid "E_quidistant spacing" msgstr "Espacement é_quidistant" #: ../src/live_effects/lpe-interpolate.cpp:33 -msgid "" -"If true, the spacing between intermediates is constant along the length of " -"the path. If false, the distance depends on the location of the nodes of the " -"trajectory path." -msgstr "" -"Si vrai, l'espacement entre les intermédiaires est constant tout au long de " -"la longueur du chemin. Si faux, la distance dépend du positionnement des " -"nœuds de la trajectoire." +msgid "If true, the spacing between intermediates is constant along the length of the path. If false, the distance depends on the location of the nodes of the trajectory path." +msgstr "Si vrai, l'espacement entre les intermédiaires est constant tout au long de la longueur du chemin. Si faux, la distance dépend du positionnement des nœuds de la trajectoire." #. initialise your parameters here: -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Fi_xed width:" msgstr "La_rgeur de recouvrement :" -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Size of hidden region of lower string" msgstr "Taille de la partie masquée sur le tracé inférieur" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "_In units of stroke width" msgstr "Proport_ionnellement à la largeur du trait" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "Consider 'Interruption width' as a ratio of stroke width" -msgstr "" -"La largeur de l'interruption est exprimée en proportion de l'épaisseur du " -"trait" +msgstr "La largeur de l'interruption est exprimée en proportion de l'épaisseur du trait" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "St_roke width" msgstr "Épaisseur du contou_r" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "Add the stroke width to the interruption size" msgstr "Ajoute l'épaisseur du trait à la taille de l'interruption" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "_Crossing path stroke width" msgstr "Épaisseur du trait _croisant" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "Add crossed stroke width to the interruption size" msgstr "Ajoute l'épaisseur du trait croisé à la taille de l'interruption" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "S_witcher size:" msgstr "Taille du sé_lecteur :" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "Orientation indicator/switcher size" -msgstr "" -"Le sélecteur précise l'orientation des croisements et permet de la changer " -"(clic). Changer la sélection par cliquer-déplacer" +msgstr "Le sélecteur précise l'orientation des croisements et permet de la changer (clic). Changer la sélection par cliquer-déplacer" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossing Signs" msgstr "Signes de croisement" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossings signs" msgstr "Signes de croisement" -#: ../src/live_effects/lpe-knot.cpp:617 +#: ../src/live_effects/lpe-knot.cpp:620 msgid "Drag to select a crossing, click to flip it" msgstr "Glisser pour sélectionner un croisement, cliquer pour le basculer" #. / @todo Is this the right verb? -#: ../src/live_effects/lpe-knot.cpp:655 +#: ../src/live_effects/lpe-knot.cpp:658 msgid "Change knot crossing" msgstr "Modifier le croisement de l'entrelacs" @@ -9506,22 +9396,22 @@ msgid "Control handle 15" msgstr "Poignée de point de rebroussement" #: ../src/live_effects/lpe-line_segment.cpp:25 -#: ../src/widgets/lpe-toolbar.cpp:252 +#: ../src/widgets/lpe-toolbar.cpp:254 msgid "Closed" msgstr "Fermé" #: ../src/live_effects/lpe-line_segment.cpp:26 -#: ../src/widgets/lpe-toolbar.cpp:254 +#: ../src/widgets/lpe-toolbar.cpp:256 msgid "Open start" msgstr "Début ouvert" #: ../src/live_effects/lpe-line_segment.cpp:27 -#: ../src/widgets/lpe-toolbar.cpp:256 +#: ../src/widgets/lpe-toolbar.cpp:258 msgid "Open end" msgstr "Fin ouverte" #: ../src/live_effects/lpe-line_segment.cpp:28 -#: ../src/widgets/lpe-toolbar.cpp:258 +#: ../src/widgets/lpe-toolbar.cpp:260 msgid "Open both" msgstr "Les deux ouverts" @@ -9581,7 +9471,7 @@ msgstr "" #: ../src/live_effects/lpe-path_length.cpp:26 #: ../src/live_effects/lpe-sketch.cpp:58 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 #: ../share/extensions/render_alphabetsoup.inx.h:3 msgid "Scale:" msgstr "Longueur/Courbure :" @@ -9601,7 +9491,8 @@ msgid "Unit:" msgstr "Unité :" #: ../src/live_effects/lpe-path_length.cpp:28 -#: ../src/live_effects/lpe-ruler.cpp:42 ../src/widgets/ruler.cpp:201 +#: ../src/live_effects/lpe-ruler.cpp:42 +#: ../src/widgets/ruler.cpp:201 msgid "Unit" msgstr "Unité" @@ -9669,12 +9560,8 @@ msgstr "Espa_cement :" #: ../src/live_effects/lpe-patternalongpath.cpp:68 #, no-c-format -msgid "" -"Space between copies of the pattern. Negative values allowed, but are " -"limited to -90% of pattern width." -msgstr "" -"Espace entre les exemplaires du motif. Les valeurs négatives sont " -"autorisées, mais limitées à -90 % de la largeur du motif." +msgid "Space between copies of the pattern. Negative values allowed, but are limited to -90% of pattern width." +msgstr "Espace entre les exemplaires du motif. Les valeurs négatives sont autorisées, mais limitées à -90 % de la largeur du motif." #: ../src/live_effects/lpe-patternalongpath.cpp:70 msgid "No_rmal offset:" @@ -9689,12 +9576,8 @@ msgid "Offsets in _unit of pattern size" msgstr "Décalages en _unité de taille de motif" #: ../src/live_effects/lpe-patternalongpath.cpp:73 -msgid "" -"Spacing, tangential and normal offset are expressed as a ratio of width/" -"height" -msgstr "" -"L'espacement et le décalage tangentiel sont exprimés en proportion de la " -"longueur du motif, le décalage normal en proportion de sa largeur" +msgid "Spacing, tangential and normal offset are expressed as a ratio of width/height" +msgstr "L'espacement et le décalage tangentiel sont exprimés en proportion de la longueur du motif, le décalage normal en proportion de sa largeur" #: ../src/live_effects/lpe-patternalongpath.cpp:75 msgid "Pattern is _vertical" @@ -9710,9 +9593,7 @@ msgstr "_Fusionner les extrémités proches :" #: ../src/live_effects/lpe-patternalongpath.cpp:77 msgid "Fuse ends closer than this number. 0 means don't fuse." -msgstr "" -"Fusionne les extrémités plus proches que ce nombre. 0 indique de ne pas " -"fusionner." +msgstr "Fusionne les extrémités plus proches que ce nombre. 0 indique de ne pas fusionner." #: ../src/live_effects/lpe-perp_bisector.cpp:159 msgid "Adjust the bisector's \"left\" end" @@ -9768,9 +9649,7 @@ msgid "Uses XY plane?" msgstr "" #: ../src/live_effects/lpe-perspective_path.cpp:51 -msgid "" -"If true, put the path on the left side of an imaginary box, otherwise on the " -"right side" +msgid "If true, put the path on the left side of an imaginary box, otherwise on the right side" msgstr "" #: ../src/live_effects/lpe-perspective_path.cpp:145 @@ -9852,9 +9731,7 @@ msgid "Interpolator type:" msgstr "Type d'interpolateur :" #: ../src/live_effects/lpe-powerstroke.cpp:235 -msgid "" -"Determines which kind of interpolator will be used to interpolate between " -"stroke width along the path" +msgid "Determines which kind of interpolator will be used to interpolate between stroke width along the path" msgstr "" #: ../src/live_effects/lpe-powerstroke.cpp:236 @@ -9863,9 +9740,7 @@ msgid "Smoothness:" msgstr "Lissage :" #: ../src/live_effects/lpe-powerstroke.cpp:236 -msgid "" -"Sets the smoothness for the CubicBezierJohan interpolator; 0 = linear " -"interpolation, 1 = smooth" +msgid "Sets the smoothness for the CubicBezierJohan interpolator; 0 = linear interpolation, 1 = smooth" msgstr "" #: ../src/live_effects/lpe-powerstroke.cpp:237 @@ -9937,48 +9812,32 @@ msgid "Half-turns smoothness: 1st side, in:" msgstr "Lissage des demi-tours : 1er côté, arrivée :" #: ../src/live_effects/lpe-rough-hatches.cpp:228 -msgid "" -"Set smoothness/sharpness of path when reaching a 'bottom' half-turn. " -"0=sharp, 1=default" -msgstr "" -"Définit le lissage du chemin lorsqu'il atteint un demi-tour inférieur. " -"0=net, 1=défaut" +msgid "Set smoothness/sharpness of path when reaching a 'bottom' half-turn. 0=sharp, 1=default" +msgstr "Définit le lissage du chemin lorsqu'il atteint un demi-tour inférieur. 0=net, 1=défaut" #: ../src/live_effects/lpe-rough-hatches.cpp:229 msgid "1st side, out:" msgstr "1er côté, départ :" #: ../src/live_effects/lpe-rough-hatches.cpp:229 -msgid "" -"Set smoothness/sharpness of path when leaving a 'bottom' half-turn. 0=sharp, " -"1=default" -msgstr "" -"Définit le lissage du chemin lorsqu'il quitte un demi-tour inférieur. 0=net, " -"1=défaut" +msgid "Set smoothness/sharpness of path when leaving a 'bottom' half-turn. 0=sharp, 1=default" +msgstr "Définit le lissage du chemin lorsqu'il quitte un demi-tour inférieur. 0=net, 1=défaut" #: ../src/live_effects/lpe-rough-hatches.cpp:230 msgid "2nd side, in:" msgstr "2e côté, arrivée :" #: ../src/live_effects/lpe-rough-hatches.cpp:230 -msgid "" -"Set smoothness/sharpness of path when reaching a 'top' half-turn. 0=sharp, " -"1=default" -msgstr "" -"Définit le lissage du chemin lorsqu'il atteint un demi-tour supérieur. " -"0=net, 1=défaut" +msgid "Set smoothness/sharpness of path when reaching a 'top' half-turn. 0=sharp, 1=default" +msgstr "Définit le lissage du chemin lorsqu'il atteint un demi-tour supérieur. 0=net, 1=défaut" #: ../src/live_effects/lpe-rough-hatches.cpp:231 msgid "2nd side, out:" msgstr "2e côté, départ :" #: ../src/live_effects/lpe-rough-hatches.cpp:231 -msgid "" -"Set smoothness/sharpness of path when leaving a 'top' half-turn. 0=sharp, " -"1=default" -msgstr "" -"Définit le lissage du chemin lorsqu'il quitte un demi-tour supérieur. 0=net, " -"1=défaut" +msgid "Set smoothness/sharpness of path when leaving a 'top' half-turn. 0=sharp, 1=default" +msgstr "Définit le lissage du chemin lorsqu'il quitte un demi-tour supérieur. 0=net, 1=défaut" #: ../src/live_effects/lpe-rough-hatches.cpp:232 msgid "Magnitude jitter: 1st side:" @@ -9986,9 +9845,7 @@ msgstr "Aléa d'amplitude : 1er côté :" #: ../src/live_effects/lpe-rough-hatches.cpp:232 msgid "Randomly moves 'bottom' half-turns to produce magnitude variations." -msgstr "" -"Déplace aléatoirement les demi-tours inférieurs pour produire des variations " -"d'amplitude." +msgstr "Déplace aléatoirement les demi-tours inférieurs pour produire des variations d'amplitude." #: ../src/live_effects/lpe-rough-hatches.cpp:233 #: ../src/live_effects/lpe-rough-hatches.cpp:235 @@ -9998,29 +9855,19 @@ msgstr "2e côté :" #: ../src/live_effects/lpe-rough-hatches.cpp:233 msgid "Randomly moves 'top' half-turns to produce magnitude variations." -msgstr "" -"Déplace aléatoirement les demi-tours supérieurs pour produire des variations " -"d'amplitude." +msgstr "Déplace aléatoirement les demi-tours supérieurs pour produire des variations d'amplitude." #: ../src/live_effects/lpe-rough-hatches.cpp:234 msgid "Parallelism jitter: 1st side:" msgstr "Aléa de parallélisme : 1er côté :" #: ../src/live_effects/lpe-rough-hatches.cpp:234 -msgid "" -"Add direction randomness by moving 'bottom' half-turns tangentially to the " -"boundary." -msgstr "" -"Ajoute un caractère aléatoire à la direction en déplaçant les demi-tours " -"inférieurs tangentiellement par rapport à la bordure." +msgid "Add direction randomness by moving 'bottom' half-turns tangentially to the boundary." +msgstr "Ajoute un caractère aléatoire à la direction en déplaçant les demi-tours inférieurs tangentiellement par rapport à la bordure." #: ../src/live_effects/lpe-rough-hatches.cpp:235 -msgid "" -"Add direction randomness by randomly moving 'top' half-turns tangentially to " -"the boundary." -msgstr "" -"Ajoute un caractère aléatoire à la direction en déplaçant les demi-tours " -"supérieurs tangentiellement par rapport à la bordure." +msgid "Add direction randomness by randomly moving 'top' half-turns tangentially to the boundary." +msgstr "Ajoute un caractère aléatoire à la direction en déplaçant les demi-tours supérieurs tangentiellement par rapport à la bordure." #: ../src/live_effects/lpe-rough-hatches.cpp:236 msgid "Variance: 1st side:" @@ -10101,34 +9948,35 @@ msgid "Global bending" msgstr "Flexion globale" #: ../src/live_effects/lpe-rough-hatches.cpp:249 -msgid "" -"Relative position to a reference point defines global bending direction and " -"amount" -msgstr "" -"La position relative à un point de référence définit globalement la " -"direction de la flexion et sa quantité" +msgid "Relative position to a reference point defines global bending direction and amount" +msgstr "La position relative à un point de référence définit globalement la direction de la flexion et sa quantité" -#: ../src/live_effects/lpe-ruler.cpp:25 ../share/extensions/restack.inx.h:12 +#: ../src/live_effects/lpe-ruler.cpp:25 +#: ../share/extensions/restack.inx.h:12 #: ../share/extensions/text_extract.inx.h:8 #: ../share/extensions/text_merge.inx.h:8 msgid "Left" msgstr "Gauche" -#: ../src/live_effects/lpe-ruler.cpp:26 ../share/extensions/restack.inx.h:14 +#: ../src/live_effects/lpe-ruler.cpp:26 +#: ../share/extensions/restack.inx.h:14 #: ../share/extensions/text_extract.inx.h:10 #: ../share/extensions/text_merge.inx.h:10 msgid "Right" msgstr "Droite" -#: ../src/live_effects/lpe-ruler.cpp:27 ../src/live_effects/lpe-ruler.cpp:35 +#: ../src/live_effects/lpe-ruler.cpp:27 +#: ../src/live_effects/lpe-ruler.cpp:35 msgid "Both" msgstr "Les deux" -#: ../src/live_effects/lpe-ruler.cpp:33 ../src/widgets/arc-toolbar.cpp:336 +#: ../src/live_effects/lpe-ruler.cpp:33 +#: ../src/widgets/arc-toolbar.cpp:336 msgid "Start" msgstr "Début" -#: ../src/live_effects/lpe-ruler.cpp:34 ../src/widgets/arc-toolbar.cpp:349 +#: ../src/live_effects/lpe-ruler.cpp:34 +#: ../src/widgets/arc-toolbar.cpp:349 msgid "End" msgstr "Fin" @@ -10162,8 +10010,7 @@ msgstr "Graduations _principales :" #: ../src/live_effects/lpe-ruler.cpp:45 msgid "Draw a major mark every ... steps" -msgstr "" -"Dessine une graduation principale en fonction de ce nombre de graduations" +msgstr "Dessine une graduation principale en fonction de ce nombre de graduations" #: ../src/live_effects/lpe-ruler.cpp:46 msgid "Shift marks _by:" @@ -10179,9 +10026,7 @@ msgstr "Positionnement de la règle :" #: ../src/live_effects/lpe-ruler.cpp:47 msgid "Direction of marks (when viewing along the path from start to end)" -msgstr "" -"Positionnement de la règle, en regardant le long du chemin du début vers la " -"fin" +msgstr "Positionnement de la règle, en regardant le long du chemin du début vers la fin" #: ../src/live_effects/lpe-ruler.cpp:48 msgid "_Offset:" @@ -10197,9 +10042,7 @@ msgstr "Graduation à l'extrémité :" #: ../src/live_effects/lpe-ruler.cpp:49 msgid "Choose whether to draw marks at the beginning and end of the path" -msgstr "" -"Choisir si les graduations doivent être dessinées au début ou à la fin du " -"chemin" +msgstr "Choisir si les graduations doivent être dessinées au début ou à la fin du chemin" #. initialise your parameters here: #: ../src/live_effects/lpe-skeleton.cpp:37 @@ -10235,9 +10078,7 @@ msgstr "Variation de longueur des traits :" #: ../src/live_effects/lpe-sketch.cpp:42 msgid "Random variation of stroke length (relative to maximum length)" -msgstr "" -"Variation aléatoire de la longueur des traits (relative à la longueur " -"maximale)" +msgstr "Variation aléatoire de la longueur des traits (relative à la longueur maximale)" #: ../src/live_effects/lpe-sketch.cpp:43 msgid "Max. overlap:" @@ -10253,20 +10094,15 @@ msgstr "Variation de chevauchement :" #: ../src/live_effects/lpe-sketch.cpp:46 msgid "Random variation of overlap (relative to maximum overlap)" -msgstr "" -"Variation aléatoire de chevauchement (relatif au chevauchement maximum)" +msgstr "Variation aléatoire de chevauchement (relatif au chevauchement maximum)" #: ../src/live_effects/lpe-sketch.cpp:47 msgid "Max. end tolerance:" msgstr "Tolérance maximale de fin :" #: ../src/live_effects/lpe-sketch.cpp:48 -msgid "" -"Maximum distance between ends of original and approximating paths (relative " -"to maximum length)" -msgstr "" -"Distance maximale entre la fin de l'original et les chemins approximatifs " -"(relatif à la longueur maximale)" +msgid "Maximum distance between ends of original and approximating paths (relative to maximum length)" +msgstr "Distance maximale entre la fin de l'original et les chemins approximatifs (relatif à la longueur maximale)" #: ../src/live_effects/lpe-sketch.cpp:49 msgid "Average offset:" @@ -10301,12 +10137,8 @@ msgid "How many construction lines (tangents) to draw" msgstr "Nombre de lignes de construction (tangentes) à dessiner" #: ../src/live_effects/lpe-sketch.cpp:59 -msgid "" -"Scale factor relating curvature and length of construction lines (try " -"5*offset)" -msgstr "" -"Coefficient de proportionnalité entre longueur des lignes de construction et " -"rayon de courbure du chemin (essayer 5 fois la valeur de décalage)" +msgid "Scale factor relating curvature and length of construction lines (try 5*offset)" +msgstr "Coefficient de proportionnalité entre longueur des lignes de construction et rayon de courbure du chemin (essayer 5 fois la valeur de décalage)" #: ../src/live_effects/lpe-sketch.cpp:60 msgid "Max. length:" @@ -10330,9 +10162,7 @@ msgstr "Caractère aléatoire du placement :" #: ../src/live_effects/lpe-sketch.cpp:62 msgid "0: evenly distributed construction lines, 1: purely random placement" -msgstr "" -"0 : lignes de construction régulièrement distribuées, 1 : placement purement " -"aléatoire" +msgstr "0 : lignes de construction régulièrement distribuées, 1 : placement purement aléatoire" #: ../src/live_effects/lpe-sketch.cpp:64 msgid "k_min:" @@ -10360,9 +10190,7 @@ msgid "Location along curve:" msgstr "Emplacement du cache utilisateur" #: ../src/live_effects/lpe-tangent_to_curve.cpp:62 -msgid "" -"Location of the point of attachment along the curve (between 0.0 and number-" -"of-segments)" +msgid "Location of the point of attachment along the curve (between 0.0 and number-of-segments)" msgstr "" #: ../src/live_effects/lpe-tangent_to_curve.cpp:63 @@ -10424,23 +10252,15 @@ msgstr "Chemin générateur :" #: ../src/live_effects/lpe-vonkoch.cpp:48 msgid "Path whose segments define the iterated transforms" -msgstr "" -"La fractale est obtenue en itérant les transformations qui envoient le " -"chemin de référence sur chaque segment de celui-ci (un segment isolé définit " -"une transformation préservant les proportions, deux segments attachés " -"définissent une transformation générale)" +msgstr "La fractale est obtenue en itérant les transformations qui envoient le chemin de référence sur chaque segment de celui-ci (un segment isolé définit une transformation préservant les proportions, deux segments attachés définissent une transformation générale)" #: ../src/live_effects/lpe-vonkoch.cpp:49 msgid "_Use uniform transforms only" msgstr "_Utiliser uniquement les transformations uniformes" #: ../src/live_effects/lpe-vonkoch.cpp:49 -msgid "" -"2 consecutive segments are used to reverse/preserve orientation only " -"(otherwise, they define a general transform)." -msgstr "" -"N'utiliser que des transformations qui préservent les proportions " -"(rotations, symétries, redimensionnements)." +msgid "2 consecutive segments are used to reverse/preserve orientation only (otherwise, they define a general transform)." +msgstr "N'utiliser que des transformations qui préservent les proportions (rotations, symétries, redimensionnements)." #: ../src/live_effects/lpe-vonkoch.cpp:50 msgid "Dra_w all generations" @@ -10457,9 +10277,7 @@ msgstr "Segment de référence :" #: ../src/live_effects/lpe-vonkoch.cpp:52 msgid "The reference segment. Defaults to the horizontal midline of the bbox." -msgstr "" -"Segment de référence. Par défaut centré horizontalement sur la boîte " -"englobante." +msgstr "Segment de référence. Par défaut centré horizontalement sur la boîte englobante." #. refA(_("Ref Start"), _("Left side middle of the reference box"), "refA", &wr, this), #. refB(_("Ref End"), _("Right side middle of the reference box"), "refB", &wr, this), @@ -10480,12 +10298,12 @@ msgstr "Modifier le paramètre booléen" msgid "Change enumeration parameter" msgstr "Changer le paramètre d'énumération" -#: ../src/live_effects/parameter/originalpath.cpp:70 -#: ../src/live_effects/parameter/path.cpp:194 +#: ../src/live_effects/parameter/originalpath.cpp:71 +#: ../src/live_effects/parameter/path.cpp:195 msgid "Link to path" msgstr "Lier au chemin" -#: ../src/live_effects/parameter/originalpath.cpp:82 +#: ../src/live_effects/parameter/originalpath.cpp:83 #, fuzzy msgid "Select original" msgstr "Sélectionner l'_original" @@ -10494,23 +10312,23 @@ msgstr "Sélectionner l'_original" msgid "Change scalar parameter" msgstr "Modifier le paramètre scalaire" -#: ../src/live_effects/parameter/path.cpp:164 +#: ../src/live_effects/parameter/path.cpp:165 msgid "Edit on-canvas" msgstr "Éditer sur la zone de travail" -#: ../src/live_effects/parameter/path.cpp:174 +#: ../src/live_effects/parameter/path.cpp:175 msgid "Copy path" msgstr "Copier le chemin" -#: ../src/live_effects/parameter/path.cpp:184 +#: ../src/live_effects/parameter/path.cpp:185 msgid "Paste path" msgstr "Coller le chemin" -#: ../src/live_effects/parameter/path.cpp:437 +#: ../src/live_effects/parameter/path.cpp:438 msgid "Paste path parameter" msgstr "Coller le paramètre du chemin" -#: ../src/live_effects/parameter/path.cpp:469 +#: ../src/live_effects/parameter/path.cpp:470 msgid "Link path parameter to path" msgstr "Lier les paramètres de chemin au chemin" @@ -10520,9 +10338,7 @@ msgstr "Modifier le paramètre de point" #: ../src/live_effects/parameter/powerstrokepointarray.cpp:226 #: ../src/live_effects/parameter/powerstrokepointarray.cpp:238 -msgid "" -"Stroke width control point: drag to alter the stroke width. Ctrl" -"+click adds a control point, Ctrl+Alt+click deletes it." +msgid "Stroke width control point: drag to alter the stroke width. Ctrl+click adds a control point, Ctrl+Alt+click deletes it." msgstr "" #: ../src/live_effects/parameter/random.cpp:134 @@ -10541,11 +10357,6 @@ msgstr "Modifier le paramètre d'unité" msgid "Change vector parameter" msgstr "Modifier le paramètre de vecteur" -#: ../src/lpe-tool-context.cpp:204 -#, fuzzy -msgid "Choose a construction tool from the toolbar." -msgstr "Sélectionner un outil secondaire dans la barre d'outils" - #: ../src/main-cmdlineact.cpp:50 #, c-format msgid "Unable to find verb ID '%s' specified on the command line.\n" @@ -10556,298 +10367,257 @@ msgstr "Verbe '%s' spécifié sur la ligne de commande introuvable.\n" msgid "Unable to find node ID: '%s'\n" msgstr "Impossible de trouver le nœud '%s'\n" -#: ../src/main.cpp:297 +#: ../src/main.cpp:295 msgid "Print the Inkscape version number" msgstr "Afficher la version d'Inkscape" -#: ../src/main.cpp:302 +#: ../src/main.cpp:300 msgid "Do not use X server (only process files from console)" -msgstr "" -"Ne pas utiliser le serveur X (traiter les fichiers seulement depuis la " -"console)" +msgstr "Ne pas utiliser le serveur X (traiter les fichiers seulement depuis la console)" -#: ../src/main.cpp:307 +#: ../src/main.cpp:305 msgid "Try to use X server (even if $DISPLAY is not set)" msgstr "Essayer d'utiliser le serveur X (même si $DISPLAY n'est pas défini)" -#: ../src/main.cpp:312 +#: ../src/main.cpp:310 msgid "Open specified document(s) (option string may be excluded)" msgstr "Ouvrir les document(s) spécifiés (la chaîne d'option peut être exclue)" -#: ../src/main.cpp:313 ../src/main.cpp:318 ../src/main.cpp:323 -#: ../src/main.cpp:395 ../src/main.cpp:400 ../src/main.cpp:405 -#: ../src/main.cpp:416 ../src/main.cpp:433 +#: ../src/main.cpp:311 +#: ../src/main.cpp:316 +#: ../src/main.cpp:321 +#: ../src/main.cpp:393 +#: ../src/main.cpp:398 +#: ../src/main.cpp:403 +#: ../src/main.cpp:414 +#: ../src/main.cpp:430 +#: ../src/main.cpp:435 msgid "FILENAME" msgstr "NOMDEFICHIER" -#: ../src/main.cpp:317 +#: ../src/main.cpp:315 msgid "Print document(s) to specified output file (use '| program' for pipe)" -msgstr "" -"Imprimer les document(s) dans le fichier de sortie spécifié (utilisez '| " -"programme ' pour envoyer la sortie à un programme)" +msgstr "Imprimer les document(s) dans le fichier de sortie spécifié (utilisez '| programme ' pour envoyer la sortie à un programme)" -#: ../src/main.cpp:322 +#: ../src/main.cpp:320 msgid "Export document to a PNG file" msgstr "Exporter le document vers un fichier PNG" -#: ../src/main.cpp:327 -msgid "" -"Resolution for exporting to bitmap and for rasterization of filters in PS/" -"EPS/PDF (default 90)" -msgstr "" -"Résolution pour l'exportation de bitmap et la rastérisation des filtres en " -"PS/EPS/PDS (90 par défaut)" +#: ../src/main.cpp:325 +msgid "Resolution for exporting to bitmap and for rasterization of filters in PS/EPS/PDF (default 90)" +msgstr "Résolution pour l'exportation de bitmap et la rastérisation des filtres en PS/EPS/PDS (90 par défaut)" -#: ../src/main.cpp:328 ../src/ui/widget/rendering-options.cpp:34 +#: ../src/main.cpp:326 +#: ../src/ui/widget/rendering-options.cpp:34 msgid "DPI" msgstr "PPP" -#: ../src/main.cpp:332 -msgid "" -"Exported area in SVG user units (default is the page; 0,0 is lower-left " -"corner)" -msgstr "" -"Zone à exporter, en unités utilisateur SVG (par défaut, la zone de travail " -"entière ; 0,0 est le coin inférieur gauche)" +#: ../src/main.cpp:330 +msgid "Exported area in SVG user units (default is the page; 0,0 is lower-left corner)" +msgstr "Zone à exporter, en unités utilisateur SVG (par défaut, la zone de travail entière ; 0,0 est le coin inférieur gauche)" -#: ../src/main.cpp:333 +#: ../src/main.cpp:331 msgid "x0:y0:x1:y1" msgstr "x0:y0:x1:y1" -#: ../src/main.cpp:337 +#: ../src/main.cpp:335 msgid "Exported area is the entire drawing (not page)" msgstr "La zone à exporter est le dessin entier (pas la zone de travail)" -#: ../src/main.cpp:342 +#: ../src/main.cpp:340 msgid "Exported area is the entire page" msgstr "La zone à exporter est la zone de travail entière" -#: ../src/main.cpp:347 +#: ../src/main.cpp:345 msgid "Only for PS/EPS/PDF, sets margin in mm around exported area (default 0)" msgstr "" -#: ../src/main.cpp:348 ../src/main.cpp:390 +#: ../src/main.cpp:346 +#: ../src/main.cpp:388 msgid "VALUE" msgstr "VALEUR" -#: ../src/main.cpp:352 -msgid "" -"Snap the bitmap export area outwards to the nearest integer values (in SVG " -"user units)" -msgstr "" -"Ajuster la zone à exporter en bitmap aux valeurs entières supérieures les " -"plus proches (en unités utilisateur SVG)" +#: ../src/main.cpp:350 +msgid "Snap the bitmap export area outwards to the nearest integer values (in SVG user units)" +msgstr "Ajuster la zone à exporter en bitmap aux valeurs entières supérieures les plus proches (en unités utilisateur SVG)" -#: ../src/main.cpp:357 +#: ../src/main.cpp:355 msgid "The width of exported bitmap in pixels (overrides export-dpi)" msgstr "La largeur en pixels du bitmap exporté (préempte export-dpi)" -#: ../src/main.cpp:358 +#: ../src/main.cpp:356 msgid "WIDTH" msgstr "LARGEUR" -#: ../src/main.cpp:362 +#: ../src/main.cpp:360 msgid "The height of exported bitmap in pixels (overrides export-dpi)" msgstr "La hauteur en pixels du bitmap exporté (préempte export-dpi)" -#: ../src/main.cpp:363 +#: ../src/main.cpp:361 msgid "HEIGHT" msgstr "HAUTEUR" -#: ../src/main.cpp:367 +#: ../src/main.cpp:365 msgid "The ID of the object to export" msgstr "L'Id de l'objet à exporter" -#: ../src/main.cpp:368 ../src/main.cpp:478 -#: ../src/ui/dialog/inkscape-preferences.cpp:1489 +#: ../src/main.cpp:366 +#: ../src/main.cpp:479 +#: ../src/ui/dialog/inkscape-preferences.cpp:1498 msgid "ID" msgstr "Id" #. TRANSLATORS: this means: "Only export the object whose id is given in --export-id". #. See "man inkscape" for details. -#: ../src/main.cpp:374 -msgid "" -"Export just the object with export-id, hide all others (only with export-id)" -msgstr "" -"N'exporter que l'objet avec export-id, cacher tous les autres (seulement " -"avec export-id)" +#: ../src/main.cpp:372 +msgid "Export just the object with export-id, hide all others (only with export-id)" +msgstr "N'exporter que l'objet avec export-id, cacher tous les autres (seulement avec export-id)" -#: ../src/main.cpp:379 +#: ../src/main.cpp:377 msgid "Use stored filename and DPI hints when exporting (only with export-id)" -msgstr "" -"Utiliser le nom de fichier et la résolution enregistrés lors de " -"l'exportation (seulement avec export-id)" +msgstr "Utiliser le nom de fichier et la résolution enregistrés lors de l'exportation (seulement avec export-id)" -#: ../src/main.cpp:384 +#: ../src/main.cpp:382 msgid "Background color of exported bitmap (any SVG-supported color string)" -msgstr "" -"Couleur de fond du bitmap exporté (n'importe quelle code de couleur permise " -"par SVG)" +msgstr "Couleur de fond du bitmap exporté (n'importe quelle code de couleur permise par SVG)" -#: ../src/main.cpp:385 +#: ../src/main.cpp:383 msgid "COLOR" msgstr "COULEUR" -#: ../src/main.cpp:389 +#: ../src/main.cpp:387 msgid "Background opacity of exported bitmap (either 0.0 to 1.0, or 1 to 255)" msgstr "Opacité du fond du bitmap exporté (entre 0,0 et 1,0 ou 1 et 255))" -#: ../src/main.cpp:394 +#: ../src/main.cpp:392 msgid "Export document to plain SVG file (no sodipodi or inkscape namespaces)" -msgstr "" -"Exporter le document en SVG simple (sans espace de nom de Sodipodi ou " -"d'Inkscape)" +msgstr "Exporter le document en SVG simple (sans espace de nom de Sodipodi ou d'Inkscape)" -#: ../src/main.cpp:399 +#: ../src/main.cpp:397 msgid "Export document to a PS file" msgstr "Exporter le document en fichier PS" -#: ../src/main.cpp:404 +#: ../src/main.cpp:402 msgid "Export document to an EPS file" msgstr "Exporter le document en fichier EPS" -#: ../src/main.cpp:409 -msgid "" -"Choose the PostScript Level used to export. Possible choices are 2 (the " -"default) and 3" +#: ../src/main.cpp:407 +msgid "Choose the PostScript Level used to export. Possible choices are 2 (the default) and 3" msgstr "" -#: ../src/main.cpp:411 +#: ../src/main.cpp:409 msgid "PS Level" msgstr "Niveau PostScript" -#: ../src/main.cpp:415 +#: ../src/main.cpp:413 msgid "Export document to a PDF file" msgstr "Exporter le document en fichier PDF" #. TRANSLATORS: "--export-pdf-version" is an Inkscape command line option; see "inkscape --help" -#: ../src/main.cpp:421 -msgid "" -"Export PDF to given version. (hint: make sure to input the exact string " -"found in the PDF export dialog, e.g. \"PDF 1.4\" which is PDF-a conformant)" +#: ../src/main.cpp:419 +msgid "Export PDF to given version. (hint: make sure to input the exact string found in the PDF export dialog, e.g. \"PDF 1.4\" which is PDF-a conformant)" msgstr "" -#: ../src/main.cpp:422 +#: ../src/main.cpp:420 msgid "PDF_VERSION" msgstr "" -#: ../src/main.cpp:426 -msgid "" -"Export PDF/PS/EPS without text. Besides the PDF/PS/EPS, a LaTeX file is " -"exported, putting the text on top of the PDF/PS/EPS file. Include the result " -"in LaTeX like: \\input{latexfile.tex}" -msgstr "" -"Exporte en PDF, PS ou EPS sans texte, celui-ci étant exporté dans un LaTex " -"séparé. Le résultat peut être intégré dans LaTeX avec : \\input{latexfile." -"tex}" +#: ../src/main.cpp:424 +msgid "Export PDF/PS/EPS without text. Besides the PDF/PS/EPS, a LaTeX file is exported, putting the text on top of the PDF/PS/EPS file. Include the result in LaTeX like: \\input{latexfile.tex}" +msgstr "Exporte en PDF, PS ou EPS sans texte, celui-ci étant exporté dans un LaTex séparé. Le résultat peut être intégré dans LaTeX avec : \\input{latexfile.tex}" -#: ../src/main.cpp:432 +#: ../src/main.cpp:429 msgid "Export document to an Enhanced Metafile (EMF) File" msgstr "Exporter le document en fichier EMF (Métafichier amélioré)" -#: ../src/main.cpp:438 +#: ../src/main.cpp:434 +#, fuzzy +msgid "Export document to a Windows Metafile (WMF) File" +msgstr "Exporter le document en fichier EMF (Métafichier amélioré)" + +#: ../src/main.cpp:439 msgid "Convert text object to paths on export (PS, EPS, PDF, SVG)" -msgstr "" -"Convertir les objets texte en chemins lors de l'export (PS, EPS, PDF, SVG)" +msgstr "Convertir les objets texte en chemins lors de l'export (PS, EPS, PDF, SVG)" -#: ../src/main.cpp:443 -msgid "" -"Render filtered objects without filters, instead of rasterizing (PS, EPS, " -"PDF)" -msgstr "" -"Les objets filtrés sont rendus sans filtres, plutôt que rastérisés (PS, EPS, " -"PDF)" +#: ../src/main.cpp:444 +msgid "Render filtered objects without filters, instead of rasterizing (PS, EPS, PDF)" +msgstr "Les objets filtrés sont rendus sans filtres, plutôt que rastérisés (PS, EPS, PDF)" #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help" -#: ../src/main.cpp:449 -msgid "" -"Query the X coordinate of the drawing or, if specified, of the object with --" -"query-id" -msgstr "" -"Demander l'abscisse (coordonnée X) du dessin ou, si spécifié avec --query-" -"id, de l'objet" +#: ../src/main.cpp:450 +msgid "Query the X coordinate of the drawing or, if specified, of the object with --query-id" +msgstr "Demander l'abscisse (coordonnée X) du dessin ou, si spécifié avec --query-id, de l'objet" #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help" -#: ../src/main.cpp:455 -msgid "" -"Query the Y coordinate of the drawing or, if specified, of the object with --" -"query-id" -msgstr "" -"Demander l'ordonnée (coordonnée Y) du dessin ou, si spécifié avec --query-" -"id, de l'objet" +#: ../src/main.cpp:456 +msgid "Query the Y coordinate of the drawing or, if specified, of the object with --query-id" +msgstr "Demander l'ordonnée (coordonnée Y) du dessin ou, si spécifié avec --query-id, de l'objet" #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help" -#: ../src/main.cpp:461 -msgid "" -"Query the width of the drawing or, if specified, of the object with --query-" -"id" -msgstr "" -"Demander la largeur du dessin ou, si spécifié avec --query-id, de l'objet" +#: ../src/main.cpp:462 +msgid "Query the width of the drawing or, if specified, of the object with --query-id" +msgstr "Demander la largeur du dessin ou, si spécifié avec --query-id, de l'objet" #. TRANSLATORS: "--query-id" is an Inkscape command line option; see "inkscape --help" -#: ../src/main.cpp:467 -msgid "" -"Query the height of the drawing or, if specified, of the object with --query-" -"id" -msgstr "" -"Demander la hauteur du dessin ou, si spécifié avec --query-id, de l'objet" +#: ../src/main.cpp:468 +msgid "Query the height of the drawing or, if specified, of the object with --query-id" +msgstr "Demander la hauteur du dessin ou, si spécifié avec --query-id, de l'objet" -#: ../src/main.cpp:472 +#: ../src/main.cpp:473 msgid "List id,x,y,w,h for all objects" msgstr "Afficher id,x,y,w,h pour tous les objets" -#: ../src/main.cpp:477 +#: ../src/main.cpp:478 msgid "The ID of the object whose dimensions are queried" msgstr "L'Id de l'objet dont les dimensions sont demandées" #. TRANSLATORS: this option makes Inkscape print the name (path) of the extension directory -#: ../src/main.cpp:483 +#: ../src/main.cpp:484 msgid "Print out the extension directory and exit" msgstr "Lister le dossier d'extensions, puis sortir" -#: ../src/main.cpp:488 +#: ../src/main.cpp:489 msgid "Remove unused definitions from the defs section(s) of the document" msgstr "Supprimer les éléments inutiles des section(s) defs du document" -#: ../src/main.cpp:494 +#: ../src/main.cpp:495 msgid "Enter a listening loop for D-Bus messages in console mode" msgstr "" -#: ../src/main.cpp:499 -msgid "" -"Specify the D-Bus bus name to listen for messages on (default is org." -"inkscape)" +#: ../src/main.cpp:500 +msgid "Specify the D-Bus bus name to listen for messages on (default is org.inkscape)" msgstr "" -#: ../src/main.cpp:500 +#: ../src/main.cpp:501 msgid "BUS-NAME" msgstr "" -#: ../src/main.cpp:505 +#: ../src/main.cpp:506 msgid "List the IDs of all the verbs in Inkscape" msgstr "Afficher les Ids de tous les verbes d'Inkscape" -#: ../src/main.cpp:510 +#: ../src/main.cpp:511 msgid "Verb to call when Inkscape opens." msgstr "Verbe sélectionné au démarrage d'Inkscape." -#: ../src/main.cpp:511 +#: ../src/main.cpp:512 msgid "VERB-ID" msgstr "VERB-ID" -#: ../src/main.cpp:515 +#: ../src/main.cpp:516 msgid "Object ID to select when Inkscape opens." msgstr "Id de l'objet à sélectionner au démarrage d'Inkscape." -#: ../src/main.cpp:516 +#: ../src/main.cpp:517 msgid "OBJECT-ID" msgstr "OBJECT-ID" -#: ../src/main.cpp:520 +#: ../src/main.cpp:521 msgid "Start Inkscape in interactive shell mode." msgstr "Démarrer Inkscape en mode de commande interactif." -#: ../src/main.cpp:867 ../src/main.cpp:1255 +#: ../src/main.cpp:871 +#: ../src/main.cpp:1270 msgid "" "[OPTIONS...] [FILE...]\n" "\n" @@ -10858,7 +10628,8 @@ msgstr "" "Options disponibles :" #. ## Add a menu for clear() -#: ../src/menus-skeleton.h:16 ../src/ui/dialog/debug.cpp:83 +#: ../src/menus-skeleton.h:16 +#: ../src/ui/dialog/debug.cpp:83 msgid "_File" msgstr "_Fichier" @@ -10868,11 +10639,14 @@ msgstr "_Nouveau" #. " \n" #. " \n" -#: ../src/menus-skeleton.h:43 ../src/verbs.cpp:2638 ../src/verbs.cpp:2644 +#: ../src/menus-skeleton.h:43 +#: ../src/verbs.cpp:2638 +#: ../src/verbs.cpp:2644 msgid "_Edit" msgstr "_Édition" -#: ../src/menus-skeleton.h:53 ../src/verbs.cpp:2402 +#: ../src/menus-skeleton.h:53 +#: ../src/verbs.cpp:2402 msgid "Paste Si_ze" msgstr "Coller les d_imensions" @@ -10936,7 +10710,8 @@ msgstr "Moti_f" msgid "_Path" msgstr "_Chemin" -#: ../src/menus-skeleton.h:249 ../src/ui/dialog/find.cpp:77 +#: ../src/menus-skeleton.h:249 +#: ../src/ui/dialog/find.cpp:77 #: ../src/ui/dialog/text-edit.cpp:72 msgid "_Text" msgstr "_Texte" @@ -10957,115 +10732,32 @@ msgstr "Aid_e" msgid "Tutorials" msgstr "Didacticiels" -#. TRANSLATORS: Mind the space in front. This is part of a compound message -#: ../src/mesh-context.cpp:131 ../src/mesh-context.cpp:142 -#, fuzzy, c-format -msgid " out of %d mesh handle" -msgid_plural " out of %d mesh handles" -msgstr[0] " sur %d poignée de dégradé" -msgstr[1] " sur %d poignées de dégradé" - -#: ../src/mesh-context.cpp:149 -#, fuzzy, c-format -msgid "%d mesh handle selected out of %d" -msgid_plural "%d mesh handles selected out of %d" -msgstr[0] "%d poignée de dégradé sélectionnée sur %d" -msgstr[1] "%d poignées de dégradé sélectionnées sur %d" - -#. TRANSLATORS: The plural refers to number of selected objects -#: ../src/mesh-context.cpp:156 -#, fuzzy, c-format -msgid "No mesh handles selected out of %d on %d selected object" -msgid_plural "No mesh handles selected out of %d on %d selected objects" -msgstr[0] "Aucune poignée sélectionnée sur %d dans %d objet sélectionné" -msgstr[1] "" -"Aucune poignée sélectionnée sur %d dans %d objets sélectionnés" - -#: ../src/mesh-context.cpp:320 -msgid "Split mesh row/column" -msgstr "" - -#: ../src/mesh-context.cpp:406 -msgid "Toggled mesh path type." -msgstr "" - -#: ../src/mesh-context.cpp:410 -msgid "Approximated arc for mesh side." -msgstr "" - -#: ../src/mesh-context.cpp:414 -msgid "Toggled mesh tensors." -msgstr "" - -#: ../src/mesh-context.cpp:418 -#, fuzzy -msgid "Smoothed mesh corner color." -msgstr "_Adoucir les coins" - -#: ../src/mesh-context.cpp:422 -#, fuzzy -msgid "Picked mesh corner color." -msgstr "Capturer la teinte de la couleur" - -#: ../src/mesh-context.cpp:497 -#, fuzzy -msgid "Create default mesh" -msgstr "Créer un dégradé par défaut" - -#: ../src/mesh-context.cpp:717 -#, fuzzy -msgid "FIXMECtrl: snap mesh angle" -msgstr "Ctrl : pour tourner par incréments" - -#: ../src/mesh-context.cpp:718 -#, fuzzy -msgid "FIXMEShift: draw mesh around the starting point" -msgstr "Maj : dessiner autour du point de départ" - #: ../src/object-edit.cpp:439 -msgid "" -"Adjust the horizontal rounding radius; with Ctrl to make the " -"vertical radius the same" -msgstr "" -"Ajuster le rayon d'arrondi horizontal; Ctrl que le rayon " -"vertical soit identique" +msgid "Adjust the horizontal rounding radius; with Ctrl to make the vertical radius the same" +msgstr "Ajuster le rayon d'arrondi horizontal; Ctrl que le rayon vertical soit identique" #: ../src/object-edit.cpp:444 -msgid "" -"Adjust the vertical rounding radius; with Ctrl to make the " -"horizontal radius the same" -msgstr "" -"Ajuster le rayon d'arrondi vertical; Ctrl pour que le rayon " -"horizontal soit identique" - -#: ../src/object-edit.cpp:449 ../src/object-edit.cpp:454 -msgid "" -"Adjust the width and height of the rectangle; with Ctrl to " -"lock ratio or stretch in one dimension only" -msgstr "" -"Ajuster la hauteur et la largeur du rectangle ; Ctrl " -"pour verrouiller le rapport des dimensions ou incliner dans une seule " -"dimension" - -#: ../src/object-edit.cpp:689 ../src/object-edit.cpp:693 -#: ../src/object-edit.cpp:697 ../src/object-edit.cpp:701 -msgid "" -"Resize box in X/Y direction; with Shift along the Z axis; with " -"Ctrl to constrain to the directions of edges or diagonals" -msgstr "" -"Redimensionner la boîte suivant les axes X/Y. Avec Shift, suivant " -"l'axe Z; avec Ctrl pour préserver les directions des arêtes ou des " -"diagonales." - -#: ../src/object-edit.cpp:705 ../src/object-edit.cpp:709 -#: ../src/object-edit.cpp:713 ../src/object-edit.cpp:717 -msgid "" -"Resize box along the Z axis; with Shift in X/Y direction; with " -"Ctrl to constrain to the directions of edges or diagonals" -msgstr "" -"Redimensionner la boîte suivant l'axe Z. Avec Shift, suivant les axes " -"X/Y; avec Ctrl pour préserver les directions des arêtes ou des " -"diagonales." +msgid "Adjust the vertical rounding radius; with Ctrl to make the horizontal radius the same" +msgstr "Ajuster le rayon d'arrondi vertical; Ctrl pour que le rayon horizontal soit identique" + +#: ../src/object-edit.cpp:449 +#: ../src/object-edit.cpp:454 +msgid "Adjust the width and height of the rectangle; with Ctrl to lock ratio or stretch in one dimension only" +msgstr "Ajuster la hauteur et la largeur du rectangle ; Ctrl pour verrouiller le rapport des dimensions ou incliner dans une seule dimension" + +#: ../src/object-edit.cpp:689 +#: ../src/object-edit.cpp:693 +#: ../src/object-edit.cpp:697 +#: ../src/object-edit.cpp:701 +msgid "Resize box in X/Y direction; with Shift along the Z axis; with Ctrl to constrain to the directions of edges or diagonals" +msgstr "Redimensionner la boîte suivant les axes X/Y. Avec Shift, suivant l'axe Z; avec Ctrl pour préserver les directions des arêtes ou des diagonales." + +#: ../src/object-edit.cpp:705 +#: ../src/object-edit.cpp:709 +#: ../src/object-edit.cpp:713 +#: ../src/object-edit.cpp:717 +msgid "Resize box along the Z axis; with Shift in X/Y direction; with Ctrl to constrain to the directions of edges or diagonals" +msgstr "Redimensionner la boîte suivant l'axe Z. Avec Shift, suivant les axes X/Y; avec Ctrl pour préserver les directions des arêtes ou des diagonales." #: ../src/object-edit.cpp:721 msgid "Move the box in perspective" @@ -11073,68 +10765,36 @@ msgstr "Déplacer la boîte en perspective." #: ../src/object-edit.cpp:948 msgid "Adjust ellipse width, with Ctrl to make circle" -msgstr "" -"Ajuster la largeur de l'ellipse; Ctrl pour en faire un cercle" +msgstr "Ajuster la largeur de l'ellipse; Ctrl pour en faire un cercle" #: ../src/object-edit.cpp:952 msgid "Adjust ellipse height, with Ctrl to make circle" -msgstr "" -"Ajuster la hauteur de l'ellipse; Ctrl pour en faire un cercle" +msgstr "Ajuster la hauteur de l'ellipse; Ctrl pour en faire un cercle" #: ../src/object-edit.cpp:956 -msgid "" -"Position the start point of the arc or segment; with Ctrl to " -"snap angle; drag inside the ellipse for arc, outside for " -"segment" -msgstr "" -"Positionner le point de départ de l'arc ou du camembert ; Ctrl " -"pour tourner par incréments ; déplacer vers l'intérieur de l'ellipse " -"pour un arc, vers l'extérieur pour un camembert" +msgid "Position the start point of the arc or segment; with Ctrl to snap angle; drag inside the ellipse for arc, outside for segment" +msgstr "Positionner le point de départ de l'arc ou du camembert ; Ctrl pour tourner par incréments ; déplacer vers l'intérieur de l'ellipse pour un arc, vers l'extérieur pour un camembert" #: ../src/object-edit.cpp:961 -msgid "" -"Position the end point of the arc or segment; with Ctrl to " -"snap angle; drag inside the ellipse for arc, outside for " -"segment" -msgstr "" -"Positionner le point final de l'arc ou du camembert; Ctrl pour " -"tourner par incréments; déplacer vers l'intérieur de l'ellipse pour " -"un arc, vers l'extérieur pour un camembert" +msgid "Position the end point of the arc or segment; with Ctrl to snap angle; drag inside the ellipse for arc, outside for segment" +msgstr "Positionner le point final de l'arc ou du camembert; Ctrl pour tourner par incréments; déplacer vers l'intérieur de l'ellipse pour un arc, vers l'extérieur pour un camembert" #: ../src/object-edit.cpp:1101 -msgid "" -"Adjust the tip radius of the star or polygon; with Shift to " -"round; with Alt to randomize" -msgstr "" -"Ajuster le rayon des sommets de l'étoile ou du polygone; Maj " -"pour arrondir; Alt pour rendre aléatoire" +msgid "Adjust the tip radius of the star or polygon; with Shift to round; with Alt to randomize" +msgstr "Ajuster le rayon des sommets de l'étoile ou du polygone; Maj pour arrondir; Alt pour rendre aléatoire" #: ../src/object-edit.cpp:1109 -msgid "" -"Adjust the base radius of the star; with Ctrl to keep star " -"rays radial (no skew); with Shift to round; with Alt to " -"randomize" -msgstr "" -"Ajuster le rayon de base de l'étoile; Ctrl pour garder " -"l'étoile parfaitement radiale (pas d'inclinaison); Maj pour arrondir; " -"Alt pour rendre aléatoire" +msgid "Adjust the base radius of the star; with Ctrl to keep star rays radial (no skew); with Shift to round; with Alt to randomize" +msgstr "Ajuster le rayon de base de l'étoile; Ctrl pour garder l'étoile parfaitement radiale (pas d'inclinaison); Maj pour arrondir; Alt pour rendre aléatoire" #: ../src/object-edit.cpp:1299 -msgid "" -"Roll/unroll the spiral from inside; with Ctrl to snap angle; " -"with Alt to converge/diverge" -msgstr "" -"Enrouler/dérouler la spirale depuis l'intérieur; Ctrl pour " -"tourner par incréments; Alt pour la faire converger/diverger" +msgid "Roll/unroll the spiral from inside; with Ctrl to snap angle; with Alt to converge/diverge" +msgstr "Enrouler/dérouler la spirale depuis l'intérieur; Ctrl pour tourner par incréments; Alt pour la faire converger/diverger" #: ../src/object-edit.cpp:1303 #, fuzzy -msgid "" -"Roll/unroll the spiral from outside; with Ctrl to snap angle; " -"with Shift to scale/rotate; with Alt to lock radius" -msgstr "" -"Enrouler/dérouler la spirale depuis l'extérieur; Ctrl pour " -"tourner par incréments; Maj pour redimensionner/ tourner" +msgid "Roll/unroll the spiral from outside; with Ctrl to snap angle; with Shift to scale/rotate; with Alt to lock radius" +msgstr "Enrouler/dérouler la spirale depuis l'extérieur; Ctrl pour tourner par incréments; Maj pour redimensionner/ tourner" #: ../src/object-edit.cpp:1348 msgid "Adjust the offset distance" @@ -11208,114 +10868,6 @@ msgstr "Inverser le chemin" msgid "No paths to reverse in the selection." msgstr "Aucun chemin à inverser dans la sélection." -#: ../src/pencil-context.cpp:226 ../src/pen-context.cpp:411 -msgid "Continuing selected path" -msgstr "Prolongation du chemin sélectionné" - -#: ../src/pencil-context.cpp:234 ../src/pen-context.cpp:421 -msgid "Creating new path" -msgstr "Création d'un nouveau chemin" - -#: ../src/pencil-context.cpp:237 ../src/pen-context.cpp:423 -msgid "Appending to selected path" -msgstr "Ajout au chemin sélectionné" - -#: ../src/pencil-context.cpp:342 -msgid "Release here to close and finish the path." -msgstr "Relâcher ici pour fermer et terminer le chemin." - -#: ../src/pencil-context.cpp:348 -msgid "Drawing a freehand path" -msgstr "Dessin d'une ligne à main levée" - -#: ../src/pencil-context.cpp:353 -msgid "Drag to continue the path from this point." -msgstr "Déplacer pour continuer le chemin à partir de ce point." - -#. Write curves to object -#: ../src/pencil-context.cpp:445 -msgid "Finishing freehand" -msgstr "Dessin à main levée terminé" - -#: ../src/pencil-context.cpp:501 ../src/pen-context.cpp:191 -msgid "Drawing cancelled" -msgstr "Tracé annulé" - -#: ../src/pencil-context.cpp:551 -msgid "" -"Sketch mode: holding Alt interpolates between sketched paths. " -"Release Alt to finalize." -msgstr "" -"Mode croquis : maintenir Alt pour réaliser une interpolation " -"entre les chemins croqués. Relacher Alt pour finaliser." - -#: ../src/pencil-context.cpp:579 -msgid "Finishing freehand sketch" -msgstr "Croquis à main levée terminé" - -#: ../src/pen-context.cpp:583 -msgid "Click or click and drag to close and finish the path." -msgstr "" -"Cliquer ou cliquer-déplacer pour fermer et terminer le chemin." - -#: ../src/pen-context.cpp:593 -msgid "" -"Click or click and drag to continue the path from this point." -msgstr "" -"Cliquer ou cliquer-déplacer pour prolonger le chemin à partir " -"de ce point." - -#: ../src/pen-context.cpp:1193 -#, c-format -msgid "" -"Curve segment: angle %3.2f°, distance %s; with Ctrl to " -"snap angle, Enter to finish the path" -msgstr "" -"Segment de courbe : angle %3.2f°, distance %s ; Ctrl pour " -"tourner par incréments ; Entrée pour terminer le chemin" - -#: ../src/pen-context.cpp:1194 -#, c-format -msgid "" -"Line segment: angle %3.2f°, distance %s; with Ctrl to " -"snap angle, Enter to finish the path" -msgstr "" -"Segment de droite : angle %3.2f°, distance %s ; Ctrl pour " -"tourner par incréments ; Entrée pour terminer le chemin" - -#: ../src/pen-context.cpp:1211 -#, c-format -msgid "" -"Curve handle: angle %3.2f°, length %s; with Ctrl to snap " -"angle" -msgstr "" -"Poignée de contrôle: angle %3.2f°, longueur %s; Ctrl pour " -"tourner par incréments" - -#: ../src/pen-context.cpp:1233 -#, c-format -msgid "" -"Curve handle, symmetric: angle %3.2f°, length %s; with Ctrl to snap angle, with Shift to move this handle only" -msgstr "" -"Poignée de la courbe, symétrique : angle %3.2f°, longueur %s ; " -"avec Ctrl pour tourner par incréments ; Maj pour ne déplacer " -"que cette poignée" - -#: ../src/pen-context.cpp:1234 -#, c-format -msgid "" -"Curve handle: angle %3.2f°, length %s; with Ctrl to snap " -"angle, with Shift to move this handle only" -msgstr "" -"Poignée de la courbe : angle %3.2f°, longueur %s ; avec Ctrl pour tourner par incréments ; Maj pour ne déplacer que cette " -"poignée" - -#: ../src/pen-context.cpp:1280 -msgid "Drawing finished" -msgstr "Tracé terminé" - #: ../src/persp3d.cpp:293 msgid "Toggle vanishing point" msgstr "Alterner les points de fuite" @@ -11325,8 +10877,7 @@ msgid "Toggle multiple vanishing points" msgstr "Alterner entre des points de fuite multiples" #: ../src/preferences.cpp:134 -msgid "" -"Inkscape will run with default settings, and new settings will not be saved. " +msgid "Inkscape will run with default settings, and new settings will not be saved. " msgstr "" "Inkscape va démarrer avec les préférences par défaut.\n" "Les nouvelles préférences ne seront pas enregistrées." @@ -11417,9 +10968,7 @@ msgstr "CC Paternité - Pas d'utilisation commerciale" #: ../src/rdf.cpp:195 msgid "CC Attribution-NonCommercial-ShareAlike" -msgstr "" -"CC Paternité - Pas d'utilisation commerciale - Partage des conditions " -"initiales à l'identique" +msgstr "CC Paternité - Pas d'utilisation commerciale - Partage des conditions initiales à l'identique" #: ../src/rdf.cpp:200 msgid "CC Attribution-NonCommercial-NoDerivs" @@ -11439,7 +10988,8 @@ msgid "Open Font License" msgstr "Open Font Licence (Licence de police libre)" #. 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/object-attributes.cpp:57 msgid "Title:" msgstr "Titre :" @@ -11452,12 +11002,11 @@ msgid "Date:" msgstr "Date :" #: ../src/rdf.cpp:239 -msgid "" -"A point or period of time associated with an event in the lifecycle of the " -"resource" +msgid "A point or period of time associated with an event in the lifecycle of the resource" msgstr "" -#: ../src/rdf.cpp:241 ../share/extensions/webslicer_create_rect.inx.h:3 +#: ../src/rdf.cpp:241 +#: ../share/extensions/webslicer_create_rect.inx.h:3 msgid "Format:" msgstr "Format :" @@ -11477,8 +11026,7 @@ msgstr "Créateur :" #: ../src/rdf.cpp:249 #, fuzzy msgid "An entity primarily responsible for making the resource" -msgstr "" -"Entité principalement responsable de la création du contenu de ce document" +msgstr "Entité principalement responsable de la création du contenu de ce document" #: ../src/rdf.cpp:251 msgid "Rights:" @@ -11518,7 +11066,8 @@ msgstr "Relation :" msgid "A related resource" msgstr "Source de fondu :" -#: ../src/rdf.cpp:267 ../src/ui/dialog/inkscape-preferences.cpp:1841 +#: ../src/rdf.cpp:267 +#: ../src/ui/dialog/inkscape-preferences.cpp:1850 msgid "Language:" msgstr "Langue principale :" @@ -11542,9 +11091,7 @@ msgid "Coverage:" msgstr "Portée :" #: ../src/rdf.cpp:276 -msgid "" -"The spatial or temporal topic of the resource, the spatial applicability of " -"the resource, or the jurisdiction under which the resource is relevant" +msgid "The spatial or temporal topic of the resource, the spatial applicability of the resource, or the jurisdiction under which the resource is relevant" msgstr "" #: ../src/rdf.cpp:279 @@ -11585,548 +11132,420 @@ msgstr "Fragment :" msgid "XML fragment for the RDF 'License' section" msgstr "Fragment XML pour la section « Licence » (RDF)" -#: ../src/rect-context.cpp:292 -msgid "" -"Ctrl: make square or integer-ratio rect, lock a rounded corner " -"circular" -msgstr "" -"Ctrl : forcer un rectangle carré ou de ratio entier, préserver le " -"rayon d'arrondi d'un coin" - -#: ../src/rect-context.cpp:453 -#, c-format -msgid "" -"Rectangle: %s × %s (constrained to ratio %d:%d); with Shift to draw around the starting point" -msgstr "" -"Rectangle : %s × %s; (contraint de ratio %d:%d) ; Maj " -"pour dessiner autour du point de départ" - -#: ../src/rect-context.cpp:456 -#, c-format -msgid "" -"Rectangle: %s × %s (constrained to golden ratio 1.618 : 1); with " -"Shift to draw around the starting point" -msgstr "" -"Rectangle : %s × %s; (contraint au ratio du Nombre d'Or 1.618 : " -"1) ; Maj dessiner autour du point de départ" - -#: ../src/rect-context.cpp:458 -#, c-format -msgid "" -"Rectangle: %s × %s (constrained to golden ratio 1 : 1.618); with " -"Shift to draw around the starting point" -msgstr "" -"Rectangle : %s × %s; (contraint au ratio du Nombre d'Or 1 : " -"1.618) ; Maj pour dessiner autour du point de départ" - -#: ../src/rect-context.cpp:462 -#, c-format -msgid "" -"Rectangle: %s × %s; with Ctrl to make square or integer-" -"ratio rectangle; with Shift to draw around the starting point" -msgstr "" -"Rectangle : %s × %s; Ctrl forcer un rectangle carré ou de " -"ratio entier; Maj dessiner autour du point de départ" - -#: ../src/rect-context.cpp:485 -msgid "Create rectangle" -msgstr "Créer un rectangle" - #: ../src/resource-manager.cpp:332 msgid "Fixup broken links" msgstr "" -#: ../src/select-context.cpp:165 -msgid "Click selection to toggle scale/rotation handles" -msgstr "" -"Cliquer sur la sélection pour alterner entre poignées de redimensionnement " -"et de rotation" - -#: ../src/select-context.cpp:166 -msgid "" -"No objects selected. Click, Shift+click, Alt+scroll mouse on top of objects, " -"or drag around objects to select." -msgstr "" -"Aucun objet sélectionné. Sélectionnez des objets par Clic, Maj+Clic ou Alt" -"+molette, ou cliquez-déplacez autour des objets à sélectionner." - -#: ../src/select-context.cpp:219 -msgid "Move canceled." -msgstr "Déplacement annulé." - -#: ../src/select-context.cpp:227 -msgid "Selection canceled." -msgstr "Sélection annulée." - -#: ../src/select-context.cpp:644 -msgid "" -"Draw over objects to select them; release Alt to switch to " -"rubberband selection" -msgstr "" -"Tracer un trait passant par des objets pour les sélectionner. Lâcher " -"la touche Alt pour repasser en mode sélection rectangle" - -#: ../src/select-context.cpp:646 -msgid "" -"Drag around objects to select them; press Alt to switch to " -"touch selection" -msgstr "" -"Entourer les objets pour les sélectionner; appuyer sur Alt " -"pour passer en « toucher pour sélectionner »" - -#: ../src/select-context.cpp:936 -msgid "Ctrl: click to select in groups; drag to move hor/vert" -msgstr "" -"Ctrl : Cliquer pour sélectionner dans les groupes; cliquer-déplacer " -"pour déplacer horizontalement/verticalment" - -#: ../src/select-context.cpp:937 -msgid "Shift: click to toggle select; drag for rubberband selection" -msgstr "" -"Maj : cliquer pour inverser l'état de sélection, cliquer-déplacer " -"pour activer la sélection rectangle" - -#: ../src/select-context.cpp:938 -msgid "" -"Alt: click to select under; scroll mouse-wheel to cycle-select; drag " -"to move selected or select by touch" -msgstr "" -"Alt : cliquer pour sélectionner sous, utiliser la molette pour " -"sélectionner cycliquement, cliquer-déplacer pour déplacer ou passer en " -"« toucher pour sélectionner »" - -#: ../src/select-context.cpp:1146 -msgid "Selected object is not a group. Cannot enter." -msgstr "L'objet sélectionné n'est pas un groupe. Impossible d'y entrer." - -#: ../src/selection-chemistry.cpp:393 +#: ../src/selection-chemistry.cpp:394 msgid "Delete text" msgstr "Supprimer le texte" -#: ../src/selection-chemistry.cpp:401 +#: ../src/selection-chemistry.cpp:402 msgid "Nothing was deleted." msgstr "Rien n'a été supprimé." -#: ../src/selection-chemistry.cpp:420 ../src/text-context.cpp:992 +#: ../src/selection-chemistry.cpp:421 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:75 -#: ../src/ui/dialog/swatches.cpp:278 ../src/widgets/eraser-toolbar.cpp:110 -#: ../src/widgets/gradient-toolbar.cpp:1195 -#: ../src/widgets/gradient-toolbar.cpp:1209 -#: ../src/widgets/gradient-toolbar.cpp:1223 -#: ../src/widgets/node-toolbar.cpp:413 +#: ../src/ui/dialog/swatches.cpp:278 +#: ../src/ui/tools/text-tool.cpp:994 +#: ../src/widgets/eraser-toolbar.cpp:110 +#: ../src/widgets/gradient-toolbar.cpp:1196 +#: ../src/widgets/gradient-toolbar.cpp:1210 +#: ../src/widgets/gradient-toolbar.cpp:1224 +#: ../src/widgets/node-toolbar.cpp:414 msgid "Delete" msgstr "Supprimer" -#: ../src/selection-chemistry.cpp:448 +#: ../src/selection-chemistry.cpp:449 msgid "Select object(s) to duplicate." msgstr "Sélectionner un ou des objet(s) à dupliquer." -#: ../src/selection-chemistry.cpp:557 +#: ../src/selection-chemistry.cpp:558 msgid "Delete all" msgstr "Supprimer tout" -#: ../src/selection-chemistry.cpp:747 +#: ../src/selection-chemistry.cpp:748 msgid "Select some objects to group." msgstr "Sélectionner des objets à grouper." -#: ../src/selection-chemistry.cpp:762 ../src/sp-item-group.cpp:331 +#: ../src/selection-chemistry.cpp:763 +#: ../src/sp-item-group.cpp:331 msgid "Group" msgstr "Groupe" -#: ../src/selection-chemistry.cpp:771 +#: ../src/selection-chemistry.cpp:772 msgid "Select a group to ungroup." msgstr "Sélectionner un groupe à dégrouper." -#: ../src/selection-chemistry.cpp:814 +#: ../src/selection-chemistry.cpp:815 msgid "No groups to ungroup in the selection." msgstr "Aucun groupe à dégrouper dans la sélection." -#: ../src/selection-chemistry.cpp:820 ../src/sp-item-group.cpp:564 +#: ../src/selection-chemistry.cpp:821 +#: ../src/sp-item-group.cpp:564 msgid "Ungroup" msgstr "Dégrouper" -#: ../src/selection-chemistry.cpp:901 +#: ../src/selection-chemistry.cpp:902 msgid "Select object(s) to raise." msgstr "Sélectionner un ou des objet(s) à monter." -#: ../src/selection-chemistry.cpp:907 ../src/selection-chemistry.cpp:963 -#: ../src/selection-chemistry.cpp:991 ../src/selection-chemistry.cpp:1052 -msgid "" -"You cannot raise/lower objects from different groups or layers." -msgstr "" -"Vous ne pouvez pas monter/descendre des objets de différents groupes " -"ou calques." +#: ../src/selection-chemistry.cpp:908 +#: ../src/selection-chemistry.cpp:964 +#: ../src/selection-chemistry.cpp:992 +#: ../src/selection-chemistry.cpp:1053 +msgid "You cannot raise/lower objects from different groups or layers." +msgstr "Vous ne pouvez pas monter/descendre des objets de différents groupes ou calques." #. TRANSLATORS: "Raise" means "to raise an object" in the undo history -#: ../src/selection-chemistry.cpp:947 +#: ../src/selection-chemistry.cpp:948 msgctxt "Undo action" msgid "Raise" msgstr "Monter" -#: ../src/selection-chemistry.cpp:955 +#: ../src/selection-chemistry.cpp:956 msgid "Select object(s) to raise to top." msgstr "Sélectionner des objets à monter au premier plan." -#: ../src/selection-chemistry.cpp:978 +#: ../src/selection-chemistry.cpp:979 msgid "Raise to top" msgstr "Monter au premier plan" -#: ../src/selection-chemistry.cpp:985 +#: ../src/selection-chemistry.cpp:986 msgid "Select object(s) to lower." msgstr "Sélectionner un ou des objet(s) à descendre." #. TRANSLATORS: "Lower" means "to lower an object" in the undo history -#: ../src/selection-chemistry.cpp:1036 +#: ../src/selection-chemistry.cpp:1037 #, fuzzy msgctxt "Undo action" msgid "Lower" msgstr "Descendre" -#: ../src/selection-chemistry.cpp:1044 +#: ../src/selection-chemistry.cpp:1045 msgid "Select object(s) to lower to bottom." msgstr "Sélectionner un ou des objet(s) à descendre à l'arrière-plan." -#: ../src/selection-chemistry.cpp:1079 +#: ../src/selection-chemistry.cpp:1080 msgid "Lower to bottom" msgstr "Descendre à l'arrière-plan" -#: ../src/selection-chemistry.cpp:1086 +#: ../src/selection-chemistry.cpp:1087 msgid "Nothing to undo." msgstr "Rien à défaire." -#: ../src/selection-chemistry.cpp:1094 +#: ../src/selection-chemistry.cpp:1095 msgid "Nothing to redo." msgstr "Rien à refaire." -#: ../src/selection-chemistry.cpp:1161 +#: ../src/selection-chemistry.cpp:1162 msgid "Paste" msgstr "Coller" -#: ../src/selection-chemistry.cpp:1169 +#: ../src/selection-chemistry.cpp:1170 msgid "Paste style" msgstr "Coller le style" -#: ../src/selection-chemistry.cpp:1179 +#: ../src/selection-chemistry.cpp:1180 msgid "Paste live path effect" msgstr "Coller l'effet de chemin en direct" -#: ../src/selection-chemistry.cpp:1201 +#: ../src/selection-chemistry.cpp:1202 msgid "Select object(s) to remove live path effects from." -msgstr "" -"Sélectionner un ou des objet(s) sur lesquels supprimer des effets de " -"chemin." +msgstr "Sélectionner un ou des objet(s) sur lesquels supprimer des effets de chemin." -#: ../src/selection-chemistry.cpp:1213 +#: ../src/selection-chemistry.cpp:1214 msgid "Remove live path effect" msgstr "Supprimer l'effet de chemin en direct" -#: ../src/selection-chemistry.cpp:1224 +#: ../src/selection-chemistry.cpp:1225 msgid "Select object(s) to remove filters from." msgstr "Sélectionner les objets pour en retirer les filtres." -#: ../src/selection-chemistry.cpp:1234 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1462 +#: ../src/selection-chemistry.cpp:1235 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1669 msgid "Remove filter" msgstr "Supprimer le filtre" -#: ../src/selection-chemistry.cpp:1243 +#: ../src/selection-chemistry.cpp:1244 msgid "Paste size" msgstr "Coller les dimensions" -#: ../src/selection-chemistry.cpp:1252 +#: ../src/selection-chemistry.cpp:1253 msgid "Paste size separately" msgstr "Coller les dimensions séparément" -#: ../src/selection-chemistry.cpp:1262 +#: ../src/selection-chemistry.cpp:1263 msgid "Select object(s) to move to the layer above." msgstr "Sélectionner un ou des objet(s) à déplacer au calque du dessus." -#: ../src/selection-chemistry.cpp:1288 +#: ../src/selection-chemistry.cpp:1289 msgid "Raise to next layer" msgstr "Monter au calque suivant" -#: ../src/selection-chemistry.cpp:1295 +#: ../src/selection-chemistry.cpp:1296 msgid "No more layers above." msgstr "Plus de calque au-dessus." -#: ../src/selection-chemistry.cpp:1307 +#: ../src/selection-chemistry.cpp:1308 msgid "Select object(s) to move to the layer below." -msgstr "" -"Sélectionner un ou des objet(s) à déplacer au calque du dessous." +msgstr "Sélectionner un ou des objet(s) à déplacer au calque du dessous." -#: ../src/selection-chemistry.cpp:1333 +#: ../src/selection-chemistry.cpp:1334 msgid "Lower to previous layer" msgstr "Descendre au calque précédent." -#: ../src/selection-chemistry.cpp:1340 +#: ../src/selection-chemistry.cpp:1341 msgid "No more layers below." msgstr "Plus de calque en-dessous." -#: ../src/selection-chemistry.cpp:1352 +#: ../src/selection-chemistry.cpp:1353 msgid "Select object(s) to move." msgstr "Sélectionner un ou des objet(s) à déplacer." -#: ../src/selection-chemistry.cpp:1369 ../src/verbs.cpp:2581 +#: ../src/selection-chemistry.cpp:1370 +#: ../src/verbs.cpp:2581 msgid "Move selection to layer" msgstr "Déplacer la sélection au calque" -#: ../src/selection-chemistry.cpp:1593 +#: ../src/selection-chemistry.cpp:1594 msgid "Remove transform" msgstr "Retirer les transformations" -#: ../src/selection-chemistry.cpp:1696 +#: ../src/selection-chemistry.cpp:1697 msgid "Rotate 90° CCW" msgstr "Tourner de 90° dans le sens anti-horaire" -#: ../src/selection-chemistry.cpp:1696 +#: ../src/selection-chemistry.cpp:1697 msgid "Rotate 90° CW" msgstr "Tourner de 90° dans le sens horaire" -#: ../src/selection-chemistry.cpp:1717 ../src/seltrans.cpp:468 -#: ../src/ui/dialog/transformation.cpp:893 +#: ../src/selection-chemistry.cpp:1718 +#: ../src/seltrans.cpp:468 +#: ../src/ui/dialog/transformation.cpp:894 msgid "Rotate" msgstr "Tourner" -#: ../src/selection-chemistry.cpp:2096 +#: ../src/selection-chemistry.cpp:2097 msgid "Rotate by pixels" msgstr "Tourner par pixels" -#: ../src/selection-chemistry.cpp:2126 ../src/seltrans.cpp:465 -#: ../src/ui/dialog/transformation.cpp:868 +#: ../src/selection-chemistry.cpp:2127 +#: ../src/seltrans.cpp:465 +#: ../src/ui/dialog/transformation.cpp:869 #: ../share/extensions/interp_att_g.inx.h:12 msgid "Scale" msgstr "Échelle" -#: ../src/selection-chemistry.cpp:2151 +#: ../src/selection-chemistry.cpp:2152 msgid "Scale by whole factor" msgstr "Redimensionner d'un facteur entier" -#: ../src/selection-chemistry.cpp:2166 +#: ../src/selection-chemistry.cpp:2167 msgid "Move vertically" msgstr "Déplacer verticalement" -#: ../src/selection-chemistry.cpp:2169 +#: ../src/selection-chemistry.cpp:2170 msgid "Move horizontally" msgstr "Déplacer horizontalement" -#: ../src/selection-chemistry.cpp:2172 ../src/selection-chemistry.cpp:2198 -#: ../src/seltrans.cpp:462 ../src/ui/dialog/transformation.cpp:807 +#: ../src/selection-chemistry.cpp:2173 +#: ../src/selection-chemistry.cpp:2199 +#: ../src/seltrans.cpp:462 +#: ../src/ui/dialog/transformation.cpp:807 msgid "Move" msgstr "Déplacer" -#: ../src/selection-chemistry.cpp:2192 +#: ../src/selection-chemistry.cpp:2193 msgid "Move vertically by pixels" msgstr "Déplacer verticalement par pixels" -#: ../src/selection-chemistry.cpp:2195 +#: ../src/selection-chemistry.cpp:2196 msgid "Move horizontally by pixels" msgstr "Déplacer horizontalement par pixels" -#: ../src/selection-chemistry.cpp:2327 +#: ../src/selection-chemistry.cpp:2328 msgid "The selection has no applied path effect." msgstr "Il n'y a pas d'effet de chemin appliqué sur cette sélection." -#: ../src/selection-chemistry.cpp:2496 ../src/ui/dialog/clonetiler.cpp:2218 +#: ../src/selection-chemistry.cpp:2497 +#: ../src/ui/dialog/clonetiler.cpp:2218 msgid "Select an object to clone." msgstr "Sélectionner un objet à cloner." -#: ../src/selection-chemistry.cpp:2532 +#: ../src/selection-chemistry.cpp:2533 msgctxt "Action" msgid "Clone" msgstr "Cloner" -#: ../src/selection-chemistry.cpp:2548 +#: ../src/selection-chemistry.cpp:2549 msgid "Select clones to relink." msgstr "Sélectionner les clones à relier." -#: ../src/selection-chemistry.cpp:2555 +#: ../src/selection-chemistry.cpp:2556 msgid "Copy an object to clipboard to relink clones to." msgstr "Copier un objet dans le presse-papier pour y relier les clones." -#: ../src/selection-chemistry.cpp:2579 +#: ../src/selection-chemistry.cpp:2580 msgid "No clones to relink in the selection." msgstr "Aucun clone à relier dans la sélection." -#: ../src/selection-chemistry.cpp:2582 +#: ../src/selection-chemistry.cpp:2583 msgid "Relink clone" msgstr "Relier le clone" -#: ../src/selection-chemistry.cpp:2596 +#: ../src/selection-chemistry.cpp:2597 msgid "Select clones to unlink." msgstr "Sélectionner les clones à délier." -#: ../src/selection-chemistry.cpp:2650 +#: ../src/selection-chemistry.cpp:2651 msgid "No clones to unlink in the selection." msgstr "Aucun clone à délier dans la sélection." -#: ../src/selection-chemistry.cpp:2654 +#: ../src/selection-chemistry.cpp:2655 msgid "Unlink clone" msgstr "Délier le clone" -#: ../src/selection-chemistry.cpp:2667 -msgid "" -"Select a clone to go to its original. Select a linked offset " -"to go to its source. Select a text on path to go to the path. Select " -"a flowed text to go to its frame." -msgstr "" -"Sélectionner un clone pour sélectionner son original. Sélectionner un " -"offset lié pour sélectionner sa source. Sélectionner un texte " -"suivant un chemin pour sélectionner son chemin. Sélectionner un texte " -"encadré pour sélectionner son cadre." +#: ../src/selection-chemistry.cpp:2668 +msgid "Select a clone to go to its original. Select a linked offset to go to its source. Select a text on path to go to the path. Select a flowed text to go to its frame." +msgstr "Sélectionner un clone pour sélectionner son original. Sélectionner un offset lié pour sélectionner sa source. Sélectionner un texte suivant un chemin pour sélectionner son chemin. Sélectionner un texte encadré pour sélectionner son cadre." -#: ../src/selection-chemistry.cpp:2700 -msgid "" -"Cannot find the object to select (orphaned clone, offset, textpath, " -"flowed text?)" -msgstr "" -"Impossible de trouver l'objet à sélectionner (clone orphelin, offset, " -"chemin de texte, texte encadré ?)" +#: ../src/selection-chemistry.cpp:2701 +msgid "Cannot find the object to select (orphaned clone, offset, textpath, flowed text?)" +msgstr "Impossible de trouver l'objet à sélectionner (clone orphelin, offset, chemin de texte, texte encadré ?)" -#: ../src/selection-chemistry.cpp:2706 -msgid "" -"The object you're trying to select is not visible (it is in <" -"defs>)" -msgstr "" -"L'objet que vous essayez de sélectionner n'est pas visible (il est " -"dans <defs>)" +#: ../src/selection-chemistry.cpp:2707 +msgid "The object you're trying to select is not visible (it is in <defs>)" +msgstr "L'objet que vous essayez de sélectionner n'est pas visible (il est dans <defs>)" -#: ../src/selection-chemistry.cpp:2751 +#: ../src/selection-chemistry.cpp:2752 msgid "Select one path to clone." msgstr "Sélectionner un chemin à cloner." -#: ../src/selection-chemistry.cpp:2755 +#: ../src/selection-chemistry.cpp:2756 msgid "Select one path to clone." msgstr "Sélectionner un chemin à cloner." -#: ../src/selection-chemistry.cpp:2810 +#: ../src/selection-chemistry.cpp:2811 msgid "Select object(s) to convert to marker." msgstr "Sélectionner un ou des objet(s) à convertir en marqueur." -#: ../src/selection-chemistry.cpp:2878 +#: ../src/selection-chemistry.cpp:2879 msgid "Objects to marker" msgstr "Objets en marqueur" -#: ../src/selection-chemistry.cpp:2906 +#: ../src/selection-chemistry.cpp:2903 msgid "Select object(s) to convert to guides." msgstr "Sélectionner un ou des objet(s) à convertir en guides." -#: ../src/selection-chemistry.cpp:2918 +#: ../src/selection-chemistry.cpp:2926 msgid "Objects to guides" msgstr "Objets en guides" -#: ../src/selection-chemistry.cpp:2937 +#: ../src/selection-chemistry.cpp:2945 #, fuzzy msgid "Select groups to convert to symbols." msgstr "Sélectionner un groupe à convertir en symbole." -#: ../src/selection-chemistry.cpp:2957 +#: ../src/selection-chemistry.cpp:2965 #, fuzzy msgid "No groups converted to symbols." msgstr "Sélectionner un groupe à convertir en symbole." #. Group just disappears, nothing to select. -#: ../src/selection-chemistry.cpp:2964 +#: ../src/selection-chemistry.cpp:2972 msgid "Group to symbol" msgstr "Groupe en symbole" -#: ../src/selection-chemistry.cpp:3030 +#: ../src/selection-chemistry.cpp:3038 msgid "Select a symbol to extract objects from." msgstr "Sélectionner un symbole pour en extraire des objets." -#: ../src/selection-chemistry.cpp:3039 +#: ../src/selection-chemistry.cpp:3047 msgid "Select only one symbol to convert to group." msgstr "Sélectionner un seul symbole(s) à convertir en groupe." -#: ../src/selection-chemistry.cpp:3080 +#: ../src/selection-chemistry.cpp:3089 msgid "Group from symbol" msgstr "Groupe à partir d'un symbole" -#: ../src/selection-chemistry.cpp:3097 +#: ../src/selection-chemistry.cpp:3106 msgid "Select object(s) to convert to pattern." -msgstr "" -"Sélectionner un ou des objet(s) à convertir en motif de remplissage." +msgstr "Sélectionner un ou des objet(s) à convertir en motif de remplissage." -#: ../src/selection-chemistry.cpp:3187 +#: ../src/selection-chemistry.cpp:3196 msgid "Objects to pattern" msgstr "Objets en motif" -#: ../src/selection-chemistry.cpp:3203 +#: ../src/selection-chemistry.cpp:3212 msgid "Select an object with pattern fill to extract objects from." -msgstr "" -"Sélectionner un objet rempli avec un motif pour en extraire des " -"objets." +msgstr "Sélectionner un objet rempli avec un motif pour en extraire des objets." -#: ../src/selection-chemistry.cpp:3258 +#: ../src/selection-chemistry.cpp:3267 msgid "No pattern fills in the selection." msgstr "Aucun motif de remplissage dans la sélection." -#: ../src/selection-chemistry.cpp:3261 +#: ../src/selection-chemistry.cpp:3270 msgid "Pattern to objects" msgstr "Motif en objets" -#: ../src/selection-chemistry.cpp:3352 +#: ../src/selection-chemistry.cpp:3361 msgid "Select object(s) to make a bitmap copy." msgstr "Sélectionner un ou des objet(s) pour en faire une copie bitmap." -#: ../src/selection-chemistry.cpp:3356 +#: ../src/selection-chemistry.cpp:3365 msgid "Rendering bitmap..." msgstr "Génération du bitmap..." -#: ../src/selection-chemistry.cpp:3535 +#: ../src/selection-chemistry.cpp:3544 msgid "Create bitmap" msgstr "Créer un bitmap" -#: ../src/selection-chemistry.cpp:3567 +#: ../src/selection-chemistry.cpp:3576 msgid "Select object(s) to create clippath or mask from." -msgstr "" -"Sélectionner un ou des objet(s) à partir desquels un chemin de " -"découpe ou un masque sera créé." +msgstr "Sélectionner un ou des objet(s) à partir desquels un chemin de découpe ou un masque sera créé." -#: ../src/selection-chemistry.cpp:3570 +#: ../src/selection-chemistry.cpp:3579 msgid "Select mask object and object(s) to apply clippath or mask to." -msgstr "" -"Sélectionner un objet masque et un ou des objet(s) auxquels appliquer " -"ce chemin de découpe ou masque." +msgstr "Sélectionner un objet masque et un ou des objet(s) auxquels appliquer ce chemin de découpe ou masque." -#: ../src/selection-chemistry.cpp:3753 +#: ../src/selection-chemistry.cpp:3762 msgid "Set clipping path" msgstr "Définir un chemin de découpe" -#: ../src/selection-chemistry.cpp:3755 +#: ../src/selection-chemistry.cpp:3764 msgid "Set mask" msgstr "Définir un masque" -#: ../src/selection-chemistry.cpp:3770 +#: ../src/selection-chemistry.cpp:3779 msgid "Select object(s) to remove clippath or mask from." -msgstr "" -"Sélectionner un ou des objet(s) pour en retirer le chemin de découpe " -"ou le masque." +msgstr "Sélectionner un ou des objet(s) pour en retirer le chemin de découpe ou le masque." -#: ../src/selection-chemistry.cpp:3881 +#: ../src/selection-chemistry.cpp:3890 msgid "Release clipping path" msgstr "Retirer le chemin de découpe" -#: ../src/selection-chemistry.cpp:3883 +#: ../src/selection-chemistry.cpp:3892 msgid "Release mask" msgstr "Retirer le masque" -#: ../src/selection-chemistry.cpp:3902 +#: ../src/selection-chemistry.cpp:3911 msgid "Select object(s) to fit canvas to." -msgstr "" -"Sélectionner un ou des objet(s) pour y ajuster la taille de la zone " -"de travail." +msgstr "Sélectionner un ou des objet(s) pour y ajuster la taille de la zone de travail." #. Fit Page -#: ../src/selection-chemistry.cpp:3922 ../src/verbs.cpp:2907 +#: ../src/selection-chemistry.cpp:3931 +#: ../src/verbs.cpp:2909 msgid "Fit Page to Selection" msgstr "Ajuster la page à la sélection" -#: ../src/selection-chemistry.cpp:3951 ../src/verbs.cpp:2909 +#: ../src/selection-chemistry.cpp:3960 +#: ../src/verbs.cpp:2911 msgid "Fit Page to Drawing" msgstr "Ajuster la page au dessin" -#: ../src/selection-chemistry.cpp:3972 ../src/verbs.cpp:2911 +#: ../src/selection-chemistry.cpp:3981 +#: ../src/verbs.cpp:2913 msgid "Fit Page to Selection or Drawing" msgstr "Ajuster la page à la sélection ou au dessin" @@ -12134,7 +11553,8 @@ msgstr "Ajuster la page à la sélection ou au dessin" msgid "root" msgstr "racine" -#: ../src/selection-describer.cpp:115 ../src/widgets/ege-paint-def.cpp:67 +#: ../src/selection-describer.cpp:115 +#: ../src/widgets/ege-paint-def.cpp:67 #: ../src/widgets/ege-paint-def.cpp:91 msgid "none" msgstr "aucune" @@ -12216,7 +11636,8 @@ msgid_plural "; %d filtered objects " msgstr[0] "; %d objet filtré" msgstr[1] "; %d objets filtrés" -#: ../src/seltrans.cpp:471 ../src/ui/dialog/transformation.cpp:981 +#: ../src/seltrans.cpp:471 +#: ../src/ui/dialog/transformation.cpp:982 msgid "Skew" msgstr "Incliner" @@ -12232,28 +11653,25 @@ msgstr "Tamponner" msgid "Reset center" msgstr "Rétablir le centre" -#: ../src/seltrans.cpp:938 ../src/seltrans.cpp:1035 +#: ../src/seltrans.cpp:938 +#: ../src/seltrans.cpp:1035 #, c-format msgid "Scale: %0.2f%% x %0.2f%%; with Ctrl to lock ratio" -msgstr "" -"Redimensionnement : %0.2f%% x %0.2f%% ; Ctrl pour préserver le " -"ratio" +msgstr "Redimensionnement : %0.2f%% x %0.2f%% ; Ctrl pour préserver le ratio" #. TRANSLATORS: don't modify the first ";" #. (it will NOT be displayed as ";" - only the second one will be) #: ../src/seltrans.cpp:1167 #, c-format msgid "Skew: %0.2f°; with Ctrl to snap angle" -msgstr "" -"Inclinaison : %0.2f° ; Ctrl pour incliner par incréments" +msgstr "Inclinaison : %0.2f° ; Ctrl pour incliner par incréments" #. TRANSLATORS: don't modify the first ";" #. (it will NOT be displayed as ";" - only the second one will be) #: ../src/seltrans.cpp:1242 #, c-format msgid "Rotate: %0.2f°; with Ctrl to snap angle" -msgstr "" -"Rotation : %0.2f° ; Ctrl pour tourner par incréments" +msgstr "Rotation : %0.2f° ; Ctrl pour tourner par incréments" #: ../src/seltrans.cpp:1279 #, c-format @@ -12262,59 +11680,36 @@ msgstr "Déplacer le centre en %s, %s" #: ../src/seltrans.cpp:1433 #, c-format -msgid "" -"Move by %s, %s; with Ctrl to restrict to horizontal/vertical; " -"with Shift to disable snapping" -msgstr "" -"Déplacer de %s, %s ; Ctrl restreindre à l'horizontale/" -"verticale; Maj désactiver le magnétisme" +msgid "Move by %s, %s; with Ctrl to restrict to horizontal/vertical; with Shift to disable snapping" +msgstr "Déplacer de %s, %s ; Ctrl restreindre à l'horizontale/verticale; Maj désactiver le magnétisme" #: ../src/seltrans-handles.cpp:9 -msgid "" -"Squeeze or stretch selection; with Ctrl to scale uniformly; " -"with Shift to scale around rotation center" -msgstr "" -"Agrandir ou rétrécir la sélection ; Ctrl pour redimensionner " -"uniformément; Maj pour redimensionner autour du centre de rotation" +msgid "Squeeze or stretch selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" +msgstr "Agrandir ou rétrécir la sélection ; Ctrl pour redimensionner uniformément; Maj pour redimensionner autour du centre de rotation" #: ../src/seltrans-handles.cpp:10 -msgid "" -"Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" -msgstr "" -"Redimensionner la sélection ; Ctrl pour redimensionner " -"uniformément autour du centre de rotation" +msgid "Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" +msgstr "Redimensionner la sélection ; Ctrl pour redimensionner uniformément autour du centre de rotation" #: ../src/seltrans-handles.cpp:11 -msgid "" -"Skew selection; with Ctrl to snap angle; with Shift to " -"skew around the opposite side" -msgstr "" -"Incliner la sélection ; Ctrl pour incliner par incréments ; " -"Maj pour incliner autour du coin opposé" +msgid "Skew selection; with Ctrl to snap angle; with Shift to skew around the opposite side" +msgstr "Incliner la sélection ; Ctrl pour incliner par incréments ; Maj pour incliner autour du coin opposé" #: ../src/seltrans-handles.cpp:12 -msgid "" -"Rotate selection; with Ctrl to snap angle; with Shift " -"to rotate around the opposite corner" -msgstr "" -"Tourner la sélection ; Ctrl pour tourner par incréments ; " -"Maj pour tourner autour du coin opposé" +msgid "Rotate selection; with Ctrl to snap angle; with Shift to rotate around the opposite corner" +msgstr "Tourner la sélection ; Ctrl pour tourner par incréments ; Maj pour tourner autour du coin opposé" #: ../src/seltrans-handles.cpp:13 -msgid "" -"Center of rotation and skewing: drag to reposition; scaling with " -"Shift also uses this center" -msgstr "" -"Centre de rotation/inclinaison : cliquer-déplacer pour le déplacer; " -"redimensionner avec Maj utilise aussi ce centre" +msgid "Center of rotation and skewing: drag to reposition; scaling with Shift also uses this center" +msgstr "Centre de rotation/inclinaison : cliquer-déplacer pour le déplacer; redimensionner avec Maj utilise aussi ce centre" #: ../src/shortcuts.cpp:226 #, c-format msgid "Keyboard directory (%s) is unavailable." msgstr "Le dossier des raccourcis (%s) est indisponible." -#: ../src/shortcuts.cpp:337 ../src/ui/dialog/export.cpp:1295 +#: ../src/shortcuts.cpp:337 +#: ../src/ui/dialog/export.cpp:1295 #: ../src/ui/dialog/export.cpp:1329 msgid "Select a filename for exporting" msgstr "Sélectionner un nom de fichier pour exporter" @@ -12344,7 +11739,8 @@ msgid "Arc" msgstr "Arabe" #. Ellipse -#: ../src/sp-ellipse.cpp:379 ../src/sp-ellipse.cpp:386 +#: ../src/sp-ellipse.cpp:379 +#: ../src/sp-ellipse.cpp:386 #: ../src/ui/dialog/inkscape-preferences.cpp:403 #: ../src/widgets/pencil-toolbar.cpp:187 msgid "Ellipse" @@ -12379,8 +11775,9 @@ msgstr "Texte encadré" msgid "Linked Flowed Text" msgstr "Texte encadré" -#: ../src/sp-flowtext.cpp:298 ../src/sp-text.cpp:357 -#: ../src/text-context.cpp:1597 +#: ../src/sp-flowtext.cpp:298 +#: ../src/sp-text.cpp:357 +#: ../src/ui/tools/text-tool.cpp:1599 msgid " [truncated]" msgstr " [tronqué]" @@ -12395,7 +11792,8 @@ msgstr[1] "(%d caractères%s)" msgid "Create Guides Around the Page" msgstr "Créer des guides autour de la page" -#: ../src/sp-guide.cpp:313 ../src/verbs.cpp:2474 +#: ../src/sp-guide.cpp:313 +#: ../src/verbs.cpp:2474 msgid "Delete All Guides" msgstr "Supprimer tous les guides" @@ -12405,12 +11803,8 @@ msgid "Deleted" msgstr "Supprimé" #: ../src/sp-guide.cpp:482 -msgid "" -"Shift+drag to rotate, Ctrl+drag to move origin, Del to " -"delete" -msgstr "" -"Maj+déplacer pour pivoter, Ctrl+déplacer pour déplacer " -"l'origine, Del pour supprimer" +msgid "Shift+drag to rotate, Ctrl+drag to move origin, Del to delete" +msgstr "Maj+déplacer pour pivoter, Ctrl+déplacer pour déplacer l'origine, Del pour supprimer" #: ../src/sp-guide.cpp:486 #, c-format @@ -12441,56 +11835,39 @@ msgstr "Préférences des étoiles" msgid "%d × %d: %s" msgstr "Image %d × %d : %s" -#: ../src/spiral-context.cpp:263 -msgid "Ctrl: snap angle" -msgstr "Ctrl : pour tourner par incréments" - -#: ../src/spiral-context.cpp:265 -msgid "Alt: lock spiral radius" -msgstr "Alt : verrouiller le rayon de la spirale" - -#: ../src/spiral-context.cpp:404 -#, c-format -msgid "" -"Spiral: radius %s, angle %5g°; with Ctrl to snap angle" -msgstr "" -"Spirale : rayon %s, angle %5g° ; avec Ctrl pour tourner " -"par incréments" - -#: ../src/spiral-context.cpp:425 -msgid "Create spiral" -msgstr "Créer une spirale" - -#: ../src/sp-item.cpp:940 ../src/verbs.cpp:213 +#: ../src/sp-item.cpp:942 +#: ../src/verbs.cpp:213 msgid "Object" msgstr "Objet" -#: ../src/sp-item.cpp:957 +#: ../src/sp-item.cpp:959 #, c-format msgid "%s; clipped" msgstr "%s; découpé" -#: ../src/sp-item.cpp:963 +#: ../src/sp-item.cpp:965 #, c-format msgid "%s; masked" msgstr "%s; masqué" -#: ../src/sp-item.cpp:973 +#: ../src/sp-item.cpp:975 #, c-format msgid "%s; filtered (%s)" msgstr "%s; filtré (%s)" -#: ../src/sp-item.cpp:975 +#: ../src/sp-item.cpp:977 #, c-format msgid "%s; filtered" msgstr "%s; filtré" -#: ../src/sp-item-group.cpp:337 ../src/sp-switch.cpp:81 +#: ../src/sp-item-group.cpp:337 +#: ../src/sp-switch.cpp:82 #, fuzzy, c-format msgid "of %d object" msgstr "Groupe de %d objet" -#: ../src/sp-item-group.cpp:337 ../src/sp-switch.cpp:81 +#: ../src/sp-item-group.cpp:337 +#: ../src/sp-switch.cpp:82 #, fuzzy, c-format msgid "of %d objects" msgstr "Groupe de %d objet" @@ -12503,10 +11880,6 @@ msgstr "Ligne" msgid "Intersection" msgstr "Intersection" -#: ../src/splivarot.cpp:88 ../src/splivarot.cpp:94 -msgid "Difference" -msgstr "Différence" - #: ../src/splivarot.cpp:105 msgid "Division" msgstr "Division" @@ -12521,57 +11894,45 @@ msgstr "Sélectionner au moins 2 chemins pour une opération booléenne." #: ../src/splivarot.cpp:337 msgid "Select at least 1 path to perform a boolean union." -msgstr "" -"Sélectionner au moins 1 chemin pour réaliser une opération booléenne." +msgstr "Sélectionner au moins 1 chemin pour réaliser une opération booléenne." -#: ../src/splivarot.cpp:343 -msgid "" -"Select exactly 2 paths to perform difference, division, or path cut." -msgstr "" -"Sélectionner exactement 2 chemins pour en faire une différence, une " -"division ou les découper." +#: ../src/splivarot.cpp:345 +msgid "Select exactly 2 paths to perform difference, division, or path cut." +msgstr "Sélectionner exactement 2 chemins pour en faire une différence, une division ou les découper." -#: ../src/splivarot.cpp:359 ../src/splivarot.cpp:374 -msgid "" -"Unable to determine the z-order of the objects selected for " -"difference, XOR, division, or path cut." -msgstr "" -"Impossible de déterminer l'ordre en z des objets sélectionnés pour en " -"faire une différence, une exclusion ou les découper." +#: ../src/splivarot.cpp:361 +#: ../src/splivarot.cpp:376 +msgid "Unable to determine the z-order of the objects selected for difference, XOR, division, or path cut." +msgstr "Impossible de déterminer l'ordre en z des objets sélectionnés pour en faire une différence, une exclusion ou les découper." -#: ../src/splivarot.cpp:404 -msgid "" -"One of the objects is not a path, cannot perform boolean operation." -msgstr "" -"Un des objets n'est pas un chemin, impossible d'effectuer une " -"opération booléenne." +#: ../src/splivarot.cpp:407 +msgid "One of the objects is not a path, cannot perform boolean operation." +msgstr "Un des objets n'est pas un chemin, impossible d'effectuer une opération booléenne." -#: ../src/splivarot.cpp:1153 +#: ../src/splivarot.cpp:1156 msgid "Select stroked path(s) to convert stroke to path." -msgstr "" -"Sélectionner des chemin(s) avec contour pour convertir les contours " -"en chemins." +msgstr "Sélectionner des chemin(s) avec contour pour convertir les contours en chemins." -#: ../src/splivarot.cpp:1506 +#: ../src/splivarot.cpp:1511 msgid "Convert stroke to path" msgstr "Convertir un contour en chemin" #. TRANSLATORS: "to outline" means "to convert stroke to path" -#: ../src/splivarot.cpp:1509 +#: ../src/splivarot.cpp:1514 msgid "No stroked paths in the selection." msgstr "Aucun chemin avec contour dans la sélection." -#: ../src/splivarot.cpp:1580 +#: ../src/splivarot.cpp:1585 msgid "Selected object is not a path, cannot inset/outset." -msgstr "" -"L'objet sélectionné n'est pas un chemin, impossible de le contracter/" -"dilater." +msgstr "L'objet sélectionné n'est pas un chemin, impossible de le contracter/dilater." -#: ../src/splivarot.cpp:1676 ../src/splivarot.cpp:1741 +#: ../src/splivarot.cpp:1676 +#: ../src/splivarot.cpp:1741 msgid "Create linked offset" msgstr "Créer un objet offset lié" -#: ../src/splivarot.cpp:1677 ../src/splivarot.cpp:1742 +#: ../src/splivarot.cpp:1677 +#: ../src/splivarot.cpp:1742 msgid "Create dynamic offset" msgstr "Créer un objet offset dynamique" @@ -12579,41 +11940,41 @@ msgstr "Créer un objet offset dynamique" msgid "Select path(s) to inset/outset." msgstr "Sélectionner des chemin(s) pour les contracter/dilater." -#: ../src/splivarot.cpp:1980 +#: ../src/splivarot.cpp:1963 msgid "Outset path" msgstr "Dilater le chemin" -#: ../src/splivarot.cpp:1980 +#: ../src/splivarot.cpp:1963 msgid "Inset path" msgstr "Contracter le chemin" -#: ../src/splivarot.cpp:1982 +#: ../src/splivarot.cpp:1965 msgid "No paths to inset/outset in the selection." msgstr "Aucun chemin à contracter/dilater dans la sélection." -#: ../src/splivarot.cpp:2144 +#: ../src/splivarot.cpp:2127 msgid "Simplifying paths (separately):" msgstr "Simplification individuelle des chemins" -#: ../src/splivarot.cpp:2146 +#: ../src/splivarot.cpp:2129 msgid "Simplifying paths:" msgstr "Simplification des chemins :" -#: ../src/splivarot.cpp:2183 +#: ../src/splivarot.cpp:2166 #, c-format msgid "%s %d of %d paths simplified..." msgstr "Simplification %s - %d chemins simplifiés sur %d..." -#: ../src/splivarot.cpp:2196 +#: ../src/splivarot.cpp:2179 #, c-format msgid "%d paths simplified." msgstr "Fait - %d chemins simplifiés." -#: ../src/splivarot.cpp:2210 +#: ../src/splivarot.cpp:2193 msgid "Select path(s) to simplify." msgstr "Sélectionner un ou des chemin(s) à simplifier." -#: ../src/splivarot.cpp:2226 +#: ../src/splivarot.cpp:2209 msgid "No paths to simplify in the selection." msgstr "Aucun chemin à simplifier dans la sélection." @@ -12664,7 +12025,7 @@ msgstr "Joindre les nœuds" msgid "%i nodes%s" msgstr "Joindre les nœuds" -#: ../src/sp-polygon.cpp:182 +#: ../src/sp-polygon.cpp:185 msgid "Polygon" msgstr "Polygone" @@ -12672,67 +12033,15 @@ msgstr "Polygone" msgid "Polyline" msgstr "Polyligne" -#: ../src/spray-context.cpp:188 ../src/tweak-context.cpp:170 -#, c-format -msgid "%i object selected" -msgid_plural "%i objects selected" -msgstr[0] "%i objet sélectionné" -msgstr[1] "%i objets sélectionnés" - -#: ../src/spray-context.cpp:190 ../src/tweak-context.cpp:172 -msgid "Nothing selected" -msgstr "Rien n'a été sélectionné." - -#: ../src/spray-context.cpp:195 -#, c-format -msgid "" -"%s. Drag, click or click and scroll to spray copies of the initial " -"selection." -msgstr "" -"%s. Cliquer-déplacer, cliquer ou défiler pour pulvériser des copies " -"de la sélection initiale." - -#: ../src/spray-context.cpp:198 -#, c-format -msgid "" -"%s. Drag, click or click and scroll to spray clones of the initial " -"selection." -msgstr "" -"%s. Cliquer-déplacer, cliquer ou défiler pour pulvériser des clones " -"de la sélection initiale." - -#: ../src/spray-context.cpp:201 -#, c-format -msgid "" -"%s. Drag, click or click and scroll to spray in a single path of the " -"initial selection." -msgstr "" -"%s. Cliquer-déplacer, cliquer ou défiler pour pulvériser dans un chemin " -"unique la sélection initiale." - -#: ../src/spray-context.cpp:641 -msgid "Nothing selected! Select objects to spray." -msgstr "Sélection vide ! Sélectionner les objets à pulvériser." - -#: ../src/spray-context.cpp:716 ../src/widgets/spray-toolbar.cpp:178 -msgid "Spray with copies" -msgstr "Pulvérise avec des copies" - -#: ../src/spray-context.cpp:720 ../src/widgets/spray-toolbar.cpp:185 -msgid "Spray with clones" -msgstr "Pulvérise avec des clones" - -#: ../src/spray-context.cpp:724 -msgid "Spray in single path" -msgstr "Pulvérisation par union des formes" - #. Rectangle -#: ../src/sp-rect.cpp:163 ../src/ui/dialog/inkscape-preferences.cpp:393 +#: ../src/sp-rect.cpp:163 +#: ../src/ui/dialog/inkscape-preferences.cpp:393 msgid "Rectangle" msgstr "Rectangle" #. Spiral -#: ../src/sp-spiral.cpp:230 ../src/ui/dialog/inkscape-preferences.cpp:411 +#: ../src/sp-spiral.cpp:230 +#: ../src/ui/dialog/inkscape-preferences.cpp:411 #: ../share/extensions/gcodetools_area.inx.h:11 msgid "Spiral" msgstr "Spirale" @@ -12745,12 +12054,14 @@ msgid "with %3f turns" msgstr "Spirale à %3f tours" #. Star -#: ../src/sp-star.cpp:256 ../src/ui/dialog/inkscape-preferences.cpp:407 +#: ../src/sp-star.cpp:256 +#: ../src/ui/dialog/inkscape-preferences.cpp:407 #: ../src/widgets/star-toolbar.cpp:477 msgid "Star" msgstr "Étoile" -#: ../src/sp-star.cpp:257 ../src/widgets/star-toolbar.cpp:470 +#: ../src/sp-star.cpp:257 +#: ../src/widgets/star-toolbar.cpp:470 msgid "Polygon" msgstr "Polygone" @@ -12767,14 +12078,16 @@ msgstr "Étoile à %d branche" msgid "with %d vertices" msgstr "Étoile à %d branche" -#: ../src/sp-switch.cpp:75 +#: ../src/sp-switch.cpp:76 msgid "Conditional Group" msgstr "" -#: ../src/sp-text.cpp:330 ../src/verbs.cpp:328 +#: ../src/sp-text.cpp:330 +#: ../src/verbs.cpp:328 #: ../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 +#: ../share/extensions/split.inx.h:10 +#: ../share/extensions/text_braille.inx.h:2 #: ../share/extensions/text_extract.inx.h:14 #: ../share/extensions/text_flipcase.inx.h:2 #: ../share/extensions/text_lowercase.inx.h:2 @@ -12810,7 +12123,8 @@ msgstr "Données de caractères clonés%s%s" msgid " from " msgstr " depuis " -#: ../src/sp-tref.cpp:259 ../src/sp-use.cpp:244 +#: ../src/sp-tref.cpp:259 +#: ../src/sp-use.cpp:244 msgid "[orphaned]" msgstr "" @@ -12845,302 +12159,90 @@ msgstr "..." msgid "of: %s" msgstr "Erreur : %s" -#: ../src/star-context.cpp:277 -msgid "Ctrl: snap angle; keep rays radial" -msgstr "" -"Ctrl pour tourner par incréments; forcer la radialité des branches" - -#: ../src/star-context.cpp:423 -#, c-format -msgid "" -"Polygon: radius %s, angle %5g°; with Ctrl to snap angle" -msgstr "" -"Polygone : rayon %s, angle %5g° ; Ctrl pour tourner par " -"incréments" - -#: ../src/star-context.cpp:424 -#, c-format -msgid "Star: radius %s, angle %5g°; with Ctrl to snap angle" -msgstr "" -"Étoile : rayon %s, angle %5g° ; Ctrl pour tourner/" -"incliner par incréments" - -#: ../src/star-context.cpp:452 -msgid "Create star" -msgstr "Créer une étoile" - #: ../src/text-chemistry.cpp:94 msgid "Select a text and a path to put text on path." -msgstr "" -"Sélectionner un texte et un chemin pour placer le texte le long du " -"chemin." +msgstr "Sélectionner un texte et un chemin pour placer le texte le long du chemin." #: ../src/text-chemistry.cpp:99 -msgid "" -"This text object is already put on a path. Remove it from the path " -"first. Use Shift+D to look up its path." -msgstr "" -"Cet objet texte est déjà placé le long d'un chemin. Le retirer du " -"chemin d'abord. Utiliser Maj+D pour trouver ce chemin." +msgid "This text object is already put on a path. Remove it from the path first. Use Shift+D to look up its path." +msgstr "Cet objet texte est déjà placé le long d'un chemin. Le retirer du chemin d'abord. Utiliser Maj+D pour trouver ce chemin." #. rect is the only SPShape which is not yet, and thus SVG forbids us from putting text on it #: ../src/text-chemistry.cpp:105 -msgid "" -"You cannot put text on a rectangle in this version. Convert rectangle to " -"path first." -msgstr "" -"Vous ne pouvez pas mettre du texte dans un rectangle (dans cette version). " -"Il faut convertir le rectangle en chemin avant." +msgid "You cannot put text on a rectangle in this version. Convert rectangle to path first." +msgstr "Vous ne pouvez pas mettre du texte dans un rectangle (dans cette version). Il faut convertir le rectangle en chemin avant." #: ../src/text-chemistry.cpp:115 msgid "The flowed text(s) must be visible in order to be put on a path." msgstr "Le texte à mettre le long d'un chemin doit être visible." -#: ../src/text-chemistry.cpp:185 ../src/verbs.cpp:2496 +#: ../src/text-chemistry.cpp:185 +#: ../src/verbs.cpp:2496 msgid "Put text on path" msgstr "Mettre le texte le long d'un chemin" #: ../src/text-chemistry.cpp:197 msgid "Select a text on path to remove it from path." -msgstr "" -"Sélectionner un texte le long d'un chemin pour le retirer de ce " -"chemin." +msgstr "Sélectionner un texte le long d'un chemin pour le retirer de ce chemin." #: ../src/text-chemistry.cpp:218 msgid "No texts-on-paths in the selection." msgstr "Aucun texte le long d'un chemin dans la sélection." -#: ../src/text-chemistry.cpp:221 ../src/verbs.cpp:2498 +#: ../src/text-chemistry.cpp:221 +#: ../src/verbs.cpp:2498 msgid "Remove text from path" msgstr "Retirer le texte du chemin" -#: ../src/text-chemistry.cpp:261 ../src/text-chemistry.cpp:282 +#: ../src/text-chemistry.cpp:262 +#: ../src/text-chemistry.cpp:283 msgid "Select text(s) to remove kerns from." msgstr "Sélectionner des texte(s) pour en retirer les crénages." -#: ../src/text-chemistry.cpp:285 +#: ../src/text-chemistry.cpp:286 msgid "Remove manual kerns" msgstr "Retirer les crénages manuels" -#: ../src/text-chemistry.cpp:305 -msgid "" -"Select a text and one or more paths or shapes to flow text " -"into frame." -msgstr "" -"Sélectionner un texte et un ou plusieurs chemins ou formes " -"pour y encadrer le texte." +#: ../src/text-chemistry.cpp:306 +msgid "Select a text and one or more paths or shapes to flow text into frame." +msgstr "Sélectionner un texte et un ou plusieurs chemins ou formes pour y encadrer le texte." -#: ../src/text-chemistry.cpp:375 +#: ../src/text-chemistry.cpp:376 msgid "Flow text into shape" msgstr "Encadrer du texte dans une forme" -#: ../src/text-chemistry.cpp:397 +#: ../src/text-chemistry.cpp:398 msgid "Select a flowed text to unflow it." msgstr "Sélectionner un texte encadré pour le désencadrer." -#: ../src/text-chemistry.cpp:471 +#: ../src/text-chemistry.cpp:472 msgid "Unflow flowed text" msgstr "Désencadrer un texte encadré" -#: ../src/text-chemistry.cpp:483 +#: ../src/text-chemistry.cpp:484 msgid "Select flowed text(s) to convert." msgstr "Sélectionner un texte encadré pour le convertir." -#: ../src/text-chemistry.cpp:501 +#: ../src/text-chemistry.cpp:502 msgid "The flowed text(s) must be visible in order to be converted." msgstr "Le texte encadré doit être visible pour être converti." -#: ../src/text-chemistry.cpp:529 +#: ../src/text-chemistry.cpp:530 msgid "Convert flowed text to text" msgstr "Convertir du texte encadré en texte" -#: ../src/text-chemistry.cpp:534 +#: ../src/text-chemistry.cpp:535 msgid "No flowed text(s) to convert in the selection." msgstr "Aucun texte encadré à convertir dans la sélection." -#: ../src/text-context.cpp:390 -msgid "Click to edit the text, drag to select part of the text." -msgstr "" -"Cliquer pour éditer le texte, cliquer-déplacer pour " -"sélectionner une partie du texte." - -#: ../src/text-context.cpp:392 -msgid "" -"Click to edit the flowed text, drag to select part of the text." -msgstr "" -"Cliquer pour éditer le texte encadré, cliquer-déplacer pour " -"sélectionner une partie du texte." - -#: ../src/text-context.cpp:446 -msgid "Create text" -msgstr "Créer un texte" - -#: ../src/text-context.cpp:471 -msgid "Non-printable character" -msgstr "Caractère non imprimable" - -#: ../src/text-context.cpp:486 -msgid "Insert Unicode character" -msgstr "Insérer un caractère Unicode" - -#: ../src/text-context.cpp:521 -#, c-format -msgid "Unicode (Enter to finish): %s: %s" -msgstr "Unicode (Entrée pour terminer) : %s: %s" - -#: ../src/text-context.cpp:523 ../src/text-context.cpp:830 -msgid "Unicode (Enter to finish): " -msgstr "Unicode (Entrée pour terminer) : " - -#: ../src/text-context.cpp:606 -#, c-format -msgid "Flowed text frame: %s × %s" -msgstr "Cadre de texte : %s × %s" - -#: ../src/text-context.cpp:664 -msgid "Type text; Enter to start new line." -msgstr "Taper le texte ; Entrée pour commencer une nouvelle ligne." - -#: ../src/text-context.cpp:675 -msgid "Flowed text is created." -msgstr "Le texte encadré est créé." - -#: ../src/text-context.cpp:677 -msgid "Create flowed text" -msgstr "Créer un texte encadré" - -#: ../src/text-context.cpp:679 -msgid "" -"The frame is too small for the current font size. Flowed text not " -"created." -msgstr "" -"Le cadre est trop petit pour la taille de police courante. Le texte " -"encadré n'a pas été créé." - -#: ../src/text-context.cpp:815 -msgid "No-break space" -msgstr "Espace insécable" - -#: ../src/text-context.cpp:817 -msgid "Insert no-break space" -msgstr "Insérer un espace insécable" - -#: ../src/text-context.cpp:854 -msgid "Make bold" -msgstr "Rendre gras" - -#: ../src/text-context.cpp:872 -msgid "Make italic" -msgstr "Rendre italique" - -#: ../src/text-context.cpp:911 -msgid "New line" -msgstr "Nouvelle ligne" - -#: ../src/text-context.cpp:953 -msgid "Backspace" -msgstr "Retour arrière" - -#: ../src/text-context.cpp:1009 -msgid "Kern to the left" -msgstr "Créner vers la gauche" - -#: ../src/text-context.cpp:1034 -msgid "Kern to the right" -msgstr "Créner vers la droite" - -#: ../src/text-context.cpp:1059 -msgid "Kern up" -msgstr "Créner vers le haut" - -#: ../src/text-context.cpp:1084 -msgid "Kern down" -msgstr "Créner vers le bas" - -#: ../src/text-context.cpp:1160 -msgid "Rotate counterclockwise" -msgstr "Tourner dans le sens anti-horaire" - -#: ../src/text-context.cpp:1181 -msgid "Rotate clockwise" -msgstr "Tourner dans le sens horaire" - -#: ../src/text-context.cpp:1198 -msgid "Contract line spacing" -msgstr "Diminuer l'espacement entre les lignes" - -#: ../src/text-context.cpp:1205 -msgid "Contract letter spacing" -msgstr "Diminuer l'espacement des lettres" - -#: ../src/text-context.cpp:1223 -msgid "Expand line spacing" -msgstr "Augmenter l'espacement entre les lignes" - -#: ../src/text-context.cpp:1230 -msgid "Expand letter spacing" -msgstr "Augmenter l'espacement des lettres" - -#: ../src/text-context.cpp:1360 -msgid "Paste text" -msgstr "Coller le texte" - -#: ../src/text-context.cpp:1485 ../src/ui/dialog/text-edit.cpp:588 -#: ../src/ui/dialog/text-edit.cpp:662 -msgid "Set text style" -msgstr "Appliquer un style à un texte" - -#: ../src/text-context.cpp:1614 -#, c-format -msgid "" -"Type or edit flowed text (%d character%s); Enter to start new " -"paragraph." -msgid_plural "" -"Type or edit flowed text (%d characters%s); Enter to start new " -"paragraph." -msgstr[0] "" -"Saisir ou modifier le texte encadré (%d caractère%s) ; Entrée pour " -"commencer un nouveau paragraphe." -msgstr[1] "" -"Saisir ou modifier le texte encadré (%d caractères%s) ; Entrée pour " -"commencer un nouveau paragraphe." - -#: ../src/text-context.cpp:1616 -#, c-format -msgid "Type or edit text (%d character%s); Enter to start new line." -msgid_plural "" -"Type or edit text (%d characters%s); Enter to start new line." -msgstr[0] "" -"Saisir ou modifier le texte (%d caractère%s) ; Entrée pour commencer " -"une nouvelle ligne." -msgstr[1] "" -"Saisir ou modifier le texte (%d caractères%s) ; Entrée pour commencer " -"une nouvelle ligne." - -#: ../src/text-context.cpp:1624 ../src/tools-switch.cpp:103 -msgid "" -"Click to select or create text, drag to create flowed text; " -"then type." -msgstr "" -"Cliquer pour sélectionner ou créer un texte, cliquer-déplacer " -"pour créer un texte encadré; puis taper le texte." - -#: ../src/text-context.cpp:1726 -msgid "Type text" -msgstr "Taper du texte" - #: ../src/text-editing.cpp:44 msgid "You cannot edit cloned character data." msgstr "Vous ne pouvez pas modifier des données de caractères clonés." #: ../src/tools-switch.cpp:91 #, fuzzy -msgid "" -"Click to Select and Transform objects, Drag to select many " -"objects." -msgstr "" -"Cliquer pour sélectionner des nœuds, cliquer-déplacer pour les " -"déplacer." +msgid "Click to Select and Transform objects, Drag to select many objects." +msgstr "Cliquer pour sélectionner des nœuds, cliquer-déplacer pour les déplacer." #: ../src/tools-switch.cpp:92 #, fuzzy @@ -13149,129 +12251,77 @@ msgstr "Simplifier les chemins sélectionnés (supprimer des nœuds superflus)" #: ../src/tools-switch.cpp:93 msgid "To tweak a path by pushing, select it and drag over it." -msgstr "" -"Pour perturber un chemin en le poussant, sélectionnez-le et faites glisser " -"la souris dessus." +msgstr "Pour perturber un chemin en le poussant, sélectionnez-le et faites glisser la souris dessus." #: ../src/tools-switch.cpp:94 -msgid "" -"Drag, click or click and scroll to spray the selected " -"objects." -msgstr "" -"Cliquer-déplacer, cliquer ou défiler pour pulvériser " -"les objets sélectionnés." +msgid "Drag, click or click and scroll to spray the selected objects." +msgstr "Cliquer-déplacer, cliquer ou défiler pour pulvériser les objets sélectionnés." #: ../src/tools-switch.cpp:95 -msgid "" -"Drag to create a rectangle. Drag controls to round corners and " -"resize. Click to select." -msgstr "" -"Cliquer-déplacer pour créer un rectangle. Déplacer les poignées pour arrondir les coins. Cliquer pour sélectionner." +msgid "Drag to create a rectangle. Drag controls to round corners and resize. Click to select." +msgstr "Cliquer-déplacer pour créer un rectangle. Déplacer les poignées pour arrondir les coins. Cliquer pour sélectionner." #: ../src/tools-switch.cpp:96 -msgid "" -"Drag to create a 3D box. Drag controls to resize in " -"perspective. Click to select (with Ctrl+Alt for single faces)." -msgstr "" -"Cliquer-déplacer pour créer une boîte 3D. Déplacer les poignées pour redimensionner en perspective. Cliquer pour sélectionner " -"(avec Ctrl+Alt pour sélectionner les faces)." +msgid "Drag to create a 3D box. Drag controls to resize in perspective. Click to select (with Ctrl+Alt for single faces)." +msgstr "Cliquer-déplacer pour créer une boîte 3D. Déplacer les poignées pour redimensionner en perspective. Cliquer pour sélectionner (avec Ctrl+Alt pour sélectionner les faces)." #: ../src/tools-switch.cpp:97 -msgid "" -"Drag to create an ellipse. Drag controls to make an arc or " -"segment. Click to select." -msgstr "" -"Cliquer-déplacer pour créer une ellipse. Déplacer les poignées " -"pour faire des arcs ou des camemberts. Cliquer pour sélectionner." +msgid "Drag to create an ellipse. Drag controls to make an arc or segment. Click to select." +msgstr "Cliquer-déplacer pour créer une ellipse. Déplacer les poignées pour faire des arcs ou des camemberts. Cliquer pour sélectionner." #: ../src/tools-switch.cpp:98 -msgid "" -"Drag to create a star. Drag controls to edit the star shape. " -"Click to select." -msgstr "" -"Cliquer-déplacer pour créer une étoile. Déplacer les poignées " -"pour éditer la forme de l'étoile. Cliquer pour sélectionner." +msgid "Drag to create a star. Drag controls to edit the star shape. Click to select." +msgstr "Cliquer-déplacer pour créer une étoile. Déplacer les poignées pour éditer la forme de l'étoile. Cliquer pour sélectionner." #: ../src/tools-switch.cpp:99 -msgid "" -"Drag to create a spiral. Drag controls to edit the spiral " -"shape. Click to select." -msgstr "" -"Cliquer-déplacer pour créer une spirale. Déplacer les poignées " -"pour modifier la forme de la spirale. Cliquer pour sélectionner." +msgid "Drag to create a spiral. Drag controls to edit the spiral shape. Click to select." +msgstr "Cliquer-déplacer pour créer une spirale. Déplacer les poignées pour modifier la forme de la spirale. Cliquer pour sélectionner." #: ../src/tools-switch.cpp:100 -msgid "" -"Drag to create a freehand line. Shift appends to selected " -"path, Alt activates sketch mode." -msgstr "" -"Cliquer-déplacer pour créer une ligne à main levée. Maj pour " -"l'ajouter au chemin sélectionné. Alt pour activer le mode croquis." +msgid "Drag to create a freehand line. Shift appends to selected path, Alt activates sketch mode." +msgstr "Cliquer-déplacer pour créer une ligne à main levée. Maj pour l'ajouter au chemin sélectionné. Alt pour activer le mode croquis." #: ../src/tools-switch.cpp:101 -msgid "" -"Click or click and drag to start a path; with Shift to " -"append to selected path. Ctrl+click to create single dots (straight " -"line modes only)." -msgstr "" -"Cliquer ou cliquer-déplacer pour commencer un chemin; Maj pour ajouter au chemin sélectionné; Ctrl+clic pour créer des " -"points isolés (avec les modes lignes droites)." +msgid "Click or click and drag to start a path; with Shift to append to selected path. Ctrl+click to create single dots (straight line modes only)." +msgstr "Cliquer ou cliquer-déplacer pour commencer un chemin; Maj pour ajouter au chemin sélectionné; Ctrl+clic pour créer des points isolés (avec les modes lignes droites)." #: ../src/tools-switch.cpp:102 -msgid "" -"Drag to draw a calligraphic stroke; with Ctrl to track a guide " -"path. Arrow keys adjust width (left/right) and angle (up/down)." -msgstr "" -"Cliquer-déplacer pour calligraphier; Ctrl pour suivre un " -"guide. Les flèches gauche/droite ajustent la largeur de la " -"plume, haut/bas son angle." +msgid "Drag to draw a calligraphic stroke; with Ctrl to track a guide path. Arrow keys adjust width (left/right) and angle (up/down)." +msgstr "Cliquer-déplacer pour calligraphier; Ctrl pour suivre un guide. Les flèches gauche/droite ajustent la largeur de la plume, haut/bas son angle." + +#: ../src/tools-switch.cpp:103 +#: ../src/ui/tools/text-tool.cpp:1626 +msgid "Click to select or create text, drag to create flowed text; then type." +msgstr "Cliquer pour sélectionner ou créer un texte, cliquer-déplacer pour créer un texte encadré; puis taper le texte." #: ../src/tools-switch.cpp:104 -msgid "" -"Drag or double click to create a gradient on selected objects, " -"drag handles to adjust gradients." -msgstr "" -"Cliquer-déplacer ou double-cliquer pour créer un dégradé sur " -"les objets sélectionnés, déplacer les poignées pour ajuster les " -"dégradés." +msgid "Drag or double click to create a gradient on selected objects, drag handles to adjust gradients." +msgstr "Cliquer-déplacer ou double-cliquer pour créer un dégradé sur les objets sélectionnés, déplacer les poignées pour ajuster les dégradés." #: ../src/tools-switch.cpp:105 -msgid "" -"Drag or double click to create a mesh on selected objects, " -"drag handles to adjust meshes." -msgstr "" -"Cliquer-déplacer ou double-cliquer pour créer une toile sur " -"les objets sélectionnés, déplacer les poignées pour ajuster les " -"toiles." +msgid "Drag or double click to create a mesh on selected objects, drag handles to adjust meshes." +msgstr "Cliquer-déplacer ou double-cliquer pour créer une toile sur les objets sélectionnés, déplacer les poignées pour ajuster les toiles." #: ../src/tools-switch.cpp:106 -msgid "" -"Click or drag around an area to zoom in, Shift+click to " -"zoom out." -msgstr "" -"Cliquer ou cliquer-déplacer sur une zone pour zoomer, Maj" -"+clic pour dézoomer." +msgid "Click or drag around an area to zoom in, Shift+click to zoom out." +msgstr "Cliquer ou cliquer-déplacer sur une zone pour zoomer, Maj+clic pour dézoomer." #: ../src/tools-switch.cpp:107 msgid "Drag to measure the dimensions of objects." msgstr "Cliquer-glisser pour mesurer les dimensions des objets." +#: ../src/tools-switch.cpp:108 +#: ../src/ui/tools/dropper-tool.cpp:287 +msgid "Click to set fill, Shift+click to set stroke; drag to average color in area; with Alt to pick inverse color; Ctrl+C to copy the color under mouse to clipboard" +msgstr "Cliquer pour appliquer au remplissage, Maj+clic pour appliquer au contour; cliquer-déplacer pour capturer la couleur moyenne sur une zone; à combiner avec Alt pour capturer la couleur inverse; Ctrl+C pour copier la couleur sous le curseur de la souris vers le presse-papiers " + #: ../src/tools-switch.cpp:109 msgid "Click and drag between shapes to create a connector." msgstr "Cliquer et déplacer entre des formes pour créer un connecteur." #: ../src/tools-switch.cpp:110 -msgid "" -"Click to paint a bounded area, Shift+click to union the new " -"fill with the current selection, Ctrl+click to change the clicked " -"object's fill and stroke to the current setting." -msgstr "" -"Cliquer pour remplir une région bornée. Maj+Clic pour faire " -"une union du remplissage avec la sélection courante, Ctrl+Clic pour " -"changer le trait et le remplissage de l'objet désigné" +msgid "Click to paint a bounded area, Shift+click to union the new fill with the current selection, Ctrl+click to change the clicked object's fill and stroke to the current setting." +msgstr "Cliquer pour remplir une région bornée. Maj+Clic pour faire une union du remplissage avec la sélection courante, Ctrl+Clic pour changer le trait et le remplissage de l'objet désigné" #: ../src/tools-switch.cpp:111 msgid "Drag to erase." @@ -13286,8 +12336,10 @@ msgstr "Sélectionner un outil secondaire dans la barre d'outils" msgid "Trace: %1. %2 nodes" msgstr "Vectoriser : %1. %2 nœuds" -#: ../src/trace/trace.cpp:59 ../src/trace/trace.cpp:124 -#: ../src/trace/trace.cpp:132 ../src/trace/trace.cpp:225 +#: ../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:338 #: ../src/ui/dialog/pixelartdialog.cpp:356 msgid "Select an image to trace" @@ -13331,153 +12383,13 @@ msgstr "Vectoriser un bitmap" msgid "Trace: Done. %ld nodes created" msgstr "Vectorisation effectuée. %ld nœuds créés." -#: ../src/tweak-context.cpp:177 -#, c-format -msgid "%s. Drag to move." -msgstr "%s. Cliquer-glisser pour déplacer." - -#: ../src/tweak-context.cpp:181 -#, c-format -msgid "%s. Drag or click to move in; with Shift to move out." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour rapprocher; avec Maj pour " -"éloigner." - -#: ../src/tweak-context.cpp:189 -#, c-format -msgid "%s. Drag or click to move randomly." -msgstr "%s. Glisser ou cliquer pour déplacer aléatoirement." - -#: ../src/tweak-context.cpp:193 -#, c-format -msgid "%s. Drag or click to scale down; with Shift to scale up." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour réduire; avec Maj pour " -"agrandir." - -#: ../src/tweak-context.cpp:201 -#, c-format -msgid "" -"%s. Drag or click to rotate clockwise; with Shift, " -"counterclockwise." -msgstr "" -"%s. Glisser ou cliquer pour pivoter dans le sens horaire ; avec Maj, " -"dans le sens anti-horaire." - -#: ../src/tweak-context.cpp:209 -#, c-format -msgid "%s. Drag or click to duplicate; with Shift, delete." -msgstr "" -"%s. Glisser ou cliquer pour dupliquer ; avec Maj, supprime." - -#: ../src/tweak-context.cpp:217 -#, c-format -msgid "%s. Drag to push paths." -msgstr "%s. Glisser pour pousser les chemins." - -#: ../src/tweak-context.cpp:221 -#, c-format -msgid "%s. Drag or click to inset paths; with Shift to outset." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour rétrécir les chemins; avec Maj " -"pour les élargir." - -#: ../src/tweak-context.cpp:229 -#, c-format -msgid "%s. Drag or click to attract paths; with Shift to repel." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour attirer les chemins; avec Maj " -"pour les repousser." - -#: ../src/tweak-context.cpp:237 -#, c-format -msgid "%s. Drag or click to roughen paths." -msgstr "%s. Cliquer-glisser ou cliquer pour rendre les chemins rugueux." - -#: ../src/tweak-context.cpp:241 -#, c-format -msgid "%s. Drag or click to paint objects with color." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour peindre les objets avec une " -"couleur." - -#: ../src/tweak-context.cpp:245 -#, c-format -msgid "%s. Drag or click to randomize colors." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour peindre avec une couleur aléatoire." - -#: ../src/tweak-context.cpp:249 -#, c-format -msgid "" -"%s. Drag or click to increase blur; with Shift to decrease." -msgstr "" -"%s. Cliquer-glisser ou cliquer pour augmenter le flou; avec Maj pour " -"le diminuer." - -#: ../src/tweak-context.cpp:1196 -msgid "Nothing selected! Select objects to tweak." -msgstr "Sélection vide ! Sélectionner les objets à ajuster." - -#: ../src/tweak-context.cpp:1230 -msgid "Move tweak" -msgstr "Ajuster en déplaçant" - -#: ../src/tweak-context.cpp:1234 -msgid "Move in/out tweak" -msgstr "Ajuster en rapprochant ou en s'éloignant du curseur" - -#: ../src/tweak-context.cpp:1238 -msgid "Move jitter tweak" -msgstr "Ajuster en déplaçant aléatoirement" - -#: ../src/tweak-context.cpp:1242 -msgid "Scale tweak" -msgstr "Ajuster en redimensionnant" - -#: ../src/tweak-context.cpp:1246 -msgid "Rotate tweak" -msgstr "Ajuster en pivotant" - -#: ../src/tweak-context.cpp:1250 -msgid "Duplicate/delete tweak" -msgstr "Ajuster en dupliquant ou supprimant" - -#: ../src/tweak-context.cpp:1254 -msgid "Push path tweak" -msgstr "Ajuster en poussant le chemin" - -#: ../src/tweak-context.cpp:1258 -msgid "Shrink/grow path tweak" -msgstr "Ajuster en contractant ou en dilatant le chemin" - -#: ../src/tweak-context.cpp:1262 -msgid "Attract/repel path tweak" -msgstr "Ajuster en attirant ou en repoussant le chemin" - -#: ../src/tweak-context.cpp:1266 -msgid "Roughen path tweak" -msgstr "Ajuster en rendant le chemin plus rugueux" - -#: ../src/tweak-context.cpp:1270 -msgid "Color paint tweak" -msgstr "Ajuster en peignant la couleur" - -#: ../src/tweak-context.cpp:1274 -msgid "Color jitter tweak" -msgstr "Ajuster en variant les couleurs" - -#: ../src/tweak-context.cpp:1278 -msgid "Blur tweak" -msgstr "Ajuster le niveau de flou" - #. check whether something is selected #: ../src/ui/clipboard.cpp:261 msgid "Nothing was copied." msgstr "Rien n'a été copié." -#: ../src/ui/clipboard.cpp:374 ../src/ui/clipboard.cpp:583 +#: ../src/ui/clipboard.cpp:374 +#: ../src/ui/clipboard.cpp:583 #: ../src/ui/clipboard.cpp:606 msgid "Nothing on the clipboard." msgstr "Rien dans le presse-papiers." @@ -13486,14 +12398,14 @@ msgstr "Rien dans le presse-papiers." msgid "Select object(s) to paste style to." msgstr "Sélectionner un ou des objets sur lesquels coller un style." -#: ../src/ui/clipboard.cpp:443 ../src/ui/clipboard.cpp:460 +#: ../src/ui/clipboard.cpp:443 +#: ../src/ui/clipboard.cpp:460 msgid "No style on the clipboard." msgstr "Pas de style dans le presse-papiers." #: ../src/ui/clipboard.cpp:485 msgid "Select object(s) to paste size to." -msgstr "" -"Sélectionner un ou des objets sur lesquels coller des dimensions." +msgstr "Sélectionner un ou des objets sur lesquels coller des dimensions." #: ../src/ui/clipboard.cpp:492 msgid "No size on the clipboard." @@ -13501,16 +12413,15 @@ msgstr "Pas de dimension dans le presse-papiers." #: ../src/ui/clipboard.cpp:545 msgid "Select object(s) to paste live path effect to." -msgstr "" -"Sélectionner un ou des objet(s) sur lesquels coller un effet de " -"chemin." +msgstr "Sélectionner un ou des objet(s) sur lesquels coller un effet de chemin." #. no_effect: #: ../src/ui/clipboard.cpp:570 msgid "No effect on the clipboard." msgstr "Pas d'effet dans le presse-papiers." -#: ../src/ui/clipboard.cpp:589 ../src/ui/clipboard.cpp:617 +#: ../src/ui/clipboard.cpp:589 +#: ../src/ui/clipboard.cpp:617 msgid "Clipboard does not contain a path." msgstr "Le presse-papier ne contient pas de chemin." @@ -13635,7 +12546,7 @@ msgid "Rearrange" msgstr "Organiser" #: ../src/ui/dialog/align-and-distribute.cpp:856 -#: ../src/widgets/toolbox.cpp:1726 +#: ../src/widgets/toolbox.cpp:1727 msgid "Nodes" msgstr "Nœuds" @@ -13648,54 +12559,63 @@ msgid "_Treat selection as group: " msgstr "_Manipuler la sélection comme un groupe :" #. Align -#: ../src/ui/dialog/align-and-distribute.cpp:877 ../src/verbs.cpp:2939 -#: ../src/verbs.cpp:2940 +#: ../src/ui/dialog/align-and-distribute.cpp:877 +#: ../src/verbs.cpp:2941 +#: ../src/verbs.cpp:2942 msgid "Align right edges of objects to the left edge of the anchor" msgstr "Aligner les bords droits des objets au bord gauche de l'ancre" -#: ../src/ui/dialog/align-and-distribute.cpp:880 ../src/verbs.cpp:2941 -#: ../src/verbs.cpp:2942 +#: ../src/ui/dialog/align-and-distribute.cpp:880 +#: ../src/verbs.cpp:2943 +#: ../src/verbs.cpp:2944 msgid "Align left edges" msgstr "Aligner les bords gauches" -#: ../src/ui/dialog/align-and-distribute.cpp:883 ../src/verbs.cpp:2943 -#: ../src/verbs.cpp:2944 +#: ../src/ui/dialog/align-and-distribute.cpp:883 +#: ../src/verbs.cpp:2945 +#: ../src/verbs.cpp:2946 msgid "Center on vertical axis" msgstr "Centrer selon un axe vertical" -#: ../src/ui/dialog/align-and-distribute.cpp:886 ../src/verbs.cpp:2945 -#: ../src/verbs.cpp:2946 +#: ../src/ui/dialog/align-and-distribute.cpp:886 +#: ../src/verbs.cpp:2947 +#: ../src/verbs.cpp:2948 msgid "Align right sides" msgstr "Aligner les côtés droits" -#: ../src/ui/dialog/align-and-distribute.cpp:889 ../src/verbs.cpp:2947 -#: ../src/verbs.cpp:2948 +#: ../src/ui/dialog/align-and-distribute.cpp:889 +#: ../src/verbs.cpp:2949 +#: ../src/verbs.cpp:2950 msgid "Align left edges of objects to the right edge of the anchor" msgstr "Aligner les bords gauches des objets au bord droit de l'ancre" -#: ../src/ui/dialog/align-and-distribute.cpp:892 ../src/verbs.cpp:2949 -#: ../src/verbs.cpp:2950 +#: ../src/ui/dialog/align-and-distribute.cpp:892 +#: ../src/verbs.cpp:2951 +#: ../src/verbs.cpp:2952 msgid "Align bottom edges of objects to the top edge of the anchor" -msgstr "" -"Aligner les bords inférieurs des objets avec le bord supérieur de l'ancre" +msgstr "Aligner les bords inférieurs des objets avec le bord supérieur de l'ancre" -#: ../src/ui/dialog/align-and-distribute.cpp:895 ../src/verbs.cpp:2951 -#: ../src/verbs.cpp:2952 +#: ../src/ui/dialog/align-and-distribute.cpp:895 +#: ../src/verbs.cpp:2953 +#: ../src/verbs.cpp:2954 msgid "Align top edges" msgstr "Aligner les bords supérieurs" -#: ../src/ui/dialog/align-and-distribute.cpp:898 ../src/verbs.cpp:2953 -#: ../src/verbs.cpp:2954 +#: ../src/ui/dialog/align-and-distribute.cpp:898 +#: ../src/verbs.cpp:2955 +#: ../src/verbs.cpp:2956 msgid "Center on horizontal axis" msgstr "Centrer selon un axe horizontal" -#: ../src/ui/dialog/align-and-distribute.cpp:901 ../src/verbs.cpp:2955 -#: ../src/verbs.cpp:2956 +#: ../src/ui/dialog/align-and-distribute.cpp:901 +#: ../src/verbs.cpp:2957 +#: ../src/verbs.cpp:2958 msgid "Align bottom edges" msgstr "Aligner les bords inférieurs" -#: ../src/ui/dialog/align-and-distribute.cpp:904 ../src/verbs.cpp:2957 -#: ../src/verbs.cpp:2958 +#: ../src/ui/dialog/align-and-distribute.cpp:904 +#: ../src/verbs.cpp:2959 +#: ../src/verbs.cpp:2960 msgid "Align top edges of objects to the bottom edge of the anchor" msgstr "Aligner les bords supérieurs des objets avec le bas de l'ancre" @@ -13717,8 +12637,7 @@ msgstr "Distribuer des distances égales entre les bords gauches des objets" #: ../src/ui/dialog/align-and-distribute.cpp:924 msgid "Distribute centers equidistantly horizontally" -msgstr "" -"Distribuer des distances égales horizontalement entre les centres des objets" +msgstr "Distribuer des distances égales horizontalement entre les centres des objets" #: ../src/ui/dialog/align-and-distribute.cpp:927 msgid "Distribute right edges equidistantly" @@ -13734,8 +12653,7 @@ msgstr "Distribuer des distances égales entre les bords supérieurs des objets" #: ../src/ui/dialog/align-and-distribute.cpp:938 msgid "Distribute centers equidistantly vertically" -msgstr "" -"Distribuer des distances égales verticalement entre les centres des objets" +msgstr "Distribuer des distances égales verticalement entre les centres des objets" #: ../src/ui/dialog/align-and-distribute.cpp:941 msgid "Distribute bottom edges equidistantly" @@ -13743,14 +12661,11 @@ msgstr "Distribuer des distances égales entre les bords inférieurs des objets" #: ../src/ui/dialog/align-and-distribute.cpp:946 msgid "Distribute baseline anchors of texts horizontally" -msgstr "" -"Distribuer des distances égales horizontalement entre les ancres des objets " -"texte" +msgstr "Distribuer des distances égales horizontalement entre les ancres des objets texte" #: ../src/ui/dialog/align-and-distribute.cpp:949 msgid "Distribute baselines of texts vertically" -msgstr "" -"Distribuer des distances égales verticalement entre lignes de base des textes" +msgstr "Distribuer des distances égales verticalement entre lignes de base des textes" #: ../src/ui/dialog/align-and-distribute.cpp:955 #: ../src/widgets/connector-toolbar.cpp:385 @@ -13775,16 +12690,11 @@ msgstr "Eparpiller aléatoirement les centres dans toutes les directions" #: ../src/ui/dialog/align-and-distribute.cpp:972 msgid "Unclump objects: try to equalize edge-to-edge distances" -msgstr "" -"Éparpiller les objets : tenter d'uniformiser les distances de bord à bord" +msgstr "Éparpiller les objets : tenter d'uniformiser les distances de bord à bord" #: ../src/ui/dialog/align-and-distribute.cpp:977 -msgid "" -"Move objects as little as possible so that their bounding boxes do not " -"overlap" -msgstr "" -"Déplacer les objets aussi peu que possible afin que leurs boîtes englobantes " -"ne se chevauchent pas" +msgid "Move objects as little as possible so that their bounding boxes do not overlap" +msgstr "Déplacer les objets aussi peu que possible afin que leurs boîtes englobantes ne se chevauchent pas" #: ../src/ui/dialog/align-and-distribute.cpp:985 msgid "Align selected nodes to a common horizontal line" @@ -13796,13 +12706,11 @@ msgstr "Aligner les nœuds sélectionnés selon une ligne verticale commune" #: ../src/ui/dialog/align-and-distribute.cpp:991 msgid "Distribute selected nodes horizontally" -msgstr "" -"Distribuer des distances égales horizontalement entre les nœuds sélectionnés" +msgstr "Distribuer des distances égales horizontalement entre les nœuds sélectionnés" #: ../src/ui/dialog/align-and-distribute.cpp:994 msgid "Distribute selected nodes vertically" -msgstr "" -"Distribuer des distances égales verticalement entre les nœuds sélectionnés" +msgstr "Distribuer des distances égales verticalement entre les nœuds sélectionnés" #. Rest of the widgetry #: ../src/ui/dialog/align-and-distribute.cpp:999 @@ -13822,8 +12730,9 @@ msgid "Smallest object" msgstr "Objet le plus petit" #: ../src/ui/dialog/align-and-distribute.cpp:1005 -#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1555 ../src/verbs.cpp:175 -#: ../src/widgets/desktop-widget.cpp:2011 +#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1555 +#: ../src/verbs.cpp:175 +#: ../src/widgets/desktop-widget.cpp:2002 #: ../share/extensions/printing_marks.inx.h:18 msgid "Selection" msgstr "Sélection" @@ -13941,14 +12850,12 @@ msgstr "Translation X :" #: ../src/ui/dialog/clonetiler.cpp:198 #, no-c-format msgid "Horizontal shift per row (in % of tile width)" -msgstr "" -"Translation horizontale à chaque ligne (en % de la largeur du pavé de base)" +msgstr "Translation horizontale à chaque ligne (en % de la largeur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:206 #, no-c-format msgid "Horizontal shift per column (in % of tile width)" -msgstr "" -"Translation horizontale à chaque colonne (en % de la largeur du pavé de base)" +msgstr "Translation horizontale à chaque colonne (en % de la largeur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:212 msgid "Randomize the horizontal shift by this percentage" @@ -13963,39 +12870,37 @@ msgstr "Translation Y :" #: ../src/ui/dialog/clonetiler.cpp:230 #, no-c-format msgid "Vertical shift per row (in % of tile height)" -msgstr "" -"Translation verticale à chaque ligne (en % de la hauteur du pavé de base)" +msgstr "Translation verticale à chaque ligne (en % de la hauteur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:238 #, no-c-format msgid "Vertical shift per column (in % of tile height)" -msgstr "" -"Translation verticale à chaque colonne (en % de la hauteur du pavé de base)" +msgstr "Translation verticale à chaque colonne (en % de la hauteur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:245 msgid "Randomize the vertical shift by this percentage" msgstr "Introduire ce pourcentage de hasard dans la translation verticale" -#: ../src/ui/dialog/clonetiler.cpp:253 ../src/ui/dialog/clonetiler.cpp:399 +#: ../src/ui/dialog/clonetiler.cpp:253 +#: ../src/ui/dialog/clonetiler.cpp:399 msgid "Exponent:" msgstr "Exposant :" #: ../src/ui/dialog/clonetiler.cpp:260 msgid "Whether rows are spaced evenly (1), converge (<1) or diverge (>1)" -msgstr "" -"Selon la valeur, l'inter ligne reste constant (1), converge (<1) ou diverge " -"(>1) " +msgstr "Selon la valeur, l'inter ligne reste constant (1), converge (<1) ou diverge (>1) " #: ../src/ui/dialog/clonetiler.cpp:267 msgid "Whether columns are spaced evenly (1), converge (<1) or diverge (>1)" -msgstr "" -"Selon la valeur, l'inter colonne reste constant (1), converge (<1) ou " -"diverge (>1) " +msgstr "Selon la valeur, l'inter colonne reste constant (1), converge (<1) ou diverge (>1) " #. TRANSLATORS: "Alternate" is a verb here -#: ../src/ui/dialog/clonetiler.cpp:275 ../src/ui/dialog/clonetiler.cpp:439 -#: ../src/ui/dialog/clonetiler.cpp:515 ../src/ui/dialog/clonetiler.cpp:588 -#: ../src/ui/dialog/clonetiler.cpp:634 ../src/ui/dialog/clonetiler.cpp:761 +#: ../src/ui/dialog/clonetiler.cpp:275 +#: ../src/ui/dialog/clonetiler.cpp:439 +#: ../src/ui/dialog/clonetiler.cpp:515 +#: ../src/ui/dialog/clonetiler.cpp:588 +#: ../src/ui/dialog/clonetiler.cpp:634 +#: ../src/ui/dialog/clonetiler.cpp:761 msgid "Alternate:" msgstr "Alterner :" @@ -14008,7 +12913,8 @@ msgid "Alternate the sign of shifts for each column" msgstr "Alterner le signe de la translation à chaque colonne" #. TRANSLATORS: "Cumulate" is a verb here -#: ../src/ui/dialog/clonetiler.cpp:293 ../src/ui/dialog/clonetiler.cpp:457 +#: ../src/ui/dialog/clonetiler.cpp:293 +#: ../src/ui/dialog/clonetiler.cpp:457 #: ../src/ui/dialog/clonetiler.cpp:533 msgid "Cumulate:" msgstr "Cumulatif :" @@ -14045,21 +12951,16 @@ msgstr "Échelle X :" #: ../src/ui/dialog/clonetiler.cpp:347 #, no-c-format msgid "Horizontal scale per row (in % of tile width)" -msgstr "" -"Redimensionnement horizontal à chaque ligne (en % de la largeur du pavé de " -"base)" +msgstr "Redimensionnement horizontal à chaque ligne (en % de la largeur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:355 #, no-c-format msgid "Horizontal scale per column (in % of tile width)" -msgstr "" -"Redimensionnement horizontal à chaque colonne (en % de la largeur du pavé de " -"base)" +msgstr "Redimensionnement horizontal à chaque colonne (en % de la largeur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:361 msgid "Randomize the horizontal scale by this percentage" -msgstr "" -"Introduire ce pourcentage de hasard dans le redimensionnement horizontal" +msgstr "Introduire ce pourcentage de hasard dans le redimensionnement horizontal" #: ../src/ui/dialog/clonetiler.cpp:369 msgid "Scale Y:" @@ -14068,16 +12969,12 @@ msgstr "Échelle Y :" #: ../src/ui/dialog/clonetiler.cpp:377 #, no-c-format msgid "Vertical scale per row (in % of tile height)" -msgstr "" -"Redimensionnement vertical à chaque ligne (en % de la hauteur du pavé de " -"base)" +msgstr "Redimensionnement vertical à chaque ligne (en % de la hauteur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:385 #, no-c-format msgid "Vertical scale per column (in % of tile height)" -msgstr "" -"Redimensionnement vertical à chaque colonne (en % de la largeur du pavé de " -"base)" +msgstr "Redimensionnement vertical à chaque colonne (en % de la largeur du pavé de base)" #: ../src/ui/dialog/clonetiler.cpp:391 msgid "Randomize the vertical scale by this percentage" @@ -14085,26 +12982,20 @@ msgstr "Introduire ce pourcentage de hasard dans le redimensionnement vertical" #: ../src/ui/dialog/clonetiler.cpp:405 msgid "Whether row scaling is uniform (1), converge (<1) or diverge (>1)" -msgstr "" -"Selon la valeur, le redimensionnement des lignes est uniforme (1), converge " -"(<1) ou diverge (>1) " +msgstr "Selon la valeur, le redimensionnement des lignes est uniforme (1), converge (<1) ou diverge (>1) " #: ../src/ui/dialog/clonetiler.cpp:411 msgid "Whether column scaling is uniform (1), converge (<1) or diverge (>1)" -msgstr "" -"Selon la valeur, le redimensionnement des colonnes est uniforme (1), " -"converge (<1) ou diverge (>1) " +msgstr "Selon la valeur, le redimensionnement des colonnes est uniforme (1), converge (<1) ou diverge (>1) " #: ../src/ui/dialog/clonetiler.cpp:419 msgid "Base:" msgstr "Base :" -#: ../src/ui/dialog/clonetiler.cpp:425 ../src/ui/dialog/clonetiler.cpp:431 -msgid "" -"Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)" -msgstr "" -"Base pour une spirale logarithmique : inutilisée (0), converge (<1), ou " -"diverge (>1)" +#: ../src/ui/dialog/clonetiler.cpp:425 +#: ../src/ui/dialog/clonetiler.cpp:431 +msgid "Base for a logarithmic spiral: not used (0), converge (<1), or diverge (>1)" +msgstr "Base pour une spirale logarithmique : inutilisée (0), converge (<1), ou diverge (>1)" #: ../src/ui/dialog/clonetiler.cpp:445 msgid "Alternate the sign of scales for each row" @@ -14225,12 +13116,8 @@ msgid "Initial color of tiled clones" msgstr "Couleur initiale des clones de pavage" #: ../src/ui/dialog/clonetiler.cpp:667 -msgid "" -"Initial color for clones (works only if the original has unset fill or " -"stroke)" -msgstr "" -"Couleur initiale pour les clones (ne fonctionne que si l'original a un " -"remplissage ou un contour indéfini)" +msgid "Initial color for clones (works only if the original has unset fill or stroke)" +msgstr "Couleur initiale pour les clones (ne fonctionne que si l'original a un remplissage ou un contour indéfini)" #: ../src/ui/dialog/clonetiler.cpp:682 msgid "H:" @@ -14297,12 +13184,8 @@ msgid "Trace the drawing under the tiles" msgstr "Calquer depuis le dessin sous les pavés" #: ../src/ui/dialog/clonetiler.cpp:796 -msgid "" -"For each clone, pick a value from the drawing in that clone's location and " -"apply it to the clone" -msgstr "" -"Pour chaque clone, capturer une valeur du dessin à l'emplacement du clone et " -"l'appliquer au clone" +msgid "For each clone, pick a value from the drawing in that clone's location and apply it to the clone" +msgstr "Pour chaque clone, capturer une valeur du dessin à l'emplacement du clone et l'appliquer au clone" #: ../src/ui/dialog/clonetiler.cpp:815 msgid "1. Pick from the drawing:" @@ -14382,8 +13265,7 @@ msgstr "Corriger le Gamma" #: ../src/ui/dialog/clonetiler.cpp:920 msgid "Shift the mid-range of the picked value upwards (>0) or downwards (<0)" -msgstr "" -"Décaler le milieu de la valeur capturée vers le haut (>0) ou vers le bas (<0)" +msgstr "Décaler le milieu de la valeur capturée vers le haut (>0) ou vers le bas (<0)" #: ../src/ui/dialog/clonetiler.cpp:927 msgid "Randomize:" @@ -14410,12 +13292,8 @@ msgid "Presence" msgstr "Présence" #: ../src/ui/dialog/clonetiler.cpp:966 -msgid "" -"Each clone is created with the probability determined by the picked value in " -"that point" -msgstr "" -"Chaque clone est créé selon une probabilité déterminée par la valeur " -"capturée en ce point" +msgid "Each clone is created with the probability determined by the picked value in that point" +msgstr "Chaque clone est créé selon une probabilité déterminée par la valeur capturée en ce point" #: ../src/ui/dialog/clonetiler.cpp:973 msgid "Size" @@ -14423,22 +13301,15 @@ msgstr "Dimensions" #: ../src/ui/dialog/clonetiler.cpp:976 msgid "Each clone's size is determined by the picked value in that point" -msgstr "" -"Les dimensions de chaque clone sont déterminées selon la valeur capturée en " -"ce point " +msgstr "Les dimensions de chaque clone sont déterminées selon la valeur capturée en ce point " #: ../src/ui/dialog/clonetiler.cpp:986 -msgid "" -"Each clone is painted by the picked color (the original must have unset fill " -"or stroke)" -msgstr "" -"Chaque clone est peint selon la couleur capturée (l'original doit avoir un " -"remplissage ou un contour indéfini)" +msgid "Each clone is painted by the picked color (the original must have unset fill or stroke)" +msgstr "Chaque clone est peint selon la couleur capturée (l'original doit avoir un remplissage ou un contour indéfini)" #: ../src/ui/dialog/clonetiler.cpp:996 msgid "Each clone's opacity is determined by the picked value in that point" -msgstr "" -"L'opacité de chaque clone est déterminée par la valeur capturée en ce point" +msgstr "L'opacité de chaque clone est déterminée par la valeur capturée en ce point" #: ../src/ui/dialog/clonetiler.cpp:1044 msgid "How many rows in the tiling" @@ -14477,12 +13348,8 @@ msgid "Use saved size and position of the tile" msgstr "Utiliser les dimensions et position enregistrées du pavage" #: ../src/ui/dialog/clonetiler.cpp:1204 -msgid "" -"Pretend that the size and position of the tile are the same as the last time " -"you tiled it (if any), instead of using the current size" -msgstr "" -"Utiliser les mêmes dimensions et position de pavés que lors du pavage " -"précédent (si possible), au lieu d'utiliser les paramètres courants" +msgid "Pretend that the size and position of the tile are the same as the last time you tiled it (if any), instead of using the current size" +msgstr "Utiliser les mêmes dimensions et position de pavés que lors du pavage précédent (si possible), au lieu d'utiliser les paramètres courants" #: ../src/ui/dialog/clonetiler.cpp:1238 msgid " _Create " @@ -14503,9 +13370,7 @@ msgstr "É_parpiller" #: ../src/ui/dialog/clonetiler.cpp:1261 msgid "Spread out clones to reduce clumping; can be applied repeatedly" -msgstr "" -"Disperser les clones de façon à reduire le rassemblement; peut être appliqué " -"plusieurs fois" +msgstr "Disperser les clones de façon à reduire le rassemblement; peut être appliqué plusieurs fois" #: ../src/ui/dialog/clonetiler.cpp:1267 msgid " Re_move " @@ -14513,9 +13378,7 @@ msgstr "_Supprimer" #: ../src/ui/dialog/clonetiler.cpp:1268 msgid "Remove existing tiled clones of the selected object (siblings only)" -msgstr "" -"Retirer les clones de pavage de l'objet sélectionné (seulement les « enfants " -"de mêmes parents »)" +msgstr "Retirer les clones de pavage de l'objet sélectionné (seulement les « enfants de mêmes parents »)" #: ../src/ui/dialog/clonetiler.cpp:1284 msgid " R_eset " @@ -14523,12 +13386,8 @@ msgstr " R-à-_z" #. TRANSLATORS: "change" is a noun here #: ../src/ui/dialog/clonetiler.cpp:1286 -msgid "" -"Reset all shifts, scales, rotates, opacity and color changes in the dialog " -"to zero" -msgstr "" -"Remise à zéro de tous les décalages, redimensionnements, rotation et " -"opacités dans la boîte de dialogue" +msgid "Reset all shifts, scales, rotates, opacity and color changes in the dialog to zero" +msgstr "Remise à zéro de tous les décalages, redimensionnements, rotation et opacités dans la boîte de dialogue" #: ../src/ui/dialog/clonetiler.cpp:1359 msgid "Nothing selected." @@ -14564,12 +13423,8 @@ msgid "Delete tiled clones" msgstr "Supprimer les clones de pavage" #: ../src/ui/dialog/clonetiler.cpp:2224 -msgid "" -"If you want to clone several objects, group them and clone the " -"group." -msgstr "" -"Si vous voulez cloner plusieurs objets, groupez-les puis clonez le " -"groupe." +msgid "If you want to clone several objects, group them and clone the group." +msgstr "Si vous voulez cloner plusieurs objets, groupez-les puis clonez le groupe." #: ../src/ui/dialog/clonetiler.cpp:2233 msgid "Creating tiled clones..." @@ -14593,11 +13448,8 @@ msgstr "Hasard :" #: ../src/ui/dialog/color-item.cpp:131 #, c-format -msgid "" -"Color: %s; Click to set fill, Shift+click to set stroke" -msgstr "" -"Couleur : %s ; Clic pour définir le remplissage, Maj + " -"clic pour définir le contour" +msgid "Color: %s; Click to set fill, Shift+click to set stroke" +msgstr "Couleur : %s ; Clic pour définir le remplissage, Maj + clic pour définir le contour" #: ../src/ui/dialog/color-item.cpp:509 msgid "Change color definition" @@ -14631,11 +13483,13 @@ msgstr "Appliquer une couleur de remplissage à partir de l'échantillon" msgid "Messages" msgstr "Messages" -#: ../src/ui/dialog/debug.cpp:87 ../src/ui/dialog/messages.cpp:47 +#: ../src/ui/dialog/debug.cpp:87 +#: ../src/ui/dialog/messages.cpp:47 msgid "_Clear" msgstr "Effa_cer" -#: ../src/ui/dialog/debug.cpp:91 ../src/ui/dialog/messages.cpp:48 +#: ../src/ui/dialog/debug.cpp:91 +#: ../src/ui/dialog/messages.cpp:48 msgid "Capture log messages" msgstr "Capturer les messages de log" @@ -14644,303 +13498,275 @@ msgid "Release log messages" msgstr "Détacher les messages de log" #: ../src/ui/dialog/document-metadata.cpp:88 -#: ../src/ui/dialog/document-properties.cpp:155 +#: ../src/ui/dialog/document-properties.cpp:156 msgid "Metadata" msgstr "Métadonnées" #: ../src/ui/dialog/document-metadata.cpp:89 -#: ../src/ui/dialog/document-properties.cpp:156 +#: ../src/ui/dialog/document-properties.cpp:157 msgid "License" msgstr "Licence" #: ../src/ui/dialog/document-metadata.cpp:126 -#: ../src/ui/dialog/document-properties.cpp:966 +#: ../src/ui/dialog/document-properties.cpp:1002 msgid "Dublin Core Entities" msgstr "Entités Dublin Core" #: ../src/ui/dialog/document-metadata.cpp:168 -#: ../src/ui/dialog/document-properties.cpp:1028 +#: ../src/ui/dialog/document-properties.cpp:1064 msgid "License" msgstr "Licence" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:108 +#: ../src/ui/dialog/document-properties.cpp:109 msgid "Show page _border" msgstr "Afficher la _bordure de page" -#: ../src/ui/dialog/document-properties.cpp:108 +#: ../src/ui/dialog/document-properties.cpp:109 msgid "If set, rectangular page border is shown" msgstr "Si coché, la bordure rectangulaire de la page est affichée" -#: ../src/ui/dialog/document-properties.cpp:109 +#: ../src/ui/dialog/document-properties.cpp:110 msgid "Border on _top of drawing" msgstr "Bordure au-_dessus du dessin" -#: ../src/ui/dialog/document-properties.cpp:109 +#: ../src/ui/dialog/document-properties.cpp:110 msgid "If set, border is always on top of the drawing" msgstr "Si coché, la bordure est toujours au-dessus du dessin" -#: ../src/ui/dialog/document-properties.cpp:110 +#: ../src/ui/dialog/document-properties.cpp:111 msgid "_Show border shadow" msgstr "_Afficher une ombre de bordure" -#: ../src/ui/dialog/document-properties.cpp:110 +#: ../src/ui/dialog/document-properties.cpp:111 msgid "If set, page border shows a shadow on its right and lower side" msgstr "Si coché, la bordure de page est ombrée en bas et à droite" -#: ../src/ui/dialog/document-properties.cpp:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "Back_ground color:" msgstr "Couleur de _fond :" -#: ../src/ui/dialog/document-properties.cpp:111 -msgid "" -"Color of the page background. Note: transparency setting ignored while " -"editing but used when exporting to bitmap." +#: ../src/ui/dialog/document-properties.cpp:112 +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:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Border _color:" msgstr "_Couleur de la bordure :" -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Page border color" msgstr "Couleur de bordure de page" -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Color of the page border" msgstr "Couleur de bordure de page" -#: ../src/ui/dialog/document-properties.cpp:113 +#: ../src/ui/dialog/document-properties.cpp:114 msgid "Default _units:" msgstr "_Unités par défaut :" #. --------------------------------------------------------------- #. General snap options -#: ../src/ui/dialog/document-properties.cpp:117 +#: ../src/ui/dialog/document-properties.cpp:118 msgid "Show _guides" msgstr "Afficher les _guides" -#: ../src/ui/dialog/document-properties.cpp:117 +#: ../src/ui/dialog/document-properties.cpp:118 msgid "Show or hide guides" msgstr "Afficher ou non les guides" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Guide co_lor:" msgstr "Cou_leur des guides :" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Guideline color" msgstr "Couleur des lignes de guide" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Color of guidelines" msgstr "Couleur des lignes de guide" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "_Highlight color:" msgstr "Couleur d'emp_hase :" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "Highlighted guideline color" msgstr "Couleur d'emphase des lignes de guide" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "Color of a guideline when it is under mouse" -msgstr "" -"Couleur d'une ligne de guide quand elle est sous le curseur de la souris" +msgstr "Couleur d'une ligne de guide quand elle est sous le curseur de la souris" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:121 +#: ../src/ui/dialog/document-properties.cpp:122 msgid "Snap _distance" msgstr "Distance d'attraction" -#: ../src/ui/dialog/document-properties.cpp:121 +#: ../src/ui/dialog/document-properties.cpp:122 msgid "Snap only when _closer than:" msgstr "Aimanter seulement à moins d'une distance de :" -#: ../src/ui/dialog/document-properties.cpp:121 -#: ../src/ui/dialog/document-properties.cpp:126 -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Always snap" msgstr "Toujours aimanter" -#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:123 msgid "Snapping distance, in screen pixels, for snapping to objects" msgstr "Distance d'attraction, en pixels d'écran, pour aimanter aux objets" -#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:123 msgid "Always snap to objects, regardless of their distance" -msgstr "" -"Toujours adhérer aux objets les plus proche, sans tenir compte de la distance" +msgstr "Toujours adhérer aux objets les plus proche, sans tenir compte de la distance" -#: ../src/ui/dialog/document-properties.cpp:123 -msgid "" -"If set, objects only snap to another object when it's within the range " -"specified below" -msgstr "" -"Si la valeur est définie, les objets ne sont aimantés entre eux que s'ils " -"sont à une distance inférieure à cette valeur" +#: ../src/ui/dialog/document-properties.cpp:124 +msgid "If set, objects only snap to another object when it's within the range specified below" +msgstr "Si la valeur est définie, les objets ne sont aimantés entre eux que s'ils sont à une distance inférieure à cette valeur" #. Options for snapping to grids -#: ../src/ui/dialog/document-properties.cpp:126 +#: ../src/ui/dialog/document-properties.cpp:127 msgid "Snap d_istance" msgstr "D_istance d'attraction" -#: ../src/ui/dialog/document-properties.cpp:126 +#: ../src/ui/dialog/document-properties.cpp:127 msgid "Snap only when c_loser than:" msgstr "Aimanter seulement à moins d'une distance de :" -#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:128 msgid "Snapping distance, in screen pixels, for snapping to grid" msgstr "Distance d'attraction, en pixels d'écran, pour aimanter à la grille" -#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:128 msgid "Always snap to grids, regardless of the distance" -msgstr "" -"Toujours adhérer aux grilles les plus proches, sans tenir compte de la " -"distance" +msgstr "Toujours adhérer aux grilles les plus proches, sans tenir compte de la distance" -#: ../src/ui/dialog/document-properties.cpp:128 -msgid "" -"If set, objects only snap to a grid line when it's within the range " -"specified below" -msgstr "" -"Si la valeur est définie, les objets ne sont aimantés à une ligne de la " -"grille que s'ils sont à une distance inférieure à cette valeur" +#: ../src/ui/dialog/document-properties.cpp:129 +msgid "If set, objects only snap to a grid line when it's within the range specified below" +msgstr "Si la valeur est définie, les objets ne sont aimantés à une ligne de la grille que s'ils sont à une distance inférieure à cette valeur" #. Options for snapping to guides -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Snap dist_ance" msgstr "Distance d'attraction" -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Snap only when close_r than:" msgstr "Aimante_r seulement à moins d'une distance de :" -#: ../src/ui/dialog/document-properties.cpp:132 +#: ../src/ui/dialog/document-properties.cpp:133 msgid "Snapping distance, in screen pixels, for snapping to guides" msgstr "Distance d'attraction, en pixels d'écran, pour aimanter aux guides" -#: ../src/ui/dialog/document-properties.cpp:132 +#: ../src/ui/dialog/document-properties.cpp:133 msgid "Always snap to guides, regardless of the distance" -msgstr "" -"Toujours adhérer aux guides les plus proches, sans tenir compte de la " -"distance" +msgstr "Toujours adhérer aux guides les plus proches, sans tenir compte de la distance" -#: ../src/ui/dialog/document-properties.cpp:133 -msgid "" -"If set, objects only snap to a guide when it's within the range specified " -"below" -msgstr "" -"Si la valeur est définie, les objets ne sont aimantés à un guide que s'ils " -"sont à une distance inférieure à cette valeur" +#: ../src/ui/dialog/document-properties.cpp:134 +msgid "If set, objects only snap to a guide when it's within the range specified below" +msgstr "Si la valeur est définie, les objets ne sont aimantés à un guide que s'ils sont à une distance inférieure à cette valeur" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:136 +#: ../src/ui/dialog/document-properties.cpp:137 msgid "Snap to clip paths" msgstr "Aimanter aux chemins de découpe" -#: ../src/ui/dialog/document-properties.cpp:136 +#: ../src/ui/dialog/document-properties.cpp:137 msgid "When snapping to paths, then also try snapping to clip paths" -msgstr "" -"Lorsque les chemins sont aimantés, essayer également d'aimanter aux chemins " -"de découpe" +msgstr "Lorsque les chemins sont aimantés, essayer également d'aimanter aux chemins de découpe" -#: ../src/ui/dialog/document-properties.cpp:137 +#: ../src/ui/dialog/document-properties.cpp:138 msgid "Snap to mask paths" msgstr "Aimanter aux chemins de masque" -#: ../src/ui/dialog/document-properties.cpp:137 +#: ../src/ui/dialog/document-properties.cpp:138 msgid "When snapping to paths, then also try snapping to mask paths" -msgstr "" -"Lorsque les chemins sont aimantés, essayer également d'aimanter aux chemins " -"de masque" +msgstr "Lorsque les chemins sont aimantés, essayer également d'aimanter aux chemins de masque" -#: ../src/ui/dialog/document-properties.cpp:138 +#: ../src/ui/dialog/document-properties.cpp:139 msgid "Snap perpendicularly" msgstr "Aimanter perpendiculairement" -#: ../src/ui/dialog/document-properties.cpp:138 -msgid "" -"When snapping to paths or guides, then also try snapping perpendicularly" -msgstr "" -"Lorsque les chemins ou les guides sont aimantés, essayer également " -"d'aimanter perpendiculairement" - #: ../src/ui/dialog/document-properties.cpp:139 +msgid "When snapping to paths or guides, then also try snapping perpendicularly" +msgstr "Lorsque les chemins ou les guides sont aimantés, essayer également d'aimanter perpendiculairement" + +#: ../src/ui/dialog/document-properties.cpp:140 msgid "Snap tangentially" msgstr "Aimanter tangentiellement" -#: ../src/ui/dialog/document-properties.cpp:139 +#: ../src/ui/dialog/document-properties.cpp:140 msgid "When snapping to paths or guides, then also try snapping tangentially" -msgstr "" -"Lorsque les chemins ou les guides sont aimantés, essayer également " -"d'aimanter tangentiellement" +msgstr "Lorsque les chemins ou les guides sont aimantés, essayer également d'aimanter tangentiellement" -#: ../src/ui/dialog/document-properties.cpp:142 +#: ../src/ui/dialog/document-properties.cpp:143 msgctxt "Grid" msgid "_New" msgstr "_Nouveau" -#: ../src/ui/dialog/document-properties.cpp:142 +#: ../src/ui/dialog/document-properties.cpp:143 msgid "Create new grid." msgstr "Créer une nouvelle grille" -#: ../src/ui/dialog/document-properties.cpp:143 +#: ../src/ui/dialog/document-properties.cpp:144 msgctxt "Grid" msgid "_Remove" msgstr "Supp_rimer" -#: ../src/ui/dialog/document-properties.cpp:143 +#: ../src/ui/dialog/document-properties.cpp:144 msgid "Remove selected grid." msgstr "Supprimer la grille sélectionnée." -#: ../src/ui/dialog/document-properties.cpp:150 -#: ../src/widgets/toolbox.cpp:1833 +#: ../src/ui/dialog/document-properties.cpp:151 +#: ../src/widgets/toolbox.cpp:1834 msgid "Guides" msgstr "Guides" -#: ../src/ui/dialog/document-properties.cpp:152 ../src/verbs.cpp:2748 +#: ../src/ui/dialog/document-properties.cpp:153 +#: ../src/verbs.cpp:2748 msgid "Snap" msgstr "Magnétisme" -#: ../src/ui/dialog/document-properties.cpp:154 +#: ../src/ui/dialog/document-properties.cpp:155 msgid "Scripting" msgstr "Programmation" -#: ../src/ui/dialog/document-properties.cpp:317 +#: ../src/ui/dialog/document-properties.cpp:318 msgid "General" msgstr "Général" -#: ../src/ui/dialog/document-properties.cpp:319 +#: ../src/ui/dialog/document-properties.cpp:320 msgid "Color" msgstr "Couleur" -#: ../src/ui/dialog/document-properties.cpp:321 +#: ../src/ui/dialog/document-properties.cpp:322 msgid "Border" msgstr "Bordure" -#: ../src/ui/dialog/document-properties.cpp:323 +#: ../src/ui/dialog/document-properties.cpp:324 msgid "Page Size" msgstr "Taille de la page" -#: ../src/ui/dialog/document-properties.cpp:356 +#: ../src/ui/dialog/document-properties.cpp:357 msgid "Guides" msgstr "Guides" -#: ../src/ui/dialog/document-properties.cpp:374 +#: ../src/ui/dialog/document-properties.cpp:375 msgid "Snap to objects" msgstr "Aimanter aux objets" -#: ../src/ui/dialog/document-properties.cpp:376 +#: ../src/ui/dialog/document-properties.cpp:377 msgid "Snap to grids" msgstr "Aimanter à la grille" -#: ../src/ui/dialog/document-properties.cpp:378 +#: ../src/ui/dialog/document-properties.cpp:379 msgid "Snap to guides" msgstr "Aimanter aux guides" -#: ../src/ui/dialog/document-properties.cpp:380 +#: ../src/ui/dialog/document-properties.cpp:381 msgid "Miscellaneous" msgstr "Divers" @@ -14948,148 +13774,152 @@ msgstr "Divers" #. Inkscape::GC::release(defsRepr); #. inform the document, so we can undo #. Color Management -#: ../src/ui/dialog/document-properties.cpp:493 ../src/verbs.cpp:2923 +#: ../src/ui/dialog/document-properties.cpp:494 +#: ../src/verbs.cpp:2925 msgid "Link Color Profile" msgstr "Lier un profil de couleurs" -#: ../src/ui/dialog/document-properties.cpp:594 +#: ../src/ui/dialog/document-properties.cpp:595 msgid "Remove linked color profile" msgstr "Supprimer le profil de couleur lié" -#: ../src/ui/dialog/document-properties.cpp:607 +#: ../src/ui/dialog/document-properties.cpp:608 msgid "Linked Color Profiles:" msgstr "Profils de couleur liés :" -#: ../src/ui/dialog/document-properties.cpp:609 +#: ../src/ui/dialog/document-properties.cpp:610 msgid "Available Color Profiles:" msgstr "Profils de couleur disponibles :" -#: ../src/ui/dialog/document-properties.cpp:611 +#: ../src/ui/dialog/document-properties.cpp:612 msgid "Link Profile" msgstr "Lier au profil" -#: ../src/ui/dialog/document-properties.cpp:614 +#: ../src/ui/dialog/document-properties.cpp:621 msgid "Unlink Profile" msgstr "Délier le profil" -#: ../src/ui/dialog/document-properties.cpp:692 +#: ../src/ui/dialog/document-properties.cpp:705 msgid "Profile Name" msgstr "Nom du profil" -#: ../src/ui/dialog/document-properties.cpp:728 +#: ../src/ui/dialog/document-properties.cpp:741 msgid "External scripts" msgstr "Programmes externes" -#: ../src/ui/dialog/document-properties.cpp:729 +#: ../src/ui/dialog/document-properties.cpp:742 msgid "Embedded scripts" msgstr "Programmes incorporés" -#: ../src/ui/dialog/document-properties.cpp:734 +#: ../src/ui/dialog/document-properties.cpp:747 msgid "External script files:" msgstr "Fichier de programmation externe :" -#: ../src/ui/dialog/document-properties.cpp:736 +#: ../src/ui/dialog/document-properties.cpp:749 msgid "Add the current file name or browse for a file" msgstr "Choisir un fichier" -#: ../src/ui/dialog/document-properties.cpp:739 -#: ../src/ui/dialog/document-properties.cpp:817 +#: ../src/ui/dialog/document-properties.cpp:758 +#: ../src/ui/dialog/document-properties.cpp:847 #: ../src/ui/widget/selected-style.cpp:339 msgid "Remove" msgstr "Supprimer" -#: ../src/ui/dialog/document-properties.cpp:804 +#: ../src/ui/dialog/document-properties.cpp:828 msgid "Filename" msgstr "Nom du fichier" -#: ../src/ui/dialog/document-properties.cpp:812 +#: ../src/ui/dialog/document-properties.cpp:836 msgid "Embedded script files:" msgstr "Fichier de programmation incorporés :" -#: ../src/ui/dialog/document-properties.cpp:814 +#: ../src/ui/dialog/document-properties.cpp:838 msgid "New" msgstr "Nouvelle" -#: ../src/ui/dialog/document-properties.cpp:881 +#: ../src/ui/dialog/document-properties.cpp:917 msgid "Script id" msgstr "Identifiant du script" -#: ../src/ui/dialog/document-properties.cpp:887 +#: ../src/ui/dialog/document-properties.cpp:923 msgid "Content:" msgstr "Contenu :" -#: ../src/ui/dialog/document-properties.cpp:1004 +#: ../src/ui/dialog/document-properties.cpp:1040 msgid "_Save as default" msgstr "Enregistrer comme valeur par _défaut" -#: ../src/ui/dialog/document-properties.cpp:1005 +#: ../src/ui/dialog/document-properties.cpp:1041 msgid "Save this metadata as the default metadata" msgstr "Enregistrer ces informations comme métadonnées par défaut" -#: ../src/ui/dialog/document-properties.cpp:1006 +#: ../src/ui/dialog/document-properties.cpp:1042 msgid "Use _default" msgstr "Utiliser les valeurs par défaut" -#: ../src/ui/dialog/document-properties.cpp:1007 +#: ../src/ui/dialog/document-properties.cpp:1043 msgid "Use the previously saved default metadata here" msgstr "Utiliser les métadonnées précédentes valeurs par défaut" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1080 +#: ../src/ui/dialog/document-properties.cpp:1116 msgid "Add external script..." msgstr "Ajouter un programme externe..." -#: ../src/ui/dialog/document-properties.cpp:1119 +#: ../src/ui/dialog/document-properties.cpp:1155 msgid "Select a script to load" msgstr "Sélectionnez un script à charger" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1147 +#: ../src/ui/dialog/document-properties.cpp:1183 msgid "Add embedded script..." msgstr "Ajouter un programme incorporé..." #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1178 +#: ../src/ui/dialog/document-properties.cpp:1214 msgid "Remove external script" msgstr "Supprimer un programme externe" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1212 +#: ../src/ui/dialog/document-properties.cpp:1248 msgid "Remove embedded script" msgstr "Retirer le programme incorporé" #. TODO repr->set_content(_EmbeddedContent.get_buffer()->get_text()); #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1312 +#: ../src/ui/dialog/document-properties.cpp:1348 msgid "Edit embedded script" msgstr "Retirer le programme incorporé" -#: ../src/ui/dialog/document-properties.cpp:1395 +#: ../src/ui/dialog/document-properties.cpp:1431 msgid "Creation" msgstr " Création " -#: ../src/ui/dialog/document-properties.cpp:1396 +#: ../src/ui/dialog/document-properties.cpp:1432 msgid "Defined grids" msgstr "Grilles définies" -#: ../src/ui/dialog/document-properties.cpp:1639 +#: ../src/ui/dialog/document-properties.cpp:1675 msgid "Remove grid" msgstr "Supprimer la grille" -#: ../src/ui/dialog/document-properties.cpp:1707 +#: ../src/ui/dialog/document-properties.cpp:1743 #, fuzzy msgid "Changed document unit" msgstr "Document sans nom %d" -#: ../src/ui/dialog/export.cpp:151 ../src/verbs.cpp:2800 +#: ../src/ui/dialog/export.cpp:151 +#: ../src/verbs.cpp:2800 msgid "_Page" msgstr "_Page" -#: ../src/ui/dialog/export.cpp:151 ../src/verbs.cpp:2804 +#: ../src/ui/dialog/export.cpp:151 +#: ../src/verbs.cpp:2804 msgid "_Drawing" msgstr "_Dessin" -#: ../src/ui/dialog/export.cpp:151 ../src/verbs.cpp:2806 +#: ../src/ui/dialog/export.cpp:151 +#: ../src/verbs.cpp:2806 msgid "_Selection" msgstr "_Sélection" @@ -15097,7 +13927,8 @@ msgstr "_Sélection" msgid "_Custom" msgstr "P_ersonnalisée" -#: ../src/ui/dialog/export.cpp:168 ../src/widgets/measure-toolbar.cpp:116 +#: ../src/ui/dialog/export.cpp:168 +#: ../src/widgets/measure-toolbar.cpp:116 #: ../src/widgets/measure-toolbar.cpp:124 #: ../share/extensions/render_gears.inx.h:6 msgid "Units:" @@ -15112,13 +13943,8 @@ msgid "B_atch export all selected objects" msgstr "Exporter les _objets sélectionnés en un lot" #: ../src/ui/dialog/export.cpp:173 -msgid "" -"Export each selected object into its own PNG file, using export hints if any " -"(caution, overwrites without asking!)" -msgstr "" -"Exporter chaque objet de la sélection dans son fichier PNG, en tenant compte " -"des indications d'export (attention, écrase les fichiers sans demander de " -"confirmation !)" +msgid "Export each selected object into its own PNG file, using export hints if any (caution, overwrites without asking!)" +msgstr "Exporter chaque objet de la sélection dans son fichier PNG, en tenant compte des indications d'export (attention, écrase les fichiers sans demander de confirmation !)" #: ../src/ui/dialog/export.cpp:175 msgid "Hide a_ll except selected" @@ -15126,8 +13952,7 @@ msgstr "_Cacher tout sauf la sélection" #: ../src/ui/dialog/export.cpp:175 msgid "In the exported image, hide all objects except those that are selected" -msgstr "" -"Dans l'image exportée, cacher tous les objets qui ne sont pas sélectionnés" +msgstr "Dans l'image exportée, cacher tous les objets qui ne sont pas sélectionnés" #: ../src/ui/dialog/export.cpp:176 msgid "Close when complete" @@ -15173,7 +13998,8 @@ msgstr "Hau_teur :" msgid "Image size" msgstr "Taille de l'image" -#: ../src/ui/dialog/export.cpp:288 ../src/ui/dialog/export.cpp:299 +#: ../src/ui/dialog/export.cpp:288 +#: ../src/ui/dialog/export.cpp:299 msgid "pixels at" msgstr "pixels à" @@ -15181,15 +14007,16 @@ msgstr "pixels à" msgid "dp_i" msgstr "_ppp" -#: ../src/ui/dialog/export.cpp:299 ../src/ui/dialog/transformation.cpp:82 +#: ../src/ui/dialog/export.cpp:299 +#: ../src/ui/dialog/transformation.cpp:82 #: ../src/ui/widget/page-sizer.cpp:237 msgid "_Height:" msgstr "_Hauteur :" #: ../src/ui/dialog/export.cpp:307 +#: ../src/ui/dialog/inkscape-preferences.cpp:1432 #: ../src/ui/dialog/inkscape-preferences.cpp:1436 -#: ../src/ui/dialog/inkscape-preferences.cpp:1439 -#: ../src/ui/dialog/inkscape-preferences.cpp:1451 +#: ../src/ui/dialog/inkscape-preferences.cpp:1460 msgid "dpi" msgstr "ppp" @@ -15216,16 +14043,19 @@ msgstr "Export en cours" msgid "No items selected." msgstr "Aucun élément sélectionné." -#: ../src/ui/dialog/export.cpp:1018 ../src/ui/dialog/export.cpp:1020 +#: ../src/ui/dialog/export.cpp:1018 +#: ../src/ui/dialog/export.cpp:1020 msgid "Exporting %1 files" msgstr "Exportation de %1 fichiers" -#: ../src/ui/dialog/export.cpp:1060 ../src/ui/dialog/export.cpp:1062 +#: ../src/ui/dialog/export.cpp:1060 +#: ../src/ui/dialog/export.cpp:1062 #, c-format msgid "Exporting file %s..." msgstr "Exportation du fichier %s en cours" -#: ../src/ui/dialog/export.cpp:1071 ../src/ui/dialog/export.cpp:1162 +#: ../src/ui/dialog/export.cpp:1071 +#: ../src/ui/dialog/export.cpp:1162 #, c-format msgid "Could not export to filename %s.\n" msgstr "Impossible d'exporter dans le fichier %s.\n" @@ -15238,9 +14068,7 @@ msgstr "Impossible d'exporter dans le fichier %s." #: ../src/ui/dialog/export.cpp:1089 #, c-format msgid "Successfully exported %d files from %d selected items." -msgstr "" -"%d fichiers ont été exportés à partir des %d objets " -"sélectionnés." +msgstr "%d fichiers ont été exportés à partir des %d objets sélectionnés." #: ../src/ui/dialog/export.cpp:1100 msgid "You have to enter a filename." @@ -15264,7 +14092,8 @@ msgid "Directory %s does not exist or is not a directory.\n" msgstr "Le dossier %s n'existe pas ou n'est pas un dossier.\n" #. TRANSLATORS: %1 will be the filename, %2 the width, and %3 the height of the image -#: ../src/ui/dialog/export.cpp:1145 ../src/ui/dialog/export.cpp:1147 +#: ../src/ui/dialog/export.cpp:1145 +#: ../src/ui/dialog/export.cpp:1147 msgid "Exporting %1 (%2 x %3)" msgstr "Exportation %s1(%2 x %3) en cours" @@ -15277,12 +14106,21 @@ msgstr "Dessin exporté vers %s." msgid "Export aborted." msgstr "Exportation annulée." +#: ../src/ui/dialog/export.cpp:1299 +#: ../src/ui/dialog/input.cpp:1082 +#: ../src/verbs.cpp:2361 +#: ../src/widgets/desktop-widget.cpp:1128 +msgid "_Save" +msgstr "_Enregistrer" + #: ../src/ui/dialog/extension-editor.cpp:81 msgid "Information" msgstr "Information" -#: ../src/ui/dialog/extension-editor.cpp:82 ../src/verbs.cpp:290 -#: ../src/verbs.cpp:309 ../share/extensions/color_custom.inx.h:7 +#: ../src/ui/dialog/extension-editor.cpp:82 +#: ../src/verbs.cpp:290 +#: ../src/verbs.cpp:309 +#: ../share/extensions/color_custom.inx.h:7 #: ../share/extensions/color_HSL_adjust.inx.h:11 #: ../share/extensions/color_randomize.inx.h:6 #: ../share/extensions/dots.inx.h:7 @@ -15301,7 +14139,7 @@ msgstr "Information" #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:17 #: ../share/extensions/gcodetools_tools_library.inx.h:12 #: ../share/extensions/generate_voronoi.inx.h:5 -#: ../share/extensions/gimp_xcf.inx.h:6 +#: ../share/extensions/gimp_xcf.inx.h:7 #: ../share/extensions/interp_att_g.inx.h:27 #: ../share/extensions/jessyInk_autoTexts.inx.h:8 #: ../share/extensions/jessyInk_effects.inx.h:13 @@ -15321,7 +14159,8 @@ msgstr "Information" #: ../share/extensions/measure.inx.h:15 #: ../share/extensions/pathalongpath.inx.h:16 #: ../share/extensions/pathscatter.inx.h:18 -#: ../share/extensions/radiusrand.inx.h:8 ../share/extensions/split.inx.h:8 +#: ../share/extensions/radiusrand.inx.h:8 +#: ../share/extensions/split.inx.h:8 #: ../share/extensions/voronoi2svg.inx.h:11 #: ../share/extensions/web-set-att.inx.h:25 #: ../share/extensions/webslicer_create_group.inx.h:11 @@ -15459,10 +14298,6 @@ msgstr "Cairo" msgid "Antialias" msgstr "Antialias" -#: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1628 -msgid "Destination" -msgstr "Destination" - #: ../src/ui/dialog/filedialogimpl-win32.cpp:421 msgid "All Executable Files" msgstr "Tous les fichiers exécutables" @@ -15488,448 +14323,419 @@ msgid "Stroke st_yle" msgstr "St_yle du contour" #. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor -#: ../src/ui/dialog/filter-effects-dialog.cpp:515 -msgid "" -"This matrix determines a linear transform on color space. Each line affects " -"one of the color components. Each column determines how much of each color " -"component from the input is passed to the output. The last column does not " -"depend on input colors, so can be used to adjust a constant component value." -msgstr "" -"Cette matrice détermine une transformation linéaire de l'espace des " -"couleurs. Chaque ligne affecte une des composantes de la couleur. Chaque " -"colonne détermine quelle proportion de chaque composante de l'entrée est " -"passée à la sortie. La dernière colonne ne dépend pas de l'entrée. Elle sert " -"à ajouter une constante aux composantes." - -#: ../src/ui/dialog/filter-effects-dialog.cpp:625 +#: ../src/ui/dialog/filter-effects-dialog.cpp:546 +msgid "This matrix determines a linear transform on color space. Each line affects one of the color components. Each column determines how much of each color component from the input is passed to the output. The last column does not depend on input colors, so can be used to adjust a constant component value." +msgstr "Cette matrice détermine une transformation linéaire de l'espace des couleurs. Chaque ligne affecte une des composantes de la couleur. Chaque colonne détermine quelle proportion de chaque composante de l'entrée est passée à la sortie. La dernière colonne ne dépend pas de l'entrée. Elle sert à ajouter une constante aux composantes." + +#: ../src/ui/dialog/filter-effects-dialog.cpp:656 msgid "Image File" msgstr "Fichier image" -#: ../src/ui/dialog/filter-effects-dialog.cpp:628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:659 msgid "Selected SVG Element" msgstr "Élément SVG sélectionné" #. TODO: any image, not just svg -#: ../src/ui/dialog/filter-effects-dialog.cpp:698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:729 msgid "Select an image to be used as feImage input" msgstr "Sélectionner une image pour l'utiliser comme entrée feImage" -#: ../src/ui/dialog/filter-effects-dialog.cpp:790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:821 msgid "This SVG filter effect does not require any parameters." msgstr "Ce filtre SVG ne demande aucun paramètre." -#: ../src/ui/dialog/filter-effects-dialog.cpp:796 +#: ../src/ui/dialog/filter-effects-dialog.cpp:827 msgid "This SVG filter effect is not yet implemented in Inkscape." msgstr "Ce filtre SVG n'est pas encore implémenté dans Inkscape." -#: ../src/ui/dialog/filter-effects-dialog.cpp:984 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1041 +#, fuzzy +msgid "Slope" +msgstr "Enveloppe" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1042 +#, fuzzy +msgid "Intercept" +msgstr "Intersection" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1045 +#, fuzzy +msgid "Amplitude" +msgstr "Amplitude :" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1046 +#, fuzzy +msgid "Exponent" +msgstr "Exposant :" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1143 +#, fuzzy +msgid "New transfer function type" +msgstr "Type de transfert :" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1178 msgid "Light Source:" msgstr "Source de lumière :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Direction angle for the light source on the XY plane, in degrees" -msgstr "" -"Angle pour la direction de la source de lumière dans le plan XY, en degrés" +msgstr "Angle pour la direction de la source de lumière dans le plan XY, en degrés" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Direction angle for the light source on the YZ plane, in degrees" -msgstr "" -"Angle pour la direction de la source de lumière dans le plan XY, en degrés" +msgstr "Angle pour la direction de la source de lumière dans le plan XY, en degrés" #. default x: #. default y: #. default z: -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 msgid "Location:" msgstr "Localisation :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "X coordinate" msgstr "Coordonnées X" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Y coordinate" msgstr "Coordonnée Y" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Z coordinate" msgstr "Coordonnée Z" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Points At" msgstr "Pointe vers" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Specular Exponent" msgstr "Exposant spéculaire" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Exponent value controlling the focus for the light source" msgstr "Valeur d'exposant contrôlant la focalisation de la source de lumière" #. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option. -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "Cone Angle" msgstr "Angle du cône" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 -msgid "" -"This is the angle between the spot light axis (i.e. the axis between the " -"light source and the point to which it is pointing at) and the spot light " -"cone. No light is projected outside this cone." -msgstr "" -"C'est l'ouverture du cône de lumière autour de l'axe de la source (la ligne " -"entre la source et le point vers lequel elle pointe). Aucune lumière n'est " -"projetée hors de ce cône." +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 +msgid "This is the angle between the spot light axis (i.e. the axis between the light source and the point to which it is pointing at) and the spot light cone. No light is projected outside this cone." +msgstr "C'est l'ouverture du cône de lumière autour de l'axe de la source (la ligne entre la source et le point vers lequel elle pointe). Aucune lumière n'est projetée hors de ce cône." -#: ../src/ui/dialog/filter-effects-dialog.cpp:1077 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1274 msgid "New light source" msgstr "Nouvelle source de lumière" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1118 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1325 msgid "_Duplicate" msgstr "_Dupliquer" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1152 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1359 msgid "_Filter" msgstr "_Filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1174 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1381 msgid "R_ename" msgstr "R_enommer" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1304 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1511 msgid "Rename filter" msgstr "Renommer le filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1349 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1556 msgid "Apply filter" msgstr "Appliquer le filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1419 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1626 msgid "filter" msgstr "filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1426 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1633 msgid "Add filter" msgstr "Ajouter un filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1478 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1685 msgid "Duplicate filter" msgstr "Dupliquer le filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1577 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1784 msgid "_Effect" msgstr "_Effets" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1587 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1794 msgid "Connections" msgstr "Connecteurs" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1725 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1932 msgid "Remove filter primitive" msgstr "Supprimer la primitive de filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2313 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2520 msgid "Remove merge node" msgstr "Supprimer le nœud de fusion" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2433 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2640 msgid "Reorder filter primitive" msgstr "Réordonner la primitive de filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2513 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2720 msgid "Add Effect:" msgstr "Ajouter un effet :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2514 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 msgid "No effect selected" msgstr "Aucun effet sélectionné" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2722 msgid "No filter selected" msgstr "Aucun filtre sélectionné" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2561 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2767 msgid "Effect parameters" msgstr "Paramètres de l'effet" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2562 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2768 msgid "Filter General Settings" msgstr "Paramètres généraux des filtres" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Coordinates:" msgstr "Coordonnées :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "X coordinate of the left corners of filter effects region" msgstr "Coordonnée X des coins gauches de la zone d'action du filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Y coordinate of the upper corners of filter effects region" msgstr "Coordonnée Y des coins supérieurs de la zone d'action du filtre" #. default width: #. default height: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Dimensions:" msgstr "Dimensions :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Width of filter effects region" msgstr "Largeur de la zone d'action du filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Height of filter effects region" msgstr "Hauteur de la zone d'action du filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2627 -msgid "" -"Indicates the type of matrix operation. The keyword 'matrix' indicates that " -"a full 5x4 matrix of values will be provided. The other keywords represent " -"convenience shortcuts to allow commonly used color operations to be " -"performed without specifying a complete matrix." -msgstr "" -"Indique le type d'opération matricielle. Le mot-clef « matrice » indique " -"qu'une matrice 5x4 sera donnée en entrée. Les autres mots-clés représentent " -"des raccourcis pour les opérations les plus fréquentes sur les couleurs sans " -"spécifier de matrice." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 +msgid "Indicates the type of matrix operation. The keyword 'matrix' indicates that a full 5x4 matrix of values will be provided. The other keywords represent convenience shortcuts to allow commonly used color operations to be performed without specifying a complete matrix." +msgstr "Indique le type d'opération matricielle. Le mot-clef « matrice » indique qu'une matrice 5x4 sera donnée en entrée. Les autres mots-clés représentent des raccourcis pour les opérations les plus fréquentes sur les couleurs sans spécifier de matrice." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2834 msgid "Value(s):" msgstr "Valeur(s) :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2643 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2838 +#, fuzzy +msgid "R:" +msgstr "Rx :" + +# Green (in RGB) +#: ../src/ui/dialog/filter-effects-dialog.cpp:2839 +#: ../src/widgets/sp-color-icc-selector.cpp:359 +msgid "G:" +msgstr "V :" + +# Blue (in RGB) +#: ../src/ui/dialog/filter-effects-dialog.cpp:2840 +#, fuzzy +msgid "B:" +msgstr "_B :" + +# Alpha (opacity) +#: ../src/ui/dialog/filter-effects-dialog.cpp:2841 +#, fuzzy +msgid "A:" +msgstr "_A :" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2844 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "Operator:" msgstr "Opérateur :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 msgid "K1:" msgstr "K1 :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 -msgid "" -"If the arithmetic operation is chosen, each result pixel is computed using " -"the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel " -"values of the first and second inputs respectively." -msgstr "" -"Si une opération arithmétique est sélectionnée, chaque pixel du résultat est " -"calculé par: k1*i1*i2 + k2*i1 + k3*i2 + k4. i1 et i2 sont les valeurs de la " -"première et de la deuxième entrée." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 +msgid "If the arithmetic operation is chosen, each result pixel is computed using the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel values of the first and second inputs respectively." +msgstr "Si une opération arithmétique est sélectionnée, chaque pixel du résultat est calculé par: k1*i1*i2 + k2*i1 + k3*i2 + k4. i1 et i2 sont les valeurs de la première et de la deuxième entrée." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 msgid "K2:" msgstr "K2 :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 msgid "K3:" msgstr "K3 :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "K4:" msgstr "K4 :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "Size:" msgstr "Taille :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "width of the convolve matrix" msgstr "largeur de la matrice de convolution" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "height of the convolve matrix" msgstr "hauteur de la matrice de convolution" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 #: ../src/ui/dialog/object-attributes.cpp:48 msgid "Target:" msgstr "Cible :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 -msgid "" -"X coordinate of the target point in the convolve matrix. The convolution is " -"applied to pixels around this point." -msgstr "" -"Coordonnée X du point cible de la matrice de convolution. La convolution est " -"appliquée aux pixels qui entourent ce point." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 +msgid "X coordinate of the target point in the convolve matrix. The convolution is applied to pixels around this point." +msgstr "Coordonnée X du point cible de la matrice de convolution. La convolution est appliquée aux pixels qui entourent ce point." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 -msgid "" -"Y coordinate of the target point in the convolve matrix. The convolution is " -"applied to pixels around this point." -msgstr "" -"Coordonnée Y du point cible de la matrice de convolution. La convolution est " -"appliquée aux pixels qui entourent ce point." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 +msgid "Y coordinate of the target point in the convolve matrix. The convolution is applied to pixels around this point." +msgstr "Coordonnée Y du point cible de la matrice de convolution. La convolution est appliquée aux pixels qui entourent ce point." #. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix) -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "Kernel:" msgstr "Kernel :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 -msgid "" -"This matrix describes the convolve operation that is applied to the input " -"image in order to calculate the pixel colors at the output. Different " -"arrangements of values in this matrix result in various possible visual " -"effects. An identity matrix would lead to a motion blur effect (parallel to " -"the matrix diagonal) while a matrix filled with a constant non-zero value " -"would lead to a common blur effect." -msgstr "" -"Cette matrice décrit l'opération de convolution qui est appliquée à l'image " -"en entrée pour calculer les valeurs des pixels en sortie. Les organisations " -"différentes des valeurs dans cette matrice donnent divers effets visuels " -"possibles. Une matrice identité produira un effet de flou de mouvement " -"(parallèle à la diagonale de la matrice) alors qu'une matrice remplie d'une " -"valeur non-nulle constante produira un effet de flou simple." - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 +msgid "This matrix describes the convolve operation that is applied to the input image in order to calculate the pixel colors at the output. Different arrangements of values in this matrix result in various possible visual effects. An identity matrix would lead to a motion blur effect (parallel to the matrix diagonal) while a matrix filled with a constant non-zero value would lead to a common blur effect." +msgstr "Cette matrice décrit l'opération de convolution qui est appliquée à l'image en entrée pour calculer les valeurs des pixels en sortie. Les organisations différentes des valeurs dans cette matrice donnent divers effets visuels possibles. Une matrice identité produira un effet de flou de mouvement (parallèle à la diagonale de la matrice) alors qu'une matrice remplie d'une valeur non-nulle constante produira un effet de flou simple." + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "Divisor:" msgstr "Diviseur :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 -msgid "" -"After applying the kernelMatrix to the input image to yield a number, that " -"number is divided by divisor to yield the final destination color value. A " -"divisor that is the sum of all the matrix values tends to have an evening " -"effect on the overall color intensity of the result." -msgstr "" -"Après l'application de la kernelMatrix à l'image en entrée pour obtenir un " -"nombre, ce nombre est divisé par le diviseur, ce qui donne la valeur de " -"couleur finale en sortie. Un diviseur d'une valeur égale à la somme de " -"toutes les valeurs de la matrice aura tendance à avoir un effet lissant sur " -"l'intensité globale de la couleur du résultat." - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 +msgid "After applying the kernelMatrix to the input image to yield a number, that number is divided by divisor to yield the final destination color value. A divisor that is the sum of all the matrix values tends to have an evening effect on the overall color intensity of the result." +msgstr "Après l'application de la kernelMatrix à l'image en entrée pour obtenir un nombre, ce nombre est divisé par le diviseur, ce qui donne la valeur de couleur finale en sortie. Un diviseur d'une valeur égale à la somme de toutes les valeurs de la matrice aura tendance à avoir un effet lissant sur l'intensité globale de la couleur du résultat." + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "Bias:" msgstr "Déviation :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 -msgid "" -"This value is added to each component. This is useful to define a constant " -"value as the zero response of the filter." -msgstr "" -"Cette valeur est ajoutée à chaque composant. Permet de définir une valeur " -"constante comme la réponse en zéro du filtre." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 +msgid "This value is added to each component. This is useful to define a constant value as the zero response of the filter." +msgstr "Cette valeur est ajoutée à chaque composant. Permet de définir une valeur constante comme la réponse en zéro du filtre." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "Edge Mode:" msgstr "Mode bordure :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 -msgid "" -"Determines how to extend the input image as necessary with color values so " -"that the matrix operations can be applied when the kernel is positioned at " -"or near the edge of the input image." -msgstr "" -"Détermine comment étendre l'image en entrée avec des valeurs de couleur si " -"besoin, pour que les opérations matricielles puissent être appliquées quand " -"le kernel est positionné au bord ou près du bord de l'image en entrée." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 +msgid "Determines how to extend the input image as necessary with color values so that the matrix operations can be applied when the kernel is positioned at or near the edge of the input image." +msgstr "Détermine comment étendre l'image en entrée avec des valeurs de couleur si besoin, pour que les opérations matricielles puissent être appliquées quand le kernel est positionné au bord ou près du bord de l'image en entrée." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "Preserve Alpha" msgstr "Préserver l'opacité" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "If set, the alpha channel won't be altered by this filter primitive." -msgstr "" -"Si coché, la composante opacité (alpha) ne sera pas modifiée par cette " -"primitive de filtre." +msgstr "Si coché, la composante opacité (alpha) ne sera pas modifiée par cette primitive de filtre." #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 msgid "Diffuse Color:" msgstr "Diffusion de la couleur :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Defines the color of the light source" msgstr "Définit la couleur de la source lumineuse" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "Surface Scale:" msgstr "Relief de surface :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 -msgid "" -"This value amplifies the heights of the bump map defined by the input alpha " -"channel" -msgstr "" -"Cette valeur amplifie la hauteur du relief défini par la composante opacité " -"(alpha) en entrée" +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 +msgid "This value amplifies the heights of the bump map defined by the input alpha channel" +msgstr "Cette valeur amplifie la hauteur du relief défini par la composante opacité (alpha) en entrée" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "Constant:" msgstr "Constante :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "This constant affects the Phong lighting model." msgstr "Cette constante agit sur le modèle d'éclairage Phong." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2664 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2865 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2899 msgid "Kernel Unit Length:" msgstr "Unité de longueur du Kernel :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 msgid "This defines the intensity of the displacement effect." msgstr "Définit l'intensité de l'effet de déplacement." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "X displacement:" msgstr "Déplacement en X :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "Color component that controls the displacement in the X direction" msgstr "Composante RGB qui contrôle le déplacement suivant l'axe X" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Y displacement:" msgstr "Déplacement en Y :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Color component that controls the displacement in the Y direction" msgstr "Composante RGB qui contrôle le déplacement dans la direction Y" #. default: black -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "Flood Color:" msgstr "Couleur de remplissage :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "The whole filter region will be filled with this color." -msgstr "" -"Toute la région affectée par le filtre sera remplie avec cette couleur." +msgstr "Toute la région affectée par le filtre sera remplie avec cette couleur." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "Standard Deviation:" msgstr "Variance :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "The standard deviation for the blur operation." msgstr "La variance pour l'effet de flou." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "" "Erode: performs \"thinning\" of input image.\n" "Dilate: performs \"fattenning\" of input image." @@ -15937,245 +14743,133 @@ msgstr "" "Contracter : rend l'image plus « fine ».\n" "Dilater : rend l'image plus « épaisse »" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2687 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2888 msgid "Source of Image:" msgstr "Source de l'image :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "Delta X:" msgstr "Delta X :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "This is how far the input image gets shifted to the right" msgstr "Distance du décalage de l'image vers la droite" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "Delta Y:" msgstr "Delta Y :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "This is how far the input image gets shifted downwards" msgstr "Distance du décalage de l'image vers le bas" #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Specular Color:" msgstr "Couleur spéculaire :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 #: ../share/extensions/interp.inx.h:2 msgid "Exponent:" msgstr "Exposant :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 msgid "Exponent for specular term, larger is more \"shiny\"." -msgstr "" -"Exposant pour le terme spéculaire. Plus il est grand, plus l'objet est " -"« brillant »." +msgstr "Exposant pour le terme spéculaire. Plus il est grand, plus l'objet est « brillant »." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 -msgid "" -"Indicates whether the filter primitive should perform a noise or turbulence " -"function." -msgstr "" -"Indique si la primitive de filtre doit effectuer une fonction de bruit ou de " -"turbulence." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 +msgid "Indicates whether the filter primitive should perform a noise or turbulence function." +msgstr "Indique si la primitive de filtre doit effectuer une fonction de bruit ou de turbulence." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2707 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2908 msgid "Base Frequency:" msgstr "Fréquence de base :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2708 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2909 msgid "Octaves:" msgstr "Octaves :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "Seed:" msgstr "Germe :" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "The starting number for the pseudo random number generator." msgstr "La graine pour le générateur pseudo-aléatoire." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2922 msgid "Add filter primitive" msgstr "Ajouter une primitive de filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2738 -msgid "" -"The feBlend filter primitive provides 4 image blending modes: screen, " -"multiply, darken and lighten." -msgstr "" -"feBlend fournit quatre modes de fondu d'image : produit, " -"superposition, obscurcir et éclaircir." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2939 +msgid "The feBlend filter primitive provides 4 image blending modes: screen, multiply, darken and lighten." +msgstr "feBlend fournit quatre modes de fondu d'image : produit, superposition, obscurcir et éclaircir." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2742 -msgid "" -"The feColorMatrix filter primitive applies a matrix transformation to " -"color of each rendered pixel. This allows for effects like turning object to " -"grayscale, modifying color saturation and changing color hue." -msgstr "" -"feColorMatrix applique une transformation matricielle à la couleur de " -"chaque pixel. Cela permet des effets comme la transformation d'objets en " -"niveaux de gris, la modification de la saturation des couleurs et la " -"modification de la teinte des couleurs." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2943 +msgid "The feColorMatrix filter primitive applies a matrix transformation to color of each rendered pixel. This allows for effects like turning object to grayscale, modifying color saturation and changing color hue." +msgstr "feColorMatrix applique une transformation matricielle à la couleur de chaque pixel. Cela permet des effets comme la transformation d'objets en niveaux de gris, la modification de la saturation des couleurs et la modification de la teinte des couleurs." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2746 -msgid "" -"The feComponentTransfer filter primitive manipulates the input's " -"color components (red, green, blue, and alpha) according to particular " -"transfer functions, allowing operations like brightness and contrast " -"adjustment, color balance, and thresholding." -msgstr "" -"feComponentTransfer manipule les composantes de couleur de l'entrée " -"(rouge, vert, bleu et opacité) suivant des fonctions de tranfert. Cela " -"permet des opérations comme l'ajustement de luminosité et de contraste, la " -"balance des couleurs, et la détection de seuil." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2947 +msgid "The feComponentTransfer filter primitive manipulates the input's color components (red, green, blue, and alpha) according to particular transfer functions, allowing operations like brightness and contrast adjustment, color balance, and thresholding." +msgstr "feComponentTransfer manipule les composantes de couleur de l'entrée (rouge, vert, bleu et opacité) suivant des fonctions de tranfert. Cela permet des opérations comme l'ajustement de luminosité et de contraste, la balance des couleurs, et la détection de seuil." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2750 -msgid "" -"The feComposite filter primitive composites two images using one of " -"the Porter-Duff blending modes or the arithmetic mode described in SVG " -"standard. Porter-Duff blending modes are essentially logical operations " -"between the corresponding pixel values of the images." -msgstr "" -"La primitive feComposite fond deux images ensemble en utilisant un " -"des modes de fondu Porter-Duff ou le mode arithmétique décrit dans le " -"standard SVG. Les modes de fondu Porter-Duff sont en résumé des opérations " -"logiques entre les valeurs de pixels respectives des images." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2951 +msgid "The feComposite filter primitive composites two images using one of the Porter-Duff blending modes or the arithmetic mode described in SVG standard. Porter-Duff blending modes are essentially logical operations between the corresponding pixel values of the images." +msgstr "La primitive feComposite fond deux images ensemble en utilisant un des modes de fondu Porter-Duff ou le mode arithmétique décrit dans le standard SVG. Les modes de fondu Porter-Duff sont en résumé des opérations logiques entre les valeurs de pixels respectives des images." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2754 -msgid "" -"The feConvolveMatrix lets you specify a Convolution to be applied on " -"the image. Common effects created using convolution matrices are blur, " -"sharpening, embossing and edge detection. Note that while gaussian blur can " -"be created using this filter primitive, the special gaussian blur primitive " -"is faster and resolution-independent." -msgstr "" -"feConvolveMatrix vous permet de spécifier une matrice de convolution " -"à appliquer à l'image. Les effets courants créés par des matrices de " -"convolution sont le flou, la netteté, le gauffrage et la détection de bords. " -"Il faut noter que, bien qu'un flou gaussien puisse être créé en utilisant " -"cette primitive de filtre, la primitive dédiée au flou gaussien est plus " -"rapide et ne dépend pas de la résolution." - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2758 -msgid "" -"The feDiffuseLighting and feSpecularLighting filter primitives create " -"\"embossed\" shadings. The input's alpha channel is used to provide depth " -"information: higher opacity areas are raised toward the viewer and lower " -"opacity areas recede away from the viewer." -msgstr "" -"feDiffuseLighting et feSpecularLighting créent des ombrages " -"« gauffrés ». La composante d'opacité (alpha) de l'entrée est utilisée pour " -"founir l'information de profondeur : les zones de forte opacité sont élevées " -"vers le point de vue et les zones de faible opacité sont reculées par " -"rapport au point de vue." - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2762 -msgid "" -"The feDisplacementMap filter primitive displaces the pixels in the " -"first input using the second input as a displacement map, that shows from " -"how far the pixel should come from. Classical examples are whirl and pinch " -"effects." -msgstr "" -"feDisplacementMap déplace les pixels de la première entrée en " -"utilisant la deuxième entrée comme displacement map, qui définit la distance " -"d'où le pixel doit venir. Les exemples les plus classiques sont les effets " -"de tourbillon et de contraction." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2955 +msgid "The feConvolveMatrix lets you specify a Convolution to be applied on the image. Common effects created using convolution matrices are blur, sharpening, embossing and edge detection. Note that while gaussian blur can be created using this filter primitive, the special gaussian blur primitive is faster and resolution-independent." +msgstr "feConvolveMatrix vous permet de spécifier une matrice de convolution à appliquer à l'image. Les effets courants créés par des matrices de convolution sont le flou, la netteté, le gauffrage et la détection de bords. Il faut noter que, bien qu'un flou gaussien puisse être créé en utilisant cette primitive de filtre, la primitive dédiée au flou gaussien est plus rapide et ne dépend pas de la résolution." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2766 -msgid "" -"The feFlood filter primitive fills the region with a given color and " -"opacity. It is usually used as an input to other filters to apply color to " -"a graphic." -msgstr "" -"feFlood remplit la région avec une couleur et une opacité données. Il " -"est le plus souvent utilisé comme entrée pour d'autres filtres pour " -"appliquer une couleur à une ressource graphique." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2959 +msgid "The feDiffuseLighting and feSpecularLighting filter primitives create \"embossed\" shadings. The input's alpha channel is used to provide depth information: higher opacity areas are raised toward the viewer and lower opacity areas recede away from the viewer." +msgstr "feDiffuseLighting et feSpecularLighting créent des ombrages « gauffrés ». La composante d'opacité (alpha) de l'entrée est utilisée pour founir l'information de profondeur : les zones de forte opacité sont élevées vers le point de vue et les zones de faible opacité sont reculées par rapport au point de vue." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2770 -msgid "" -"The feGaussianBlur filter primitive uniformly blurs its input. It is " -"commonly used together with feOffset to create a drop shadow effect." -msgstr "" -"feGaussianBlur rend uniformément flou son entrée. Il est le plus " -"souvent utilisé avec feOffset pour créer un effet d'ombre portée." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2963 +msgid "The feDisplacementMap filter primitive displaces the pixels in the first input using the second input as a displacement map, that shows from how far the pixel should come from. Classical examples are whirl and pinch effects." +msgstr "feDisplacementMap déplace les pixels de la première entrée en utilisant la deuxième entrée comme displacement map, qui définit la distance d'où le pixel doit venir. Les exemples les plus classiques sont les effets de tourbillon et de contraction." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2774 -msgid "" -"The feImage filter primitive fills the region with an external image " -"or another part of the document." -msgstr "" -"feImage remplit la zone avec une image externe ou une autre partie du " -"document." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2967 +msgid "The feFlood filter primitive fills the region with a given color and opacity. It is usually used as an input to other filters to apply color to a graphic." +msgstr "feFlood remplit la région avec une couleur et une opacité données. Il est le plus souvent utilisé comme entrée pour d'autres filtres pour appliquer une couleur à une ressource graphique." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2778 -msgid "" -"The feMerge filter primitive composites several temporary images " -"inside the filter primitive to a single image. It uses normal alpha " -"compositing for this. This is equivalent to using several feBlend primitives " -"in 'normal' mode or several feComposite primitives in 'over' mode." -msgstr "" -"feMerge compose plusieurs images temporaires à l'intérieur du filtre " -"de primitive en une seule image. Il utilise la composition alpha normale " -"pour ce faire. Celà équivaut à utiliser plusieurs primitives feBlend en mode " -"'normal' ou plusieurs primitives feComposite en mode 'over'." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2971 +msgid "The feGaussianBlur filter primitive uniformly blurs its input. It is commonly used together with feOffset to create a drop shadow effect." +msgstr "feGaussianBlur rend uniformément flou son entrée. Il est le plus souvent utilisé avec feOffset pour créer un effet d'ombre portée." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2782 -msgid "" -"The feMorphology filter primitive provides erode and dilate effects. " -"For single-color objects erode makes the object thinner and dilate makes it " -"thicker." -msgstr "" -"feMorphology fournit des effets de contraction et de dilatation. Pour " -"des objets de couleur uniforme la contraction rend l'objet plus fin et la " -"dilatation le rend plus épais." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2975 +msgid "The feImage filter primitive fills the region with an external image or another part of the document." +msgstr "feImage remplit la zone avec une image externe ou une autre partie du document." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2786 -msgid "" -"The feOffset filter primitive offsets the image by an user-defined " -"amount. For example, this is useful for drop shadows, where the shadow is in " -"a slightly different position than the actual object." -msgstr "" -"feOffset décale l'image d'une quantité définie par l'utilisateur. Par " -"example, il est utile dans le cas des ombres portées, où les ombres sont " -"dans une position légèrement différente de l'objet source de l'ombre." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2979 +msgid "The feMerge filter primitive composites several temporary images inside the filter primitive to a single image. It uses normal alpha compositing for this. This is equivalent to using several feBlend primitives in 'normal' mode or several feComposite primitives in 'over' mode." +msgstr "feMerge compose plusieurs images temporaires à l'intérieur du filtre de primitive en une seule image. Il utilise la composition alpha normale pour ce faire. Celà équivaut à utiliser plusieurs primitives feBlend en mode 'normal' ou plusieurs primitives feComposite en mode 'over'." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2790 -msgid "" -"The feDiffuseLighting and feSpecularLighting filter primitives " -"create \"embossed\" shadings. The input's alpha channel is used to provide " -"depth information: higher opacity areas are raised toward the viewer and " -"lower opacity areas recede away from the viewer." -msgstr "" -"feDiffuseLighting et feSpecularLighting créent des ombrages " -"« gaufrés ». La composante d'opacité (alpha) de l'entrée est utilisée pour " -"fournir l'information de profondeur : les zones de forte opacité sont " -"élevées vers le point de vue et les zones de faible opacité sont reculées " -"par rapport au point de vue." - -#: ../src/ui/dialog/filter-effects-dialog.cpp:2794 -msgid "" -"The feTile filter primitive tiles a region with its input graphic" -msgstr "" -"feTile pave une région avec la ressource graphique fournie en entrée." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2983 +msgid "The feMorphology filter primitive provides erode and dilate effects. For single-color objects erode makes the object thinner and dilate makes it thicker." +msgstr "feMorphology fournit des effets de contraction et de dilatation. Pour des objets de couleur uniforme la contraction rend l'objet plus fin et la dilatation le rend plus épais." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2798 -msgid "" -"The feTurbulence filter primitive renders Perlin noise. This kind of " -"noise is useful in simulating several nature phenomena like clouds, fire and " -"smoke and in generating complex textures like marble or granite." -msgstr "" -"feTurbulence crée du bruit de Perlin. Ce genre de bruit est utile " -"pour simuler les phénomènes naturels comme les nuages, le feu et la fumée, " -"et pour générer des textures complexes comme le marbre ou le granit." +#: ../src/ui/dialog/filter-effects-dialog.cpp:2987 +msgid "The feOffset filter primitive offsets the image by an user-defined amount. For example, this is useful for drop shadows, where the shadow is in a slightly different position than the actual object." +msgstr "feOffset décale l'image d'une quantité définie par l'utilisateur. Par example, il est utile dans le cas des ombres portées, où les ombres sont dans une position légèrement différente de l'objet source de l'ombre." + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2991 +msgid "The feDiffuseLighting and feSpecularLighting filter primitives create \"embossed\" shadings. The input's alpha channel is used to provide depth information: higher opacity areas are raised toward the viewer and lower opacity areas recede away from the viewer." +msgstr "feDiffuseLighting et feSpecularLighting créent des ombrages « gaufrés ». La composante d'opacité (alpha) de l'entrée est utilisée pour fournir l'information de profondeur : les zones de forte opacité sont élevées vers le point de vue et les zones de faible opacité sont reculées par rapport au point de vue." + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2995 +msgid "The feTile filter primitive tiles a region with its input graphic" +msgstr "feTile pave une région avec la ressource graphique fournie en entrée." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2817 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2999 +msgid "The feTurbulence filter primitive renders Perlin noise. This kind of noise is useful in simulating several nature phenomena like clouds, fire and smoke and in generating complex textures like marble or granite." +msgstr "feTurbulence crée du bruit de Perlin. Ce genre de bruit est utile pour simuler les phénomènes naturels comme les nuages, le feu et la fumée, et pour générer des textures complexes comme le marbre ou le granit." + +#: ../src/ui/dialog/filter-effects-dialog.cpp:3018 msgid "Duplicate filter primitive" msgstr "Dupliquer la primitive de filtre" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3071 msgid "Set filter primitive attribute" msgstr "Définir l'attribut de la primitive de filtre" @@ -16185,9 +14879,7 @@ msgstr "Re_chercher :" #: ../src/ui/dialog/find.cpp:71 msgid "Find objects by their content or properties (exact or partial match)" -msgstr "" -"Rechercher des objets par leur contenu ou propriétés (correspondance exacte " -"ou partielle)" +msgstr "Rechercher des objets par leur contenu ou propriétés (correspondance exacte ou partielle)" #: ../src/ui/dialog/find.cpp:72 msgid "R_eplace:" @@ -16231,9 +14923,7 @@ msgstr "_Propriétés" #: ../src/ui/dialog/find.cpp:78 msgid "Search in object properties, styles, attributes and IDs" -msgstr "" -"Rechercher dans les propriétés, les styles, les attributs et les " -"identifiants des objets" +msgstr "Rechercher dans les propriétés, les styles, les attributs et les identifiants des objets" #: ../src/ui/dialog/find.cpp:80 msgid "Search in" @@ -16363,7 +15053,8 @@ msgstr "Spirales" msgid "Search spirals" msgstr "Rechercher les spirales" -#: ../src/ui/dialog/find.cpp:102 ../src/widgets/toolbox.cpp:1734 +#: ../src/ui/dialog/find.cpp:102 +#: ../src/widgets/toolbox.cpp:1735 msgid "Paths" msgstr "Chemins" @@ -16397,7 +15088,8 @@ msgstr "Clones" msgid "Search clones" msgstr "Rechercher les clones" -#: ../src/ui/dialog/find.cpp:109 ../share/extensions/embedimage.inx.h:3 +#: ../src/ui/dialog/find.cpp:109 +#: ../share/extensions/embedimage.inx.h:3 #: ../share/extensions/extractimage.inx.h:5 msgid "Images" msgstr "Images" @@ -16424,8 +15116,7 @@ msgstr "_Rechercher" #: ../src/ui/dialog/find.cpp:114 msgid "Select all objects matching the selection criteria" -msgstr "" -"Sélectionner tous les objets qui correspondent aux critères de sélection" +msgstr "Sélectionner tous les objets qui correspondent aux critères de sélection" #: ../src/ui/dialog/find.cpp:115 msgid "_Replace All" @@ -16512,7 +15203,8 @@ msgstr "Ne plus afficher cet avertissement" msgid "Font '%1' substituted with '%2'" msgstr "Fonte '%1' remplacée par '%2'" -#: ../src/ui/dialog/glyphs.cpp:60 ../src/ui/dialog/glyphs.cpp:152 +#: ../src/ui/dialog/glyphs.cpp:60 +#: ../src/ui/dialog/glyphs.cpp:152 msgid "all" msgstr "tout" @@ -16524,31 +15216,38 @@ msgstr "commun" msgid "inherited" msgstr "hérité" -#: ../src/ui/dialog/glyphs.cpp:63 ../src/ui/dialog/glyphs.cpp:165 +#: ../src/ui/dialog/glyphs.cpp:63 +#: ../src/ui/dialog/glyphs.cpp:165 msgid "Arabic" msgstr "Arabe" -#: ../src/ui/dialog/glyphs.cpp:64 ../src/ui/dialog/glyphs.cpp:163 +#: ../src/ui/dialog/glyphs.cpp:64 +#: ../src/ui/dialog/glyphs.cpp:163 msgid "Armenian" msgstr "Arménien" -#: ../src/ui/dialog/glyphs.cpp:65 ../src/ui/dialog/glyphs.cpp:172 +#: ../src/ui/dialog/glyphs.cpp:65 +#: ../src/ui/dialog/glyphs.cpp:172 msgid "Bengali" msgstr "Bengali" -#: ../src/ui/dialog/glyphs.cpp:66 ../src/ui/dialog/glyphs.cpp:254 +#: ../src/ui/dialog/glyphs.cpp:66 +#: ../src/ui/dialog/glyphs.cpp:254 msgid "Bopomofo" msgstr "Bopomofo" -#: ../src/ui/dialog/glyphs.cpp:67 ../src/ui/dialog/glyphs.cpp:189 +#: ../src/ui/dialog/glyphs.cpp:67 +#: ../src/ui/dialog/glyphs.cpp:189 msgid "Cherokee" msgstr "Chérokî" -#: ../src/ui/dialog/glyphs.cpp:68 ../src/ui/dialog/glyphs.cpp:242 +#: ../src/ui/dialog/glyphs.cpp:68 +#: ../src/ui/dialog/glyphs.cpp:242 msgid "Coptic" msgstr "Copte" -#: ../src/ui/dialog/glyphs.cpp:69 ../src/ui/dialog/glyphs.cpp:161 +#: ../src/ui/dialog/glyphs.cpp:69 +#: ../src/ui/dialog/glyphs.cpp:161 #: ../share/extensions/hershey.inx.h:22 msgid "Cyrillic" msgstr "Cyrillique" @@ -16557,15 +15256,18 @@ msgstr "Cyrillique" msgid "Deseret" msgstr "Déséret" -#: ../src/ui/dialog/glyphs.cpp:71 ../src/ui/dialog/glyphs.cpp:171 +#: ../src/ui/dialog/glyphs.cpp:71 +#: ../src/ui/dialog/glyphs.cpp:171 msgid "Devanagari" msgstr "Dévanâgarî" -#: ../src/ui/dialog/glyphs.cpp:72 ../src/ui/dialog/glyphs.cpp:187 +#: ../src/ui/dialog/glyphs.cpp:72 +#: ../src/ui/dialog/glyphs.cpp:187 msgid "Ethiopic" msgstr "Éthiopien" -#: ../src/ui/dialog/glyphs.cpp:73 ../src/ui/dialog/glyphs.cpp:185 +#: ../src/ui/dialog/glyphs.cpp:73 +#: ../src/ui/dialog/glyphs.cpp:185 msgid "Georgian" msgstr "Géorgien" @@ -16577,11 +15279,13 @@ msgstr "Gotique" msgid "Greek" msgstr "Grec" -#: ../src/ui/dialog/glyphs.cpp:76 ../src/ui/dialog/glyphs.cpp:174 +#: ../src/ui/dialog/glyphs.cpp:76 +#: ../src/ui/dialog/glyphs.cpp:174 msgid "Gujarati" msgstr "Goudjarati" -#: ../src/ui/dialog/glyphs.cpp:77 ../src/ui/dialog/glyphs.cpp:173 +#: ../src/ui/dialog/glyphs.cpp:77 +#: ../src/ui/dialog/glyphs.cpp:173 msgid "Gurmukhi" msgstr "Gourmoukhî" @@ -16593,27 +15297,33 @@ msgstr "Han" msgid "Hangul" msgstr "Hangûl" -#: ../src/ui/dialog/glyphs.cpp:80 ../src/ui/dialog/glyphs.cpp:164 +#: ../src/ui/dialog/glyphs.cpp:80 +#: ../src/ui/dialog/glyphs.cpp:164 msgid "Hebrew" msgstr "Hébreu" -#: ../src/ui/dialog/glyphs.cpp:81 ../src/ui/dialog/glyphs.cpp:252 +#: ../src/ui/dialog/glyphs.cpp:81 +#: ../src/ui/dialog/glyphs.cpp:252 msgid "Hiragana" msgstr "Hiragana" -#: ../src/ui/dialog/glyphs.cpp:82 ../src/ui/dialog/glyphs.cpp:178 +#: ../src/ui/dialog/glyphs.cpp:82 +#: ../src/ui/dialog/glyphs.cpp:178 msgid "Kannada" msgstr "Kannara" -#: ../src/ui/dialog/glyphs.cpp:83 ../src/ui/dialog/glyphs.cpp:253 +#: ../src/ui/dialog/glyphs.cpp:83 +#: ../src/ui/dialog/glyphs.cpp:253 msgid "Katakana" msgstr "Katakana" -#: ../src/ui/dialog/glyphs.cpp:84 ../src/ui/dialog/glyphs.cpp:197 +#: ../src/ui/dialog/glyphs.cpp:84 +#: ../src/ui/dialog/glyphs.cpp:197 msgid "Khmer" msgstr "Khmer" -#: ../src/ui/dialog/glyphs.cpp:85 ../src/ui/dialog/glyphs.cpp:182 +#: ../src/ui/dialog/glyphs.cpp:85 +#: ../src/ui/dialog/glyphs.cpp:182 msgid "Lao" msgstr "Lao" @@ -16621,19 +15331,23 @@ msgstr "Lao" msgid "Latin" msgstr "Latin" -#: ../src/ui/dialog/glyphs.cpp:87 ../src/ui/dialog/glyphs.cpp:179 +#: ../src/ui/dialog/glyphs.cpp:87 +#: ../src/ui/dialog/glyphs.cpp:179 msgid "Malayalam" msgstr "Malayalam" -#: ../src/ui/dialog/glyphs.cpp:88 ../src/ui/dialog/glyphs.cpp:198 +#: ../src/ui/dialog/glyphs.cpp:88 +#: ../src/ui/dialog/glyphs.cpp:198 msgid "Mongolian" msgstr "Mongol" -#: ../src/ui/dialog/glyphs.cpp:89 ../src/ui/dialog/glyphs.cpp:184 +#: ../src/ui/dialog/glyphs.cpp:89 +#: ../src/ui/dialog/glyphs.cpp:184 msgid "Myanmar" msgstr "Birman" -#: ../src/ui/dialog/glyphs.cpp:90 ../src/ui/dialog/glyphs.cpp:191 +#: ../src/ui/dialog/glyphs.cpp:90 +#: ../src/ui/dialog/glyphs.cpp:191 msgid "Ogham" msgstr "Ogam" @@ -16641,39 +15355,48 @@ msgstr "Ogam" msgid "Old Italic" msgstr "Vieil italique" -#: ../src/ui/dialog/glyphs.cpp:92 ../src/ui/dialog/glyphs.cpp:175 +#: ../src/ui/dialog/glyphs.cpp:92 +#: ../src/ui/dialog/glyphs.cpp:175 msgid "Oriya" msgstr "Oriya" -#: ../src/ui/dialog/glyphs.cpp:93 ../src/ui/dialog/glyphs.cpp:192 +#: ../src/ui/dialog/glyphs.cpp:93 +#: ../src/ui/dialog/glyphs.cpp:192 msgid "Runic" msgstr "Runes" -#: ../src/ui/dialog/glyphs.cpp:94 ../src/ui/dialog/glyphs.cpp:180 +#: ../src/ui/dialog/glyphs.cpp:94 +#: ../src/ui/dialog/glyphs.cpp:180 msgid "Sinhala" msgstr "Singhalais" -#: ../src/ui/dialog/glyphs.cpp:95 ../src/ui/dialog/glyphs.cpp:166 +#: ../src/ui/dialog/glyphs.cpp:95 +#: ../src/ui/dialog/glyphs.cpp:166 msgid "Syriac" msgstr "Syriaque" -#: ../src/ui/dialog/glyphs.cpp:96 ../src/ui/dialog/glyphs.cpp:176 +#: ../src/ui/dialog/glyphs.cpp:96 +#: ../src/ui/dialog/glyphs.cpp:176 msgid "Tamil" msgstr "Tamoul" -#: ../src/ui/dialog/glyphs.cpp:97 ../src/ui/dialog/glyphs.cpp:177 +#: ../src/ui/dialog/glyphs.cpp:97 +#: ../src/ui/dialog/glyphs.cpp:177 msgid "Telugu" msgstr "Télougou" -#: ../src/ui/dialog/glyphs.cpp:98 ../src/ui/dialog/glyphs.cpp:168 +#: ../src/ui/dialog/glyphs.cpp:98 +#: ../src/ui/dialog/glyphs.cpp:168 msgid "Thaana" msgstr "Thâna" -#: ../src/ui/dialog/glyphs.cpp:99 ../src/ui/dialog/glyphs.cpp:181 +#: ../src/ui/dialog/glyphs.cpp:99 +#: ../src/ui/dialog/glyphs.cpp:181 msgid "Thai" msgstr "Thaï" -#: ../src/ui/dialog/glyphs.cpp:100 ../src/ui/dialog/glyphs.cpp:183 +#: ../src/ui/dialog/glyphs.cpp:100 +#: ../src/ui/dialog/glyphs.cpp:183 msgid "Tibetan" msgstr "Tibétain" @@ -16685,19 +15408,23 @@ msgstr "Syllabaires canadiens" msgid "Yi" msgstr "Yi" -#: ../src/ui/dialog/glyphs.cpp:103 ../src/ui/dialog/glyphs.cpp:193 +#: ../src/ui/dialog/glyphs.cpp:103 +#: ../src/ui/dialog/glyphs.cpp:193 msgid "Tagalog" msgstr "Tagal" -#: ../src/ui/dialog/glyphs.cpp:104 ../src/ui/dialog/glyphs.cpp:194 +#: ../src/ui/dialog/glyphs.cpp:104 +#: ../src/ui/dialog/glyphs.cpp:194 msgid "Hanunoo" msgstr "Hanounóo" -#: ../src/ui/dialog/glyphs.cpp:105 ../src/ui/dialog/glyphs.cpp:195 +#: ../src/ui/dialog/glyphs.cpp:105 +#: ../src/ui/dialog/glyphs.cpp:195 msgid "Buhid" msgstr "Bouhid" -#: ../src/ui/dialog/glyphs.cpp:106 ../src/ui/dialog/glyphs.cpp:196 +#: ../src/ui/dialog/glyphs.cpp:106 +#: ../src/ui/dialog/glyphs.cpp:196 msgid "Tagbanwa" msgstr "Tagbanoua" @@ -16709,7 +15436,8 @@ msgstr "Braille" msgid "Cypriot" msgstr "Syllabaire chypriote" -#: ../src/ui/dialog/glyphs.cpp:109 ../src/ui/dialog/glyphs.cpp:200 +#: ../src/ui/dialog/glyphs.cpp:109 +#: ../src/ui/dialog/glyphs.cpp:200 msgid "Limbu" msgstr "Limbu" @@ -16725,7 +15453,8 @@ msgstr "Shavien" msgid "Linear B" msgstr "Linéaire B" -#: ../src/ui/dialog/glyphs.cpp:113 ../src/ui/dialog/glyphs.cpp:201 +#: ../src/ui/dialog/glyphs.cpp:113 +#: ../src/ui/dialog/glyphs.cpp:201 msgid "Tai Le" msgstr "Taï-le" @@ -16733,23 +15462,28 @@ msgstr "Taï-le" msgid "Ugaritic" msgstr "Ougaritique" -#: ../src/ui/dialog/glyphs.cpp:115 ../src/ui/dialog/glyphs.cpp:202 +#: ../src/ui/dialog/glyphs.cpp:115 +#: ../src/ui/dialog/glyphs.cpp:202 msgid "New Tai Lue" msgstr "Nouveau taï lü" -#: ../src/ui/dialog/glyphs.cpp:116 ../src/ui/dialog/glyphs.cpp:204 +#: ../src/ui/dialog/glyphs.cpp:116 +#: ../src/ui/dialog/glyphs.cpp:204 msgid "Buginese" msgstr "Buginais" -#: ../src/ui/dialog/glyphs.cpp:117 ../src/ui/dialog/glyphs.cpp:240 +#: ../src/ui/dialog/glyphs.cpp:117 +#: ../src/ui/dialog/glyphs.cpp:240 msgid "Glagolitic" msgstr "Glagolitique" -#: ../src/ui/dialog/glyphs.cpp:118 ../src/ui/dialog/glyphs.cpp:244 +#: ../src/ui/dialog/glyphs.cpp:118 +#: ../src/ui/dialog/glyphs.cpp:244 msgid "Tifinagh" msgstr "Tifinaghe" -#: ../src/ui/dialog/glyphs.cpp:119 ../src/ui/dialog/glyphs.cpp:273 +#: ../src/ui/dialog/glyphs.cpp:119 +#: ../src/ui/dialog/glyphs.cpp:273 msgid "Syloti Nagri" msgstr "Sylotî nâgrî" @@ -16765,7 +15499,8 @@ msgstr "Kharochthî" msgid "unassigned" msgstr "Non assigné" -#: ../src/ui/dialog/glyphs.cpp:123 ../src/ui/dialog/glyphs.cpp:206 +#: ../src/ui/dialog/glyphs.cpp:123 +#: ../src/ui/dialog/glyphs.cpp:206 msgid "Balinese" msgstr "Balinais" @@ -16777,7 +15512,8 @@ msgstr "Cunéiforme" msgid "Phoenician" msgstr "Phénicien" -#: ../src/ui/dialog/glyphs.cpp:126 ../src/ui/dialog/glyphs.cpp:275 +#: ../src/ui/dialog/glyphs.cpp:126 +#: ../src/ui/dialog/glyphs.cpp:275 msgid "Phags-pa" msgstr "Phags-pa" @@ -16785,35 +15521,43 @@ msgstr "Phags-pa" msgid "N'Ko" msgstr "N'Ko" -#: ../src/ui/dialog/glyphs.cpp:128 ../src/ui/dialog/glyphs.cpp:278 +#: ../src/ui/dialog/glyphs.cpp:128 +#: ../src/ui/dialog/glyphs.cpp:278 msgid "Kayah Li" msgstr "Kayah Li" -#: ../src/ui/dialog/glyphs.cpp:129 ../src/ui/dialog/glyphs.cpp:208 +#: ../src/ui/dialog/glyphs.cpp:129 +#: ../src/ui/dialog/glyphs.cpp:208 msgid "Lepcha" msgstr "Lepcha" -#: ../src/ui/dialog/glyphs.cpp:130 ../src/ui/dialog/glyphs.cpp:279 +#: ../src/ui/dialog/glyphs.cpp:130 +#: ../src/ui/dialog/glyphs.cpp:279 msgid "Rejang" msgstr "Rejang" -#: ../src/ui/dialog/glyphs.cpp:131 ../src/ui/dialog/glyphs.cpp:207 +#: ../src/ui/dialog/glyphs.cpp:131 +#: ../src/ui/dialog/glyphs.cpp:207 msgid "Sundanese" msgstr "Soundanais" -#: ../src/ui/dialog/glyphs.cpp:132 ../src/ui/dialog/glyphs.cpp:276 +#: ../src/ui/dialog/glyphs.cpp:132 +#: ../src/ui/dialog/glyphs.cpp:276 msgid "Saurashtra" msgstr "Saurashtra" -#: ../src/ui/dialog/glyphs.cpp:133 ../src/ui/dialog/glyphs.cpp:282 +#: ../src/ui/dialog/glyphs.cpp:133 +#: ../src/ui/dialog/glyphs.cpp:282 msgid "Cham" msgstr "Cham" -#: ../src/ui/dialog/glyphs.cpp:134 ../src/ui/dialog/glyphs.cpp:209 +#: ../src/ui/dialog/glyphs.cpp:134 +#: ../src/ui/dialog/glyphs.cpp:209 msgid "Ol Chiki" msgstr "Santâlî" -#: ../src/ui/dialog/glyphs.cpp:135 ../src/ui/dialog/glyphs.cpp:268 +#: ../src/ui/dialog/glyphs.cpp:135 +#: ../src/ui/dialog/glyphs.cpp:268 msgid "Vai" msgstr "Vaï" @@ -17255,7 +15999,8 @@ msgctxt "Guides" msgid "_Y:" msgstr "_Y :" -#: ../src/ui/dialog/guides.cpp:50 ../src/ui/dialog/object-properties.cpp:62 +#: ../src/ui/dialog/guides.cpp:50 +#: ../src/ui/dialog/object-properties.cpp:64 msgid "_Label:" msgstr "É_tiquette :" @@ -17312,11 +16057,8 @@ msgid "Show selection cue" msgstr "Afficher les poignées de sélection" #: ../src/ui/dialog/inkscape-preferences.cpp:182 -msgid "" -"Whether selected objects display a selection cue (the same as in selector)" -msgstr "" -"Si coché, l'objet sélectionné affiche ses poignées de sélection (les mêmes " -"que dans le sélecteur)" +msgid "Whether selected objects display a selection cue (the same as in selector)" +msgstr "Si coché, l'objet sélectionné affiche ses poignées de sélection (les mêmes que dans le sélecteur)" #: ../src/ui/dialog/inkscape-preferences.cpp:188 msgid "Enable gradient editing" @@ -17324,23 +16066,15 @@ msgstr "Activer l'édition de dégradé" #: ../src/ui/dialog/inkscape-preferences.cpp:189 msgid "Whether selected objects display gradient editing controls" -msgstr "" -"Si coché, les objets sélectionnés affichent leurs poignées d'édition de " -"dégradés" +msgstr "Si coché, les objets sélectionnés affichent leurs poignées d'édition de dégradés" #: ../src/ui/dialog/inkscape-preferences.cpp:194 msgid "Conversion to guides uses edges instead of bounding box" -msgstr "" -"Utiliser les bords (plutôt que les boîtes englobantes) pour convertir en " -"guides" +msgstr "Utiliser les bords (plutôt que les boîtes englobantes) pour convertir en guides" #: ../src/ui/dialog/inkscape-preferences.cpp:195 -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 "" -"La conversion d'un objet en guides place ceux-ci le long des bords réels de " -"l'objet (imitant la forme de l'objet), et non le long de sa boîte englobante" +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 "La conversion d'un objet en guides place ceux-ci le long des bords réels de l'objet (imitant la forme de l'objet), et non le long de sa boîte englobante" #: ../src/ui/dialog/inkscape-preferences.cpp:202 msgid "Ctrl+click _dot size:" @@ -17352,21 +16086,15 @@ msgstr "fois l'épaisseur courante de contour" #: ../src/ui/dialog/inkscape-preferences.cpp:203 msgid "Size of dots created with Ctrl+click (relative to current stroke width)" -msgstr "" -"Taille des points créés avec Ctrl+clic (par rapport à l'épaisseur courante " -"de contour)" +msgstr "Taille des points créés avec Ctrl+clic (par rapport à l'épaisseur courante de contour)" #: ../src/ui/dialog/inkscape-preferences.cpp:218 msgid "No objects selected to take the style from." msgstr "Aucun objet sélectionné pour en capturer le style." #: ../src/ui/dialog/inkscape-preferences.cpp:227 -msgid "" -"More than one object selected. Cannot take style from multiple " -"objects." -msgstr "" -"Plus d'un objet est sélectionné. Impossible de capturer le style de " -"plusieurs objets." +msgid "More than one object selected. Cannot take style from multiple objects." +msgstr "Plus d'un objet est sélectionné. Impossible de capturer le style de plusieurs objets." #: ../src/ui/dialog/inkscape-preferences.cpp:260 msgid "Style of new objects" @@ -17385,12 +16113,8 @@ msgid "This tool's own style:" msgstr "Style propre à l'outil :" #: ../src/ui/dialog/inkscape-preferences.cpp:273 -msgid "" -"Each tool may store its own style to apply to the newly created objects. Use " -"the button below to set it." -msgstr "" -"Chaque outil retient son propre style à appliquer aux nouveaux objets créés. " -"Utiliser le bouton ci-dessous pour le définir." +msgid "Each tool may store its own style to apply to the newly created objects. Use the button below to set it." +msgstr "Chaque outil retient son propre style à appliquer aux nouveaux objets créés. Utiliser le bouton ci-dessous pour le définir." #. style swatch #: ../src/ui/dialog/inkscape-preferences.cpp:277 @@ -17403,8 +16127,7 @@ msgstr "Style de cet outil pour les nouveaux objets" #: ../src/ui/dialog/inkscape-preferences.cpp:289 msgid "Remember the style of the (first) selected object as this tool's style" -msgstr "" -"Mémoriser le style du premier objet sélectionné comme style de cet outil" +msgstr "Mémoriser le style du premier objet sélectionné comme style de cet outil" #: ../src/ui/dialog/inkscape-preferences.cpp:294 msgid "Tools" @@ -17420,9 +16143,7 @@ msgstr "Boîte englobante visuelle" #: ../src/ui/dialog/inkscape-preferences.cpp:300 msgid "This bounding box includes stroke width, markers, filter margins, etc." -msgstr "" -"Cette boîte englobante comprend l'épaisseur du contour, les marqueurs, les " -"marges des filtres, etc." +msgstr "Cette boîte englobante comprend l'épaisseur du contour, les marqueurs, les marges des filtres, etc." #: ../src/ui/dialog/inkscape-preferences.cpp:301 msgid "Geometric bounding box" @@ -17441,24 +16162,16 @@ msgid "Keep objects after conversion to guides" msgstr "Conserver les objets après leur conversion en guides" #: ../src/ui/dialog/inkscape-preferences.cpp:308 -msgid "" -"When converting an object to guides, don't delete the object after the " -"conversion" -msgstr "" -"Lors de la conversion d'objets en guides, ne pas supprimer les objets après " -"la conversion" +msgid "When converting an object to guides, don't delete the object after the conversion" +msgstr "Lors de la conversion d'objets en guides, ne pas supprimer les objets après la conversion" #: ../src/ui/dialog/inkscape-preferences.cpp:309 msgid "Treat groups as a single object" msgstr "Manipule le groupe comme un objet unique" #: ../src/ui/dialog/inkscape-preferences.cpp:311 -msgid "" -"Treat groups as a single object during conversion to guides rather than " -"converting each child separately" -msgstr "" -"Lors de la conversion en guides, les groupes sont traités chacun comme un " -"objet unique (la conversion n'est pas appliquée à chaque enfant séparément)" +msgid "Treat groups as a single object during conversion to guides rather than converting each child separately" +msgstr "Lors de la conversion en guides, les groupes sont traités chacun comme un objet unique (la conversion n'est pas appliquée à chaque enfant séparément)" #: ../src/ui/dialog/inkscape-preferences.cpp:313 msgid "Average all sketches" @@ -17499,9 +16212,7 @@ msgstr "Silhouette rectangulaire" #: ../src/ui/dialog/inkscape-preferences.cpp:330 msgid "Show only a box outline of the objects when moving or transforming" -msgstr "" -"N'afficher que la silhouette rectangulaire des objets lors de leurs " -"déplacements ou transformations" +msgstr "N'afficher que la silhouette rectangulaire des objets lors de leurs déplacements ou transformations" #: ../src/ui/dialog/inkscape-preferences.cpp:331 msgid "Per-object selection cue" @@ -17517,9 +16228,7 @@ msgstr "Marque" #: ../src/ui/dialog/inkscape-preferences.cpp:337 msgid "Each selected object has a diamond mark in the top left corner" -msgstr "" -"Chaque objet sélectionné est marqué d'un losange dans le coin en haut à " -"gauche" +msgstr "Chaque objet sélectionné est marqué d'un losange dans le coin en haut à gauche" #: ../src/ui/dialog/inkscape-preferences.cpp:338 msgid "Box" @@ -17552,47 +16261,31 @@ msgstr "Toujours afficher le contour" #: ../src/ui/dialog/inkscape-preferences.cpp:350 msgid "Show outlines for all paths, not only invisible paths" -msgstr "" -"Affiche les contours pour tous les chemins, pas seulement les chemins " -"invisibles" +msgstr "Affiche les contours pour tous les chemins, pas seulement les chemins invisibles" #: ../src/ui/dialog/inkscape-preferences.cpp:351 msgid "Update outline when dragging nodes" msgstr "Mettre à jour le contour pendant le déplacement des nœuds" #: ../src/ui/dialog/inkscape-preferences.cpp:352 -msgid "" -"Update the outline when dragging or transforming nodes; if this is off, the " -"outline will only update when completing a drag" -msgstr "" -"Met à jour le contour pendant le déplacement ou la transformation des " -"nœuds ; lorsque cette option est désactivée, le contour n'est mis à jour " -"qu'à la fin du déplacement" +msgid "Update the outline when dragging or transforming nodes; if this is off, the outline will only update when completing a drag" +msgstr "Met à jour le contour pendant le déplacement ou la transformation des nœuds ; lorsque cette option est désactivée, le contour n'est mis à jour qu'à la fin du déplacement" #: ../src/ui/dialog/inkscape-preferences.cpp:353 msgid "Update paths when dragging nodes" msgstr "Mettre à jour les chemins pendant le déplacement des nœuds" #: ../src/ui/dialog/inkscape-preferences.cpp:354 -msgid "" -"Update paths when dragging or transforming nodes; if this is off, paths will " -"only be updated when completing a drag" -msgstr "" -"Met à jour les chemins pendant le déplacement ou la transformation des " -"nœuds ; lorsque cette option est désactivée, les chemins ne sont mis à jour " -"qu'à la fin du déplacement" +msgid "Update paths when dragging or transforming nodes; if this is off, paths will only be updated when completing a drag" +msgstr "Met à jour les chemins pendant le déplacement ou la transformation des nœuds ; lorsque cette option est désactivée, les chemins ne sont mis à jour qu'à la fin du déplacement" #: ../src/ui/dialog/inkscape-preferences.cpp:355 msgid "Show path direction on outlines" msgstr "Afficher la direction des chemins sur le contour" #: ../src/ui/dialog/inkscape-preferences.cpp:356 -msgid "" -"Visualize the direction of selected paths by drawing small arrows in the " -"middle of each outline segment" -msgstr "" -"Visualise la direction des chemins sélectionnés en dessinant de petites " -"flèches au milieu de chaque segment de contour" +msgid "Visualize the direction of selected paths by drawing small arrows in the middle of each outline segment" +msgstr "Visualise la direction des chemins sélectionnés en dessinant de petites flèches au milieu de chaque segment de contour" #: ../src/ui/dialog/inkscape-preferences.cpp:357 msgid "Show temporary path outline" @@ -17608,23 +16301,15 @@ msgstr "Afficher temporairement le contour des chemins sélectionnés" #: ../src/ui/dialog/inkscape-preferences.cpp:360 msgid "Show temporary outline even when a path is selected for editing" -msgstr "" -"Affiche temporairement le contour même lorsqu'un chemin est sélectionné pour " -"édition" +msgstr "Affiche temporairement le contour même lorsqu'un chemin est sélectionné pour édition" #: ../src/ui/dialog/inkscape-preferences.cpp:362 msgid "_Flash time:" msgstr "Durée de _clignotement :" #: ../src/ui/dialog/inkscape-preferences.cpp:362 -msgid "" -"Specifies how long the path outline will be visible after a mouse-over (in " -"milliseconds); specify 0 to have the outline shown until mouse leaves the " -"path" -msgstr "" -"Définit combien de temps le contour sera visible après son survol par la " -"souris (en millisecondes) ; choisissez 0 pour garder le contour visible " -"jusqu'à ce que la souris quitte le chemin." +msgid "Specifies how long the path outline will be visible after a mouse-over (in milliseconds); specify 0 to have the outline shown until mouse leaves the path" +msgstr "Définit combien de temps le contour sera visible après son survol par la souris (en millisecondes) ; choisissez 0 pour garder le contour visible jusqu'à ce que la souris quitte le chemin." #: ../src/ui/dialog/inkscape-preferences.cpp:363 msgid "Editing preferences" @@ -17636,21 +16321,15 @@ msgstr "Afficher les poignées de transformation pour un nœud seul" #: ../src/ui/dialog/inkscape-preferences.cpp:365 msgid "Show transform handles even when only a single node is selected" -msgstr "" -"Affiche les poignées de transformation même lorsqu'un seul nœud est " -"sélectionné" +msgstr "Affiche les poignées de transformation même lorsqu'un seul nœud est sélectionné" #: ../src/ui/dialog/inkscape-preferences.cpp:366 msgid "Deleting nodes preserves shape" msgstr "La suppression des nœuds préserve la forme" #: ../src/ui/dialog/inkscape-preferences.cpp:367 -msgid "" -"Move handles next to deleted nodes to resemble original shape; hold Ctrl to " -"get the other behavior" -msgstr "" -"Déplace les poignées près des nœuds supprimés pour conserver la forme " -"originale ; maintenir Ctrl pour désactiver cette fonctionnalité" +msgid "Move handles next to deleted nodes to resemble original shape; hold Ctrl to get the other behavior" +msgstr "Déplace les poignées près des nœuds supprimés pour conserver la forme originale ; maintenir Ctrl pour désactiver cette fonctionnalité" #. Tweak #: ../src/ui/dialog/inkscape-preferences.cpp:370 @@ -17663,12 +16342,13 @@ msgstr "Style de l'outil" #. Zoom #: ../src/ui/dialog/inkscape-preferences.cpp:376 -#: ../src/widgets/desktop-widget.cpp:635 +#: ../src/widgets/desktop-widget.cpp:636 msgid "Zoom" msgstr "Zoom" #. Measure -#: ../src/ui/dialog/inkscape-preferences.cpp:381 ../src/verbs.cpp:2682 +#: ../src/ui/dialog/inkscape-preferences.cpp:381 +#: ../src/verbs.cpp:2682 msgctxt "ContextVerb" msgid "Measure" msgstr "Mesurer" @@ -17678,14 +16358,8 @@ msgid "Ignore first and last points" msgstr "Ignorer le premier et le dernier point" #: ../src/ui/dialog/inkscape-preferences.cpp:384 -msgid "" -"The start and end of the measurement tool's control line will not be " -"considered for calculating lengths. Only lengths between actual curve " -"intersections will be displayed." -msgstr "" -"Le début et la fin de la ligne de contrôle de l'outil de mesure ne sont pas " -"pris en compte dans le calcul des longueurs. Seules les longueurs entre les " -"intersections des chemins sont affichées." +msgid "The start and end of the measurement tool's control line will not be considered for calculating lengths. Only lengths between actual curve intersections will be displayed." +msgstr "Le début et la fin de la ligne de contrôle de l'outil de mesure ne sont pas pris en compte dans le calcul des longueurs. Seules les longueurs entre les intersections des chemins sont affichées." #. Shapes #: ../src/ui/dialog/inkscape-preferences.cpp:387 @@ -17697,13 +16371,8 @@ msgid "Sketch mode" msgstr "Mode croquis" #: ../src/ui/dialog/inkscape-preferences.cpp:421 -msgid "" -"If on, the sketch result will be the normal average of all sketches made, " -"instead of averaging the old result with the new sketch" -msgstr "" -"Si coché, le résultat du croquis sera moyenné avec tous les autres croquis ; " -"sinon, la moyenne sera effectuée entre l'ancien résultat et le nouveau " -"croquis" +msgid "If on, the sketch result will be the normal average of all sketches made, instead of averaging the old result with the new sketch" +msgstr "Si coché, le résultat du croquis sera moyenné avec tous les autres croquis ; sinon, la moyenne sera effectuée entre l'ancien résultat et le nouveau croquis" #. Pen #: ../src/ui/dialog/inkscape-preferences.cpp:424 @@ -17717,24 +16386,16 @@ msgid "Calligraphy" msgstr "Plume calligraphique" #: ../src/ui/dialog/inkscape-preferences.cpp:434 -msgid "" -"If on, pen width is in absolute units (px) independent of zoom; otherwise " -"pen width depends on zoom so that it looks the same at any zoom" -msgstr "" -"Si coché, la largeur de la plume est en unités absolues (px) indépendemment " -"du zoom; sinon, la largeur de plume dépend du zoom afin de paraître la même " -"quel que soit le zoom" +msgid "If on, pen width is in absolute units (px) independent of zoom; otherwise pen width depends on zoom so that it looks the same at any zoom" +msgstr "Si coché, la largeur de la plume est en unités absolues (px) indépendemment du zoom; sinon, la largeur de plume dépend du zoom afin de paraître la même quel que soit le zoom" #: ../src/ui/dialog/inkscape-preferences.cpp:436 -msgid "" -"If on, each newly created object will be selected (deselecting previous " -"selection)" -msgstr "" -"Activer pour que les nouveaux objets soient automatiquement sélectionnés (à " -"la place de l'ancienne sélection)" +msgid "If on, each newly created object will be selected (deselecting previous selection)" +msgstr "Activer pour que les nouveaux objets soient automatiquement sélectionnés (à la place de l'ancienne sélection)" #. Text -#: ../src/ui/dialog/inkscape-preferences.cpp:439 ../src/verbs.cpp:2674 +#: ../src/ui/dialog/inkscape-preferences.cpp:439 +#: ../src/verbs.cpp:2674 msgctxt "ContextVerb" msgid "Text" msgstr "Texte" @@ -17744,23 +16405,16 @@ msgid "Show font samples in the drop-down list" msgstr "Afficher les échantillons de police dans la liste déroulante" #: ../src/ui/dialog/inkscape-preferences.cpp:445 -msgid "" -"Show font samples alongside font names in the drop-down list in Text bar" -msgstr "" -"Affiche les échantillons de police à côté du nom dans la liste déroulante de " -"la barre de texte" +msgid "Show font samples alongside font names in the drop-down list in Text bar" +msgstr "Affiche les échantillons de police à côté du nom dans la liste déroulante de la barre de texte" #: ../src/ui/dialog/inkscape-preferences.cpp:447 msgid "Show font substitution warning dialog" msgstr "Afficher un avertissement lors du remplacement de polices" #: ../src/ui/dialog/inkscape-preferences.cpp:448 -msgid "" -"Show font substitution warning dialog when requested fonts are not available " -"on the system" -msgstr "" -"Afficher un avertissement de remplacement de police lorsque les polices " -"demandées ne sont pas disponibles" +msgid "Show font substitution warning dialog when requested fonts are not available on the system" +msgstr "Afficher un avertissement de remplacement de police lorsque les polices demandées ne sont pas disponibles" #: ../src/ui/dialog/inkscape-preferences.cpp:451 msgid "Pixel" @@ -17798,21 +16452,15 @@ msgstr "Unité de mesure pour la taille du texte :" #: ../src/ui/dialog/inkscape-preferences.cpp:457 msgid "Set the type of unit used in the text toolbar and text dialogs" -msgstr "" -"Définir le type d'unité utilisée dans la boîte de dialogue Texte et police " -"et la barre de commande de l'outil texte" +msgstr "Définir le type d'unité utilisée dans la boîte de dialogue Texte et police et la barre de commande de l'outil texte" #: ../src/ui/dialog/inkscape-preferences.cpp:458 msgid "Always output text size in pixels (px)" msgstr "Toujours enregistrer la taille du texte en pixels (px)" #: ../src/ui/dialog/inkscape-preferences.cpp:459 -msgid "" -"Always convert the text size units above into pixels (px) before saving to " -"file" -msgstr "" -"Toujours convertir la taille du texte en pixels (px) avant d'enregistrer " -"dans un fichier" +msgid "Always convert the text size units above into pixels (px) before saving to file" +msgstr "Toujours convertir la taille du texte en pixels (px) avant d'enregistrer dans un fichier" #. Spray #: ../src/ui/dialog/inkscape-preferences.cpp:464 @@ -17831,8 +16479,8 @@ msgstr "Remplissage au seau" #. Gradient #: ../src/ui/dialog/inkscape-preferences.cpp:478 -#: ../src/widgets/gradient-selector.cpp:151 -#: ../src/widgets/gradient-selector.cpp:303 +#: ../src/widgets/gradient-selector.cpp:152 +#: ../src/widgets/gradient-selector.cpp:320 msgid "Gradient" msgstr "Dégradé" @@ -17841,24 +16489,15 @@ msgid "Prevent sharing of gradient definitions" msgstr "Interdire le partage des définitions de dégradé" #: ../src/ui/dialog/inkscape-preferences.cpp:482 -msgid "" -"When on, shared gradient definitions are automatically forked on change; " -"uncheck to allow sharing of gradient definitions so that editing one object " -"may affect other objects using the same gradient" -msgstr "" -"Si coché, les définitions communes de dégradés sont automatiquement " -"dupliquées lors d'une modification; décocher pour autoriser le partage des " -"définitions de dégradé de manière à ce que la modification d'un objet puisse " -"affecter tous les objets utilisant le même dégradé" +msgid "When on, shared gradient definitions are automatically forked on change; uncheck to allow sharing of gradient definitions so that editing one object may affect other objects using the same gradient" +msgstr "Si coché, les définitions communes de dégradés sont automatiquement dupliquées lors d'une modification; décocher pour autoriser le partage des définitions de dégradé de manière à ce que la modification d'un objet puisse affecter tous les objets utilisant le même dégradé" #: ../src/ui/dialog/inkscape-preferences.cpp:483 msgid "Use legacy Gradient Editor" msgstr "Utiliser l'ancien éditeur de dégradé" #: ../src/ui/dialog/inkscape-preferences.cpp:485 -msgid "" -"When on, the Gradient Edit button in the Fill & Stroke dialog will show the " -"legacy Gradient Editor dialog, when off the Gradient Tool will be used" +msgid "When on, the Gradient Edit button in the Fill & Stroke dialog will show the legacy Gradient Editor dialog, when off the Gradient Tool will be used" msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:488 @@ -17866,8 +16505,7 @@ msgid "Linear gradient _angle:" msgstr "_Angle de dégradé linéaire :" #: ../src/ui/dialog/inkscape-preferences.cpp:489 -msgid "" -"Default angle of new linear gradients in degrees (clockwise from horizontal)" +msgid "Default angle of new linear gradients in degrees (clockwise from horizontal)" msgstr "" #. Dropper @@ -17882,9 +16520,7 @@ msgstr "Connecteur" #: ../src/ui/dialog/inkscape-preferences.cpp:501 msgid "If on, connector attachment points will not be shown for text objects" -msgstr "" -"Si coché, les points d'accroche de connecteur ne sont pas montrés pour des " -"objets texte" +msgstr "Si coché, les points d'accroche de connecteur ne sont pas montrés pour des objets texte" #: ../src/ui/dialog/inkscape-preferences.cpp:511 msgid "Interface" @@ -18190,42 +16826,31 @@ msgstr "Taille des icônes de la barre d'outils :" #: ../src/ui/dialog/inkscape-preferences.cpp:566 msgid "Set the size for the tool icons (requires restart)" -msgstr "" -"Définit la taille des icônes de la barre d'outils (nécessite un redémarrage)" +msgstr "Définit la taille des icônes de la barre d'outils (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:569 msgid "Control bar icon size:" msgstr "Taille des icônes de la barre de contrôle des outils :" #: ../src/ui/dialog/inkscape-preferences.cpp:570 -msgid "" -"Set the size for the icons in tools' control bars to use (requires restart)" -msgstr "" -"Définit la taille des icônes de la barre de contrôle des outils (nécessite " -"un redémarrage)" +msgid "Set the size for the icons in tools' control bars to use (requires restart)" +msgstr "Définit la taille des icônes de la barre de contrôle des outils (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:573 msgid "Secondary toolbar icon size:" msgstr "Taille des icônes de la barre d'outils secondaire :" #: ../src/ui/dialog/inkscape-preferences.cpp:574 -msgid "" -"Set the size for the icons in secondary toolbars to use (requires restart)" -msgstr "" -"Définit la taille des icônes de la barre d'outils secondaire (nécessite un " -"redémarrage)" +msgid "Set the size for the icons in secondary toolbars to use (requires restart)" +msgstr "Définit la taille des icônes de la barre d'outils secondaire (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:577 msgid "Work-around color sliders not drawing" msgstr "Contourner le non affichage des barres de défilement de couleur" #: ../src/ui/dialog/inkscape-preferences.cpp:579 -msgid "" -"When on, will attempt to work around bugs in certain GTK themes drawing " -"color sliders" -msgstr "" -"Si activé, essayera de contourner un défaut d'affichage des barres de " -"défilement de couleur lié à certains thèmes GTK" +msgid "When on, will attempt to work around bugs in certain GTK themes drawing color sliders" +msgstr "Si activé, essayera de contourner un défaut d'affichage des barres de défilement de couleur lié à certains thèmes GTK" #: ../src/ui/dialog/inkscape-preferences.cpp:584 msgid "Clear list" @@ -18236,53 +16861,33 @@ msgid "Maximum documents in Open _Recent:" msgstr "Nombre maximum de documents _récents :" #: ../src/ui/dialog/inkscape-preferences.cpp:588 -msgid "" -"Set the maximum length of the Open Recent list in the File menu, or clear " -"the list" -msgstr "" -"Définit la longueur maximum de la liste « Documents récents » dans le menu " -"« Fichier », ou efface la liste" +msgid "Set the maximum length of the Open Recent list in the File menu, or clear the list" +msgstr "Définit la longueur maximum de la liste « Documents récents » dans le menu « Fichier », ou efface la liste" #: ../src/ui/dialog/inkscape-preferences.cpp:591 msgid "_Zoom correction factor (in %):" msgstr "Niveau de correction du _zoom (en %) :" #: ../src/ui/dialog/inkscape-preferences.cpp:592 -msgid "" -"Adjust the slider until the length of the ruler on your screen matches its " -"real length. This information is used when zooming to 1:1, 1:2, etc., to " -"display objects in their true sizes" -msgstr "" -"Ajuster le curseur pour faire correspondre la longueur de la règle sur " -"l'écran avec sa vraie valeur. Cette information est utilisée lors des zoom " -"de niveau 1:1, 1:2, etc. pour afficher les objets avec leur taille exacte" +msgid "Adjust the slider until the length of the ruler on your screen matches its real length. This information is used when zooming to 1:1, 1:2, etc., to display objects in their true sizes" +msgstr "Ajuster le curseur pour faire correspondre la longueur de la règle sur l'écran avec sa vraie valeur. Cette information est utilisée lors des zoom de niveau 1:1, 1:2, etc. pour afficher les objets avec leur taille exacte" #: ../src/ui/dialog/inkscape-preferences.cpp:595 msgid "Enable dynamic relayout for incomplete sections" msgstr "Activer la remise en forme dynamique des sections incomplètes" #: ../src/ui/dialog/inkscape-preferences.cpp:597 -msgid "" -"When on, will allow dynamic layout of components that are not completely " -"finished being refactored" -msgstr "" -"Lorsqu'activé, autorise la mise en forme dynamique des composants dont le " -"réusinage n'est pas complètement achevé" +msgid "When on, will allow dynamic layout of components that are not completely finished being refactored" +msgstr "Lorsqu'activé, autorise la mise en forme dynamique des composants dont le réusinage n'est pas complètement achevé" #. show infobox #: ../src/ui/dialog/inkscape-preferences.cpp:600 msgid "Show filter primitives infobox (requires restart)" -msgstr "" -"Affiche la boîte d'information des primitives de filtre (nécessite un " -"redémarrage)" +msgstr "Affiche la boîte d'information des primitives de filtre (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:602 -msgid "" -"Show icons and descriptions for the filter primitives available at the " -"filter effects dialog" -msgstr "" -"Afficher les icônes et les descriptions pour les primitives de filtre " -"disponibles dans la boîte de dialogue des effets de filtre" +msgid "Show icons and descriptions for the filter primitives available at the filter effects dialog" +msgstr "Afficher les icônes et les descriptions pour les primitives de filtre disponibles dans la boîte de dialogue des effets de filtre" #: ../src/ui/dialog/inkscape-preferences.cpp:605 #: ../src/ui/dialog/inkscape-preferences.cpp:613 @@ -18304,9 +16909,7 @@ msgid "Dockbar style (requires restart):" msgstr "Style de barre détachable (nécessite un redémarrage) :" #: ../src/ui/dialog/inkscape-preferences.cpp:611 -msgid "" -"Selects whether the vertical bars on the dockbar will show text labels, " -"icons, or both" +msgid "Selects whether the vertical bars on the dockbar will show text labels, icons, or both" msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:618 @@ -18314,15 +16917,13 @@ msgid "Switcher style (requires restart):" msgstr "Style de bouton de commutation (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:619 -msgid "" -"Selects whether the dockbar switcher will show text labels, icons, or both" +msgid "Selects whether the dockbar switcher will show text labels, icons, or both" msgstr "" #. Windows #: ../src/ui/dialog/inkscape-preferences.cpp:623 msgid "Save and restore window geometry for each document" -msgstr "" -"Enregistrer et restaurer la géométrie de la fenêtre pour chaque document" +msgstr "Enregistrer et restaurer la géométrie de la fenêtre pour chaque document" #: ../src/ui/dialog/inkscape-preferences.cpp:624 msgid "Remember and use last window's geometry" @@ -18395,32 +16996,20 @@ msgid "Let the window manager determine placement of all windows" msgstr "Laisser le gestionnaire de fenêtre placer toutes les fenêtres" #: ../src/ui/dialog/inkscape-preferences.cpp:658 -msgid "" -"Remember and use the last window's geometry (saves geometry to user " -"preferences)" -msgstr "" -"Mémoriser et utiliser la géométrie de la dernière fenêtre (enregistre la " -"géométrie dans les préférences utilisateur)" +msgid "Remember and use the last window's geometry (saves geometry to user preferences)" +msgstr "Mémoriser et utiliser la géométrie de la dernière fenêtre (enregistre la géométrie dans les préférences utilisateur)" #: ../src/ui/dialog/inkscape-preferences.cpp:660 -msgid "" -"Save and restore window geometry for each document (saves geometry in the " -"document)" -msgstr "" -"Sauver et restaurer la géométrie de la fenêtre pour chaque document " -"(enregistre la géométrie avec le document)" +msgid "Save and restore window geometry for each document (saves geometry in the document)" +msgstr "Sauver et restaurer la géométrie de la fenêtre pour chaque document (enregistre la géométrie avec le document)" #: ../src/ui/dialog/inkscape-preferences.cpp:662 msgid "Saving dialogs status" msgstr "Enregistrer l'état des fenêtres" #: ../src/ui/dialog/inkscape-preferences.cpp:666 -msgid "" -"Save and restore dialogs status (the last open windows dialogs are saved " -"when it closes)" -msgstr "" -"Enregistrer et restaurer l'état des boîtes de dialogue (dans l'état de la " -"dernière fenêtre fermée)" +msgid "Save and restore dialogs status (the last open windows dialogs are saved when it closes)" +msgstr "Enregistrer et restaurer l'état des boîtes de dialogue (dans l'état de la dernière fenêtre fermée)" #: ../src/ui/dialog/inkscape-preferences.cpp:670 msgid "Dialog behavior (requires restart)" @@ -18432,15 +17021,11 @@ msgstr "Intégration au bureau" #: ../src/ui/dialog/inkscape-preferences.cpp:678 msgid "Use Windows like open and save dialogs" -msgstr "" -"Utiliser des boîtes de dialogue à la Windows pour l'ouverture et " -"l'enregistrement de fichiers" +msgstr "Utiliser des boîtes de dialogue à la Windows pour l'ouverture et l'enregistrement de fichiers" #: ../src/ui/dialog/inkscape-preferences.cpp:680 msgid "Use GTK open and save dialogs " -msgstr "" -"Utiliser les boîtes de dialogue GTK pour l'ouverture et l'enregistrement de " -"fichiers" +msgstr "Utiliser les boîtes de dialogue GTK pour l'ouverture et l'enregistrement de fichiers" #: ../src/ui/dialog/inkscape-preferences.cpp:684 msgid "Dialogs on top:" @@ -18456,9 +17041,7 @@ msgstr "Les dialogues restent au-dessus des fenêtres de document" #: ../src/ui/dialog/inkscape-preferences.cpp:691 msgid "Same as Normal but may work better with some window managers" -msgstr "" -"Comme Normal, mais fonctionne peut-être mieux avec certains gestionnaires de " -"fenêtres" +msgstr "Comme Normal, mais fonctionne peut-être mieux avec certains gestionnaires de fenêtres" #: ../src/ui/dialog/inkscape-preferences.cpp:694 msgid "Dialog Transparency" @@ -18477,39 +17060,26 @@ msgid "_Time of opacity change animation:" msgstr "_Temps de transition :" #: ../src/ui/dialog/inkscape-preferences.cpp:703 -#: ../share/extensions/hpgl_output.inx.h:30 -#: ../share/extensions/plotter.inx.h:40 +#: ../share/extensions/hpgl_output.inx.h:34 +#: ../share/extensions/plotter.inx.h:50 msgid "Miscellaneous" msgstr "Divers" #: ../src/ui/dialog/inkscape-preferences.cpp:706 msgid "Whether dialog windows are to be hidden in the window manager taskbar" -msgstr "" -"Si coché, les boîtes de dialogue sont cachées dans la barre des tâches du " -"gestionnaire de fenêtre" +msgstr "Si coché, les boîtes de dialogue sont cachées dans la barre des tâches du gestionnaire de fenêtre" #: ../src/ui/dialog/inkscape-preferences.cpp:709 -msgid "" -"Zoom drawing when document window is resized, to keep the same area visible " -"(this is the default which can be changed in any window using the button " -"above the right scrollbar)" -msgstr "" -"Si coché, le dessin est rezoomé quand la fenêtre est redimensionnée, pour " -"garder visible la même aire (c'est l'option par défaut qui peut être changée " -"dans toute fenêtre en utilisant le boutton au dessus de la barre de " -"défilement de droite)" +msgid "Zoom drawing when document window is resized, to keep the same area visible (this is the default which can be changed in any window using the button above the right scrollbar)" +msgstr "Si coché, le dessin est rezoomé quand la fenêtre est redimensionnée, pour garder visible la même aire (c'est l'option par défaut qui peut être changée dans toute fenêtre en utilisant le boutton au dessus de la barre de défilement de droite)" #: ../src/ui/dialog/inkscape-preferences.cpp:711 -msgid "" -"Save documents viewport (zoom and panning position). Useful to turn off when " -"sharing version controlled files." +msgid "Save documents viewport (zoom and panning position). Useful to turn off when sharing version controlled files." msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:713 msgid "Whether dialog windows have a close button (requires restart)" -msgstr "" -"Si coché, les boîtes de dialogue ont un bouton de fermeture (nécessite un " -"redémarrage)" +msgstr "Si coché, les boîtes de dialogue ont un bouton de fermeture (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:714 msgid "Windows" @@ -18522,13 +17092,11 @@ msgstr "Couleur des lignes pendant le zoom arrière" #: ../src/ui/dialog/inkscape-preferences.cpp:720 msgid "The gridlines will be shown in minor grid line color" -msgstr "" -"Les lignes de grille seront affichées avec la couleur de grille secondaire" +msgstr "Les lignes de grille seront affichées avec la couleur de grille secondaire" #: ../src/ui/dialog/inkscape-preferences.cpp:722 msgid "The gridlines will be shown in major grid line color" -msgstr "" -"Les lignes de grille seront affichées avec la couleur de grille principale" +msgstr "Les lignes de grille seront affichées avec la couleur de grille principale" #: ../src/ui/dialog/inkscape-preferences.cpp:724 msgid "Default grid settings" @@ -18593,9 +17161,7 @@ msgstr "Afficher des points plutôt que des lignes" #: ../src/ui/dialog/inkscape-preferences.cpp:751 msgid "If set, display dots at gridpoints instead of gridlines" -msgstr "" -"Cocher pour afficher des points aux intersections de la grille plutôt que " -"des lignes" +msgstr "Cocher pour afficher des points aux intersections de la grille plutôt que des lignes" #: ../src/ui/dialog/inkscape-preferences.cpp:832 msgid "Input/Output" @@ -18606,40 +17172,24 @@ msgid "Use current directory for \"Save As ...\"" msgstr "« Enregistrer sous... » utilise le dossier courant " #: ../src/ui/dialog/inkscape-preferences.cpp:837 -msgid "" -"When this option is on, the \"Save as...\" and \"Save a Copy\" dialogs will " -"always open in the directory where the currently open document is; when it's " -"off, each will open in the directory where you last saved a file using it" -msgstr "" -"Lorsque cette option est active, les boîtes de dialogue « Enregistrer " -"sous... » et « Enregistrer une copie... » s'ouvrent toujours dans le dossier " -"contenant le document actuellement ouvert ; si l'option est désactivée, " -"elles ouvrent alors le dernier dossier dans lequel un fichier a été " -"enregistré avec ces boîtes de dialogue" +msgid "When this option is on, the \"Save as...\" and \"Save a Copy\" dialogs will always open in the directory where the currently open document is; when it's off, each will open in the directory where you last saved a file using it" +msgstr "Lorsque cette option est active, les boîtes de dialogue « Enregistrer sous... » et « Enregistrer une copie... » s'ouvrent toujours dans le dossier contenant le document actuellement ouvert ; si l'option est désactivée, elles ouvrent alors le dernier dossier dans lequel un fichier a été enregistré avec ces boîtes de dialogue" #: ../src/ui/dialog/inkscape-preferences.cpp:839 msgid "Add label comments to printing output" msgstr "Ajouter les labels de commentaires à l'impression" #: ../src/ui/dialog/inkscape-preferences.cpp:841 -msgid "" -"When on, a comment will be added to the raw print output, marking the " -"rendered output for an object with its label" -msgstr "" -"Si coché, un commentaire est ajouté à l'impression brute, signalant le rendu " -"d'un objet avec son label" +msgid "When on, a comment will be added to the raw print output, marking the rendered output for an object with its label" +msgstr "Si coché, un commentaire est ajouté à l'impression brute, signalant le rendu d'un objet avec son label" #: ../src/ui/dialog/inkscape-preferences.cpp:843 msgid "Add default metadata to new documents" msgstr "Ajouter les métadonnées par défaut aux nouveaux documents" #: ../src/ui/dialog/inkscape-preferences.cpp:845 -msgid "" -"Add default metadata to new documents. Default metadata can be set from " -"Document Properties->Metadata." -msgstr "" -"Ajoute les métadonnées par défaut dans les nouveaux documents. Ces " -"métadonnées peuvent être définies dans Propriétés du document>Métadonnées." +msgid "Add default metadata to new documents. Default metadata can be set from Document Properties->Metadata." +msgstr "Ajoute les métadonnées par défaut dans les nouveaux documents. Ces métadonnées peuvent être définies dans Propriétés du document>Métadonnées." #: ../src/ui/dialog/inkscape-preferences.cpp:849 msgid "_Grab sensitivity:" @@ -18650,12 +17200,8 @@ msgid "pixels (requires restart)" msgstr "pixels (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:850 -msgid "" -"How close on the screen you need to be to an object to be able to grab it " -"with mouse (in screen pixels)" -msgstr "" -"Distance à partir de laquelle on peut saisir un objet à l'écran avec la " -"souris (en pixels d'écran)" +msgid "How close on the screen you need to be to an object to be able to grab it with mouse (in screen pixels)" +msgstr "Distance à partir de laquelle on peut saisir un objet à l'écran avec la souris (en pixels d'écran)" #: ../src/ui/dialog/inkscape-preferences.cpp:852 msgid "_Click/drag threshold:" @@ -18669,11 +17215,8 @@ msgid "pixels" msgstr "pixels" #: ../src/ui/dialog/inkscape-preferences.cpp:853 -msgid "" -"Maximum mouse drag (in screen pixels) which is considered a click, not a drag" -msgstr "" -"Déplacement maximal de la souris (en pixels d'écran) considéré comme un clic " -"et non comme un déplacement" +msgid "Maximum mouse drag (in screen pixels) which is considered a click, not a drag" +msgstr "Déplacement maximal de la souris (en pixels d'écran) considéré comme un clic et non comme un déplacement" #: ../src/ui/dialog/inkscape-preferences.cpp:856 msgid "_Handle size:" @@ -18685,33 +17228,19 @@ msgstr "Définir la taille relative des poignées de nœuds" #: ../src/ui/dialog/inkscape-preferences.cpp:859 msgid "Use pressure-sensitive tablet (requires restart)" -msgstr "" -"Utiliser une tablette graphique sensible à la pression (nécessite un " -"redémarrage)" +msgstr "Utiliser une tablette graphique sensible à la pression (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:861 -msgid "" -"Use the capabilities of a tablet or other pressure-sensitive device. Disable " -"this only if you have problems with the tablet (you can still use it as a " -"mouse)" -msgstr "" -"Utiliser les possibilités offertes par une tablette graphique ou un autre " -"périphérique sensible à la pression. Désactivez ceci uniquement si vous " -"rencontrez des problèmes avec la tablette (vous pourrez néanmoins continuer " -"à l'utiliser comme souris)" +msgid "Use the capabilities of a tablet or other pressure-sensitive device. Disable this only if you have problems with the tablet (you can still use it as a mouse)" +msgstr "Utiliser les possibilités offertes par une tablette graphique ou un autre périphérique sensible à la pression. Désactivez ceci uniquement si vous rencontrez des problèmes avec la tablette (vous pourrez néanmoins continuer à l'utiliser comme souris)" #: ../src/ui/dialog/inkscape-preferences.cpp:863 msgid "Switch tool based on tablet device (requires restart)" -msgstr "" -"Change d'outil en fonction des dispositifs de tablette (nécessite un " -"redémarrage)" +msgstr "Change d'outil en fonction des dispositifs de tablette (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:865 -msgid "" -"Change tool as different devices are used on the tablet (pen, eraser, mouse)" -msgstr "" -"Change d'outil lorsque des dispositifs différents sont utilisés sur la " -"tablette (crayon, gomme, souris)" +msgid "Change tool as different devices are used on the tablet (pen, eraser, mouse)" +msgstr "Change d'outil lorsque des dispositifs différents sont utilisés sur la tablette (crayon, gomme, souris)" #: ../src/ui/dialog/inkscape-preferences.cpp:866 msgid "Input devices" @@ -18723,12 +17252,8 @@ msgid "Use named colors" msgstr "Utiliser les couleurs nommées" #: ../src/ui/dialog/inkscape-preferences.cpp:870 -msgid "" -"If set, write the CSS name of the color when available (e.g. 'red' or " -"'magenta') instead of the numeric value" -msgstr "" -"Si coché, écrit le nom CSS de la couleur si elle est disponible (rouge ou " -"magenta, par exemple) à la place de sa valeur numérique" +msgid "If set, write the CSS name of the color when available (e.g. 'red' or 'magenta') instead of the numeric value" +msgstr "Si coché, écrit le nom CSS de la couleur si elle est disponible (rouge ou magenta, par exemple) à la place de sa valeur numérique" #: ../src/ui/dialog/inkscape-preferences.cpp:872 msgid "XML formatting" @@ -18747,12 +17272,8 @@ msgid "_Indent, spaces:" msgstr "_Distance d'indentation (en espaces) :" #: ../src/ui/dialog/inkscape-preferences.cpp:878 -msgid "" -"The number of spaces to use for indenting nested elements; set to 0 for no " -"indentation" -msgstr "" -"Le nombre d'espaces utilisés pour l'indentation d'éléments imbriqués ; " -"définir à 0 pour désactiver l'indentation" +msgid "The number of spaces to use for indenting nested elements; set to 0 for no indentation" +msgstr "Le nombre d'espaces utilisés pour l'indentation d'éléments imbriqués ; définir à 0 pour désactiver l'indentation" #: ../src/ui/dialog/inkscape-preferences.cpp:880 msgid "Path data" @@ -18777,10 +17298,7 @@ msgid "Path string format:" msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:887 -msgid "" -"Path data should be written: only with absolute coordinates, only with " -"relative coordinates, or optimized for string length (mixed absolute and " -"relative coordinates)" +msgid "Path data should be written: only with absolute coordinates, only with relative coordinates, or optimized for string length (mixed absolute and relative coordinates)" msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:889 @@ -18788,12 +17306,8 @@ msgid "Force repeat commands" msgstr "Imposer les commandes répétitives" #: ../src/ui/dialog/inkscape-preferences.cpp:890 -msgid "" -"Force repeating of the same path command (for example, 'L 1,2 L 3,4' instead " -"of 'L 1,2 3,4')" -msgstr "" -"Si coché, impose la répétition de la même commande de chemin (écrit 'L 1,2 L " -"3,4' à la place de 'L 1,2 3,4')." +msgid "Force repeating of the same path command (for example, 'L 1,2 L 3,4' instead of 'L 1,2 3,4')" +msgstr "Si coché, impose la répétition de la même commande de chemin (écrit 'L 1,2 L 3,4' à la place de 'L 1,2 3,4')." #: ../src/ui/dialog/inkscape-preferences.cpp:892 msgid "Numbers" @@ -18805,20 +17319,15 @@ msgstr "_Précision numérique :" #: ../src/ui/dialog/inkscape-preferences.cpp:895 msgid "Significant figures of the values written to the SVG file" -msgstr "" -"Nombre de chiffres significatifs des valeurs écrites dans le fichier SVG" +msgstr "Nombre de chiffres significatifs des valeurs écrites dans le fichier SVG" #: ../src/ui/dialog/inkscape-preferences.cpp:898 msgid "Minimum _exponent:" msgstr "Exposant _minimum :" #: ../src/ui/dialog/inkscape-preferences.cpp:898 -msgid "" -"The smallest number written to SVG is 10 to the power of this exponent; " -"anything smaller is written as zero" -msgstr "" -"La taille minimale d'un nombre écrite dans le SVG est 10 à la puissance de " -"cet exposant ; les nombres plus petits s'écriront zéro" +msgid "The smallest number written to SVG is 10 to the power of this exponent; anything smaller is written as zero" +msgstr "La taille minimale d'un nombre écrite dans le SVG est 10 à la puissance de cet exposant ; les nombres plus petits s'écriront zéro" #. Code to add controls for attribute checking options #. Add incorrect style properties options @@ -18833,13 +17342,8 @@ msgid "Print warnings" msgstr "Afficher un avertissement" #: ../src/ui/dialog/inkscape-preferences.cpp:906 -msgid "" -"Print warning if invalid or non-useful attributes found. Database files " -"located in inkscape_data_dir/attributes." -msgstr "" -"Affiche un avertissement si des attributs invalides ou inappropriés sont " -"détectés. Le fichier de données est disponible dans inkscape_data_dir/" -"attributes." +msgid "Print warning if invalid or non-useful attributes found. Database files located in inkscape_data_dir/attributes." +msgstr "Affiche un avertissement si des attributs invalides ou inappropriés sont détectés. Le fichier de données est disponible dans inkscape_data_dir/attributes." #: ../src/ui/dialog/inkscape-preferences.cpp:907 msgid "Remove attributes" @@ -18855,13 +17359,8 @@ msgid "Inappropriate Style Properties Actions" msgstr "En cas de propriétés de style inappropriées" #: ../src/ui/dialog/inkscape-preferences.cpp:914 -msgid "" -"Print warning if inappropriate style properties found (i.e. 'font-family' " -"set on a ). Database files located in inkscape_data_dir/attributes." -msgstr "" -"Affiche un avertissement si des propriétés de style inappropriés sont " -"détectés (par exemple 'font-family' dans un élément . Le fichier de " -"données est disponible dans inkscape_data_dir/attributes." +msgid "Print warning if inappropriate style properties found (i.e. 'font-family' set on a ). Database files located in inkscape_data_dir/attributes." +msgstr "Affiche un avertissement si des propriétés de style inappropriés sont détectés (par exemple 'font-family' dans un élément . Le fichier de données est disponible dans inkscape_data_dir/attributes." #: ../src/ui/dialog/inkscape-preferences.cpp:915 #: ../src/ui/dialog/inkscape-preferences.cpp:923 @@ -18878,16 +17377,8 @@ msgid "Non-useful Style Properties Actions" msgstr "En cas de propriétés de style inutiles" #: ../src/ui/dialog/inkscape-preferences.cpp:922 -msgid "" -"Print warning if redundant style properties found (i.e. if a property has " -"the default value and a different value is not inherited or if value is the " -"same as would be inherited). Database files located in inkscape_data_dir/" -"attributes." -msgstr "" -"Affiche un avertissement si des propriétés de style inutiles sont détectés " -"(par exemple si une propriété est définie avec sa valeur par défaut et que " -"cette valeur ne modifie pas l'héritage). Le fichier de données est " -"disponible dans inkscape_data_dir/attributes." +msgid "Print warning if redundant style properties found (i.e. if a property has the default value and a different value is not inherited or if value is the same as would be inherited). Database files located in inkscape_data_dir/attributes." +msgstr "Affiche un avertissement si des propriétés de style inutiles sont détectés (par exemple si une propriété est définie avec sa valeur par défaut et que cette valeur ne modifie pas l'héritage). Le fichier de données est disponible dans inkscape_data_dir/attributes." #: ../src/ui/dialog/inkscape-preferences.cpp:924 msgid "Delete redundant style properties" @@ -18902,26 +17393,16 @@ msgid "Reading" msgstr "Lors de la lecture" #: ../src/ui/dialog/inkscape-preferences.cpp:929 -msgid "" -"Check attributes and style properties on reading in SVG files (including " -"those internal to Inkscape which will slow down startup)" -msgstr "" -"Vérifier les attributs et les propriétés de style lors de la lecture des " -"fichiers SVG (y compris les fichiers internes à Inkscape, ce qui ralentira " -"le démarrage de l'application)" +msgid "Check attributes and style properties on reading in SVG files (including those internal to Inkscape which will slow down startup)" +msgstr "Vérifier les attributs et les propriétés de style lors de la lecture des fichiers SVG (y compris les fichiers internes à Inkscape, ce qui ralentira le démarrage de l'application)" #: ../src/ui/dialog/inkscape-preferences.cpp:930 msgid "Editing" msgstr "Lors de l'édition" #: ../src/ui/dialog/inkscape-preferences.cpp:931 -msgid "" -"Check attributes and style properties while editing SVG files (may slow down " -"Inkscape, mostly useful for debugging)" -msgstr "" -"Vérifier les attributs et les propriétés de style lors de l'édition des " -"fichiers SVG (peut ralentir Inkscape, à utiliser principalement pour le " -"débogage)" +msgid "Check attributes and style properties while editing SVG files (may slow down Inkscape, mostly useful for debugging)" +msgstr "Vérifier les attributs et les propriétés de style lors de l'édition des fichiers SVG (peut ralentir Inkscape, à utiliser principalement pour le débogage)" #: ../src/ui/dialog/inkscape-preferences.cpp:932 msgid "Writing" @@ -18929,9 +17410,7 @@ msgstr "Lors de l'écriture" #: ../src/ui/dialog/inkscape-preferences.cpp:933 msgid "Check attributes and style properties on writing out SVG files" -msgstr "" -"Vérifier les attributs et les propriétés de style lors de l'écriture des " -"fichiers SVG" +msgstr "Vérifier les attributs et les propriétés de style lors de l'écriture des fichiers SVG" #: ../src/ui/dialog/inkscape-preferences.cpp:935 msgid "SVG output" @@ -18952,9 +17431,7 @@ msgstr "Colorimétrie absolue" #: ../src/ui/dialog/inkscape-preferences.cpp:945 msgid "(Note: Color management has been disabled in this build)" -msgstr "" -"(NB : les fonctionnalités colorimétriques sont désactivées dans cette " -"version)" +msgstr "(NB : les fonctionnalités colorimétriques sont désactivées dans cette version)" #: ../src/ui/dialog/inkscape-preferences.cpp:949 msgid "Display adjustment" @@ -18979,14 +17456,11 @@ msgstr "Utiliser le profil proposé par le périphérique d'affichage." #: ../src/ui/dialog/inkscape-preferences.cpp:968 msgid "Retrieve profiles from those attached to displays via XICC" -msgstr "" -"Utiliser un profil parmi ceux correspondant aux périphériques d'affichage " -"grâce à XICC" +msgstr "Utiliser un profil parmi ceux correspondant aux périphériques d'affichage grâce à XICC" #: ../src/ui/dialog/inkscape-preferences.cpp:970 msgid "Retrieve profiles from those attached to displays" -msgstr "" -"Utiliser un profil parmi ceux correspondant aux périphériques d'affichage" +msgstr "Utiliser un profil parmi ceux correspondant aux périphériques d'affichage" #: ../src/ui/dialog/inkscape-preferences.cpp:975 msgid "Display rendering intent:" @@ -19014,9 +17488,7 @@ msgstr "Marquer les couleurs hors-gamut" #: ../src/ui/dialog/inkscape-preferences.cpp:986 msgid "Highlights colors that are out of gamut for the target device" -msgstr "" -"Mettre en exergue les couleurs qui sont en-dehors du gamut pour le " -"périphérique cible" +msgstr "Mettre en exergue les couleurs qui sont en-dehors du gamut pour le périphérique cible" #: ../src/ui/dialog/inkscape-preferences.cpp:998 msgid "Out of gamut warning color:" @@ -19040,8 +17512,7 @@ msgstr "Intention de rendu du périphérique :" #: ../src/ui/dialog/inkscape-preferences.cpp:1006 msgid "The rendering intent to use to calibrate device output" -msgstr "" -"L'intention de rendu à utiliser pour calibrer le périphérique de sortie" +msgstr "L'intention de rendu à utiliser pour calibrer le périphérique de sortie" #: ../src/ui/dialog/inkscape-preferences.cpp:1008 msgid "Black point compensation" @@ -19079,12 +17550,8 @@ msgid "Enable autosave (requires restart)" msgstr "Activer l'enregistrement automatique (nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:1084 -msgid "" -"Automatically save the current document(s) at a given interval, thus " -"minimizing loss in case of a crash" -msgstr "" -"Enregistre automatiquement les documents en cours, à intervalle donné, pour " -"diminuer les risques de perte de données en cas de plantage de l'application" +msgid "Automatically save the current document(s) at a given interval, thus minimizing loss in case of a crash" +msgstr "Enregistre automatiquement les documents en cours, à intervalle donné, pour diminuer les risques de perte de données en cas de plantage de l'application" #: ../src/ui/dialog/inkscape-preferences.cpp:1090 msgctxt "Filesystem" @@ -19092,9 +17559,7 @@ msgid "Autosave _directory:" msgstr "_Dossier des enregistrements automatiques :" #: ../src/ui/dialog/inkscape-preferences.cpp:1090 -msgid "" -"The directory where autosaves will be written. This should be an absolute " -"path (starts with / on UNIX or a drive letter such as C: on Windows). " +msgid "The directory where autosaves will be written. This should be an absolute path (starts with / on UNIX or a drive letter such as C: on Windows). " msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:1092 @@ -19103,20 +17568,15 @@ msgstr "_Intervalle (en minutes) :" #: ../src/ui/dialog/inkscape-preferences.cpp:1092 msgid "Interval (in minutes) at which document will be autosaved" -msgstr "" -"Définit l'intervalle (en minutes) auquel l'espace de travail sera enregistré " -"automatiquement" +msgstr "Définit l'intervalle (en minutes) auquel l'espace de travail sera enregistré automatiquement" #: ../src/ui/dialog/inkscape-preferences.cpp:1094 msgid "_Maximum number of autosaves:" msgstr "Nombre _maximum d'enregistrements :" #: ../src/ui/dialog/inkscape-preferences.cpp:1094 -msgid "" -"Maximum number of autosaved files; use this to limit the storage space used" -msgstr "" -"Nombre maximum d'enregistrements automatiques ; utiliser cette valeur pour " -"limiter l'espace de stockage utilisé" +msgid "Maximum number of autosaved files; use this to limit the storage space used" +msgstr "Nombre maximum d'enregistrements automatiques ; utiliser cette valeur pour limiter l'espace de stockage utilisé" #. When changing the interval or enabling/disabling the autosave function, #. * update our running configuration @@ -19139,12 +17599,8 @@ msgid "Open Clip Art Library _Server Name:" msgstr "Nom du _serveur de bibliothèque Open Clip Art :" #: ../src/ui/dialog/inkscape-preferences.cpp:1114 -msgid "" -"The server name of the Open Clip Art Library webdav server; it's used by the " -"Import and Export to OCAL function" -msgstr "" -"Le nom du serveur webdav de la bibliothèque Open Clip Art ; il est utilisé " -"par la fonction d'import et export vers OCAL." +msgid "The server name of the Open Clip Art Library webdav server; it's used by the Import and Export to OCAL function" +msgstr "Le nom du serveur webdav de la bibliothèque Open Clip Art ; il est utilisé par la fonction d'import et export vers OCAL." #: ../src/ui/dialog/inkscape-preferences.cpp:1116 msgid "Open Clip Art Library _Username:" @@ -19175,14 +17631,8 @@ msgid "_Simplification threshold:" msgstr "_Seuil de simplification :" #: ../src/ui/dialog/inkscape-preferences.cpp:1131 -msgid "" -"How strong is the Node tool's Simplify command by default. If you invoke " -"this command several times in quick succession, it will act more and more " -"aggressively; invoking it again after a pause restores the default threshold." -msgstr "" -"Force par défaut de la commande Simplifier. En faisant appel à cette " -"commande plusieurs fois de suite, elle agira de façon de plus en plus " -"agressive ; un appel après une pause restaurera la valeur par défaut." +msgid "How strong is the Node tool's Simplify command by default. If you invoke this command several times in quick succession, it will act more and more aggressively; invoking it again after a pause restores the default threshold." +msgstr "Force par défaut de la commande Simplifier. En faisant appel à cette commande plusieurs fois de suite, elle agira de façon de plus en plus agressive ; un appel après une pause restaurera la valeur par défaut." #: ../src/ui/dialog/inkscape-preferences.cpp:1133 msgid "Color stock markers the same color as object" @@ -19195,9 +17645,7 @@ msgstr "Colorer les marqueurs personnalisés avec la même couleur que l'objet" #: ../src/ui/dialog/inkscape-preferences.cpp:1135 #: ../src/ui/dialog/inkscape-preferences.cpp:1345 msgid "Update marker color when object color changes" -msgstr "" -"Mettre à jour la couleur du marqueur lorsque la couleur de l'objet est " -"modifiée" +msgstr "Mettre à jour la couleur du marqueur lorsque la couleur de l'objet est modifiée" #. Selecting options #: ../src/ui/dialog/inkscape-preferences.cpp:1138 @@ -19225,12 +17673,8 @@ msgid "Deselect upon layer change" msgstr "Désélectionner en changeant de calque" #: ../src/ui/dialog/inkscape-preferences.cpp:1146 -msgid "" -"Uncheck this to be able to keep the current objects selected when the " -"current layer changes" -msgstr "" -"Si décoché, les objets sélectionnés restent sélectionnés lorsque vous passez " -"du calque courant à un autre" +msgid "Uncheck this to be able to keep the current objects selected when the current layer changes" +msgstr "Si décoché, les objets sélectionnés restent sélectionnés lorsque vous passez du calque courant à un autre" #: ../src/ui/dialog/inkscape-preferences.cpp:1148 msgid "Ctrl+A, Tab, Shift+Tab" @@ -19238,39 +17682,23 @@ msgstr "Ctrl+A, Tab, Maj+Tab" #: ../src/ui/dialog/inkscape-preferences.cpp:1150 msgid "Make keyboard selection commands work on objects in all layers" -msgstr "" -"Les commandes de sélection au clavier s'appliquent aux objets dans tous les " -"calques" +msgstr "Les commandes de sélection au clavier s'appliquent aux objets dans tous les calques" #: ../src/ui/dialog/inkscape-preferences.cpp:1152 msgid "Make keyboard selection commands work on objects in current layer only" -msgstr "" -"Les commandes de sélection au clavier s'appliquent seulement dans le calque " -"courant" +msgstr "Les commandes de sélection au clavier s'appliquent seulement dans le calque courant" #: ../src/ui/dialog/inkscape-preferences.cpp:1154 -msgid "" -"Make keyboard selection commands work on objects in current layer and all " -"its sublayers" -msgstr "" -"Les commandes de sélection au clavier s'appliquent seulement dans le calque " -"courant et dans ses sous-calques" +msgid "Make keyboard selection commands work on objects in current layer and all its sublayers" +msgstr "Les commandes de sélection au clavier s'appliquent seulement dans le calque courant et dans ses sous-calques" #: ../src/ui/dialog/inkscape-preferences.cpp:1156 -msgid "" -"Uncheck this to be able to select objects that are hidden (either by " -"themselves or by being in a hidden layer)" -msgstr "" -"Si décoché, la sélection des objets cachés est possible (objets cachés " -"isolés ou appartenant à calque caché)" +msgid "Uncheck this to be able to select objects that are hidden (either by themselves or by being in a hidden layer)" +msgstr "Si décoché, la sélection des objets cachés est possible (objets cachés isolés ou appartenant à calque caché)" #: ../src/ui/dialog/inkscape-preferences.cpp:1158 -msgid "" -"Uncheck this to be able to select objects that are locked (either by " -"themselves or by being in a locked layer)" -msgstr "" -"Si décoché, la sélection des objets verrouillés est possible (objets " -"verrouillés isolés ou appartenant à un calque verrouillé)" +msgid "Uncheck this to be able to select objects that are locked (either by themselves or by being in a locked layer)" +msgstr "Si décoché, la sélection des objets verrouillés est possible (objets verrouillés isolés ou appartenant à un calque verrouillé)" #: ../src/ui/dialog/inkscape-preferences.cpp:1160 msgid "Wrap when cycling objects in z-order" @@ -19290,7 +17718,7 @@ msgstr "Sélection" #. Transforms options #: ../src/ui/dialog/inkscape-preferences.cpp:1169 -#: ../src/widgets/select-toolbar.cpp:577 +#: ../src/widgets/select-toolbar.cpp:578 msgid "Scale stroke width" msgstr "Redimensionner l'épaisseur du contour" @@ -19311,48 +17739,36 @@ msgid "Preserved" msgstr "Préservé" #: ../src/ui/dialog/inkscape-preferences.cpp:1177 -#: ../src/widgets/select-toolbar.cpp:578 +#: ../src/widgets/select-toolbar.cpp:579 msgid "When scaling objects, scale the stroke width by the same proportion" -msgstr "" -"Lors d'un redimensionnement des objets, préserver la proportion des " -"épaisseurs des contours" +msgstr "Lors d'un redimensionnement des objets, préserver la proportion des épaisseurs des contours" #: ../src/ui/dialog/inkscape-preferences.cpp:1179 -#: ../src/widgets/select-toolbar.cpp:589 +#: ../src/widgets/select-toolbar.cpp:590 msgid "When scaling rectangles, scale the radii of rounded corners" -msgstr "" -"Lors du redimensionnements d'un rectangle, préserver la proportion des " -"rayons des coins arrondis" +msgstr "Lors du redimensionnements d'un rectangle, préserver la proportion des rayons des coins arrondis" #: ../src/ui/dialog/inkscape-preferences.cpp:1181 -#: ../src/widgets/select-toolbar.cpp:600 +#: ../src/widgets/select-toolbar.cpp:601 msgid "Move gradients (in fill or stroke) along with the objects" msgstr "Transformer les dégradés avec les objets (remplissage et contour)" #: ../src/ui/dialog/inkscape-preferences.cpp:1183 -#: ../src/widgets/select-toolbar.cpp:611 +#: ../src/widgets/select-toolbar.cpp:612 msgid "Move patterns (in fill or stroke) along with the objects" -msgstr "" -"Transformer les motifs de remplissage avec les objets (remplissage et " -"contour)" +msgstr "Transformer les motifs de remplissage avec les objets (remplissage et contour)" #: ../src/ui/dialog/inkscape-preferences.cpp:1184 msgid "Store transformation" msgstr "Enregistrement des transformations" #: ../src/ui/dialog/inkscape-preferences.cpp:1186 -msgid "" -"If possible, apply transformation to objects without adding a transform= " -"attribute" -msgstr "" -"Si possible, appliquer des transformations aux objets sans ajouter " -"l'attribut transform=" +msgid "If possible, apply transformation to objects without adding a transform= attribute" +msgstr "Si possible, appliquer des transformations aux objets sans ajouter l'attribut transform=" #: ../src/ui/dialog/inkscape-preferences.cpp:1188 msgid "Always store transformation as a transform= attribute on objects" -msgstr "" -"Toujours enregistrer les transformations dans l'attribut transform= des " -"objets" +msgstr "Toujours enregistrer les transformations dans l'attribut transform= des objets" #: ../src/ui/dialog/inkscape-preferences.cpp:1190 msgid "Transforms" @@ -19363,12 +17779,8 @@ msgid "Mouse _wheel scrolls by:" msgstr "La _molette de la souris défile de :" #: ../src/ui/dialog/inkscape-preferences.cpp:1195 -msgid "" -"One mouse wheel notch scrolls by this distance in screen pixels " -"(horizontally with Shift)" -msgstr "" -"Un cran de la molette de la souris fait défiler de tant de pixels " -"(horizontalement avec Maj)" +msgid "One mouse wheel notch scrolls by this distance in screen pixels (horizontally with Shift)" +msgstr "Un cran de la molette de la souris fait défiler de tant de pixels (horizontalement avec Maj)" #: ../src/ui/dialog/inkscape-preferences.cpp:1196 msgid "Ctrl+arrows" @@ -19380,20 +17792,15 @@ msgstr "Défile_r de :" #: ../src/ui/dialog/inkscape-preferences.cpp:1199 msgid "Pressing Ctrl+arrow key scrolls by this distance (in screen pixels)" -msgstr "" -"Appuyer sur Ctrl+flèches fait défiler de cette distance (en pixels d'écran)" +msgstr "Appuyer sur Ctrl+flèches fait défiler de cette distance (en pixels d'écran)" #: ../src/ui/dialog/inkscape-preferences.cpp:1201 msgid "_Acceleration:" msgstr "_Accélération :" #: ../src/ui/dialog/inkscape-preferences.cpp:1202 -msgid "" -"Pressing and holding Ctrl+arrow will gradually speed up scrolling (0 for no " -"acceleration)" -msgstr "" -"Garder appuyé Ctrl+flèches accélère graduellement la vitesse du défilement " -"(0 pour aucune accélération)" +msgid "Pressing and holding Ctrl+arrow will gradually speed up scrolling (0 for no acceleration)" +msgstr "Garder appuyé Ctrl+flèches accélère graduellement la vitesse du défilement (0 pour aucune accélération)" #: ../src/ui/dialog/inkscape-preferences.cpp:1203 msgid "Autoscrolling" @@ -19404,26 +17811,18 @@ msgid "_Speed:" msgstr "_Vitesse :" #: ../src/ui/dialog/inkscape-preferences.cpp:1206 -msgid "" -"How fast the canvas autoscrolls when you drag beyond canvas edge (0 to turn " -"autoscroll off)" -msgstr "" -"Vitesse du défilement automatique de la zone de travail lors que l'on tire " -"un objet au dehors de la zone (0 pour aucun défilement automatique)" +msgid "How fast the canvas autoscrolls when you drag beyond canvas edge (0 to turn autoscroll off)" +msgstr "Vitesse du défilement automatique de la zone de travail lors que l'on tire un objet au dehors de la zone (0 pour aucun défilement automatique)" #: ../src/ui/dialog/inkscape-preferences.cpp:1208 -#: ../src/ui/dialog/tracedialog.cpp:522 ../src/ui/dialog/tracedialog.cpp:721 +#: ../src/ui/dialog/tracedialog.cpp:522 +#: ../src/ui/dialog/tracedialog.cpp:721 msgid "_Threshold:" msgstr "_Seuil :" #: ../src/ui/dialog/inkscape-preferences.cpp:1209 -msgid "" -"How far (in screen pixels) you need to be from the canvas edge to trigger " -"autoscroll; positive is outside the canvas, negative is within the canvas" -msgstr "" -"Distance (en pixels d'écran) à laquelle il faut être du bord de la zone de " -"travail pour activer le défilement automatique; les valeurs positives sont " -"en dehors de la zone, les négatives à l'intérieur" +msgid "How far (in screen pixels) you need to be from the canvas edge to trigger autoscroll; positive is outside the canvas, negative is within the canvas" +msgstr "Distance (en pixels d'écran) à laquelle il faut être du bord de la zone de travail pour activer le défilement automatique; les valeurs positives sont en dehors de la zone, les négatives à l'intérieur" #. #. _scroll_space.init ( _("Left mouse button pans when Space is pressed"), "/options/spacepans/value", false); @@ -19435,13 +17834,8 @@ msgid "Mouse wheel zooms by default" msgstr "La molette de la souris zoome par défaut" #: ../src/ui/dialog/inkscape-preferences.cpp:1217 -msgid "" -"When on, mouse wheel zooms without Ctrl and scrolls canvas with Ctrl; when " -"off, it zooms with Ctrl and scrolls without Ctrl" -msgstr "" -"Si coché, la molette de la souris zoome sans la touche Ctrl et fait défiler " -"la zone de travail avec Ctrl ; si décoché, elle zoome avec Ctrl et fait " -"défiler sans Ctrl." +msgid "When on, mouse wheel zooms without Ctrl and scrolls canvas with Ctrl; when off, it zooms with Ctrl and scrolls without Ctrl" +msgstr "Si coché, la molette de la souris zoome sans la touche Ctrl et fait défiler la zone de travail avec Ctrl ; si décoché, elle zoome avec Ctrl et fait défiler sans Ctrl." #: ../src/ui/dialog/inkscape-preferences.cpp:1218 msgid "Scrolling" @@ -19461,23 +17855,15 @@ msgid "_Delay (in ms):" msgstr "_Délai (en millisecondes) :" #: ../src/ui/dialog/inkscape-preferences.cpp:1227 -msgid "" -"Postpone snapping as long as the mouse is moving, and then wait an " -"additional fraction of a second. This additional delay is specified here. " -"When set to zero or to a very small number, snapping will be immediate." -msgstr "" -"Diffère le magnétisme aussi longtemps que la souris est en mouvement, puis " -"attend encore une fraction de seconde supplémentaire. Ce délai additionnel " -"est défini ici. Si la valeur est nulle ou très faible, l'aimantation est " -"immédiate." +msgid "Postpone snapping as long as the mouse is moving, and then wait an additional fraction of a second. This additional delay is specified here. When set to zero or to a very small number, snapping will be immediate." +msgstr "Diffère le magnétisme aussi longtemps que la souris est en mouvement, puis attend encore une fraction de seconde supplémentaire. Ce délai additionnel est défini ici. Si la valeur est nulle ou très faible, l'aimantation est immédiate." #: ../src/ui/dialog/inkscape-preferences.cpp:1229 msgid "Only snap the node closest to the pointer" msgstr "Aimanter seulement le nœud le plus proche du pointeur" #: ../src/ui/dialog/inkscape-preferences.cpp:1231 -msgid "" -"Only try to snap the node that is initially closest to the mouse pointer" +msgid "Only try to snap the node that is initially closest to the mouse pointer" msgstr "Essayer d'aimanter le nœud initialement le plus proche du pointeur" #: ../src/ui/dialog/inkscape-preferences.cpp:1234 @@ -19485,28 +17871,16 @@ msgid "_Weight factor:" msgstr "_Coefficient de pondération :" #: ../src/ui/dialog/inkscape-preferences.cpp:1235 -msgid "" -"When multiple snap solutions are found, then Inkscape can either prefer the " -"closest transformation (when set to 0), or prefer the node that was " -"initially the closest to the pointer (when set to 1)" -msgstr "" -"Lorsque plusieurs aimantations sont possibles, Inkscape choisit soit la " -"transformation la plus proche (si positionné à 0), soit le nœud qui était " -"initialement le plus proche du pointeur (si positionné à 1)" +msgid "When multiple snap solutions are found, then Inkscape can either prefer the closest transformation (when set to 0), or prefer the node that was initially the closest to the pointer (when set to 1)" +msgstr "Lorsque plusieurs aimantations sont possibles, Inkscape choisit soit la transformation la plus proche (si positionné à 0), soit le nœud qui était initialement le plus proche du pointeur (si positionné à 1)" #: ../src/ui/dialog/inkscape-preferences.cpp:1237 msgid "Snap the mouse pointer when dragging a constrained knot" msgstr "Aimanter le pointeur de souris lors du déplacement d'un nœud contraint" #: ../src/ui/dialog/inkscape-preferences.cpp:1239 -msgid "" -"When dragging a knot along a constraint line, then snap the position of the " -"mouse pointer instead of snapping the projection of the knot onto the " -"constraint line" -msgstr "" -"Lorsqu'un nœud est déplacé le long d'une ligne de contrainte, alors aimanter " -"la position du pointeur de souris plutôt que la projection du nœud sur la " -"ligne de contrainte" +msgid "When dragging a knot along a constraint line, then snap the position of the mouse pointer instead of snapping the projection of the knot onto the constraint line" +msgstr "Lorsqu'un nœud est déplacé le long d'une ligne de contrainte, alors aimanter la position du pointeur de souris plutôt que la projection du nœud sur la ligne de contrainte" #: ../src/ui/dialog/inkscape-preferences.cpp:1241 msgid "Snapping" @@ -19518,11 +17892,8 @@ msgid "_Arrow keys move by:" msgstr "Les _flèches déplacent de :" #: ../src/ui/dialog/inkscape-preferences.cpp:1247 -msgid "" -"Pressing an arrow key moves selected object(s) or node(s) by this distance" -msgstr "" -"Appuyer sur une flèche déplace les objet(s) ou les nœud(s) sélectionnés de " -"cette distance" +msgid "Pressing an arrow key moves selected object(s) or node(s) by this distance" +msgstr "Appuyer sur une flèche déplace les objet(s) ou les nœud(s) sélectionnés de cette distance" #. defaultscale is limited to 1000 in select-context.cpp: use the same limit here #: ../src/ui/dialog/inkscape-preferences.cpp:1250 @@ -19539,22 +17910,15 @@ msgstr "_Contracter/dilater de :" #: ../src/ui/dialog/inkscape-preferences.cpp:1254 msgid "Inset and Outset commands displace the path by this distance" -msgstr "" -"Les commandes contracter et dilater déplacent le chemin de cette distance" +msgstr "Les commandes contracter et dilater déplacent le chemin de cette distance" #: ../src/ui/dialog/inkscape-preferences.cpp:1255 msgid "Compass-like display of angles" msgstr "Afficher les angles comme sur une boussole" #: ../src/ui/dialog/inkscape-preferences.cpp:1257 -msgid "" -"When on, angles are displayed with 0 at north, 0 to 360 range, positive " -"clockwise; otherwise with 0 at east, -180 to 180 range, positive " -"counterclockwise" -msgstr "" -"Si coché, les angles sont affichés en sens horaire de 0 (au nord) à 360; si " -"décoché, ils sont affichés de -180 à 180 en sens anti-horaire (0 étant à " -"l'est)" +msgid "When on, angles are displayed with 0 at north, 0 to 360 range, positive clockwise; otherwise with 0 at east, -180 to 180 range, positive counterclockwise" +msgstr "Si coché, les angles sont affichés en sens horaire de 0 (au nord) à 360; si décoché, ils sont affichés de -180 à 180 en sens anti-horaire (0 étant à l'est)" #: ../src/ui/dialog/inkscape-preferences.cpp:1263 msgid "_Rotation snaps every:" @@ -19565,24 +17929,16 @@ msgid "degrees" msgstr "degrés" #: ../src/ui/dialog/inkscape-preferences.cpp:1264 -msgid "" -"Rotating with Ctrl pressed snaps every that much degrees; also, pressing " -"[ or ] rotates by this amount" -msgstr "" -"Ctrl appuyé forcera des rotations de tant de degrés; de même en appuyant sur " -"[ ou ], les rotations se feront selon cet incrément" +msgid "Rotating with Ctrl pressed snaps every that much degrees; also, pressing [ or ] rotates by this amount" +msgstr "Ctrl appuyé forcera des rotations de tant de degrés; de même en appuyant sur [ ou ], les rotations se feront selon cet incrément" #: ../src/ui/dialog/inkscape-preferences.cpp:1265 msgid "Relative snapping of guideline angles" msgstr "Aimanter relativement aux angles des guides" #: ../src/ui/dialog/inkscape-preferences.cpp:1267 -msgid "" -"When on, the snap angles when rotating a guideline will be relative to the " -"original angle" -msgstr "" -"Si coché, l'angle de magnétisme lors de la rotation d'un guide est relatif à " -"l'angle d'origine" +msgid "When on, the snap angles when rotating a guideline will be relative to the original angle" +msgstr "Si coché, l'angle de magnétisme lors de la rotation d'un guide est relatif à l'angle d'origine" #: ../src/ui/dialog/inkscape-preferences.cpp:1269 msgid "_Zoom in/out by:" @@ -19593,12 +17949,8 @@ msgid "%" msgstr "%" #: ../src/ui/dialog/inkscape-preferences.cpp:1270 -msgid "" -"Zoom tool click, +/- keys, and middle click zoom in and out by this " -"multiplier" -msgstr "" -"Les outils de zoom (clic en mode zoom, touches +/-, clic bouton du milieu) " -"zooment ou dézooment selon ce facteur" +msgid "Zoom tool click, +/- keys, and middle click zoom in and out by this multiplier" +msgstr "Les outils de zoom (clic en mode zoom, touches +/-, clic bouton du milieu) zooment ou dézooment selon ce facteur" #: ../src/ui/dialog/inkscape-preferences.cpp:1271 msgid "Steps" @@ -19638,13 +17990,8 @@ msgid "Clones preserve their positions when their original is moved" msgstr "Les clones restent sur place quand leur original est déplacé" #: ../src/ui/dialog/inkscape-preferences.cpp:1291 -msgid "" -"Each clone moves according to the value of its transform= attribute; for " -"example, a rotated clone will move in a different direction than its original" -msgstr "" -"Chaque clone est déplacé en fonction de son attribut transform= ; par " -"exemple, un clone qui a déjà été tourné sera déplacé dans une direction " -"différente de celle de son original" +msgid "Each clone moves according to the value of its transform= attribute; for example, a rotated clone will move in a different direction than its original" +msgstr "Chaque clone est déplacé en fonction de son attribut transform= ; par exemple, un clone qui a déjà été tourné sera déplacé dans une direction différente de celle de son original" #: ../src/ui/dialog/inkscape-preferences.cpp:1292 msgid "Deleting original: clones" @@ -19660,22 +18007,15 @@ msgstr "Les clones orphelins sont supprimés en même temps que leur original" #: ../src/ui/dialog/inkscape-preferences.cpp:1298 msgid "Duplicating original+clones/linked offset" -msgstr "" -"Lors de la duplication d'un original et de ses clones ou de ses offsets liés" +msgstr "Lors de la duplication d'un original et de ses clones ou de ses offsets liés" #: ../src/ui/dialog/inkscape-preferences.cpp:1300 msgid "Relink duplicated clones" msgstr "Relier les clones dupliqués" #: ../src/ui/dialog/inkscape-preferences.cpp:1302 -msgid "" -"When duplicating a selection containing both a clone and its original " -"(possibly in groups), relink the duplicated clone to the duplicated original " -"instead of the old original" -msgstr "" -"Lorsque la sélection dupliquée contient un clone et son original (dans un " -"groupe par exemple), relier le clone dupliqué à l'objet original dupliqué " -"plutôt qu'à l'original initial" +msgid "When duplicating a selection containing both a clone and its original (possibly in groups), relink the duplicated clone to the duplicated original instead of the old original" +msgstr "Lorsque la sélection dupliquée contient un clone et son original (dans un groupe par exemple), relier le clone dupliqué à l'objet original dupliqué plutôt qu'à l'original initial" #. TRANSLATORS: Heading for the Inkscape Preferences "Clones" Page #: ../src/ui/dialog/inkscape-preferences.cpp:1305 @@ -19685,28 +18025,19 @@ msgstr "Clones" #. Clip paths and masks options #: ../src/ui/dialog/inkscape-preferences.cpp:1308 msgid "When applying, use the topmost selected object as clippath/mask" -msgstr "" -"Utiliser l'objet le plus haut comme chemin de découpe ou masque lors de " -"l'application" +msgstr "Utiliser l'objet le plus haut comme chemin de découpe ou masque lors de l'application" #: ../src/ui/dialog/inkscape-preferences.cpp:1310 -msgid "" -"Uncheck this to use the bottom selected object as the clipping path or mask" -msgstr "" -"Si décoché, l'objet le plus en-dessous de la sélection est utilisé comme " -"chemin de découpe ou masque" +msgid "Uncheck this to use the bottom selected object as the clipping path or mask" +msgstr "Si décoché, l'objet le plus en-dessous de la sélection est utilisé comme chemin de découpe ou masque" #: ../src/ui/dialog/inkscape-preferences.cpp:1311 msgid "Remove clippath/mask object after applying" msgstr "Supprimer le chemin de découpe ou le masque après application" #: ../src/ui/dialog/inkscape-preferences.cpp:1313 -msgid "" -"After applying, remove the object used as the clipping path or mask from the " -"drawing" -msgstr "" -"Si coché, le chemin de découpe ou masque est supprimé du dessin après avoir " -"été appliqué" +msgid "After applying, remove the object used as the clipping path or mask from the drawing" +msgstr "Si coché, le chemin de découpe ou masque est supprimé du dessin après avoir été appliqué" #: ../src/ui/dialog/inkscape-preferences.cpp:1315 msgid "Before applying" @@ -19746,9 +18077,7 @@ msgstr "Dégrouper les groupes créés automatiquement" #: ../src/ui/dialog/inkscape-preferences.cpp:1334 msgid "Ungroup groups created when setting clip/mask" -msgstr "" -"Dégrouper les groupes créés lors de la mise en place de la découpe ou du " -"masque" +msgstr "Dégrouper les groupes créés lors de la mise en place de la découpe ou du masque" #: ../src/ui/dialog/inkscape-preferences.cpp:1336 msgid "Clippaths and masks" @@ -19760,9 +18089,7 @@ msgstr "Style de contour des marqueurs" #: ../src/ui/dialog/inkscape-preferences.cpp:1341 #: ../src/ui/dialog/inkscape-preferences.cpp:1343 -msgid "" -"Stroke color same as object, fill color either object fill color or marker " -"fill color" +msgid "Stroke color same as object, fill color either object fill color or marker fill color" msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:1347 @@ -19789,15 +18116,13 @@ msgid "Number of _Threads:" msgstr "Nombre de _threads :" #: ../src/ui/dialog/inkscape-preferences.cpp:1362 -#: ../src/ui/dialog/inkscape-preferences.cpp:1880 +#: ../src/ui/dialog/inkscape-preferences.cpp:1889 msgid "(requires restart)" msgstr "(nécessite un redémarrage)" #: ../src/ui/dialog/inkscape-preferences.cpp:1363 msgid "Configure number of processors/threads to use when rendering filters" -msgstr "" -"Configure le nombre de processeurs/threads à utiliser pour le rendu des " -"filtres" +msgstr "Configure le nombre de processeurs/threads à utiliser pour le rendu des filtres" #: ../src/ui/dialog/inkscape-preferences.cpp:1367 msgid "Rendering _cache size:" @@ -19809,13 +18134,8 @@ msgid "MiB" msgstr "Mio" #: ../src/ui/dialog/inkscape-preferences.cpp:1367 -msgid "" -"Set the amount of memory per document which can be used to store rendered " -"parts of the drawing for later reuse; set to zero to disable caching" -msgstr "" -"Configure la quantité de mémoire par document pouvant être utilisée pour " -"stocker les parties affichées du dessin pour une réutilisation ultérieure ; " -"positionnez cette valeur à zéro pour désactiver le cache" +msgid "Set the amount of memory per document which can be used to store rendered parts of the drawing for later reuse; set to zero to disable caching" +msgstr "Configure la quantité de mémoire par document pouvant être utilisée pour stocker les parties affichées du dessin pour une réutilisation ultérieure ; positionnez cette valeur à zéro pour désactiver le cache" #. blur quality #. filter quality @@ -19850,12 +18170,8 @@ msgstr "Qualité d'affichage du flou gaussien" #: ../src/ui/dialog/inkscape-preferences.cpp:1383 #: ../src/ui/dialog/inkscape-preferences.cpp:1407 -msgid "" -"Best quality, but display may be very slow at high zooms (bitmap export " -"always uses best quality)" -msgstr "" -"La plus haute qualité, mais l'affichage peut être très lent pour des zooms " -"importants (l'export en bitmap utilise toujours la plus haute qualité)" +msgid "Best quality, but display may be very slow at high zooms (bitmap export always uses best quality)" +msgstr "La plus haute qualité, mais l'affichage peut être très lent pour des zooms importants (l'export en bitmap utilise toujours la plus haute qualité)" #: ../src/ui/dialog/inkscape-preferences.cpp:1385 #: ../src/ui/dialog/inkscape-preferences.cpp:1409 @@ -19875,9 +18191,7 @@ msgstr "Qualité plus faible (présence d'artefacts), mais affichage plus rapide #: ../src/ui/dialog/inkscape-preferences.cpp:1391 #: ../src/ui/dialog/inkscape-preferences.cpp:1415 msgid "Lowest quality (considerable artifacts), but display is fastest" -msgstr "" -"La plus mauvaise qualité (nombreux artefacts), mais l'affichage est bien " -"plus rapide" +msgstr "La plus mauvaise qualité (nombreux artefacts), mais l'affichage est bien plus rapide" #: ../src/ui/dialog/inkscape-preferences.cpp:1405 msgid "Filter effects quality for display" @@ -19889,127 +18203,113 @@ msgstr "Qualité d'affichage des effets de filtre" msgid "Rendering" msgstr "Rendu" +#. Note: /options/bitmapoversample removed with Cairo renderer #: ../src/ui/dialog/inkscape-preferences.cpp:1423 -msgid "2x2" -msgstr "2x2" - -#: ../src/ui/dialog/inkscape-preferences.cpp:1423 -msgid "4x4" -msgstr "4x4" - -#: ../src/ui/dialog/inkscape-preferences.cpp:1423 -msgid "8x8" -msgstr "8x8" - -#: ../src/ui/dialog/inkscape-preferences.cpp:1423 -msgid "16x16" -msgstr "16x16" - -#: ../src/ui/dialog/inkscape-preferences.cpp:1427 -msgid "Oversample bitmaps:" -msgstr "Sur-échantilloner les bitmaps :" +#: ../src/verbs.cpp:156 +#: ../src/widgets/calligraphy-toolbar.cpp:643 +msgid "Edit" +msgstr "Édition" -#: ../src/ui/dialog/inkscape-preferences.cpp:1430 +#: ../src/ui/dialog/inkscape-preferences.cpp:1424 msgid "Automatically reload bitmaps" msgstr "Recharger automatiquement les bitmaps" -#: ../src/ui/dialog/inkscape-preferences.cpp:1432 +#: ../src/ui/dialog/inkscape-preferences.cpp:1426 msgid "Automatically reload linked images when file is changed on disk" -msgstr "" -"Active le rechargement automatique des images liées lorsqu'elles ont été " -"modifiées sur le disque" +msgstr "Active le rechargement automatique des images liées lorsqu'elles ont été modifiées sur le disque" -#: ../src/ui/dialog/inkscape-preferences.cpp:1434 +#: ../src/ui/dialog/inkscape-preferences.cpp:1428 msgid "_Bitmap editor:" msgstr "Éditeur de _bitmap :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1436 +#: ../src/ui/dialog/inkscape-preferences.cpp:1430 +#: ../share/extensions/guillotine.inx.h:5 +#: ../share/extensions/print_win32_vector.inx.h:2 +msgid "Export" +msgstr "Exporter" + +#: ../src/ui/dialog/inkscape-preferences.cpp:1432 msgid "Default export _resolution:" msgstr "_Résolution par défaut d'exportation :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1437 +#: ../src/ui/dialog/inkscape-preferences.cpp:1433 msgid "Default bitmap resolution (in dots per inch) in the Export dialog" -msgstr "" -"Résolution par défaut (point par pouce) dans la boîte de dialogue exporter" +msgstr "Résolution par défaut (point par pouce) dans la boîte de dialogue exporter" -#: ../src/ui/dialog/inkscape-preferences.cpp:1439 +#: ../src/ui/dialog/inkscape-preferences.cpp:1434 +#: ../src/ui/dialog/xml-tree.cpp:909 +msgid "Create" +msgstr "Créer" + +#: ../src/ui/dialog/inkscape-preferences.cpp:1436 msgid "Resolution for Create Bitmap _Copy:" msgstr "Résolution pour _Créer une copie bitmap :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1440 +#: ../src/ui/dialog/inkscape-preferences.cpp:1437 msgid "Resolution used by the Create Bitmap Copy command" msgstr "Résolution utilisée par la commande Créer une copie bitmap" -#: ../src/ui/dialog/inkscape-preferences.cpp:1442 -msgid "Always embed" -msgstr "Toujours incorporer" - -#: ../src/ui/dialog/inkscape-preferences.cpp:1442 -msgid "Always link" -msgstr "Toujours lier" +#: ../src/ui/dialog/inkscape-preferences.cpp:1440 +msgid "Ask about linking and scaling when importing" +msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:1442 -msgid "Ask" -msgstr "Demander" +msgid "Pop-up linking and scaling dialog when importing bitmap image." +msgstr "" -#: ../src/ui/dialog/inkscape-preferences.cpp:1445 -msgid "Bitmap import:" +#: ../src/ui/dialog/inkscape-preferences.cpp:1448 +#, fuzzy +msgid "Bitmap link:" msgstr "Importation de bitmap :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1448 -msgid "Bitmap import quality:" -msgstr "Qualité de bitmap à l'importation :" +#: ../src/ui/dialog/inkscape-preferences.cpp:1455 +msgid "Bitmap scale (image-rendering):" +msgstr "" -#: ../src/ui/dialog/inkscape-preferences.cpp:1451 +#: ../src/ui/dialog/inkscape-preferences.cpp:1460 msgid "Default _import resolution:" msgstr "Résolution par défaut d'_importation :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#: ../src/ui/dialog/inkscape-preferences.cpp:1461 msgid "Default bitmap resolution (in dots per inch) for bitmap import" -msgstr "" -"Résolution bitmap par défaut (point par pouce) dans la boîte de dialogue " -"importer" +msgstr "Résolution bitmap par défaut (point par pouce) dans la boîte de dialogue importer" -#: ../src/ui/dialog/inkscape-preferences.cpp:1453 +#: ../src/ui/dialog/inkscape-preferences.cpp:1462 msgid "Override file resolution" msgstr "Écraser la résolution du fichier" -#: ../src/ui/dialog/inkscape-preferences.cpp:1455 +#: ../src/ui/dialog/inkscape-preferences.cpp:1464 msgid "Use default bitmap resolution in favor of information from file" -msgstr "" -"Utilise la résolution matricielle par défaut à la place de celle contenue " -"dans le fichier" +msgstr "Utilise la résolution matricielle par défaut à la place de celle contenue dans le fichier" -#: ../src/ui/dialog/inkscape-preferences.cpp:1457 +#: ../src/ui/dialog/inkscape-preferences.cpp:1466 msgid "Bitmaps" msgstr "Bitmaps" -#: ../src/ui/dialog/inkscape-preferences.cpp:1469 +#: ../src/ui/dialog/inkscape-preferences.cpp:1478 #, fuzzy -msgid "" -"Select a file of predefined shortcuts to use. Any customized shortcuts you " -"create will be added seperately to " +msgid "Select a file of predefined shortcuts to use. Any customized shortcuts you create will be added seperately to " msgstr "Sélectionnez un fichier de raccourcis prédéfinis à utiliser." -#: ../src/ui/dialog/inkscape-preferences.cpp:1472 +#: ../src/ui/dialog/inkscape-preferences.cpp:1481 msgid "Shortcut file:" msgstr "Fichier des raccourcis :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1475 -#: ../src/ui/dialog/template-load-tab.cpp:50 +#: ../src/ui/dialog/inkscape-preferences.cpp:1484 +#: ../src/ui/dialog/template-load-tab.cpp:48 msgid "Search:" msgstr "Rechercher :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1487 +#: ../src/ui/dialog/inkscape-preferences.cpp:1496 msgid "Shortcut" msgstr "Raccourci" -#: ../src/ui/dialog/inkscape-preferences.cpp:1488 +#: ../src/ui/dialog/inkscape-preferences.cpp:1497 #: ../src/ui/widget/page-sizer.cpp:260 msgid "Description" msgstr "Description" -#: ../src/ui/dialog/inkscape-preferences.cpp:1543 +#: ../src/ui/dialog/inkscape-preferences.cpp:1552 #: ../src/ui/dialog/pixelartdialog.cpp:268 #: ../src/ui/dialog/svg-fonts-dialog.cpp:698 #: ../src/ui/dialog/tracedialog.cpp:813 @@ -20017,195 +18317,173 @@ msgstr "Description" msgid "Reset" msgstr "Réinitialiser" -#: ../src/ui/dialog/inkscape-preferences.cpp:1543 -msgid "" -"Remove all your customized keyboard shortcuts, and revert to the shortcuts " -"in the shortcut file listed above" -msgstr "" -"Remplace tous les raccourcis clavier personnalisés par ceux définis dans le " -"fichier choisi" +#: ../src/ui/dialog/inkscape-preferences.cpp:1552 +msgid "Remove all your customized keyboard shortcuts, and revert to the shortcuts in the shortcut file listed above" +msgstr "Remplace tous les raccourcis clavier personnalisés par ceux définis dans le fichier choisi" -#: ../src/ui/dialog/inkscape-preferences.cpp:1547 +#: ../src/ui/dialog/inkscape-preferences.cpp:1556 msgid "Import ..." msgstr "Importer..." -#: ../src/ui/dialog/inkscape-preferences.cpp:1547 +#: ../src/ui/dialog/inkscape-preferences.cpp:1556 msgid "Import custom keyboard shortcuts from a file" msgstr "Importer des raccourcis clavier personnalisés à partir d'un fichier" -#: ../src/ui/dialog/inkscape-preferences.cpp:1550 +#: ../src/ui/dialog/inkscape-preferences.cpp:1559 msgid "Export ..." msgstr "Exporter..." -#: ../src/ui/dialog/inkscape-preferences.cpp:1550 +#: ../src/ui/dialog/inkscape-preferences.cpp:1559 msgid "Export custom keyboard shortcuts to a file" msgstr "Exporter les raccourcis clavier personnalisés dans un fichier" -#: ../src/ui/dialog/inkscape-preferences.cpp:1560 +#: ../src/ui/dialog/inkscape-preferences.cpp:1569 msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #. Find this group in the tree -#: ../src/ui/dialog/inkscape-preferences.cpp:1723 +#: ../src/ui/dialog/inkscape-preferences.cpp:1732 msgid "Misc" msgstr "Divers" -#: ../src/ui/dialog/inkscape-preferences.cpp:1842 +#: ../src/ui/dialog/inkscape-preferences.cpp:1851 msgid "Set the main spell check language" msgstr "Définit la langue principale du correcteur orthographique" -#: ../src/ui/dialog/inkscape-preferences.cpp:1845 +#: ../src/ui/dialog/inkscape-preferences.cpp:1854 msgid "Second language:" msgstr "Deuxième langue :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1846 -msgid "" -"Set the second spell check language; checking will only stop on words " -"unknown in ALL chosen languages" -msgstr "" -"Définit la deuxième langue du correcteur orthographique ; la vérification ne " -"s'arrêtera que sur les mots inconnus de toutes les langues sélectionnées" +#: ../src/ui/dialog/inkscape-preferences.cpp:1855 +msgid "Set the second spell check language; checking will only stop on words unknown in ALL chosen languages" +msgstr "Définit la deuxième langue du correcteur orthographique ; la vérification ne s'arrêtera que sur les mots inconnus de toutes les langues sélectionnées" -#: ../src/ui/dialog/inkscape-preferences.cpp:1849 +#: ../src/ui/dialog/inkscape-preferences.cpp:1858 msgid "Third language:" msgstr "Troisième langue :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1850 -msgid "" -"Set the third spell check language; checking will only stop on words unknown " -"in ALL chosen languages" -msgstr "" -"Définit la troisième langue du correcteur orthographique ; la vérification " -"ne s'arrêtera que sur les mots inconnus de toutes les langues sélectionnées" +#: ../src/ui/dialog/inkscape-preferences.cpp:1859 +msgid "Set the third spell check language; checking will only stop on words unknown in ALL chosen languages" +msgstr "Définit la troisième langue du correcteur orthographique ; la vérification ne s'arrêtera que sur les mots inconnus de toutes les langues sélectionnées" -#: ../src/ui/dialog/inkscape-preferences.cpp:1852 +#: ../src/ui/dialog/inkscape-preferences.cpp:1861 msgid "Ignore words with digits" msgstr "Ignorer les mots contenant des chiffres" -#: ../src/ui/dialog/inkscape-preferences.cpp:1854 +#: ../src/ui/dialog/inkscape-preferences.cpp:1863 msgid "Ignore words containing digits, such as \"R2D2\"" msgstr "Ignorer les mots contenant des chiffres, comme « R2D2 »" -#: ../src/ui/dialog/inkscape-preferences.cpp:1856 +#: ../src/ui/dialog/inkscape-preferences.cpp:1865 msgid "Ignore words in ALL CAPITALS" msgstr "Ignorer les mots tout en capitales" -#: ../src/ui/dialog/inkscape-preferences.cpp:1858 +#: ../src/ui/dialog/inkscape-preferences.cpp:1867 msgid "Ignore words in all capitals, such as \"IUPAC\"" msgstr "Ignorer les mots tout en capitales, comme « GNU »" -#: ../src/ui/dialog/inkscape-preferences.cpp:1860 +#: ../src/ui/dialog/inkscape-preferences.cpp:1869 msgid "Spellcheck" msgstr "Vérification orthographique" -#: ../src/ui/dialog/inkscape-preferences.cpp:1880 +#: ../src/ui/dialog/inkscape-preferences.cpp:1889 msgid "Latency _skew:" msgstr "_Décalage temporel :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1881 -msgid "" -"Factor by which the event clock is skewed from the actual time (0.9766 on " -"some systems)" -msgstr "" -"Facteur de décalage entre l'horloge de l'événement et le temps réel (0,9766 " -"sur certains systèmes)" +#: ../src/ui/dialog/inkscape-preferences.cpp:1890 +msgid "Factor by which the event clock is skewed from the actual time (0.9766 on some systems)" +msgstr "Facteur de décalage entre l'horloge de l'événement et le temps réel (0,9766 sur certains systèmes)" -#: ../src/ui/dialog/inkscape-preferences.cpp:1883 +#: ../src/ui/dialog/inkscape-preferences.cpp:1892 msgid "Pre-render named icons" msgstr "Préafficher les icônes nommées" -#: ../src/ui/dialog/inkscape-preferences.cpp:1885 -msgid "" -"When on, named icons will be rendered before displaying the ui. This is for " -"working around bugs in GTK+ named icon notification" -msgstr "" -"Si coché, les icônes nommées sont rendues avant l'affichage de l'interface " -"utilisateur. Il s'agit du contournement d'un bug sur la notification des " -"icônes nommées dans GTK+." +#: ../src/ui/dialog/inkscape-preferences.cpp:1894 +msgid "When on, named icons will be rendered before displaying the ui. This is for working around bugs in GTK+ named icon notification" +msgstr "Si coché, les icônes nommées sont rendues avant l'affichage de l'interface utilisateur. Il s'agit du contournement d'un bug sur la notification des icônes nommées dans GTK+." -#: ../src/ui/dialog/inkscape-preferences.cpp:1893 +#: ../src/ui/dialog/inkscape-preferences.cpp:1902 msgid "System info" msgstr "Informations système" -#: ../src/ui/dialog/inkscape-preferences.cpp:1897 +#: ../src/ui/dialog/inkscape-preferences.cpp:1906 msgid "User config: " msgstr "Configuration utilisateur : " -#: ../src/ui/dialog/inkscape-preferences.cpp:1897 +#: ../src/ui/dialog/inkscape-preferences.cpp:1906 msgid "Location of users configuration" msgstr "Emplacement de la configuration utilisateur" -#: ../src/ui/dialog/inkscape-preferences.cpp:1901 +#: ../src/ui/dialog/inkscape-preferences.cpp:1910 msgid "User preferences: " msgstr "Préférences de l'utilisateur :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1901 +#: ../src/ui/dialog/inkscape-preferences.cpp:1910 msgid "Location of the users preferences file" msgstr "Emplacement du fichier de préférences de l'utilisateur" -#: ../src/ui/dialog/inkscape-preferences.cpp:1905 +#: ../src/ui/dialog/inkscape-preferences.cpp:1914 msgid "User extensions: " msgstr "Extensions de l'utilisateur :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1905 +#: ../src/ui/dialog/inkscape-preferences.cpp:1914 msgid "Location of the users extensions" msgstr "Emplacement des extensions de l'utilisateur" -#: ../src/ui/dialog/inkscape-preferences.cpp:1909 +#: ../src/ui/dialog/inkscape-preferences.cpp:1918 msgid "User cache: " msgstr "Cache utilisateur : " -#: ../src/ui/dialog/inkscape-preferences.cpp:1909 +#: ../src/ui/dialog/inkscape-preferences.cpp:1918 msgid "Location of users cache" msgstr "Emplacement du cache utilisateur" -#: ../src/ui/dialog/inkscape-preferences.cpp:1917 +#: ../src/ui/dialog/inkscape-preferences.cpp:1926 msgid "Temporary files: " msgstr "Fichiers temporaires :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1917 +#: ../src/ui/dialog/inkscape-preferences.cpp:1926 msgid "Location of the temporary files used for autosave" -msgstr "" -"Emplacement des fichiers temporaires utilisés pour l'enregistrement " -"automatique" +msgstr "Emplacement des fichiers temporaires utilisés pour l'enregistrement automatique" -#: ../src/ui/dialog/inkscape-preferences.cpp:1921 +#: ../src/ui/dialog/inkscape-preferences.cpp:1930 msgid "Inkscape data: " msgstr "Données d'Inkscape :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1921 +#: ../src/ui/dialog/inkscape-preferences.cpp:1930 msgid "Location of Inkscape data" msgstr "Emplacement des données d'Inkscape" -#: ../src/ui/dialog/inkscape-preferences.cpp:1925 +#: ../src/ui/dialog/inkscape-preferences.cpp:1934 msgid "Inkscape extensions: " msgstr "Extensions d'Inkscape :" -#: ../src/ui/dialog/inkscape-preferences.cpp:1925 +#: ../src/ui/dialog/inkscape-preferences.cpp:1934 msgid "Location of the Inkscape extensions" msgstr "Emplacement des extensions d'Inkscape" -#: ../src/ui/dialog/inkscape-preferences.cpp:1934 +#: ../src/ui/dialog/inkscape-preferences.cpp:1943 msgid "System data: " msgstr "Données système : " -#: ../src/ui/dialog/inkscape-preferences.cpp:1934 +#: ../src/ui/dialog/inkscape-preferences.cpp:1943 msgid "Locations of system data" msgstr "Emplacement des données du système" -#: ../src/ui/dialog/inkscape-preferences.cpp:1958 +#: ../src/ui/dialog/inkscape-preferences.cpp:1967 msgid "Icon theme: " msgstr "Thème d'icônes : " -#: ../src/ui/dialog/inkscape-preferences.cpp:1958 +#: ../src/ui/dialog/inkscape-preferences.cpp:1967 msgid "Locations of icon themes" msgstr "Emplacement des thèmes d'icône" -#: ../src/ui/dialog/inkscape-preferences.cpp:1960 +#: ../src/ui/dialog/inkscape-preferences.cpp:1969 msgid "System" msgstr "Système" -#: ../src/ui/dialog/input.cpp:360 ../src/ui/dialog/input.cpp:381 +#: ../src/ui/dialog/input.cpp:360 +#: ../src/ui/dialog/input.cpp:381 #: ../src/ui/dialog/input.cpp:1641 msgid "Disabled" msgstr "Désactivé" @@ -20215,7 +18493,8 @@ msgctxt "Input device" msgid "Screen" msgstr "Superposition" -#: ../src/ui/dialog/input.cpp:362 ../src/ui/dialog/input.cpp:383 +#: ../src/ui/dialog/input.cpp:362 +#: ../src/ui/dialog/input.cpp:383 msgid "Window" msgstr "Fenêtre" @@ -20227,7 +18506,8 @@ msgstr "Zone de test" msgid "Axis" msgstr "Axe" -#: ../src/ui/dialog/input.cpp:708 ../share/extensions/svgcalendar.inx.h:2 +#: ../src/ui/dialog/input.cpp:708 +#: ../share/extensions/svgcalendar.inx.h:2 msgid "Configuration" msgstr "Configuration" @@ -20255,19 +18535,14 @@ msgstr "Nombre de boutons :" msgid "Tablet" msgstr "Tablette" -#: ../src/ui/dialog/input.cpp:1039 ../src/ui/dialog/input.cpp:1931 +#: ../src/ui/dialog/input.cpp:1039 +#: ../src/ui/dialog/input.cpp:1931 msgid "pad" msgstr "pad" #: ../src/ui/dialog/input.cpp:1081 msgid "_Use pressure-sensitive tablet (requires restart)" -msgstr "" -"_Utiliser une tablette graphique sensible à la pression (nécessite un " -"redémarrage)" - -#: ../src/ui/dialog/input.cpp:1082 ../src/verbs.cpp:2361 -msgid "_Save" -msgstr "_Enregistrer" +msgstr "_Utiliser une tablette graphique sensible à la pression (nécessite un redémarrage)" #: ../src/ui/dialog/input.cpp:1086 msgid "Axes" @@ -20278,13 +18553,13 @@ msgid "Keys" msgstr "Touches" #: ../src/ui/dialog/input.cpp:1170 -msgid "" -"A device can be 'Disabled', its co-ordinates mapped to the whole 'Screen', " -"or to a single (usually focused) 'Window'" +msgid "A device can be 'Disabled', its co-ordinates mapped to the whole 'Screen', or to a single (usually focused) 'Window'" msgstr "" -#: ../src/ui/dialog/input.cpp:1616 ../src/widgets/calligraphy-toolbar.cpp:595 -#: ../src/widgets/spray-toolbar.cpp:236 ../src/widgets/tweak-toolbar.cpp:386 +#: ../src/ui/dialog/input.cpp:1616 +#: ../src/widgets/calligraphy-toolbar.cpp:595 +#: ../src/widgets/spray-toolbar.cpp:236 +#: ../src/widgets/tweak-toolbar.cpp:386 msgid "Pressure" msgstr "Pression" @@ -20327,7 +18602,8 @@ msgstr "Renommer le calque" #. TODO: find an unused layer number, forming name from _("Layer ") + "%d" #: ../src/ui/dialog/layer-properties.cpp:354 -#: ../src/ui/dialog/layer-properties.cpp:410 ../src/verbs.cpp:194 +#: ../src/ui/dialog/layer-properties.cpp:410 +#: ../src/verbs.cpp:194 #: ../src/verbs.cpp:2292 msgid "Layer" msgstr "Calque" @@ -20336,7 +18612,8 @@ msgstr "Calque" msgid "_Rename" msgstr "_Renommer" -#: ../src/ui/dialog/layer-properties.cpp:368 ../src/ui/dialog/layers.cpp:750 +#: ../src/ui/dialog/layer-properties.cpp:368 +#: ../src/ui/dialog/layers.cpp:750 msgid "Rename layer" msgstr "Renommer le calque" @@ -20366,27 +18643,33 @@ msgstr "Déplacer vers le calque" msgid "_Move" msgstr "Déplace_ment" -#: ../src/ui/dialog/layers.cpp:525 ../src/ui/widget/layer-selector.cpp:613 +#: ../src/ui/dialog/layers.cpp:525 +#: ../src/ui/widget/layer-selector.cpp:613 msgid "Unhide layer" msgstr "Montrer le calque" -#: ../src/ui/dialog/layers.cpp:525 ../src/ui/widget/layer-selector.cpp:613 +#: ../src/ui/dialog/layers.cpp:525 +#: ../src/ui/widget/layer-selector.cpp:613 msgid "Hide layer" msgstr "Cacher le calque" -#: ../src/ui/dialog/layers.cpp:536 ../src/ui/widget/layer-selector.cpp:605 +#: ../src/ui/dialog/layers.cpp:536 +#: ../src/ui/widget/layer-selector.cpp:605 msgid "Lock layer" msgstr "Verrouiller le calque" -#: ../src/ui/dialog/layers.cpp:536 ../src/ui/widget/layer-selector.cpp:605 +#: ../src/ui/dialog/layers.cpp:536 +#: ../src/ui/widget/layer-selector.cpp:605 msgid "Unlock layer" msgstr "Déverrouiller le calque" -#: ../src/ui/dialog/layers.cpp:624 ../src/verbs.cpp:1401 +#: ../src/ui/dialog/layers.cpp:624 +#: ../src/verbs.cpp:1401 msgid "Toggle layer solo" msgstr "Afficher ou masquer les autres calques" -#: ../src/ui/dialog/layers.cpp:627 ../src/verbs.cpp:1425 +#: ../src/ui/dialog/layers.cpp:627 +#: ../src/verbs.cpp:1425 msgid "Lock other layers" msgstr "Verrouiller les autres calques" @@ -20427,69 +18710,69 @@ msgstr "Ajouter un effet de chemin" msgid "Add path effect" msgstr "Ajouter un effet de chemin" -#: ../src/ui/dialog/livepatheffect-editor.cpp:113 +#: ../src/ui/dialog/livepatheffect-editor.cpp:119 msgid "Delete current path effect" msgstr "Supprimer l'effet de chemin courant" -#: ../src/ui/dialog/livepatheffect-editor.cpp:117 +#: ../src/ui/dialog/livepatheffect-editor.cpp:129 msgid "Raise the current path effect" msgstr "Monter l'effet de chemin courant" -#: ../src/ui/dialog/livepatheffect-editor.cpp:121 +#: ../src/ui/dialog/livepatheffect-editor.cpp:139 msgid "Lower the current path effect" msgstr "Descendre l'effet de chemin courant" -#: ../src/ui/dialog/livepatheffect-editor.cpp:289 +#: ../src/ui/dialog/livepatheffect-editor.cpp:313 msgid "Unknown effect is applied" msgstr "Un effet inconnu est appliqué" -#: ../src/ui/dialog/livepatheffect-editor.cpp:292 +#: ../src/ui/dialog/livepatheffect-editor.cpp:316 msgid "Click button to add an effect" msgstr "Cliquez sur le bouton pour ajouter un effet" -#: ../src/ui/dialog/livepatheffect-editor.cpp:305 +#: ../src/ui/dialog/livepatheffect-editor.cpp:329 msgid "Click add button to convert clone" msgstr "Cliquez sur le bouton ajouter pour convertir un clone" -#: ../src/ui/dialog/livepatheffect-editor.cpp:310 -#: ../src/ui/dialog/livepatheffect-editor.cpp:314 -#: ../src/ui/dialog/livepatheffect-editor.cpp:322 +#: ../src/ui/dialog/livepatheffect-editor.cpp:334 +#: ../src/ui/dialog/livepatheffect-editor.cpp:338 +#: ../src/ui/dialog/livepatheffect-editor.cpp:346 msgid "Select a path or shape" msgstr "Sélectionnez un chemin ou une forme" -#: ../src/ui/dialog/livepatheffect-editor.cpp:318 +#: ../src/ui/dialog/livepatheffect-editor.cpp:342 msgid "Only one item can be selected" msgstr "On ne peut sélectionner qu'un objet à la fois" -#: ../src/ui/dialog/livepatheffect-editor.cpp:350 +#: ../src/ui/dialog/livepatheffect-editor.cpp:374 msgid "Unknown effect" msgstr "Un effet inconnu est appliqué" -#: ../src/ui/dialog/livepatheffect-editor.cpp:426 +#: ../src/ui/dialog/livepatheffect-editor.cpp:450 msgid "Create and apply path effect" msgstr "Créer et appliquer un effet de chemin" -#: ../src/ui/dialog/livepatheffect-editor.cpp:461 +#: ../src/ui/dialog/livepatheffect-editor.cpp:485 msgid "Create and apply Clone original path effect" msgstr "Créer et appliquer l'effet de chemin Cloner l'original" -#: ../src/ui/dialog/livepatheffect-editor.cpp:481 +#: ../src/ui/dialog/livepatheffect-editor.cpp:505 msgid "Remove path effect" msgstr "Supprimer l'effet de chemin" -#: ../src/ui/dialog/livepatheffect-editor.cpp:498 +#: ../src/ui/dialog/livepatheffect-editor.cpp:522 msgid "Move path effect up" msgstr "Monter l'effet de chemin" -#: ../src/ui/dialog/livepatheffect-editor.cpp:514 +#: ../src/ui/dialog/livepatheffect-editor.cpp:538 msgid "Move path effect down" msgstr "Descendre l'effet de chemin" -#: ../src/ui/dialog/livepatheffect-editor.cpp:553 +#: ../src/ui/dialog/livepatheffect-editor.cpp:577 msgid "Activate path effect" msgstr "Activer l'effet de chemin" -#: ../src/ui/dialog/livepatheffect-editor.cpp:553 +#: ../src/ui/dialog/livepatheffect-editor.cpp:577 msgid "Deactivate path effect" msgstr "Désactiver l'effet de chemin" @@ -20511,8 +18794,10 @@ msgstr "Inutilisée" msgid "Total" msgstr "Total" -#: ../src/ui/dialog/memory.cpp:141 ../src/ui/dialog/memory.cpp:147 -#: ../src/ui/dialog/memory.cpp:154 ../src/ui/dialog/memory.cpp:186 +#: ../src/ui/dialog/memory.cpp:141 +#: ../src/ui/dialog/memory.cpp:147 +#: ../src/ui/dialog/memory.cpp:154 +#: ../src/ui/dialog/memory.cpp:186 msgid "Unknown" msgstr "Inconnu" @@ -20580,176 +18865,194 @@ msgid "URL:" msgstr "URL :" #: ../src/ui/dialog/object-attributes.cpp:66 -#: ../src/ui/dialog/object-attributes.cpp:74 ../src/ui/dialog/tile.cpp:618 -#: ../src/widgets/desktop-widget.cpp:670 ../src/widgets/node-toolbar.cpp:593 +#: ../src/ui/dialog/object-attributes.cpp:75 +#: ../src/ui/dialog/tile.cpp:618 +#: ../src/widgets/desktop-widget.cpp:671 +#: ../src/widgets/node-toolbar.cpp:594 msgid "X:" msgstr "X :" #: ../src/ui/dialog/object-attributes.cpp:67 -#: ../src/ui/dialog/object-attributes.cpp:75 ../src/ui/dialog/tile.cpp:619 -#: ../src/widgets/desktop-widget.cpp:680 ../src/widgets/node-toolbar.cpp:611 +#: ../src/ui/dialog/object-attributes.cpp:76 +#: ../src/ui/dialog/tile.cpp:619 +#: ../src/widgets/desktop-widget.cpp:681 +#: ../src/widgets/node-toolbar.cpp:612 msgid "Y:" msgstr "Y :" -#: ../src/ui/dialog/object-properties.cpp:61 -#: ../src/ui/dialog/object-properties.cpp:362 -#: ../src/ui/dialog/object-properties.cpp:419 -#: ../src/ui/dialog/object-properties.cpp:426 +#: ../src/ui/dialog/object-attributes.cpp:70 +#, fuzzy +msgid "Image Rendering:" +msgstr "Rendu" + +#: ../src/ui/dialog/object-properties.cpp:63 +#: ../src/ui/dialog/object-properties.cpp:398 +#: ../src/ui/dialog/object-properties.cpp:473 +#: ../src/ui/dialog/object-properties.cpp:480 msgid "_ID:" msgstr "_ID :" -#: ../src/ui/dialog/object-properties.cpp:63 +#: ../src/ui/dialog/object-properties.cpp:65 msgid "_Title:" msgstr "_Titre :" -#: ../src/ui/dialog/object-properties.cpp:64 +#: ../src/ui/dialog/object-properties.cpp:66 +#, fuzzy +msgid "_Image Rendering:" +msgstr "Rendu" + +#: ../src/ui/dialog/object-properties.cpp:67 msgid "_Description:" msgstr "_Description :" -#: ../src/ui/dialog/object-properties.cpp:72 +#: ../src/ui/dialog/object-properties.cpp:75 msgid "_Hide" msgstr "Cac_her" -#: ../src/ui/dialog/object-properties.cpp:73 +#: ../src/ui/dialog/object-properties.cpp:76 msgid "L_ock" msgstr "Verr_ouiller" -#: ../src/ui/dialog/object-properties.cpp:74 ../src/verbs.cpp:2636 +#: ../src/ui/dialog/object-properties.cpp:77 +#: ../src/verbs.cpp:2636 #: ../src/verbs.cpp:2642 msgid "_Set" msgstr "_Définir" -#: ../src/ui/dialog/object-properties.cpp:75 +#: ../src/ui/dialog/object-properties.cpp:78 msgid "_Interactivity" msgstr "_Interactivité" #. Create the entry box for the object id -#: ../src/ui/dialog/object-properties.cpp:153 -msgid "" -"The id= attribute (only letters, digits, and the characters .-_: allowed)" -msgstr "" -"L'attribut id= (seuls les chiffres, lettres, et les caractères .-_: sont " -"autorisés)" +#: ../src/ui/dialog/object-properties.cpp:156 +msgid "The id= attribute (only letters, digits, and the characters .-_: allowed)" +msgstr "L'attribut id= (seuls les chiffres, lettres, et les caractères .-_: sont autorisés)" #. Create the entry box for the object label -#: ../src/ui/dialog/object-properties.cpp:186 +#: ../src/ui/dialog/object-properties.cpp:189 msgid "A freeform label for the object" msgstr "Une étiquette attribuée à l'objet" +#: ../src/ui/dialog/object-properties.cpp:272 +msgid "" +"The 'image-rendering' property can influence how a bitmap is up-scaled:\n" +"\t'auto' no preference;\n" +"\t'optimizeQuality' smooth;\n" +"\t'optimizeSpeed' blocky.\n" +"Note that this behaviour is not defined in the SVG 1.1 specification and not all browsers follow this interpretation." +msgstr "" + #. Hide -#: ../src/ui/dialog/object-properties.cpp:257 +#: ../src/ui/dialog/object-properties.cpp:293 msgid "Check to make the object invisible" msgstr "Si coché, l'objet devient invisible" #. Lock #. TRANSLATORS: "Lock" is a verb here -#: ../src/ui/dialog/object-properties.cpp:273 +#: ../src/ui/dialog/object-properties.cpp:309 msgid "Check to make the object insensitive (not selectable by mouse)" msgstr "Si coché, l'objet devient insensible (non sélectionnable à la souris)" -#: ../src/ui/dialog/object-properties.cpp:349 -#: ../src/ui/dialog/object-properties.cpp:354 +#: ../src/ui/dialog/object-properties.cpp:385 +#: ../src/ui/dialog/object-properties.cpp:390 msgid "Ref" msgstr "Réf" -#: ../src/ui/dialog/object-properties.cpp:421 +#: ../src/ui/dialog/object-properties.cpp:475 msgid "Id invalid! " msgstr "Id invalide !" -#: ../src/ui/dialog/object-properties.cpp:423 +#: ../src/ui/dialog/object-properties.cpp:477 msgid "Id exists! " msgstr "Cet Id existe déjà !" -#: ../src/ui/dialog/object-properties.cpp:429 +#: ../src/ui/dialog/object-properties.cpp:483 msgid "Set object ID" msgstr "Définir l'Id d'un objet" -#: ../src/ui/dialog/object-properties.cpp:443 +#: ../src/ui/dialog/object-properties.cpp:497 msgid "Set object label" msgstr "Définir l'étiquette de l'objet" -#: ../src/ui/dialog/object-properties.cpp:449 +#: ../src/ui/dialog/object-properties.cpp:503 msgid "Set object title" msgstr "Définir le titre d'un objet" -#: ../src/ui/dialog/object-properties.cpp:457 +#: ../src/ui/dialog/object-properties.cpp:511 msgid "Set object description" msgstr "Définir la description d'un objet" -#: ../src/ui/dialog/object-properties.cpp:475 +#: ../src/ui/dialog/object-properties.cpp:555 msgid "Lock object" msgstr "Verrouiller l'objet" -#: ../src/ui/dialog/object-properties.cpp:475 +#: ../src/ui/dialog/object-properties.cpp:555 msgid "Unlock object" msgstr "Déverrouiller l'objet" -#: ../src/ui/dialog/object-properties.cpp:492 +#: ../src/ui/dialog/object-properties.cpp:572 msgid "Hide object" msgstr "Cacher l'objet" -#: ../src/ui/dialog/object-properties.cpp:492 +#: ../src/ui/dialog/object-properties.cpp:572 msgid "Unhide object" msgstr "Montrer l'objet" -#: ../src/ui/dialog/ocaldialogs.cpp:713 +#: ../src/ui/dialog/ocaldialogs.cpp:715 msgid "Clipart found" msgstr "Clipart trouvé" -#: ../src/ui/dialog/ocaldialogs.cpp:762 +#: ../src/ui/dialog/ocaldialogs.cpp:764 msgid "Downloading image..." msgstr "Téléchargement de l'image..." -#: ../src/ui/dialog/ocaldialogs.cpp:910 +#: ../src/ui/dialog/ocaldialogs.cpp:912 msgid "Could not download image" msgstr "Téléchargement de l'image impossible" -#: ../src/ui/dialog/ocaldialogs.cpp:920 +#: ../src/ui/dialog/ocaldialogs.cpp:922 msgid "Clipart downloaded successfully" msgstr "Clipart téléchargé avec succès" -#: ../src/ui/dialog/ocaldialogs.cpp:934 +#: ../src/ui/dialog/ocaldialogs.cpp:936 msgid "Could not download thumbnail file" msgstr "Le fichier aperçu n'a pas pu être téléchargé" -#: ../src/ui/dialog/ocaldialogs.cpp:1009 +#: ../src/ui/dialog/ocaldialogs.cpp:1011 msgid "No description" msgstr "Aucune description" -#: ../src/ui/dialog/ocaldialogs.cpp:1077 +#: ../src/ui/dialog/ocaldialogs.cpp:1079 msgid "Searching clipart..." msgstr "Recherche du clipart..." -#: ../src/ui/dialog/ocaldialogs.cpp:1097 ../src/ui/dialog/ocaldialogs.cpp:1118 +#: ../src/ui/dialog/ocaldialogs.cpp:1099 +#: ../src/ui/dialog/ocaldialogs.cpp:1120 msgid "Could not connect to the Open Clip Art Library" msgstr "Connexion à la bibliothèque Open Clip Art impossible" -#: ../src/ui/dialog/ocaldialogs.cpp:1143 +#: ../src/ui/dialog/ocaldialogs.cpp:1145 msgid "Could not parse search results" msgstr "Impossible de parcourir les résultats de la recherche" -#: ../src/ui/dialog/ocaldialogs.cpp:1177 +#: ../src/ui/dialog/ocaldialogs.cpp:1179 msgid "No clipart named %1 was found." msgstr "Aucun clipart nommé %1 n'a été trouvé." -#: ../src/ui/dialog/ocaldialogs.cpp:1179 -msgid "" -"Please make sure all keywords are spelled correctly, or try again with " -"different keywords." -msgstr "" -"Veuillez vous assurer que les mots clé ont été correctement épelé, ou " -"essayez avec des mots clé différents." +#: ../src/ui/dialog/ocaldialogs.cpp:1181 +msgid "Please make sure all keywords are spelled correctly, or try again with different keywords." +msgstr "Veuillez vous assurer que les mots clé ont été correctement épelé, ou essayez avec des mots clé différents." -#: ../src/ui/dialog/ocaldialogs.cpp:1231 +#: ../src/ui/dialog/ocaldialogs.cpp:1233 msgid "Search" msgstr "Rechercher" -#: ../src/ui/dialog/ocaldialogs.cpp:1243 +#: ../src/ui/dialog/ocaldialogs.cpp:1245 msgid "Close" msgstr "Fermer" #: ../src/ui/dialog/pixelartdialog.cpp:162 -msgid "_Curves (multiplier)" +msgid "_Curves (multiplier):" msgstr "" #: ../src/ui/dialog/pixelartdialog.cpp:165 @@ -20757,8 +19060,9 @@ msgid "Favors connections that are part of a long curve" msgstr "" #: ../src/ui/dialog/pixelartdialog.cpp:176 -msgid "_Islands (weight)" -msgstr "" +#, fuzzy +msgid "_Islands (weight):" +msgstr "Hauteur de capitale :" #: ../src/ui/dialog/pixelartdialog.cpp:179 msgid "Avoid single disconnected pixels" @@ -20770,7 +19074,7 @@ msgid "A constant vote value" msgstr "angle contraint" #: ../src/ui/dialog/pixelartdialog.cpp:191 -msgid "Sparse pixels (window _radius)" +msgid "Sparse pixels (window _radius):" msgstr "" #: ../src/ui/dialog/pixelartdialog.cpp:200 @@ -20778,7 +19082,7 @@ msgid "The radius of the window analyzed" msgstr "" #: ../src/ui/dialog/pixelartdialog.cpp:201 -msgid "Sparse pixels (_multiplier)" +msgid "Sparse pixels (_multiplier):" msgstr "" #: ../src/ui/dialog/pixelartdialog.cpp:212 @@ -20847,8 +19151,7 @@ msgstr "pixels à" #: ../src/ui/dialog/pixelartdialog.cpp:376 msgid "" -"Image looks too big. Process may take a while and is wise to save your " -"document before continue.\n" +"Image looks too big. Process may take a while and it is wise to save your document before continuing.\n" "\n" "Continue the procedure (without saving)?" msgstr "" @@ -21086,7 +19389,8 @@ msgstr "fonte" msgid "Add font" msgstr "Ajouter une fonte" -#: ../src/ui/dialog/svg-fonts-dialog.cpp:912 ../src/ui/dialog/text-edit.cpp:70 +#: ../src/ui/dialog/svg-fonts-dialog.cpp:912 +#: ../src/ui/dialog/text-edit.cpp:70 msgid "_Font" msgstr "_Police" @@ -21111,6 +19415,13 @@ msgstr "Texte exemple" msgid "Preview Text:" msgstr "Texte de l'aperçu :" +#: ../src/ui/dialog/swatches.cpp:203 +#: ../src/ui/tools/gradient-tool.cpp:369 +#: ../src/ui/tools/gradient-tool.cpp:467 +#: ../src/widgets/gradient-vector.cpp:814 +msgid "Add gradient stop" +msgstr "Ajouter un stop au dégradé" + #. TRANSLATORS: An item in context menu on a colour in the swatches #: ../src/ui/dialog/swatches.cpp:258 msgid "Set fill" @@ -21135,71 +19446,67 @@ msgid "Palettes directory (%s) is unavailable." msgstr "Le dossier des palettes (%s) est indisponible." #. ******************* Symbol Sets ************************ -#: ../src/ui/dialog/symbols.cpp:128 +#: ../src/ui/dialog/symbols.cpp:126 msgid "Symbol set: " msgstr "Jeu de symboles :" #. Fill in later -#: ../src/ui/dialog/symbols.cpp:137 ../src/ui/dialog/symbols.cpp:138 +#: ../src/ui/dialog/symbols.cpp:135 +#: ../src/ui/dialog/symbols.cpp:136 msgid "Current Document" msgstr "Document courant" -#: ../src/ui/dialog/symbols.cpp:205 +#: ../src/ui/dialog/symbols.cpp:203 msgid "Add Symbol from the current document." msgstr "Ajouter un symbole à partir du document courant." -#: ../src/ui/dialog/symbols.cpp:214 +#: ../src/ui/dialog/symbols.cpp:212 msgid "Remove Symbol from the current document." msgstr "Supprimer un symbole du document courant." -#: ../src/ui/dialog/symbols.cpp:227 +#: ../src/ui/dialog/symbols.cpp:225 msgid "Make Icons bigger by zooming in." msgstr "" -#: ../src/ui/dialog/symbols.cpp:236 +#: ../src/ui/dialog/symbols.cpp:234 msgid "Make Icons smaller by zooming out." msgstr "Rendre les icônes plus petites." -#: ../src/ui/dialog/symbols.cpp:245 +#: ../src/ui/dialog/symbols.cpp:243 msgid "Toggle 'fit' symbols in icon space." msgstr "" -#: ../src/ui/dialog/symbols.cpp:558 +#: ../src/ui/dialog/symbols.cpp:565 msgid "Unnamed Symbols" msgstr "Symboles sans nom" #: ../src/ui/dialog/template-widget.cpp:36 -#, fuzzy msgid "More info" -msgstr "Augmenter la luminosité" +msgstr "Informations" #: ../src/ui/dialog/template-widget.cpp:37 msgid " " msgstr "" #: ../src/ui/dialog/template-widget.cpp:38 -#, fuzzy msgid "no template selected" -msgstr "Aucun élément sélectionné." +msgstr "Aucun modèle sélectionné" #: ../src/ui/dialog/template-widget.cpp:119 -#, fuzzy msgid "Path: " -msgstr "Chemin :" +msgstr "Chemin : " #: ../src/ui/dialog/template-widget.cpp:122 -#, fuzzy msgid "Description: " -msgstr "Description :" +msgstr "Description : " #: ../src/ui/dialog/template-widget.cpp:124 -#, fuzzy msgid "Keywords: " -msgstr "Mots clés :" +msgstr "Mots clés : " #: ../src/ui/dialog/template-widget.cpp:131 msgid "By: " -msgstr "" +msgstr "Par : " #: ../src/ui/dialog/text-edit.cpp:73 msgid "Set as _default" @@ -21212,35 +19519,42 @@ msgid "AaBbCcIiPpQq12369$€¢?.;/()" msgstr "AaBbCcIiPpQq12369$€¢?.;/()" #. Align buttons -#: ../src/ui/dialog/text-edit.cpp:97 ../src/widgets/text-toolbar.cpp:1349 +#: ../src/ui/dialog/text-edit.cpp:97 +#: ../src/widgets/text-toolbar.cpp:1349 #: ../src/widgets/text-toolbar.cpp:1350 msgid "Align left" msgstr "Aligner à gauche" -#: ../src/ui/dialog/text-edit.cpp:98 ../src/widgets/text-toolbar.cpp:1357 +#: ../src/ui/dialog/text-edit.cpp:98 +#: ../src/widgets/text-toolbar.cpp:1357 #: ../src/widgets/text-toolbar.cpp:1358 msgid "Align center" msgstr "Centrer" -#: ../src/ui/dialog/text-edit.cpp:99 ../src/widgets/text-toolbar.cpp:1365 +#: ../src/ui/dialog/text-edit.cpp:99 +#: ../src/widgets/text-toolbar.cpp:1365 #: ../src/widgets/text-toolbar.cpp:1366 msgid "Align right" msgstr "Aligner à droite" -#: ../src/ui/dialog/text-edit.cpp:100 ../src/widgets/text-toolbar.cpp:1374 +#: ../src/ui/dialog/text-edit.cpp:100 +#: ../src/widgets/text-toolbar.cpp:1374 msgid "Justify (only flowed text)" msgstr "Justifier (texte encadré seulement)" #. Direction buttons -#: ../src/ui/dialog/text-edit.cpp:109 ../src/widgets/text-toolbar.cpp:1409 +#: ../src/ui/dialog/text-edit.cpp:109 +#: ../src/widgets/text-toolbar.cpp:1409 msgid "Horizontal text" msgstr "Texte horizontal" -#: ../src/ui/dialog/text-edit.cpp:110 ../src/widgets/text-toolbar.cpp:1416 +#: ../src/ui/dialog/text-edit.cpp:110 +#: ../src/widgets/text-toolbar.cpp:1416 msgid "Vertical text" msgstr "Texte vertical" -#: ../src/ui/dialog/text-edit.cpp:130 ../src/ui/dialog/text-edit.cpp:131 +#: ../src/ui/dialog/text-edit.cpp:130 +#: ../src/ui/dialog/text-edit.cpp:131 msgid "Spacing between lines (percent of font size)" msgstr "Espacement entre les lignes (pourcentage de la taille de la police)" @@ -21249,6 +19563,12 @@ msgstr "Espacement entre les lignes (pourcentage de la taille de la police)" msgid "Text path offset" msgstr "Décalage magenta" +#: ../src/ui/dialog/text-edit.cpp:588 +#: ../src/ui/dialog/text-edit.cpp:662 +#: ../src/ui/tools/text-tool.cpp:1487 +msgid "Set text style" +msgstr "Appliquer un style à un texte" + #: ../src/ui/dialog/tile.cpp:349 msgid "Arrange in a grid" msgstr "Disposer selon une grille" @@ -21275,13 +19595,12 @@ msgstr "Égaliser la _hauteur" #: ../src/ui/dialog/tile.cpp:690 msgid "If not set, each row has the height of the tallest object in it" -msgstr "" -"Si décoché, chaque ligne a même la hauteur que l'objet le plus haut qu'elle " -"contient" +msgstr "Si décoché, chaque ligne a même la hauteur que l'objet le plus haut qu'elle contient" #. #### Radio buttons to control vertical alignment #### #. #### Radio buttons to control horizontal alignment #### -#: ../src/ui/dialog/tile.cpp:696 ../src/ui/dialog/tile.cpp:768 +#: ../src/ui/dialog/tile.cpp:696 +#: ../src/ui/dialog/tile.cpp:768 msgid "Align:" msgstr "Aligner :" @@ -21300,9 +19619,7 @@ msgstr "Égaliser la _largeur" #: ../src/ui/dialog/tile.cpp:761 msgid "If not set, each column has the width of the widest object in it" -msgstr "" -"Si décoché, chaque ligne a la même largeur que l'objet le plus large qu'elle " -"contient" +msgstr "Si décoché, chaque ligne a la même largeur que l'objet le plus large qu'elle contient" #. #### Radio buttons to control spacing manually or to fit selection bbox #### #: ../src/ui/dialog/tile.cpp:807 @@ -21356,9 +19673,7 @@ msgstr "Vectoriser en utilisant l'algorithme détection d'arêtes de J. Canny" #: ../src/ui/dialog/tracedialog.cpp:556 msgid "Brightness cutoff for adjacent pixels (determines edge thickness)" -msgstr "" -"Limite de luminosité pour déterminer les pixels adjacents (détermine la " -"finesse des arrêtes)" +msgstr "Limite de luminosité pour déterminer les pixels adjacents (détermine la finesse des arrêtes)" #: ../src/ui/dialog/tracedialog.cpp:559 msgid "T_hreshold:" @@ -21442,12 +19757,8 @@ msgid "Stac_k scans" msgstr "Em_piler les passes" #: ../src/ui/dialog/tracedialog.cpp:661 -msgid "" -"Stack scans on top of one another (no gaps) instead of tiling (usually with " -"gaps)" -msgstr "" -"Empiler les passes verticalement (sans espacement) au lieu de les juxtaposer " -"(souvent avec de l'espacement)" +msgid "Stack scans on top of one another (no gaps) instead of tiling (usually with gaps)" +msgstr "Empiler les passes verticalement (sans espacement) au lieu de les juxtaposer (souvent avec de l'espacement)" #: ../src/ui/dialog/tracedialog.cpp:665 msgid "Remo_ve background" @@ -21504,17 +19815,11 @@ msgstr "_Optimiser les chemins" #: ../src/ui/dialog/tracedialog.cpp:729 msgid "Try to optimize paths by joining adjacent Bezier curve segments" -msgstr "" -"Tenter d'optimiser les chemins en joignant les segments de courbes de Bézier " -"adjacents" +msgstr "Tenter d'optimiser les chemins en joignant les segments de courbes de Bézier adjacents" #: ../src/ui/dialog/tracedialog.cpp:737 -msgid "" -"Increase this to reduce the number of nodes in the trace by more aggressive " -"optimization" -msgstr "" -"Augmenter ce paramètre pour diminuer le nombre de nœuds de la vectorisation " -"avec une optimisation plus aggressive" +msgid "Increase this to reduce the number of nodes in the trace by more aggressive optimization" +msgstr "Augmenter ce paramètre pour diminuer le nombre de nœuds de la vectorisation avec une optimisation plus aggressive" #: ../src/ui/dialog/tracedialog.cpp:739 msgid "To_lerance:" @@ -21564,12 +19869,8 @@ msgstr "_Mettre à jour" #. I guess it's correct to call the "intermediate bitmap" a preview of the trace #: ../src/ui/dialog/tracedialog.cpp:796 -msgid "" -"Preview the intermediate bitmap with the current settings, without actual " -"tracing" -msgstr "" -"Aperçu du bitmap intermédiaire avec les paramètres définis, sans " -"vectorisation effective" +msgid "Preview the intermediate bitmap with the current settings, without actual tracing" +msgstr "Aperçu du bitmap intermédiaire avec les paramètres définis, sans vectorisation effective" #: ../src/ui/dialog/tracedialog.cpp:800 msgid "Preview" @@ -21606,25 +19907,17 @@ msgid "A_ngle:" msgstr "A_ngle :" #: ../src/ui/dialog/transformation.cpp:84 -#: ../src/ui/dialog/transformation.cpp:1103 +#: ../src/ui/dialog/transformation.cpp:1104 msgid "Rotation angle (positive = counterclockwise)" msgstr "Angle de rotation (positif = sens anti-horaire)" #: ../src/ui/dialog/transformation.cpp:86 -msgid "" -"Horizontal skew angle (positive = counterclockwise), or absolute " -"displacement, or percentage displacement" -msgstr "" -"Angle d'inclinaison horizontal (positif = sens anti-horaire) ou déplacement " -"absolu, ou pourcentage de déplacement" +msgid "Horizontal skew angle (positive = counterclockwise), or absolute displacement, or percentage displacement" +msgstr "Angle d'inclinaison horizontal (positif = sens anti-horaire) ou déplacement absolu, ou pourcentage de déplacement" #: ../src/ui/dialog/transformation.cpp:88 -msgid "" -"Vertical skew angle (positive = counterclockwise), or absolute displacement, " -"or percentage displacement" -msgstr "" -"Angle d'inclinaison vertical (positif = sens anti-horaire) ou déplacement " -"absolu, ou pourcentage de déplacement" +msgid "Vertical skew angle (positive = counterclockwise), or absolute displacement, or percentage displacement" +msgstr "Angle d'inclinaison vertical (positif = sens anti-horaire) ou déplacement absolu, ou pourcentage de déplacement" #: ../src/ui/dialog/transformation.cpp:91 msgid "Transformation matrix element A" @@ -21655,12 +19948,8 @@ msgid "Rela_tive move" msgstr "Déplacement rela_tif" #: ../src/ui/dialog/transformation.cpp:101 -msgid "" -"Add the specified relative displacement to the current position; otherwise, " -"edit the current absolute position directly" -msgstr "" -"Ajoute le déplacement relatif spécifié à la position courante; sinon, " -"modifie directement la position absolue courante" +msgid "Add the specified relative displacement to the current position; otherwise, edit the current absolute position directly" +msgstr "Ajoute le déplacement relatif spécifié à la position courante; sinon, modifie directement la position absolue courante" #: ../src/ui/dialog/transformation.cpp:102 msgid "_Scale proportionally" @@ -21675,24 +19964,16 @@ msgid "Apply to each _object separately" msgstr "Appliquer à chaque _objet séparément" #: ../src/ui/dialog/transformation.cpp:103 -msgid "" -"Apply the scale/rotate/skew to each selected object separately; otherwise, " -"transform the selection as a whole" -msgstr "" -"Appliquer la transformation à chaque objet séparément; sinon, transformer la " -"sélection comme un tout" +msgid "Apply the scale/rotate/skew to each selected object separately; otherwise, transform the selection as a whole" +msgstr "Appliquer la transformation à chaque objet séparément; sinon, transformer la sélection comme un tout" #: ../src/ui/dialog/transformation.cpp:104 msgid "Edit c_urrent matrix" msgstr "Editer la matrice co_urante" #: ../src/ui/dialog/transformation.cpp:104 -msgid "" -"Edit the current transform= matrix; otherwise, post-multiply transform= by " -"this matrix" -msgstr "" -"Si coché, édite la matrice de la transformation courante; sinon, post-" -"multiplie la transformation courante par cette matrice." +msgid "Edit the current transform= matrix; otherwise, post-multiply transform= by this matrix" +msgstr "Si coché, édite la matrice de la transformation courante; sinon, post-multiplie la transformation courante par cette matrice." #: ../src/ui/dialog/transformation.cpp:117 msgid "_Scale" @@ -21726,42 +20007,47 @@ msgstr "Tourner dans le sens anti-horaire" msgid "Rotate in a clockwise direction" msgstr "Tourner dans le sens horaire" -#: ../src/ui/dialog/transformation.cpp:907 -#: ../src/ui/dialog/transformation.cpp:918 -#: ../src/ui/dialog/transformation.cpp:932 -#: ../src/ui/dialog/transformation.cpp:951 -#: ../src/ui/dialog/transformation.cpp:962 -#: ../src/ui/dialog/transformation.cpp:972 -#: ../src/ui/dialog/transformation.cpp:996 +#: ../src/ui/dialog/transformation.cpp:908 +#: ../src/ui/dialog/transformation.cpp:919 +#: ../src/ui/dialog/transformation.cpp:933 +#: ../src/ui/dialog/transformation.cpp:952 +#: ../src/ui/dialog/transformation.cpp:963 +#: ../src/ui/dialog/transformation.cpp:973 +#: ../src/ui/dialog/transformation.cpp:997 msgid "Transform matrix is singular, not used." msgstr "" -#: ../src/ui/dialog/transformation.cpp:1011 +#: ../src/ui/dialog/transformation.cpp:1012 msgid "Edit transformation matrix" msgstr "Éditer la matrice de transformation" -#: ../src/ui/dialog/transformation.cpp:1110 +#: ../src/ui/dialog/transformation.cpp:1111 msgid "Rotation angle (positive = clockwise)" msgstr "Angle de rotation (positif = sens horaire)" -#: ../src/ui/dialog/xml-tree.cpp:70 ../src/ui/dialog/xml-tree.cpp:123 +#: ../src/ui/dialog/xml-tree.cpp:70 +#: ../src/ui/dialog/xml-tree.cpp:123 msgid "New element node" msgstr "Nouveau nœud élément" -#: ../src/ui/dialog/xml-tree.cpp:71 ../src/ui/dialog/xml-tree.cpp:129 +#: ../src/ui/dialog/xml-tree.cpp:71 +#: ../src/ui/dialog/xml-tree.cpp:129 msgid "New text node" msgstr "Nouveau nœud texte" -#: ../src/ui/dialog/xml-tree.cpp:72 ../src/ui/dialog/xml-tree.cpp:143 +#: ../src/ui/dialog/xml-tree.cpp:72 +#: ../src/ui/dialog/xml-tree.cpp:143 msgid "nodeAsInXMLdialogTooltip|Delete node" msgstr "Supprimer le nœud" -#: ../src/ui/dialog/xml-tree.cpp:73 ../src/ui/dialog/xml-tree.cpp:135 +#: ../src/ui/dialog/xml-tree.cpp:73 +#: ../src/ui/dialog/xml-tree.cpp:135 #: ../src/ui/dialog/xml-tree.cpp:974 msgid "Duplicate node" msgstr "Dupliquer le nœud" -#: ../src/ui/dialog/xml-tree.cpp:79 ../src/ui/dialog/xml-tree.cpp:188 +#: ../src/ui/dialog/xml-tree.cpp:79 +#: ../src/ui/dialog/xml-tree.cpp:188 #: ../src/ui/dialog/xml-tree.cpp:1010 msgid "Delete attribute" msgstr "Supprimer l'attribut" @@ -21774,22 +20060,26 @@ msgstr "Définir" msgid "Drag to reorder nodes" msgstr "Cliquer-déplacer pour réorganiser les nœuds" -#: ../src/ui/dialog/xml-tree.cpp:149 ../src/ui/dialog/xml-tree.cpp:150 +#: ../src/ui/dialog/xml-tree.cpp:149 +#: ../src/ui/dialog/xml-tree.cpp:150 #: ../src/ui/dialog/xml-tree.cpp:1131 msgid "Unindent node" msgstr "Désindenter le nœud" -#: ../src/ui/dialog/xml-tree.cpp:154 ../src/ui/dialog/xml-tree.cpp:155 +#: ../src/ui/dialog/xml-tree.cpp:154 +#: ../src/ui/dialog/xml-tree.cpp:155 #: ../src/ui/dialog/xml-tree.cpp:1109 msgid "Indent node" msgstr "Indenter le nœud" -#: ../src/ui/dialog/xml-tree.cpp:159 ../src/ui/dialog/xml-tree.cpp:160 +#: ../src/ui/dialog/xml-tree.cpp:159 +#: ../src/ui/dialog/xml-tree.cpp:160 #: ../src/ui/dialog/xml-tree.cpp:1060 msgid "Raise node" msgstr "Monter le nœud" -#: ../src/ui/dialog/xml-tree.cpp:164 ../src/ui/dialog/xml-tree.cpp:165 +#: ../src/ui/dialog/xml-tree.cpp:164 +#: ../src/ui/dialog/xml-tree.cpp:165 #: ../src/ui/dialog/xml-tree.cpp:1078 msgid "Lower node" msgstr "Descendre le nœud" @@ -21804,9 +20094,7 @@ msgstr "Valeur de l'attribut" #: ../src/ui/dialog/xml-tree.cpp:308 msgid "Click to select nodes, drag to rearrange." -msgstr "" -"Cliquer pour sélectionner des nœuds, cliquer-déplacer pour les " -"déplacer." +msgstr "Cliquer pour sélectionner des nœuds, cliquer-déplacer pour les déplacer." #: ../src/ui/dialog/xml-tree.cpp:319 msgid "Click attribute to edit." @@ -21814,12 +20102,8 @@ msgstr "Cliquer sur les attributs pour pouvoir les éditer." #: ../src/ui/dialog/xml-tree.cpp:323 #, c-format -msgid "" -"Attribute %s selected. Press Ctrl+Enter when done editing to " -"commit changes." -msgstr "" -"Attribut %s sélectionné. Appuyer sur Ctrl+Enter après édition " -"pour valider." +msgid "Attribute %s selected. Press Ctrl+Enter when done editing to commit changes." +msgstr "Attribut %s sélectionné. Appuyer sur Ctrl+Enter après édition pour valider." #: ../src/ui/dialog/xml-tree.cpp:563 msgid "Drag XML subtree" @@ -21833,10 +20117,6 @@ msgstr "Nouveau nœud élément..." msgid "Cancel" msgstr "Annuler" -#: ../src/ui/dialog/xml-tree.cpp:909 -msgid "Create" -msgstr "Créer" - #: ../src/ui/dialog/xml-tree.cpp:940 msgid "Create new element node" msgstr "Créer un nouveau nœud élément" @@ -21873,113 +20153,104 @@ msgstr "Ctrl+Alt : cliquer pour insérer un nœud" #: ../src/ui/tool/curve-drag-point.cpp:175 msgctxt "Path segment tip" -msgid "" -"Linear segment: drag to convert to a Bezier segment, doubleclick to " -"insert node, click to select (more: Shift, Ctrl+Alt)" -msgstr "" -"Segment linéaire : cliquer-déplacer pour convertir en segment de " -"Bézier, double-cliquer pour insérer un nœud, cliquer pour sélectionner " -"(modificateurs : Maj, Ctrl+Alt)" +msgid "Linear segment: drag to convert to a Bezier segment, doubleclick to insert node, click to select (more: Shift, Ctrl+Alt)" +msgstr "Segment linéaire : cliquer-déplacer pour convertir en segment de Bézier, double-cliquer pour insérer un nœud, cliquer pour sélectionner (modificateurs : Maj, Ctrl+Alt)" #: ../src/ui/tool/curve-drag-point.cpp:179 msgctxt "Path segment tip" -msgid "" -"Bezier segment: drag to shape the segment, doubleclick to insert " -"node, click to select (more: Shift, Ctrl+Alt)" -msgstr "" -"Segment de Bézier : cliquer-déplacer pour modeler le segment, double-" -"cliquer pour insérer un nœud, cliquer pour sélectionner (modificateurs : " -"Maj, Ctrl+Alt)" +msgid "Bezier segment: drag to shape the segment, doubleclick to insert node, click to select (more: Shift, Ctrl+Alt)" +msgstr "Segment de Bézier : cliquer-déplacer pour modeler le segment, double-cliquer pour insérer un nœud, cliquer pour sélectionner (modificateurs : Maj, Ctrl+Alt)" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 msgid "Retract handles" msgstr "Rétracter les poignées" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 ../src/ui/tool/node.cpp:270 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 +#: ../src/ui/tool/node.cpp:270 msgid "Change node type" msgstr "Modifier le type de nœud" -#: ../src/ui/tool/multi-path-manipulator.cpp:334 +#: ../src/ui/tool/multi-path-manipulator.cpp:323 msgid "Straighten segments" msgstr "Rendre les segments droits" -#: ../src/ui/tool/multi-path-manipulator.cpp:336 +#: ../src/ui/tool/multi-path-manipulator.cpp:325 msgid "Make segments curves" msgstr "Rendre courbes les segments sélectionnés" -#: ../src/ui/tool/multi-path-manipulator.cpp:343 +#: ../src/ui/tool/multi-path-manipulator.cpp:333 msgid "Add nodes" msgstr "Ajouter des nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:348 +#: ../src/ui/tool/multi-path-manipulator.cpp:339 msgid "Add extremum nodes" msgstr "Ajouter des nœuds aux extrémités" -#: ../src/ui/tool/multi-path-manipulator.cpp:354 +#: ../src/ui/tool/multi-path-manipulator.cpp:346 msgid "Duplicate nodes" msgstr "Dupliquer les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:416 -#: ../src/widgets/node-toolbar.cpp:420 +#: ../src/ui/tool/multi-path-manipulator.cpp:409 +#: ../src/widgets/node-toolbar.cpp:421 msgid "Join nodes" msgstr "Joindre les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:423 -#: ../src/widgets/node-toolbar.cpp:431 +#: ../src/ui/tool/multi-path-manipulator.cpp:416 +#: ../src/widgets/node-toolbar.cpp:432 msgid "Break nodes" msgstr "Séparer les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:430 +#: ../src/ui/tool/multi-path-manipulator.cpp:423 msgid "Delete nodes" msgstr "Supprimer les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:760 +#: ../src/ui/tool/multi-path-manipulator.cpp:757 msgid "Move nodes" msgstr "Déplacer les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:763 +#: ../src/ui/tool/multi-path-manipulator.cpp:760 msgid "Move nodes horizontally" msgstr "Déplacer les nœuds horizontalement" -#: ../src/ui/tool/multi-path-manipulator.cpp:767 +#: ../src/ui/tool/multi-path-manipulator.cpp:764 msgid "Move nodes vertically" msgstr "Déplacer les nœuds verticalement" +#: ../src/ui/tool/multi-path-manipulator.cpp:768 #: ../src/ui/tool/multi-path-manipulator.cpp:771 -#: ../src/ui/tool/multi-path-manipulator.cpp:774 msgid "Rotate nodes" msgstr "Tourner les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:778 -#: ../src/ui/tool/multi-path-manipulator.cpp:784 +#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:781 msgid "Scale nodes uniformly" msgstr "Redimensionner les nœuds uniformément" -#: ../src/ui/tool/multi-path-manipulator.cpp:781 +#: ../src/ui/tool/multi-path-manipulator.cpp:778 msgid "Scale nodes" msgstr "Redimensionner les nœuds" -#: ../src/ui/tool/multi-path-manipulator.cpp:788 +#: ../src/ui/tool/multi-path-manipulator.cpp:785 msgid "Scale nodes horizontally" msgstr "Redimensionner les nœuds horizontalement" -#: ../src/ui/tool/multi-path-manipulator.cpp:792 +#: ../src/ui/tool/multi-path-manipulator.cpp:789 msgid "Scale nodes vertically" msgstr "Redimensionner les nœuds verticalement" -#: ../src/ui/tool/multi-path-manipulator.cpp:796 +#: ../src/ui/tool/multi-path-manipulator.cpp:793 msgid "Skew nodes horizontally" msgstr "Incliner les nœuds horizontalement" -#: ../src/ui/tool/multi-path-manipulator.cpp:800 +#: ../src/ui/tool/multi-path-manipulator.cpp:797 msgid "Skew nodes vertically" msgstr "Incliner les nœuds verticalement" -#: ../src/ui/tool/multi-path-manipulator.cpp:804 +#: ../src/ui/tool/multi-path-manipulator.cpp:801 msgid "Flip nodes horizontally" msgstr "Retourner les nœuds horizontalement" -#: ../src/ui/tool/multi-path-manipulator.cpp:807 +#: ../src/ui/tool/multi-path-manipulator.cpp:804 msgid "Flip nodes vertically" msgstr "Retourner les nœuds verticalement" @@ -22012,28 +20283,19 @@ msgstr "modificateurs : Ctrl, Alt" #: ../src/ui/tool/node.cpp:440 #, c-format msgctxt "Path handle tip" -msgid "" -"Shift+Ctrl+Alt: preserve length and snap rotation angle to %g° " -"increments while rotating both handles" -msgstr "" -"Maj+Ctrl+Alt : préserver la longueur et forcer l'incrément de l'angle " -"de rotation à %g ° lorsque les deux poignées sont tournées" +msgid "Shift+Ctrl+Alt: preserve length and snap rotation angle to %g° increments while rotating both handles" +msgstr "Maj+Ctrl+Alt : préserver la longueur et forcer l'incrément de l'angle de rotation à %g ° lorsque les deux poignées sont tournées" #: ../src/ui/tool/node.cpp:445 #, c-format msgctxt "Path handle tip" -msgid "" -"Ctrl+Alt: preserve length and snap rotation angle to %g° increments" -msgstr "" -"Ctrl+Alt : préserver la longueur et forcer l'incrément de l'angle de " -"rotation à %g °" +msgid "Ctrl+Alt: preserve length and snap rotation angle to %g° increments" +msgstr "Ctrl+Alt : préserver la longueur et forcer l'incrément de l'angle de rotation à %g °" #: ../src/ui/tool/node.cpp:451 msgctxt "Path handle tip" msgid "Shift+Alt: preserve handle length and rotate both handles" -msgstr "" -"Maj+Alt : préserver la longueur des poignées et tourner les deux " -"poignées" +msgstr "Maj+Alt : préserver la longueur des poignées et tourner les deux poignées" #: ../src/ui/tool/node.cpp:454 msgctxt "Path handle tip" @@ -22043,20 +20305,14 @@ msgstr "Alt : préserver la longueur des poignées lors des déplacement #: ../src/ui/tool/node.cpp:461 #, c-format msgctxt "Path handle tip" -msgid "" -"Shift+Ctrl: snap rotation angle to %g° increments and rotate both " -"handles" -msgstr "" -"Maj+Ctrl : forcer l'incrément de l'angle de rotation à %g ° et " -"tourner les deux poignées" +msgid "Shift+Ctrl: snap rotation angle to %g° increments and rotate both handles" +msgstr "Maj+Ctrl : forcer l'incrément de l'angle de rotation à %g ° et tourner les deux poignées" #: ../src/ui/tool/node.cpp:465 #, c-format msgctxt "Path handle tip" msgid "Ctrl: snap rotation angle to %g° increments, click to retract" -msgstr "" -"Ctrl : forcer l'incrément de l'angle de rotation à %g °, cliquer pour " -"rétracter" +msgstr "Ctrl : forcer l'incrément de l'angle de rotation à %g °, cliquer pour rétracter" #: ../src/ui/tool/node.cpp:470 msgctxt "Path hande tip" @@ -22067,9 +20323,7 @@ msgstr "Maj : applique une rotation d'angle identique aux deux poignées #, c-format msgctxt "Path handle tip" msgid "Auto node handle: drag to convert to smooth node (%s)" -msgstr "" -"Poignées de nœud automatique : cliquer-déplacer pour convertir en " -"nœud doux (%s)" +msgstr "Poignées de nœud automatique : cliquer-déplacer pour convertir en nœud doux (%s)" #: ../src/ui/tool/node.cpp:480 #, c-format @@ -22086,9 +20340,7 @@ msgstr "Déplacement des poignées de %s, %s; angle %.2f°, longueur %s" #: ../src/ui/tool/node.cpp:1266 msgctxt "Path node tip" msgid "Shift: drag out a handle, click to toggle selection" -msgstr "" -"Maj : cliquer-déplacer pour étirer une poignée, cliquer pour inverser " -"l'état de sélection" +msgstr "Maj : cliquer-déplacer pour étirer une poignée, cliquer pour inverser l'état de sélection" #: ../src/ui/tool/node.cpp:1268 msgctxt "Path node tip" @@ -22098,15 +20350,12 @@ msgstr "Maj : cliquer pour inverser l'état de sélection" #: ../src/ui/tool/node.cpp:1273 msgctxt "Path node tip" msgid "Ctrl+Alt: move along handle lines, click to delete node" -msgstr "" -"Ctrl+Alt : déplacer le long des lignes des poignées, cliquer pour " -"effacer le nœud" +msgstr "Ctrl+Alt : déplacer le long des lignes des poignées, cliquer pour effacer le nœud" #: ../src/ui/tool/node.cpp:1276 msgctxt "Path node tip" msgid "Ctrl: move along axes, click to change node type" -msgstr "" -"Ctrl : déplacer le long des axes, cliquer pour changer de type de nœud" +msgstr "Ctrl : déplacer le long des axes, cliquer pour changer de type de nœud" #: ../src/ui/tool/node.cpp:1280 msgctxt "Path node tip" @@ -22117,30 +20366,19 @@ msgstr "Alt : sculpter les nœuds" #, c-format msgctxt "Path node tip" msgid "%s: drag to shape the path (more: Shift, Ctrl, Alt)" -msgstr "" -"%s : cliquer-déplacer pour modeler le chemin (modificateurs : Maj, " -"Ctrl, Alt)" +msgstr "%s : cliquer-déplacer pour modeler le chemin (modificateurs : Maj, Ctrl, Alt)" #: ../src/ui/tool/node.cpp:1291 #, c-format msgctxt "Path node tip" -msgid "" -"%s: drag to shape the path, click to toggle scale/rotation handles " -"(more: Shift, Ctrl, Alt)" -msgstr "" -"%s : cliquer-déplacer pour modeler le chemin, cliquer pour basculer " -"entre les poignées de sélection et de rotation (modificateurs : Maj, Ctrl, " -"Alt)" +msgid "%s: drag to shape the path, click to toggle scale/rotation handles (more: Shift, Ctrl, Alt)" +msgstr "%s : cliquer-déplacer pour modeler le chemin, cliquer pour basculer entre les poignées de sélection et de rotation (modificateurs : Maj, Ctrl, Alt)" #: ../src/ui/tool/node.cpp:1294 #, c-format msgctxt "Path node tip" -msgid "" -"%s: drag to shape the path, click to select only this node (more: " -"Shift, Ctrl, Alt)" -msgstr "" -"%s : cliquer-déplacer pour modeler le chemin, cliquer pour " -"sélectionner seulement ce nœud (modificateurs : Maj, Ctrl, Alt)" +msgid "%s: drag to shape the path, click to select only this node (more: Shift, Ctrl, Alt)" +msgstr "%s : cliquer-déplacer pour modeler le chemin, cliquer pour sélectionner seulement ce nœud (modificateurs : Maj, Ctrl, Alt)" #: ../src/ui/tool/node.cpp:1305 #, c-format @@ -22156,100 +20394,960 @@ msgstr "Nœud symétrique" msgid "Auto-smooth node" msgstr "Nœud automatique" -#: ../src/ui/tool/node-tool.cpp:553 -msgctxt "Node tool tip" -msgid "" -"Shift: drag to add nodes to the selection, click to toggle object " -"selection" +#: ../src/ui/tool/path-manipulator.cpp:821 +msgid "Scale handle" +msgstr "Redimensionner la poignée" + +#: ../src/ui/tool/path-manipulator.cpp:845 +msgid "Rotate handle" +msgstr "Faire tourner la poignée" + +#. We need to call MPM's method because it could have been our last node +#: ../src/ui/tool/path-manipulator.cpp:1384 +#: ../src/widgets/node-toolbar.cpp:410 +msgid "Delete node" +msgstr "Supprimer le nœud" + +#: ../src/ui/tool/path-manipulator.cpp:1392 +msgid "Cycle node type" +msgstr "Permuter le type de nœud" + +#: ../src/ui/tool/path-manipulator.cpp:1407 +msgid "Drag handle" +msgstr "Étirer la poignée" + +#: ../src/ui/tool/path-manipulator.cpp:1416 +msgid "Retract handle" +msgstr "Retracter la poignée" + +#: ../src/ui/tools/arc-tool.cpp:269 +msgid "Ctrl: make circle or integer-ratio ellipse, snap arc/segment angle" +msgstr "Ctrl : dessiner des cercles ou des ellipses de ratio entier, forcer la modification des angles des arcs/camemberts par incréments" + +#: ../src/ui/tools/arc-tool.cpp:270 +#: ../src/ui/tools/rect-tool.cpp:297 +msgid "Shift: draw around the starting point" +msgstr "Maj : dessiner autour du point de départ" + +#: ../src/ui/tools/arc-tool.cpp:439 +#, c-format +msgid "Ellipse: %s × %s (constrained to ratio %d:%d); with Shift to draw around the starting point" +msgstr "Ellipse : %s × %s; (contrainte de ratio %d:%d); Maj pour dessiner autour du point de départ" + +#: ../src/ui/tools/arc-tool.cpp:441 +#, c-format +msgid "Ellipse: %s × %s; with Ctrl to make square or integer-ratio ellipse; with Shift to draw around the starting point" +msgstr "Ellipse : %s × %s; Ctrl pour dessiner des cercles ou des ellipses de ratio entier, Maj pour dessiner autour du point de départ" + +#: ../src/ui/tools/arc-tool.cpp:464 +msgid "Create ellipse" +msgstr "Créer une ellipse" + +#: ../src/ui/tools/box3d-tool.cpp:379 +#: ../src/ui/tools/box3d-tool.cpp:386 +#: ../src/ui/tools/box3d-tool.cpp:393 +#: ../src/ui/tools/box3d-tool.cpp:400 +#: ../src/ui/tools/box3d-tool.cpp:407 +#: ../src/ui/tools/box3d-tool.cpp:414 +msgid "Change perspective (angle of PLs)" +msgstr "Changer la perspective (angle des LP)" + +#. status text +#: ../src/ui/tools/box3d-tool.cpp:592 +msgid "3D Box; with Shift to extrude along the Z axis" +msgstr "Boîte 3D. Utiliser Maj pour extruder suivant Z" + +#: ../src/ui/tools/box3d-tool.cpp:618 +msgid "Create 3D box" +msgstr "Créer une boîte 3D" + +#: ../src/ui/tools/calligraphic-tool.cpp:542 +msgid "Guide path selected; start drawing along the guide with Ctrl" +msgstr "Guide sélectionné; commencer à dessiner le long du guide avec Ctrl" + +#: ../src/ui/tools/calligraphic-tool.cpp:544 +msgid "Select a guide path to track with Ctrl" +msgstr "Choisir un chemin comme guide avec Ctrl" + +#: ../src/ui/tools/calligraphic-tool.cpp:679 +msgid "Tracking: connection to guide path lost!" +msgstr "Suivi : Connexion avec le guide perdue !" + +#: ../src/ui/tools/calligraphic-tool.cpp:679 +msgid "Tracking a guide path" +msgstr "Suivi d'un chemin guide" + +#: ../src/ui/tools/calligraphic-tool.cpp:682 +msgid "Drawing a calligraphic stroke" +msgstr "Tracé calligraphique en cours" + +#: ../src/ui/tools/calligraphic-tool.cpp:983 +msgid "Draw calligraphic stroke" +msgstr "Créer un tracé calligraphique" + +#: ../src/ui/tools/connector-tool.cpp:547 +msgid "Creating new connector" +msgstr "Création d'un nouveau connecteur" + +#: ../src/ui/tools/connector-tool.cpp:802 +msgid "Connector endpoint drag cancelled." +msgstr "Déplacement de fin de connecteur annulé." + +#: ../src/ui/tools/connector-tool.cpp:849 +msgid "Reroute connector" +msgstr "Rerouter un connecteur" + +#: ../src/ui/tools/connector-tool.cpp:1016 +msgid "Create connector" +msgstr "Créer un connecteur" + +#: ../src/ui/tools/connector-tool.cpp:1039 +msgid "Finishing connector" +msgstr "Tracé du connecteur terminé" + +#: ../src/ui/tools/connector-tool.cpp:1275 +msgid "Connector endpoint: drag to reroute or connect to new shapes" +msgstr "Fin de connecteur : déplacer pour rerouter ou connecter à de nouvelles formes" + +#: ../src/ui/tools/connector-tool.cpp:1415 +msgid "Select at least one non-connector object." +msgstr "Sélectionner au moins un objet non connecteur." + +#: ../src/ui/tools/connector-tool.cpp:1420 +#: ../src/widgets/connector-toolbar.cpp:326 +msgid "Make connectors avoid selected objects" +msgstr "Faire que les connecteurs évitent les objets sélectionnés" + +#: ../src/ui/tools/connector-tool.cpp:1421 +#: ../src/widgets/connector-toolbar.cpp:336 +msgid "Make connectors ignore selected objects" +msgstr "Faire que les connecteurs ignorent les objets sélectionnés" + +#. 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:283 +#, c-format +msgid " alpha %.3g" +msgstr " alpha %.3g" + +#. where the color is picked, to show in the statusbar +#: ../src/ui/tools/dropper-tool.cpp:285 +#, c-format +msgid ", averaged with radius %d" +msgstr ", valeur moyenne dans un rayon de %d" + +#: ../src/ui/tools/dropper-tool.cpp:285 +msgid " under cursor" +msgstr " sous le curseur" + +#. message, to show in the statusbar +#: ../src/ui/tools/dropper-tool.cpp:287 +msgid "Release mouse to set color." +msgstr "Relâcher la souris pour appliquer la couleur." + +#: ../src/ui/tools/dropper-tool.cpp:335 +msgid "Set picked color" +msgstr "Appliquer la couleur capturée" + +#: ../src/ui/tools/eraser-tool.cpp:437 +msgid "Drawing an eraser stroke" +msgstr "Coup de gomme en cours" + +#: ../src/ui/tools/eraser-tool.cpp:770 +msgid "Draw eraser stroke" +msgstr "Donner un coup de gomme" + +#: ../src/ui/tools/flood-tool.cpp:197 +msgid "Visible Colors" +msgstr "Couleurs visibles" + +#: ../src/ui/tools/flood-tool.cpp:215 +msgctxt "Flood autogap" +msgid "None" +msgstr "Aucun" + +#: ../src/ui/tools/flood-tool.cpp:216 +msgctxt "Flood autogap" +msgid "Small" +msgstr "Petit" + +#: ../src/ui/tools/flood-tool.cpp:217 +msgctxt "Flood autogap" +msgid "Medium" +msgstr "Moyen" + +#: ../src/ui/tools/flood-tool.cpp:218 +msgctxt "Flood autogap" +msgid "Large" +msgstr "Grand" + +#: ../src/ui/tools/flood-tool.cpp:440 +msgid "Too much inset, the result is empty." +msgstr "Trop de contraction, le résultat est vide." + +#: ../src/ui/tools/flood-tool.cpp:481 +#, c-format +msgid "Area filled, path with %d node created and unioned with selection." +msgid_plural "Area filled, path with %d nodes created and unioned with selection." +msgstr[0] "Zone remplie, création d'un chemin de %d nœud, ajouté à la sélection." +msgstr[1] "Zone remplie, création d'un chemin de %d nœuds, ajouté à la sélection." + +#: ../src/ui/tools/flood-tool.cpp:487 +#, c-format +msgid "Area filled, path with %d node created." +msgid_plural "Area filled, path with %d nodes created." +msgstr[0] "Zone remplie, création d'un chemin avec %d nœud." +msgstr[1] "Zone remplie, création d'un chemin avec %d nœuds." + +#: ../src/ui/tools/flood-tool.cpp:755 +#: ../src/ui/tools/flood-tool.cpp:1065 +msgid "Area is not bounded, cannot fill." +msgstr "Zone non bornée, impossible de remplir." + +#: ../src/ui/tools/flood-tool.cpp:1070 +msgid "Only the visible part of the bounded area was filled. If you want to fill all of the area, undo, zoom out, and fill again." +msgstr "Seule la partie visible de la zone a été remplie. Pour remplir toute la zone, annulez, dézoomez et remplissez à nouveau." + +#: ../src/ui/tools/flood-tool.cpp:1088 +#: ../src/ui/tools/flood-tool.cpp:1239 +msgid "Fill bounded area" +msgstr "Remplissage d'une zone bornée" + +#: ../src/ui/tools/flood-tool.cpp:1104 +msgid "Set style on object" +msgstr "Appliquer un style à l'objet" + +#: ../src/ui/tools/flood-tool.cpp:1164 +msgid "Draw over areas to add to fill, hold Alt for touch fill" +msgstr "Dessiner au-dessus d'une zone pour la remplir, avec Alt pour remplir au toucher" + +#. We hit green anchor, closing Green-Blue-Red +#: ../src/ui/tools/freehand-base.cpp:494 +msgid "Path is closed." +msgstr "Le chemin est fermé." + +#. We hit bot start and end of single curve, closing paths +#: ../src/ui/tools/freehand-base.cpp:509 +msgid "Closing path." +msgstr "Fermeture de chemin." + +#: ../src/ui/tools/freehand-base.cpp:611 +msgid "Draw path" +msgstr "Dessiner un chemin" + +#: ../src/ui/tools/freehand-base.cpp:768 +msgid "Creating single dot" +msgstr "Création d'un point isolé" + +#: ../src/ui/tools/freehand-base.cpp:769 +msgid "Create single dot" +msgstr "Créer un point isolé" + +#. 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:135 +#: ../src/ui/tools/mesh-tool.cpp:132 +#, c-format +msgid "%s selected" +msgstr "%s sélectionné" + +#. TRANSLATORS: Mind the space in front. This is part of a compound message +#: ../src/ui/tools/gradient-tool.cpp:137 +#: ../src/ui/tools/gradient-tool.cpp:146 +#, c-format +msgid " out of %d gradient handle" +msgid_plural " out of %d gradient handles" +msgstr[0] " sur %d poignée de dégradé" +msgstr[1] " sur %d poignées de dégradé" + +#. TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message +#: ../src/ui/tools/gradient-tool.cpp:138 +#: ../src/ui/tools/gradient-tool.cpp:147 +#: ../src/ui/tools/gradient-tool.cpp:154 +#: ../src/ui/tools/mesh-tool.cpp:135 +#: ../src/ui/tools/mesh-tool.cpp:146 +#: ../src/ui/tools/mesh-tool.cpp:154 +#, c-format +msgid " on %d selected object" +msgid_plural " on %d selected objects" +msgstr[0] " dans %d objet sélectionné" +msgstr[1] " dans %d objets sélectionnés" + +#. 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:144 +#: ../src/ui/tools/mesh-tool.cpp:142 +#, c-format +msgid "One handle merging %d stop (drag with Shift to separate) selected" +msgid_plural "One handle merging %d stops (drag with Shift to separate) selected" +msgstr[0] "Une poignée de dégradé rassemblant %d stops (cliquer-glissser avec Maj pour les séparer) sélectionnée" +msgstr[1] "Une poignée de dégradé rassemblant %d stops (cliquer-glissser avec Maj pour les séparer) sélectionnée" + +#. 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:152 +#, c-format +msgid "%d gradient handle selected out of %d" +msgid_plural "%d gradient handles selected out of %d" +msgstr[0] "%d poignée de dégradé sélectionnée sur %d" +msgstr[1] "%d poignées de dégradé sélectionnées sur %d" + +#. TRANSLATORS: The plural refers to number of selected objects +#: ../src/ui/tools/gradient-tool.cpp:159 +#, c-format +msgid "No gradient handles selected out of %d on %d selected object" +msgid_plural "No gradient handles selected out of %d on %d selected objects" +msgstr[0] "Aucune poignée sélectionnée sur %d dans %d objet sélectionné" +msgstr[1] "Aucune poignée sélectionnée sur %d dans %d objets sélectionnés" + +#: ../src/ui/tools/gradient-tool.cpp:442 +msgid "Simplify gradient" +msgstr "Simplifier le dégradé" + +#: ../src/ui/tools/gradient-tool.cpp:518 +msgid "Create default gradient" +msgstr "Créer un dégradé par défaut" + +#: ../src/ui/tools/gradient-tool.cpp:577 +#: ../src/ui/tools/mesh-tool.cpp:572 +msgid "Draw around handles to select them" +msgstr "Dessiner autour des poignées pour les sélectionner" + +#: ../src/ui/tools/gradient-tool.cpp:700 +msgid "Ctrl: snap gradient angle" +msgstr "Ctrl : pour forcer la modification de l'inclinaison du dégradé par incréments" + +#: ../src/ui/tools/gradient-tool.cpp:701 +msgid "Shift: draw gradient around the starting point" +msgstr "Maj : pour dessiner le dégradé autour du point de départ" + +#: ../src/ui/tools/gradient-tool.cpp:955 +#: ../src/ui/tools/mesh-tool.cpp:995 +#, c-format +msgid "Gradient for %d object; with Ctrl to snap angle" +msgid_plural "Gradient for %d objects; with Ctrl to snap angle" +msgstr[0] "Dégradé appliqué à %d objet; déplacer avec Ctrl pour forcer la modification de l'inclinaison par incréments" +msgstr[1] "Dégradé appliqué à %d objets; déplacer avec Ctrl pour forcer la modification de l'inclinaison par incréments" + +#: ../src/ui/tools/gradient-tool.cpp:959 +#: ../src/ui/tools/mesh-tool.cpp:999 +msgid "Select objects on which to create gradient." +msgstr "Sélectionner des objets auxquels appliquer un dégradé." + +#: ../src/ui/tools/lpe-tool.cpp:209 +#, fuzzy +msgid "Choose a construction tool from the toolbar." +msgstr "Sélectionner un outil secondaire dans la barre d'outils" + +#. TRANSLATORS: Mind the space in front. This is part of a compound message +#: ../src/ui/tools/mesh-tool.cpp:134 +#: ../src/ui/tools/mesh-tool.cpp:145 +#, fuzzy, c-format +msgid " out of %d mesh handle" +msgid_plural " out of %d mesh handles" +msgstr[0] " sur %d poignée de dégradé" +msgstr[1] " sur %d poignées de dégradé" + +#: ../src/ui/tools/mesh-tool.cpp:152 +#, fuzzy, c-format +msgid "%d mesh handle selected out of %d" +msgid_plural "%d mesh handles selected out of %d" +msgstr[0] "%d poignée de dégradé sélectionnée sur %d" +msgstr[1] "%d poignées de dégradé sélectionnées sur %d" + +#. TRANSLATORS: The plural refers to number of selected objects +#: ../src/ui/tools/mesh-tool.cpp:159 +#, fuzzy, c-format +msgid "No mesh handles selected out of %d on %d selected object" +msgid_plural "No mesh handles selected out of %d on %d selected objects" +msgstr[0] "Aucune poignée sélectionnée sur %d dans %d objet sélectionné" +msgstr[1] "Aucune poignée sélectionnée sur %d dans %d objets sélectionnés" + +#: ../src/ui/tools/mesh-tool.cpp:323 +msgid "Split mesh row/column" +msgstr "" + +#: ../src/ui/tools/mesh-tool.cpp:409 +msgid "Toggled mesh path type." +msgstr "" + +#: ../src/ui/tools/mesh-tool.cpp:413 +msgid "Approximated arc for mesh side." +msgstr "" + +#: ../src/ui/tools/mesh-tool.cpp:417 +msgid "Toggled mesh tensors." msgstr "" -"Maj : cliquer-déplacer pour ajouter des nœuds à la sélection, cliquer " -"pour inverser l'état de sélection de l'objet" -#: ../src/ui/tool/node-tool.cpp:557 +#: ../src/ui/tools/mesh-tool.cpp:421 +#, fuzzy +msgid "Smoothed mesh corner color." +msgstr "_Adoucir les coins" + +#: ../src/ui/tools/mesh-tool.cpp:425 +#, fuzzy +msgid "Picked mesh corner color." +msgstr "Capturer la teinte de la couleur" + +#: ../src/ui/tools/mesh-tool.cpp:500 +#, fuzzy +msgid "Create default mesh" +msgstr "Créer un dégradé par défaut" + +#: ../src/ui/tools/mesh-tool.cpp:720 +#, fuzzy +msgid "FIXMECtrl: snap mesh angle" +msgstr "Ctrl : pour tourner par incréments" + +#: ../src/ui/tools/mesh-tool.cpp:721 +#, fuzzy +msgid "FIXMEShift: draw mesh around the starting point" +msgstr "Maj : dessiner autour du point de départ" + +#: ../src/ui/tools/node-tool.cpp:557 +msgctxt "Node tool tip" +msgid "Shift: drag to add nodes to the selection, click to toggle object selection" +msgstr "Maj : cliquer-déplacer pour ajouter des nœuds à la sélection, cliquer pour inverser l'état de sélection de l'objet" + +#: ../src/ui/tools/node-tool.cpp:561 msgctxt "Node tool tip" msgid "Shift: drag to add nodes to the selection" msgstr "Maj : cliquer-déplacer pour ajouter des nœuds à la sélection" -#: ../src/ui/tool/node-tool.cpp:569 +#: ../src/ui/tools/node-tool.cpp:573 #, c-format msgid "%u of %u node selected." msgid_plural "%u of %u nodes selected." msgstr[0] "%u objet sur %u sélectionné" msgstr[1] "%u objets sur %u sélectionnés" -#: ../src/ui/tool/node-tool.cpp:575 +#: ../src/ui/tools/node-tool.cpp:579 #, c-format msgctxt "Node tool tip" msgid "%s Drag to select nodes, click to edit only this object (more: Shift)" -msgstr "" -"%s Cliquer-glisser pour sélectionner des nœuds, cliquer pour sélectionner " -"seulement cet objet (plus d'actions avec Maj)" +msgstr "%s Cliquer-glisser pour sélectionner des nœuds, cliquer pour sélectionner seulement cet objet (plus d'actions avec Maj)" -#: ../src/ui/tool/node-tool.cpp:581 +#: ../src/ui/tools/node-tool.cpp:585 #, c-format msgctxt "Node tool tip" msgid "%s Drag to select nodes, click clear the selection" -msgstr "" -"%s Cliquer-glisser pour sélectionner des nœuds, cliquer pour libérer la " -"sélection" +msgstr "%s Cliquer-glisser pour sélectionner des nœuds, cliquer pour libérer la sélection" -#: ../src/ui/tool/node-tool.cpp:590 +#: ../src/ui/tools/node-tool.cpp:594 msgctxt "Node tool tip" msgid "Drag to select nodes, click to edit only this object" -msgstr "" -"Cliquer-glisser pour sélectionner des nœuds, cliquer pour sélectionner " -"seulement cet objet" +msgstr "Cliquer-glisser pour sélectionner des nœuds, cliquer pour sélectionner seulement cet objet" -#: ../src/ui/tool/node-tool.cpp:593 +#: ../src/ui/tools/node-tool.cpp:597 msgctxt "Node tool tip" msgid "Drag to select nodes, click to clear the selection" -msgstr "" -"Cliquer-glisser pour sélectionner des nœuds, cliquer pour libérer la " -"sélection" +msgstr "Cliquer-glisser pour sélectionner des nœuds, cliquer pour libérer la sélection" -#: ../src/ui/tool/node-tool.cpp:598 +#: ../src/ui/tools/node-tool.cpp:602 msgctxt "Node tool tip" msgid "Drag to select objects to edit, click to edit this object (more: Shift)" -msgstr "" -"Cliquer-glisser pour sélectionner les objets à éditer, cliquer pour éditer " -"les objets (modificateur : Maj)" +msgstr "Cliquer-glisser pour sélectionner les objets à éditer, cliquer pour éditer les objets (modificateur : Maj)" -#: ../src/ui/tool/node-tool.cpp:601 +#: ../src/ui/tools/node-tool.cpp:605 msgctxt "Node tool tip" msgid "Drag to select objects to edit" msgstr "Cliquer-glisser pour sélectionner les objets à éditer" -#: ../src/ui/tool/path-manipulator.cpp:821 -msgid "Scale handle" -msgstr "Redimensionner la poignée" +#: ../src/ui/tools/pencil-tool.cpp:229 +#: ../src/ui/tools/pen-tool.cpp:413 +msgid "Continuing selected path" +msgstr "Prolongation du chemin sélectionné" -#: ../src/ui/tool/path-manipulator.cpp:845 -msgid "Rotate handle" -msgstr "Faire tourner la poignée" +#: ../src/ui/tools/pencil-tool.cpp:237 +#: ../src/ui/tools/pen-tool.cpp:423 +msgid "Creating new path" +msgstr "Création d'un nouveau chemin" -#. We need to call MPM's method because it could have been our last node -#: ../src/ui/tool/path-manipulator.cpp:1384 -#: ../src/widgets/node-toolbar.cpp:409 -msgid "Delete node" -msgstr "Supprimer le nœud" +#: ../src/ui/tools/pencil-tool.cpp:240 +#: ../src/ui/tools/pen-tool.cpp:425 +msgid "Appending to selected path" +msgstr "Ajout au chemin sélectionné" -#: ../src/ui/tool/path-manipulator.cpp:1392 -msgid "Cycle node type" -msgstr "Permuter le type de nœud" +#: ../src/ui/tools/pencil-tool.cpp:345 +msgid "Release here to close and finish the path." +msgstr "Relâcher ici pour fermer et terminer le chemin." -#: ../src/ui/tool/path-manipulator.cpp:1407 -msgid "Drag handle" -msgstr "Étirer la poignée" +#: ../src/ui/tools/pencil-tool.cpp:351 +msgid "Drawing a freehand path" +msgstr "Dessin d'une ligne à main levée" -#: ../src/ui/tool/path-manipulator.cpp:1416 -msgid "Retract handle" -msgstr "Retracter la poignée" +#: ../src/ui/tools/pencil-tool.cpp:356 +msgid "Drag to continue the path from this point." +msgstr "Déplacer pour continuer le chemin à partir de ce point." + +#. Write curves to object +#: ../src/ui/tools/pencil-tool.cpp:448 +msgid "Finishing freehand" +msgstr "Dessin à main levée terminé" + +#: ../src/ui/tools/pencil-tool.cpp:504 +#: ../src/ui/tools/pen-tool.cpp:193 +msgid "Drawing cancelled" +msgstr "Tracé annulé" + +#: ../src/ui/tools/pencil-tool.cpp:554 +msgid "Sketch mode: holding Alt interpolates between sketched paths. Release Alt to finalize." +msgstr "Mode croquis : maintenir Alt pour réaliser une interpolation entre les chemins croqués. Relacher Alt pour finaliser." + +#: ../src/ui/tools/pencil-tool.cpp:582 +msgid "Finishing freehand sketch" +msgstr "Croquis à main levée terminé" + +#: ../src/ui/tools/pen-tool.cpp:585 +msgid "Click or click and drag to close and finish the path." +msgstr "Cliquer ou cliquer-déplacer pour fermer et terminer le chemin." + +#: ../src/ui/tools/pen-tool.cpp:595 +msgid "Click or click and drag to continue the path from this point." +msgstr "Cliquer ou cliquer-déplacer pour prolonger le chemin à partir de ce point." + +#: ../src/ui/tools/pen-tool.cpp:1195 +#, c-format +msgid "Curve segment: angle %3.2f°, distance %s; with Ctrl to snap angle, Enter to finish the path" +msgstr "Segment de courbe : angle %3.2f°, distance %s ; Ctrl pour tourner par incréments ; Entrée pour terminer le chemin" + +#: ../src/ui/tools/pen-tool.cpp:1196 +#, c-format +msgid "Line segment: angle %3.2f°, distance %s; with Ctrl to snap angle, Enter to finish the path" +msgstr "Segment de droite : angle %3.2f°, distance %s ; Ctrl pour tourner par incréments ; Entrée pour terminer le chemin" + +#: ../src/ui/tools/pen-tool.cpp:1213 +#, c-format +msgid "Curve handle: angle %3.2f°, length %s; with Ctrl to snap angle" +msgstr "Poignée de contrôle: angle %3.2f°, longueur %s; Ctrl pour tourner par incréments" + +#: ../src/ui/tools/pen-tool.cpp:1235 +#, c-format +msgid "Curve handle, symmetric: angle %3.2f°, length %s; with Ctrl to snap angle, with Shift to move this handle only" +msgstr "Poignée de la courbe, symétrique : angle %3.2f°, longueur %s ; avec Ctrl pour tourner par incréments ; Maj pour ne déplacer que cette poignée" + +#: ../src/ui/tools/pen-tool.cpp:1236 +#, c-format +msgid "Curve handle: angle %3.2f°, length %s; with Ctrl to snap angle, with Shift to move this handle only" +msgstr "Poignée de la courbe : angle %3.2f°, longueur %s ; avec Ctrl pour tourner par incréments ; Maj pour ne déplacer que cette poignée" + +#: ../src/ui/tools/pen-tool.cpp:1282 +msgid "Drawing finished" +msgstr "Tracé terminé" + +#: ../src/ui/tools/rect-tool.cpp:296 +msgid "Ctrl: make square or integer-ratio rect, lock a rounded corner circular" +msgstr "Ctrl : forcer un rectangle carré ou de ratio entier, préserver le rayon d'arrondi d'un coin" + +#: ../src/ui/tools/rect-tool.cpp:457 +#, c-format +msgid "Rectangle: %s × %s (constrained to ratio %d:%d); with Shift to draw around the starting point" +msgstr "Rectangle : %s × %s; (contraint de ratio %d:%d) ; Maj pour dessiner autour du point de départ" + +#: ../src/ui/tools/rect-tool.cpp:460 +#, c-format +msgid "Rectangle: %s × %s (constrained to golden ratio 1.618 : 1); with Shift to draw around the starting point" +msgstr "Rectangle : %s × %s; (contraint au ratio du Nombre d'Or 1.618 : 1) ; Maj dessiner autour du point de départ" + +#: ../src/ui/tools/rect-tool.cpp:462 +#, c-format +msgid "Rectangle: %s × %s (constrained to golden ratio 1 : 1.618); with Shift to draw around the starting point" +msgstr "Rectangle : %s × %s; (contraint au ratio du Nombre d'Or 1 : 1.618) ; Maj pour dessiner autour du point de départ" + +#: ../src/ui/tools/rect-tool.cpp:466 +#, c-format +msgid "Rectangle: %s × %s; with Ctrl to make square or integer-ratio rectangle; with Shift to draw around the starting point" +msgstr "Rectangle : %s × %s; Ctrl forcer un rectangle carré ou de ratio entier; Maj dessiner autour du point de départ" + +#: ../src/ui/tools/rect-tool.cpp:489 +msgid "Create rectangle" +msgstr "Créer un rectangle" + +#: ../src/ui/tools/select-tool.cpp:170 +msgid "Click selection to toggle scale/rotation handles" +msgstr "Cliquer sur la sélection pour alterner entre poignées de redimensionnement et de rotation" + +#: ../src/ui/tools/select-tool.cpp:171 +msgid "No objects selected. Click, Shift+click, Alt+scroll mouse on top of objects, or drag around objects to select." +msgstr "Aucun objet sélectionné. Sélectionnez des objets par Clic, Maj+Clic ou Alt+molette, ou cliquez-déplacez autour des objets à sélectionner." + +#: ../src/ui/tools/select-tool.cpp:224 +msgid "Move canceled." +msgstr "Déplacement annulé." + +#: ../src/ui/tools/select-tool.cpp:232 +msgid "Selection canceled." +msgstr "Sélection annulée." + +#: ../src/ui/tools/select-tool.cpp:649 +msgid "Draw over objects to select them; release Alt to switch to rubberband selection" +msgstr "Tracer un trait passant par des objets pour les sélectionner. Lâcher la touche Alt pour repasser en mode sélection rectangle" + +#: ../src/ui/tools/select-tool.cpp:651 +msgid "Drag around objects to select them; press Alt to switch to touch selection" +msgstr "Entourer les objets pour les sélectionner; appuyer sur Alt pour passer en « toucher pour sélectionner »" + +#: ../src/ui/tools/select-tool.cpp:941 +msgid "Ctrl: click to select in groups; drag to move hor/vert" +msgstr "Ctrl : Cliquer pour sélectionner dans les groupes; cliquer-déplacer pour déplacer horizontalement/verticalment" + +#: ../src/ui/tools/select-tool.cpp:942 +msgid "Shift: click to toggle select; drag for rubberband selection" +msgstr "Maj : cliquer pour inverser l'état de sélection, cliquer-déplacer pour activer la sélection rectangle" + +#: ../src/ui/tools/select-tool.cpp:943 +msgid "Alt: click to select under; scroll mouse-wheel to cycle-select; drag to move selected or select by touch" +msgstr "Alt : cliquer pour sélectionner sous, utiliser la molette pour sélectionner cycliquement, cliquer-déplacer pour déplacer ou passer en « toucher pour sélectionner »" + +#: ../src/ui/tools/select-tool.cpp:1151 +msgid "Selected object is not a group. Cannot enter." +msgstr "L'objet sélectionné n'est pas un groupe. Impossible d'y entrer." + +#: ../src/ui/tools/spiral-tool.cpp:267 +msgid "Ctrl: snap angle" +msgstr "Ctrl : pour tourner par incréments" + +#: ../src/ui/tools/spiral-tool.cpp:269 +msgid "Alt: lock spiral radius" +msgstr "Alt : verrouiller le rayon de la spirale" + +#: ../src/ui/tools/spiral-tool.cpp:408 +#, c-format +msgid "Spiral: radius %s, angle %5g°; with Ctrl to snap angle" +msgstr "Spirale : rayon %s, angle %5g° ; avec Ctrl pour tourner par incréments" + +#: ../src/ui/tools/spiral-tool.cpp:429 +msgid "Create spiral" +msgstr "Créer une spirale" + +#: ../src/ui/tools/spray-tool.cpp:192 +#: ../src/ui/tools/tweak-tool.cpp:174 +#, c-format +msgid "%i object selected" +msgid_plural "%i objects selected" +msgstr[0] "%i objet sélectionné" +msgstr[1] "%i objets sélectionnés" + +#: ../src/ui/tools/spray-tool.cpp:194 +#: ../src/ui/tools/tweak-tool.cpp:176 +msgid "Nothing selected" +msgstr "Rien n'a été sélectionné." + +#: ../src/ui/tools/spray-tool.cpp:199 +#, c-format +msgid "%s. Drag, click or click and scroll to spray copies of the initial selection." +msgstr "%s. Cliquer-déplacer, cliquer ou défiler pour pulvériser des copies de la sélection initiale." + +#: ../src/ui/tools/spray-tool.cpp:202 +#, c-format +msgid "%s. Drag, click or click and scroll to spray clones of the initial selection." +msgstr "%s. Cliquer-déplacer, cliquer ou défiler pour pulvériser des clones de la sélection initiale." + +#: ../src/ui/tools/spray-tool.cpp:205 +#, c-format +msgid "%s. Drag, click or click and scroll to spray in a single path of the initial selection." +msgstr "%s. Cliquer-déplacer, cliquer ou défiler pour pulvériser dans un chemin unique la sélection initiale." + +#: ../src/ui/tools/spray-tool.cpp:645 +msgid "Nothing selected! Select objects to spray." +msgstr "Sélection vide ! Sélectionner les objets à pulvériser." + +#: ../src/ui/tools/spray-tool.cpp:720 +#: ../src/widgets/spray-toolbar.cpp:178 +msgid "Spray with copies" +msgstr "Pulvérise avec des copies" + +#: ../src/ui/tools/spray-tool.cpp:724 +#: ../src/widgets/spray-toolbar.cpp:185 +msgid "Spray with clones" +msgstr "Pulvérise avec des clones" + +#: ../src/ui/tools/spray-tool.cpp:728 +msgid "Spray in single path" +msgstr "Pulvérisation par union des formes" + +#: ../src/ui/tools/star-tool.cpp:281 +msgid "Ctrl: snap angle; keep rays radial" +msgstr "Ctrl pour tourner par incréments; forcer la radialité des branches" + +#: ../src/ui/tools/star-tool.cpp:427 +#, c-format +msgid "Polygon: radius %s, angle %5g°; with Ctrl to snap angle" +msgstr "Polygone : rayon %s, angle %5g° ; Ctrl pour tourner par incréments" + +#: ../src/ui/tools/star-tool.cpp:428 +#, c-format +msgid "Star: radius %s, angle %5g°; with Ctrl to snap angle" +msgstr "Étoile : rayon %s, angle %5g° ; Ctrl pour tourner/incliner par incréments" + +#: ../src/ui/tools/star-tool.cpp:456 +msgid "Create star" +msgstr "Créer une étoile" + +#: ../src/ui/tools/text-tool.cpp:392 +msgid "Click to edit the text, drag to select part of the text." +msgstr "Cliquer pour éditer le texte, cliquer-déplacer pour sélectionner une partie du texte." + +#: ../src/ui/tools/text-tool.cpp:394 +msgid "Click to edit the flowed text, drag to select part of the text." +msgstr "Cliquer pour éditer le texte encadré, cliquer-déplacer pour sélectionner une partie du texte." + +#: ../src/ui/tools/text-tool.cpp:448 +msgid "Create text" +msgstr "Créer un texte" + +#: ../src/ui/tools/text-tool.cpp:473 +msgid "Non-printable character" +msgstr "Caractère non imprimable" + +#: ../src/ui/tools/text-tool.cpp:488 +msgid "Insert Unicode character" +msgstr "Insérer un caractère Unicode" + +#: ../src/ui/tools/text-tool.cpp:523 +#, c-format +msgid "Unicode (Enter to finish): %s: %s" +msgstr "Unicode (Entrée pour terminer) : %s: %s" + +#: ../src/ui/tools/text-tool.cpp:525 +#: ../src/ui/tools/text-tool.cpp:832 +msgid "Unicode (Enter to finish): " +msgstr "Unicode (Entrée pour terminer) : " + +#: ../src/ui/tools/text-tool.cpp:608 +#, c-format +msgid "Flowed text frame: %s × %s" +msgstr "Cadre de texte : %s × %s" + +#: ../src/ui/tools/text-tool.cpp:666 +msgid "Type text; Enter to start new line." +msgstr "Taper le texte ; Entrée pour commencer une nouvelle ligne." + +#: ../src/ui/tools/text-tool.cpp:677 +msgid "Flowed text is created." +msgstr "Le texte encadré est créé." + +#: ../src/ui/tools/text-tool.cpp:679 +msgid "Create flowed text" +msgstr "Créer un texte encadré" + +#: ../src/ui/tools/text-tool.cpp:681 +msgid "The frame is too small for the current font size. Flowed text not created." +msgstr "Le cadre est trop petit pour la taille de police courante. Le texte encadré n'a pas été créé." + +#: ../src/ui/tools/text-tool.cpp:817 +msgid "No-break space" +msgstr "Espace insécable" + +#: ../src/ui/tools/text-tool.cpp:819 +msgid "Insert no-break space" +msgstr "Insérer un espace insécable" + +#: ../src/ui/tools/text-tool.cpp:856 +msgid "Make bold" +msgstr "Rendre gras" + +#: ../src/ui/tools/text-tool.cpp:874 +msgid "Make italic" +msgstr "Rendre italique" + +#: ../src/ui/tools/text-tool.cpp:913 +msgid "New line" +msgstr "Nouvelle ligne" + +#: ../src/ui/tools/text-tool.cpp:955 +msgid "Backspace" +msgstr "Retour arrière" + +#: ../src/ui/tools/text-tool.cpp:1011 +msgid "Kern to the left" +msgstr "Créner vers la gauche" + +#: ../src/ui/tools/text-tool.cpp:1036 +msgid "Kern to the right" +msgstr "Créner vers la droite" + +#: ../src/ui/tools/text-tool.cpp:1061 +msgid "Kern up" +msgstr "Créner vers le haut" + +#: ../src/ui/tools/text-tool.cpp:1086 +msgid "Kern down" +msgstr "Créner vers le bas" + +#: ../src/ui/tools/text-tool.cpp:1162 +msgid "Rotate counterclockwise" +msgstr "Tourner dans le sens anti-horaire" + +#: ../src/ui/tools/text-tool.cpp:1183 +msgid "Rotate clockwise" +msgstr "Tourner dans le sens horaire" + +#: ../src/ui/tools/text-tool.cpp:1200 +msgid "Contract line spacing" +msgstr "Diminuer l'espacement entre les lignes" + +#: ../src/ui/tools/text-tool.cpp:1207 +msgid "Contract letter spacing" +msgstr "Diminuer l'espacement des lettres" + +#: ../src/ui/tools/text-tool.cpp:1225 +msgid "Expand line spacing" +msgstr "Augmenter l'espacement entre les lignes" + +#: ../src/ui/tools/text-tool.cpp:1232 +msgid "Expand letter spacing" +msgstr "Augmenter l'espacement des lettres" + +#: ../src/ui/tools/text-tool.cpp:1362 +msgid "Paste text" +msgstr "Coller le texte" + +#: ../src/ui/tools/text-tool.cpp:1616 +#, c-format +msgid "Type or edit flowed text (%d character%s); Enter to start new paragraph." +msgid_plural "Type or edit flowed text (%d characters%s); Enter to start new paragraph." +msgstr[0] "Saisir ou modifier le texte encadré (%d caractère%s) ; Entrée pour commencer un nouveau paragraphe." +msgstr[1] "Saisir ou modifier le texte encadré (%d caractères%s) ; Entrée pour commencer un nouveau paragraphe." + +#: ../src/ui/tools/text-tool.cpp:1618 +#, c-format +msgid "Type or edit text (%d character%s); Enter to start new line." +msgid_plural "Type or edit text (%d characters%s); Enter to start new line." +msgstr[0] "Saisir ou modifier le texte (%d caractère%s) ; Entrée pour commencer une nouvelle ligne." +msgstr[1] "Saisir ou modifier le texte (%d caractères%s) ; Entrée pour commencer une nouvelle ligne." + +#: ../src/ui/tools/text-tool.cpp:1728 +msgid "Type text" +msgstr "Taper du texte" + +#: ../src/ui/tools/tool-base.cpp:697 +#, fuzzy +msgid "Space+mouse move to pan canvas" +msgstr "Espace+déplacer avec la souris pour bouger la zone de travail" + +#: ../src/ui/tools/tweak-tool.cpp:181 +#, c-format +msgid "%s. Drag to move." +msgstr "%s. Cliquer-glisser pour déplacer." + +#: ../src/ui/tools/tweak-tool.cpp:185 +#, c-format +msgid "%s. Drag or click to move in; with Shift to move out." +msgstr "%s. Cliquer-glisser ou cliquer pour rapprocher; avec Maj pour éloigner." + +#: ../src/ui/tools/tweak-tool.cpp:193 +#, c-format +msgid "%s. Drag or click to move randomly." +msgstr "%s. Glisser ou cliquer pour déplacer aléatoirement." + +#: ../src/ui/tools/tweak-tool.cpp:197 +#, c-format +msgid "%s. Drag or click to scale down; with Shift to scale up." +msgstr "%s. Cliquer-glisser ou cliquer pour réduire; avec Maj pour agrandir." + +#: ../src/ui/tools/tweak-tool.cpp:205 +#, c-format +msgid "%s. Drag or click to rotate clockwise; with Shift, counterclockwise." +msgstr "%s. Glisser ou cliquer pour pivoter dans le sens horaire ; avec Maj, dans le sens anti-horaire." + +#: ../src/ui/tools/tweak-tool.cpp:213 +#, c-format +msgid "%s. Drag or click to duplicate; with Shift, delete." +msgstr "%s. Glisser ou cliquer pour dupliquer ; avec Maj, supprime." + +#: ../src/ui/tools/tweak-tool.cpp:221 +#, c-format +msgid "%s. Drag to push paths." +msgstr "%s. Glisser pour pousser les chemins." + +#: ../src/ui/tools/tweak-tool.cpp:225 +#, c-format +msgid "%s. Drag or click to inset paths; with Shift to outset." +msgstr "%s. Cliquer-glisser ou cliquer pour rétrécir les chemins; avec Maj pour les élargir." + +#: ../src/ui/tools/tweak-tool.cpp:233 +#, c-format +msgid "%s. Drag or click to attract paths; with Shift to repel." +msgstr "%s. Cliquer-glisser ou cliquer pour attirer les chemins; avec Maj pour les repousser." + +#: ../src/ui/tools/tweak-tool.cpp:241 +#, c-format +msgid "%s. Drag or click to roughen paths." +msgstr "%s. Cliquer-glisser ou cliquer pour rendre les chemins rugueux." + +#: ../src/ui/tools/tweak-tool.cpp:245 +#, c-format +msgid "%s. Drag or click to paint objects with color." +msgstr "%s. Cliquer-glisser ou cliquer pour peindre les objets avec une couleur." + +#: ../src/ui/tools/tweak-tool.cpp:249 +#, c-format +msgid "%s. Drag or click to randomize colors." +msgstr "%s. Cliquer-glisser ou cliquer pour peindre avec une couleur aléatoire." + +#: ../src/ui/tools/tweak-tool.cpp:253 +#, c-format +msgid "%s. Drag or click to increase blur; with Shift to decrease." +msgstr "%s. Cliquer-glisser ou cliquer pour augmenter le flou; avec Maj pour le diminuer." + +#: ../src/ui/tools/tweak-tool.cpp:1200 +msgid "Nothing selected! Select objects to tweak." +msgstr "Sélection vide ! Sélectionner les objets à ajuster." + +#: ../src/ui/tools/tweak-tool.cpp:1234 +msgid "Move tweak" +msgstr "Ajuster en déplaçant" + +#: ../src/ui/tools/tweak-tool.cpp:1238 +msgid "Move in/out tweak" +msgstr "Ajuster en rapprochant ou en s'éloignant du curseur" + +#: ../src/ui/tools/tweak-tool.cpp:1242 +msgid "Move jitter tweak" +msgstr "Ajuster en déplaçant aléatoirement" + +#: ../src/ui/tools/tweak-tool.cpp:1246 +msgid "Scale tweak" +msgstr "Ajuster en redimensionnant" + +#: ../src/ui/tools/tweak-tool.cpp:1250 +msgid "Rotate tweak" +msgstr "Ajuster en pivotant" + +#: ../src/ui/tools/tweak-tool.cpp:1254 +msgid "Duplicate/delete tweak" +msgstr "Ajuster en dupliquant ou supprimant" + +#: ../src/ui/tools/tweak-tool.cpp:1258 +msgid "Push path tweak" +msgstr "Ajuster en poussant le chemin" + +#: ../src/ui/tools/tweak-tool.cpp:1262 +msgid "Shrink/grow path tweak" +msgstr "Ajuster en contractant ou en dilatant le chemin" + +#: ../src/ui/tools/tweak-tool.cpp:1266 +msgid "Attract/repel path tweak" +msgstr "Ajuster en attirant ou en repoussant le chemin" + +#: ../src/ui/tools/tweak-tool.cpp:1270 +msgid "Roughen path tweak" +msgstr "Ajuster en rendant le chemin plus rugueux" + +#: ../src/ui/tools/tweak-tool.cpp:1274 +msgid "Color paint tweak" +msgstr "Ajuster en peignant la couleur" + +#: ../src/ui/tools/tweak-tool.cpp:1278 +msgid "Color jitter tweak" +msgstr "Ajuster en variant les couleurs" + +#: ../src/ui/tools/tweak-tool.cpp:1282 +msgid "Blur tweak" +msgstr "Ajuster le niveau de flou" #: ../src/ui/tool/transform-handle-set.cpp:195 msgctxt "Transform handle tip" msgid "Shift+Ctrl: scale uniformly about the rotation center" -msgstr "" -"Maj+Ctrl : redimensionne uniformément autour du centre de rotation" +msgstr "Maj+Ctrl : redimensionne uniformément autour du centre de rotation" #: ../src/ui/tool/transform-handle-set.cpp:197 msgctxt "Transform handle tip" @@ -22258,11 +21356,8 @@ msgstr "Ctrl : redimensionner uniformément" #: ../src/ui/tool/transform-handle-set.cpp:202 msgctxt "Transform handle tip" -msgid "" -"Shift+Alt: scale using an integer ratio about the rotation center" -msgstr "" -"Maj+Alt : redimensionne conformément à un rapport entier autour du " -"centre de rotation" +msgid "Shift+Alt: scale using an integer ratio about the rotation center" +msgstr "Maj+Alt : redimensionne conformément à un rapport entier autour du centre de rotation" #: ../src/ui/tool/transform-handle-set.cpp:204 msgctxt "Transform handle tip" @@ -22277,9 +21372,7 @@ msgstr "Alt : redimensionne conformément à un rapport entier" #: ../src/ui/tool/transform-handle-set.cpp:209 msgctxt "Transform handle tip" msgid "Scale handle: drag to scale the selection" -msgstr "" -"Poignée de redimensionnement : cliquer-déplacer pour redimensionner " -"la sélection" +msgstr "Poignée de redimensionnement : cliquer-déplacer pour redimensionner la sélection" #: ../src/ui/tool/transform-handle-set.cpp:214 #, c-format @@ -22290,9 +21383,7 @@ msgstr "Redimensionnement de %.2f%% x %.2f%%" #: ../src/ui/tool/transform-handle-set.cpp:438 #, c-format msgctxt "Transform handle tip" -msgid "" -"Shift+Ctrl: rotate around the opposite corner and snap angle to %f° " -"increments" +msgid "Shift+Ctrl: rotate around the opposite corner and snap angle to %f° increments" msgstr "Maj+Ctrl : tourne autour du coin opposé par incréments de %f °" #: ../src/ui/tool/transform-handle-set.cpp:441 @@ -22308,12 +21399,8 @@ msgstr "Ctrl : tourner par incréments de %f °" #: ../src/ui/tool/transform-handle-set.cpp:447 msgctxt "Transform handle tip" -msgid "" -"Rotation handle: drag to rotate the selection around the rotation " -"center" -msgstr "" -"Poignée de rotation : cliquer-déplacer pour faire tourner la " -"sélection autour du centre de rotation" +msgid "Rotation handle: drag to rotate the selection around the rotation center" +msgstr "Poignée de rotation : cliquer-déplacer pour faire tourner la sélection autour du centre de rotation" #. event #: ../src/ui/tool/transform-handle-set.cpp:452 @@ -22325,12 +21412,8 @@ msgstr "Rotation de %.2f °" #: ../src/ui/tool/transform-handle-set.cpp:578 #, c-format msgctxt "Transform handle tip" -msgid "" -"Shift+Ctrl: skew about the rotation center with snapping to %f° " -"increments" -msgstr "" -"Maj+Ctrl : incliner par rapport au centre de rotation par incréments " -"de %f °" +msgid "Shift+Ctrl: skew about the rotation center with snapping to %f° increments" +msgstr "Maj+Ctrl : incliner par rapport au centre de rotation par incréments de %f °" #: ../src/ui/tool/transform-handle-set.cpp:581 msgctxt "Transform handle tip" @@ -22345,11 +21428,8 @@ msgstr "Ctrl : incliner par incréments de %f °" #: ../src/ui/tool/transform-handle-set.cpp:588 msgctxt "Transform handle tip" -msgid "" -"Skew handle: drag to skew (shear) selection about the opposite handle" -msgstr "" -"Poignée d'inclinaison : cliquer-déplacer pour incliner la sélection " -"par rapport à la poignée opposée" +msgid "Skew handle: drag to skew (shear) selection about the opposite handle" +msgstr "Poignée d'inclinaison : cliquer-déplacer pour incliner la sélection par rapport à la poignée opposée" #: ../src/ui/tool/transform-handle-set.cpp:594 #, c-format @@ -22366,9 +21446,7 @@ msgstr "Incline verticalement de %.2f °" #: ../src/ui/tool/transform-handle-set.cpp:656 msgctxt "Transform handle tip" msgid "Rotation center: drag to change the origin of transforms" -msgstr "" -"Centre de rotation : cliquer-déplacer pour modifier l'origine des " -"transformations" +msgstr "Centre de rotation : cliquer-déplacer pour modifier l'origine des transformations" #: ../src/ui/widget/filter-effect-chooser.cpp:27 msgid "Blur (%)" @@ -22486,12 +21564,8 @@ msgid "_Resize page to drawing or selection" msgstr "A_juster la page au dessin ou à la sélection" #: ../src/ui/widget/page-sizer.cpp:420 -msgid "" -"Resize the page to fit the current selection, or the entire drawing if there " -"is no selection" -msgstr "" -"Redimensionner la page pour l'ajuster à la sélection, ou au dessin entier " -"s'il n'y a pas de sélection" +msgid "Resize the page to fit the current selection, or the entire drawing if there is no selection" +msgstr "Redimensionner la page pour l'ajuster à la sélection, ou au dessin entier s'il n'y a pas de sélection" #: ../src/ui/widget/page-sizer.cpp:488 msgid "Set page size" @@ -22596,12 +21670,8 @@ msgid "Select a bitmap editor" msgstr "Sélectionnez un éditeur de bitmap" #: ../src/ui/widget/random.cpp:84 -msgid "" -"Reseed the random number generator; this creates a different sequence of " -"random numbers." -msgstr "" -"Réinitialiser le générateur pseudo-aléatoire; cela crée une nouvelle suite " -"de nombre aléatoires." +msgid "Reseed the random number generator; this creates a different sequence of random numbers." +msgstr "Réinitialiser le générateur pseudo-aléatoire; cela crée une nouvelle suite de nombre aléatoires." #: ../src/ui/widget/rendering-options.cpp:30 msgid "Backend" @@ -22624,24 +21694,12 @@ msgid "Preferred resolution of rendering, in dots per inch." msgstr "Résolution préférée (point par pouce) du rendu." #: ../src/ui/widget/rendering-options.cpp:43 -msgid "" -"Render using Cairo vector operations. The resulting image is usually " -"smaller in file size and can be arbitrarily scaled, but some filter effects " -"will not be correctly rendered." -msgstr "" -"Utiliser les opérateurs vectoriels Cairo. Le fichier image résultant est en " -"général moins volumineux et reste redimensionnable; cependant les motifs de " -"remplissage seront perdus." +msgid "Render using Cairo vector operations. The resulting image is usually smaller in file size and can be arbitrarily scaled, but some filter effects will not be correctly rendered." +msgstr "Utiliser les opérateurs vectoriels Cairo. Le fichier image résultant est en général moins volumineux et reste redimensionnable; cependant les motifs de remplissage seront perdus." #: ../src/ui/widget/rendering-options.cpp:48 -msgid "" -"Render everything as bitmap. The resulting image is usually larger in file " -"size and cannot be arbitrarily scaled without quality loss, but all objects " -"will be rendered exactly as displayed." -msgstr "" -"Tout imprimer en tant que bitmap. Le fichier image résultant sera en général " -"plus volumineux et n'est plus redimensionnable sans perte de qualité, " -"cependant tous les objets seront rendus tels qu'affichés." +msgid "Render everything as bitmap. The resulting image is usually larger in file size and cannot be arbitrarily scaled without quality loss, but all objects will be rendered exactly as displayed." +msgstr "Tout imprimer en tant que bitmap. Le fichier image résultant sera en général plus volumineux et n'est plus redimensionnable sans perte de qualité, cependant tous les objets seront rendus tels qu'affichés." #: ../src/ui/widget/selected-style.cpp:130 #: ../src/ui/widget/style-swatch.cpp:127 @@ -22660,7 +21718,7 @@ msgstr "N/A" #: ../src/ui/widget/selected-style.cpp:180 #: ../src/ui/widget/selected-style.cpp:1088 #: ../src/ui/widget/selected-style.cpp:1089 -#: ../src/widgets/gradient-toolbar.cpp:177 +#: ../src/widgets/gradient-toolbar.cpp:178 msgid "Nothing selected" msgstr "Aucune sélection" @@ -22683,7 +21741,8 @@ msgid "No stroke" msgstr "Aucun contour" #: ../src/ui/widget/selected-style.cpp:187 -#: ../src/ui/widget/style-swatch.cpp:301 ../src/widgets/paint-selector.cpp:242 +#: ../src/ui/widget/style-swatch.cpp:301 +#: ../src/widgets/paint-selector.cpp:242 msgid "Pattern" msgstr "Motif" @@ -22746,14 +21805,16 @@ msgstr "Indéfini" #: ../src/ui/widget/selected-style.cpp:220 #: ../src/ui/widget/selected-style.cpp:278 #: ../src/ui/widget/selected-style.cpp:559 -#: ../src/ui/widget/style-swatch.cpp:327 ../src/widgets/fill-style.cpp:712 +#: ../src/ui/widget/style-swatch.cpp:327 +#: ../src/widgets/fill-style.cpp:712 msgid "Unset fill" msgstr "Ne pas définir le remplissage" #: ../src/ui/widget/selected-style.cpp:220 #: ../src/ui/widget/selected-style.cpp:278 #: ../src/ui/widget/selected-style.cpp:575 -#: ../src/ui/widget/style-swatch.cpp:327 ../src/widgets/fill-style.cpp:712 +#: ../src/ui/widget/style-swatch.cpp:327 +#: ../src/widgets/fill-style.cpp:712 msgid "Unset stroke" msgstr "Ne pas définir le contour" @@ -22831,12 +21892,14 @@ msgid "Make stroke opaque" msgstr "Rendre le contour opaque" #: ../src/ui/widget/selected-style.cpp:282 -#: ../src/ui/widget/selected-style.cpp:541 ../src/widgets/fill-style.cpp:510 +#: ../src/ui/widget/selected-style.cpp:541 +#: ../src/widgets/fill-style.cpp:510 msgid "Remove fill" msgstr "Supprimer le remplissage" #: ../src/ui/widget/selected-style.cpp:282 -#: ../src/ui/widget/selected-style.cpp:550 ../src/widgets/fill-style.cpp:510 +#: ../src/ui/widget/selected-style.cpp:550 +#: ../src/widgets/fill-style.cpp:510 msgid "Remove stroke" msgstr "Supprimer le contour" @@ -22919,14 +21982,8 @@ msgstr "Ajuster l'opacité" #: ../src/ui/widget/selected-style.cpp:1359 #, c-format -msgid "" -"Adjusting alpha: was %.3g, now %.3g (diff %.3g); with Ctrl to adjust lightness, with Shift to adjust saturation, without " -"modifiers to adjust hue" -msgstr "" -"Ajustement de l'opacité : valeur précédente %.3g, désormais %.3g (diff. %.3g) ; Ctrl pour ajuster la luminosité, Maj pour " -"ajuster la saturation, sans touche modificatrice pour ajuster la teinte" +msgid "Adjusting alpha: was %.3g, now %.3g (diff %.3g); with Ctrl to adjust lightness, with Shift to adjust saturation, without modifiers to adjust hue" +msgstr "Ajustement de l'opacité : valeur précédente %.3g, désormais %.3g (diff. %.3g) ; Ctrl pour ajuster la luminosité, Maj pour ajuster la saturation, sans touche modificatrice pour ajuster la teinte" #: ../src/ui/widget/selected-style.cpp:1363 msgid "Adjust saturation" @@ -22934,14 +21991,8 @@ msgstr "Ajuster la saturation" #: ../src/ui/widget/selected-style.cpp:1365 #, c-format -msgid "" -"Adjusting saturation: was %.3g, now %.3g (diff %.3g); with " -"Ctrl to adjust lightness, with Alt to adjust alpha, without " -"modifiers to adjust hue" -msgstr "" -"Ajustement de la saturation : valeur précédente %.3g, désormais " -"%.3g (diff. %.3g) ; Ctrl pour ajuster la luminosité, csans touche " -"modificatrice pour ajuster la teinte" +msgid "Adjusting saturation: was %.3g, now %.3g (diff %.3g); with Ctrl to adjust lightness, with Alt to adjust alpha, without modifiers to adjust hue" +msgstr "Ajustement de la saturation : valeur précédente %.3g, désormais %.3g (diff. %.3g) ; Ctrl pour ajuster la luminosité, csans touche modificatrice pour ajuster la teinte" #: ../src/ui/widget/selected-style.cpp:1369 msgid "Adjust lightness" @@ -22949,14 +22000,8 @@ msgstr "Ajuster la luminosité" #: ../src/ui/widget/selected-style.cpp:1371 #, c-format -msgid "" -"Adjusting lightness: was %.3g, now %.3g (diff %.3g); with " -"Shift to adjust saturation, with Alt to adjust alpha, without " -"modifiers to adjust hue" -msgstr "" -"Ajustement de la luminosité : valeur précédente %.3g, désormais " -"%.3g (diff. %.3g) ; Maj pour ajuster la saturation, Alt " -"pour ajuster l'opacité, sans touche modificatrice pour ajuster la teinte" +msgid "Adjusting lightness: was %.3g, now %.3g (diff %.3g); with Shift to adjust saturation, with Alt to adjust alpha, without modifiers to adjust hue" +msgstr "Ajustement de la luminosité : valeur précédente %.3g, désormais %.3g (diff. %.3g) ; Maj pour ajuster la saturation, Alt pour ajuster l'opacité, sans touche modificatrice pour ajuster la teinte" #: ../src/ui/widget/selected-style.cpp:1375 msgid "Adjust hue" @@ -22964,14 +22009,8 @@ msgstr "Ajuster la teinte" #: ../src/ui/widget/selected-style.cpp:1377 #, c-format -msgid "" -"Adjusting hue: was %.3g, now %.3g (diff %.3g); with Shift to adjust saturation, with Alt to adjust alpha, with Ctrl " -"to adjust lightness" -msgstr "" -"Ajustement de la teinte : valeur précédente %.3g, désormais %.3g (diff. %.3g) ; Maj pour ajuster la saturation, Ctrl pour " -"ajuster la luminosité, Alt pour ajuster l'opacité" +msgid "Adjusting hue: was %.3g, now %.3g (diff %.3g); with Shift to adjust saturation, with Alt to adjust alpha, with Ctrl to adjust lightness" +msgstr "Ajustement de la teinte : valeur précédente %.3g, désormais %.3g (diff. %.3g) ; Maj pour ajuster la saturation, Ctrl pour ajuster la luminosité, Alt pour ajuster l'opacité" #: ../src/ui/widget/selected-style.cpp:1495 #: ../src/ui/widget/selected-style.cpp:1509 @@ -22981,12 +22020,11 @@ msgstr "Ajustement de l'épaisseur du contour" #: ../src/ui/widget/selected-style.cpp:1496 #, c-format msgid "Adjusting stroke width: was %.3g, now %.3g (diff %.3g)" -msgstr "" -"Ajustement de l'épaisseur du contour : de %.3g vers %.3g (diff " -"%.3g)" +msgstr "Ajustement de l'épaisseur du contour : de %.3g vers %.3g (diff %.3g)" #. TRANSLATORS: "Link" means to _link_ two sliders together -#: ../src/ui/widget/spin-scale.cpp:138 ../src/ui/widget/spin-slider.cpp:156 +#: ../src/ui/widget/spin-scale.cpp:138 +#: ../src/ui/widget/spin-slider.cpp:156 msgctxt "Sliders" msgid "Link" msgstr "Lier" @@ -23039,54 +22077,36 @@ msgstr "Boîte 3D : déplacer le point de fuite" #: ../src/vanishing-point.cpp:326 #, c-format msgid "Finite vanishing point shared by %d box" -msgid_plural "" -"Finite vanishing point shared by %d boxes; drag with Shift to separate selected box(es)" +msgid_plural "Finite vanishing point shared by %d boxes; drag with Shift to separate selected box(es)" msgstr[0] "Point de fuite fini partagé par %d boîte" -msgstr[1] "" -"Point de fuite fini partagé par %d boîtes; cliquer-déplacer " -"avec Maj pour séparer les boîte(s) sélectionnée(s)" +msgstr[1] "Point de fuite fini partagé par %d boîtes; cliquer-déplacer avec Maj pour séparer les boîte(s) sélectionnée(s)" #. This won't make sense any more when infinite VPs are not shown on the canvas, #. but currently we update the status message anyway #: ../src/vanishing-point.cpp:333 #, c-format msgid "Infinite vanishing point shared by %d box" -msgid_plural "" -"Infinite vanishing point shared by %d boxes; drag with " -"Shift to separate selected box(es)" +msgid_plural "Infinite vanishing point shared by %d boxes; drag with Shift to separate selected box(es)" msgstr[0] "Point de fuite infini partagé par %d boîte" -msgstr[1] "" -"Point de fuite infini partagé par %d boîtes; cliquer-déplacer " -"avec Maj pour séparer les boîte(s) sélectionnée(s)" +msgstr[1] "Point de fuite infini partagé par %d boîtes; cliquer-déplacer avec Maj pour séparer les boîte(s) sélectionnée(s)" #: ../src/vanishing-point.cpp:341 #, c-format -msgid "" -"shared by %d box; drag with Shift to separate selected box(es)" -msgid_plural "" -"shared by %d boxes; drag with Shift to separate selected box" -"(es)" -msgstr[0] "" -"partagé par %d boîte; déplacer avec Maj pour séparer les boîte" -"(s) sélectionnée(s)" -msgstr[1] "" -"partagé par %d boîtes; déplacer avec Maj pour séparer la boîte " -"sélectionnée" +msgid "shared by %d box; drag with Shift to separate selected box(es)" +msgid_plural "shared by %d boxes; drag with Shift to separate selected box(es)" +msgstr[0] "partagé par %d boîte; déplacer avec Maj pour séparer les boîte(s) sélectionnée(s)" +msgstr[1] "partagé par %d boîtes; déplacer avec Maj pour séparer la boîte sélectionnée" #: ../src/verbs.cpp:137 msgid "File" msgstr "Fichier" -#: ../src/verbs.cpp:156 ../src/widgets/calligraphy-toolbar.cpp:643 -msgid "Edit" -msgstr "Édition" - #: ../src/verbs.cpp:232 msgid "Context" msgstr "Contexte" -#: ../src/verbs.cpp:251 ../src/verbs.cpp:2226 +#: ../src/verbs.cpp:251 +#: ../src/verbs.cpp:2226 #: ../share/extensions/jessyInk_view.inx.h:1 #: ../share/extensions/polyhedron_3d.inx.h:26 msgid "View" @@ -23120,12 +22140,17 @@ msgstr "Transféré sur le calque précédent." msgid "Cannot go before first layer." msgstr "Impossible de transférer sous le premier calque." -#: ../src/verbs.cpp:1263 ../src/verbs.cpp:1360 ../src/verbs.cpp:1392 -#: ../src/verbs.cpp:1398 ../src/verbs.cpp:1422 ../src/verbs.cpp:1437 +#: ../src/verbs.cpp:1263 +#: ../src/verbs.cpp:1360 +#: ../src/verbs.cpp:1392 +#: ../src/verbs.cpp:1398 +#: ../src/verbs.cpp:1422 +#: ../src/verbs.cpp:1437 msgid "No current layer." msgstr "Aucun calque courant." -#: ../src/verbs.cpp:1292 ../src/verbs.cpp:1296 +#: ../src/verbs.cpp:1292 +#: ../src/verbs.cpp:1296 #, c-format msgid "Raised layer %s." msgstr "Calque %s monté." @@ -23138,7 +22163,8 @@ msgstr "Calque au premier plan" msgid "Raise layer" msgstr "Monter le calque" -#: ../src/verbs.cpp:1300 ../src/verbs.cpp:1304 +#: ../src/verbs.cpp:1300 +#: ../src/verbs.cpp:1304 #, c-format msgid "Lowered layer %s." msgstr "Calque %s descendu." @@ -23155,7 +22181,8 @@ msgstr "Descendre le calque" msgid "Cannot move layer any further." msgstr "Impossible de déplacer le calque plus loin." -#: ../src/verbs.cpp:1328 ../src/verbs.cpp:1347 +#: ../src/verbs.cpp:1328 +#: ../src/verbs.cpp:1347 #, c-format msgid "%s copy" msgstr "Copie de %s" @@ -23258,19 +22285,23 @@ msgstr "tutorial-elements.fr.svg" msgid "tutorial-tips.svg" msgstr "tutorial-tips.fr.svg" -#: ../src/verbs.cpp:2325 ../src/verbs.cpp:2915 +#: ../src/verbs.cpp:2325 +#: ../src/verbs.cpp:2917 msgid "Unlock all objects in the current layer" msgstr "Déverrouiller tous les objets sur le calque courant" -#: ../src/verbs.cpp:2329 ../src/verbs.cpp:2917 +#: ../src/verbs.cpp:2329 +#: ../src/verbs.cpp:2919 msgid "Unlock all objects in all layers" msgstr "Déverouiller tous les objets sur tous les calques" -#: ../src/verbs.cpp:2333 ../src/verbs.cpp:2919 +#: ../src/verbs.cpp:2333 +#: ../src/verbs.cpp:2921 msgid "Unhide all objects in the current layer" msgstr "Montrer tous les objets sur le calque courant" -#: ../src/verbs.cpp:2337 ../src/verbs.cpp:2921 +#: ../src/verbs.cpp:2337 +#: ../src/verbs.cpp:2923 msgid "Unhide all objects in all layers" msgstr "Montrer tous les objets sur tous les calques" @@ -23296,9 +22327,7 @@ msgstr "_Recharger" #: ../src/verbs.cpp:2360 msgid "Revert to the last saved version of document (changes will be lost)" -msgstr "" -"Recharger le dernier enregistrement du document (les changements seront " -"perdus)" +msgstr "Recharger le dernier enregistrement du document (les changements seront perdus)" #: ../src/verbs.cpp:2361 msgid "Save document" @@ -23334,12 +22363,8 @@ msgid "Clean _up document" msgstr "Nettoyer le doc_ument" #: ../src/verbs.cpp:2370 -msgid "" -"Remove unused definitions (such as gradients or clipping paths) from the <" -"defs> of the document" -msgstr "" -"Retirer les définitions inutilisées (comme des dégradés ou des chemins de " -"découpe) des <defs> du document" +msgid "Remove unused definitions (such as gradients or clipping paths) from the <defs> of the document" +msgstr "Retirer les définitions inutilisées (comme des dégradés ou des chemins de découpe) des <defs> du document" #: ../src/verbs.cpp:2372 msgid "_Import..." @@ -23399,14 +22424,12 @@ msgid "Quit Inkscape" msgstr "Quitter Inkscape" #: ../src/verbs.cpp:2386 -#, fuzzy msgid "_Templates..." -msgstr "_Palettes..." +msgstr "_Modèles..." #: ../src/verbs.cpp:2387 -#, fuzzy msgid "Create new project from template" -msgstr "Créer un nouveau document depuis le modèle par défaut" +msgstr "Créer un nouveau document depuis un modèle" #: ../src/verbs.cpp:2390 msgid "Undo last action" @@ -23438,9 +22461,7 @@ msgstr "C_oller" #: ../src/verbs.cpp:2399 msgid "Paste objects from clipboard to mouse point, or paste text" -msgstr "" -"Coller les objets du presse-papiers sous le pointeur de souris, ou coller du " -"texte" +msgstr "Coller les objets du presse-papiers sous le pointeur de souris, ou coller du texte" #: ../src/verbs.cpp:2400 msgid "Paste _Style" @@ -23452,9 +22473,7 @@ msgstr "Appliquer le style de l'objet copié à la sélection" #: ../src/verbs.cpp:2403 msgid "Scale selection to match the size of the copied object" -msgstr "" -"Redimensionner la sélection afin de correspondre aux dimensions de l'objet " -"sélectionné" +msgstr "Redimensionner la sélection afin de correspondre aux dimensions de l'objet sélectionné" #: ../src/verbs.cpp:2404 msgid "Paste _Width" @@ -23462,9 +22481,7 @@ msgstr "Coller la _largeur" #: ../src/verbs.cpp:2405 msgid "Scale selection horizontally to match the width of the copied object" -msgstr "" -"Redimensionne horizontalement la sélection afin d'avoir la largeur de " -"l'objet copié" +msgstr "Redimensionne horizontalement la sélection afin d'avoir la largeur de l'objet copié" #: ../src/verbs.cpp:2406 msgid "Paste _Height" @@ -23472,9 +22489,7 @@ msgstr "Coller la _hauteur" #: ../src/verbs.cpp:2407 msgid "Scale selection vertically to match the height of the copied object" -msgstr "" -"Redimensionne verticalement la sélection afin d'avoir la hauteur de l'objet " -"copié" +msgstr "Redimensionne verticalement la sélection afin d'avoir la hauteur de l'objet copié" #: ../src/verbs.cpp:2408 msgid "Paste Size Separately" @@ -23482,33 +22497,23 @@ msgstr "Coller les dimensions séparément" #: ../src/verbs.cpp:2409 msgid "Scale each selected object to match the size of the copied object" -msgstr "" -"Redimensionner chaque objet sélectionné afin de correspondre aux dimensions " -"de l'objet copié" +msgstr "Redimensionner chaque objet sélectionné afin de correspondre aux dimensions de l'objet copié" #: ../src/verbs.cpp:2410 msgid "Paste Width Separately" msgstr "Coller la largeur séparément" #: ../src/verbs.cpp:2411 -msgid "" -"Scale each selected object horizontally to match the width of the copied " -"object" -msgstr "" -"Redimensionner horizontalement chaque objet sélectionné afin de correspondre " -"à la largeur de l'objet copié" +msgid "Scale each selected object horizontally to match the width of the copied object" +msgstr "Redimensionner horizontalement chaque objet sélectionné afin de correspondre à la largeur de l'objet copié" #: ../src/verbs.cpp:2412 msgid "Paste Height Separately" msgstr "Coller la hauteur séparément" #: ../src/verbs.cpp:2413 -msgid "" -"Scale each selected object vertically to match the height of the copied " -"object" -msgstr "" -"Redimensionner verticalement chaque objet sélectionné afin de correspondre à " -"la hauteur de l'objet copié" +msgid "Scale each selected object vertically to match the height of the copied object" +msgstr "Redimensionner verticalement chaque objet sélectionné afin de correspondre à la hauteur de l'objet copié" #: ../src/verbs.cpp:2414 msgid "Paste _In Place" @@ -23571,12 +22576,8 @@ msgid "Unlin_k Clone" msgstr "_Délier le clone" #: ../src/verbs.cpp:2429 -msgid "" -"Cut the selected clones' links to the originals, turning them into " -"standalone objects" -msgstr "" -"Couper le lien entre le clone sélectionné et son original, le transformant " -"en objet indépendant" +msgid "Cut the selected clones' links to the originals, turning them into standalone objects" +msgstr "Couper le lien entre le clone sélectionné et son original, le transformant en objet indépendant" #: ../src/verbs.cpp:2430 msgid "Relink to Copied" @@ -23584,9 +22585,7 @@ msgstr "Relier à la copie" #: ../src/verbs.cpp:2431 msgid "Relink the selected clones to the object currently on the clipboard" -msgstr "" -"Relier les clones sélectionnés à l'objet actuellement placé dans le presse-" -"papier" +msgstr "Relier les clones sélectionnés à l'objet actuellement placé dans le presse-papier" #: ../src/verbs.cpp:2432 msgid "Select _Original" @@ -23601,9 +22600,7 @@ msgid "Clone original path (LPE)" msgstr "Cloner le chemin original (LPE)" #: ../src/verbs.cpp:2435 -msgid "" -"Creates a new path, applies the Clone original LPE, and refers it to the " -"selected path" +msgid "Creates a new path, applies the Clone original LPE, and refers it to the selected path" msgstr "" #: ../src/verbs.cpp:2436 @@ -23619,12 +22616,8 @@ msgid "Objects to Gu_ides" msgstr "Objets en gu_ides" #: ../src/verbs.cpp:2439 -msgid "" -"Convert selected objects to a collection of guidelines aligned with their " -"edges" -msgstr "" -"Convertir les objets sélectionnés en une collection de guides alignés avec " -"leurs bords" +msgid "Convert selected objects to a collection of guidelines aligned with their edges" +msgstr "Convertir les objets sélectionnés en une collection de guides alignés avec leurs bords" #: ../src/verbs.cpp:2440 msgid "Objects to Patter_n" @@ -23680,19 +22673,15 @@ msgstr "Tout s_électionner dans tous les calques" #: ../src/verbs.cpp:2453 msgid "Select all objects in all visible and unlocked layers" -msgstr "" -"Sélectionner tous les objets dans tous les calques visibles et non " -"verrouillés" +msgstr "Sélectionner tous les objets dans tous les calques visibles et non verrouillés" #: ../src/verbs.cpp:2454 msgid "Fill _and Stroke" msgstr "Remplissage _et contour" #: ../src/verbs.cpp:2455 -msgid "" -"Select all objects with the same fill and stroke as the selected objects" -msgstr "" -"Sélectionner tous les objets de même remplissage et contour que la sélection" +msgid "Select all objects with the same fill and stroke as the selected objects" +msgstr "Sélectionner tous les objets de même remplissage et contour que la sélection" #: ../src/verbs.cpp:2456 msgid "_Fill Color" @@ -23715,24 +22704,16 @@ msgid "Stroke St_yle" msgstr "St_yle du contour" #: ../src/verbs.cpp:2461 -msgid "" -"Select all objects with the same stroke style (width, dash, markers) as the " -"selected objects" -msgstr "" -"Sélectionner tous les objets de même style de contour (épaisseur, " -"pointillés, marqueurs) que la sélection" +msgid "Select all objects with the same stroke style (width, dash, markers) as the selected objects" +msgstr "Sélectionner tous les objets de même style de contour (épaisseur, pointillés, marqueurs) que la sélection" #: ../src/verbs.cpp:2462 msgid "_Object Type" msgstr "Type d'_objet" #: ../src/verbs.cpp:2463 -msgid "" -"Select all objects with the same object type (rect, arc, text, path, bitmap " -"etc) as the selected objects" -msgstr "" -"Sélectionner tous les objets de même type (rectangle, arc, texte, chemin, " -"bitmap, etc.) que la sélection" +msgid "Select all objects with the same object type (rect, arc, text, path, bitmap etc) as the selected objects" +msgstr "Sélectionner tous les objets de même type (rectangle, arc, texte, chemin, bitmap, etc.) que la sélection" #: ../src/verbs.cpp:2464 msgid "In_vert Selection" @@ -23740,9 +22721,7 @@ msgstr "In_verser la sélection" #: ../src/verbs.cpp:2465 msgid "Invert selection (unselect what is selected and select everything else)" -msgstr "" -"Inverser la sélection (désélectionner tout ce qui était sélectionné, et " -"sélectionner tout le reste)" +msgstr "Inverser la sélection (désélectionner tout ce qui était sélectionné, et sélectionner tout le reste)" #: ../src/verbs.cpp:2466 msgid "Invert in All Layers" @@ -23750,8 +22729,7 @@ msgstr "Inverser dans tous les calques" #: ../src/verbs.cpp:2467 msgid "Invert selection in all visible and unlocked layers" -msgstr "" -"Inverser la sélection dans tous les calques visibles et non verrouillés" +msgstr "Inverser la sélection dans tous les calques visibles et non verrouillés" #: ../src/verbs.cpp:2468 msgid "Select Next" @@ -23777,7 +22755,8 @@ msgstr "_Désélectionner" msgid "Deselect any selected objects or nodes" msgstr "Désélectionner tous les objets ou nœuds" -#: ../src/verbs.cpp:2475 ../src/verbs.cpp:2477 +#: ../src/verbs.cpp:2475 +#: ../src/verbs.cpp:2477 msgid "Create four guides aligned with the page borders" msgstr "Crée quatre guides alignés sur les bords de la page" @@ -23881,12 +22860,8 @@ msgid "E_xclusion" msgstr "E_xclusion" #: ../src/verbs.cpp:2511 -msgid "" -"Create exclusive OR of selected paths (those parts that belong to only one " -"path)" -msgstr "" -"Créer un OU exclusif des chemins sélectionnés (seules les parties qui " -"n'appartiennent qu'à un seul chemin)" +msgid "Create exclusive OR of selected paths (those parts that belong to only one path)" +msgstr "Créer un OU exclusif des chemins sélectionnés (seules les parties qui n'appartiennent qu'à un seul chemin)" #: ../src/verbs.cpp:2512 msgid "Di_vision" @@ -23998,9 +22973,7 @@ msgstr "Invers_er" #: ../src/verbs.cpp:2551 msgid "Reverse the direction of selected paths (useful for flipping markers)" -msgstr "" -"Inverser la direction des chemins sélectionnés (utile pour retourner des " -"marqueurs)" +msgstr "Inverser la direction des chemins sélectionnés (utile pour retourner des marqueurs)" #: ../src/verbs.cpp:2554 msgid "Create one or more paths from a bitmap by tracing it" @@ -24256,12 +23229,8 @@ msgid "_Flow into Frame" msgstr "_Encadrer" #: ../src/verbs.cpp:2625 -msgid "" -"Put text into a frame (path or shape), creating a flowed text linked to the " -"frame object" -msgstr "" -"Placer du texte dans un cadre (chemin ou forme), créant un texte encadré lié " -"à l'objet cadre" +msgid "Put text into a frame (path or shape), creating a flowed text linked to the frame object" +msgstr "Placer du texte dans un cadre (chemin ou forme), créant un texte encadré lié à l'objet cadre" #: ../src/verbs.cpp:2626 msgid "_Unflow" @@ -24277,8 +23246,7 @@ msgstr "_Convertir en texte" #: ../src/verbs.cpp:2629 msgid "Convert flowed text to regular text object (preserves appearance)" -msgstr "" -"Convertir du texte encadré en objet texte normal (en préservant l'apparence)" +msgstr "Convertir du texte encadré en objet texte normal (en préservant l'apparence)" #: ../src/verbs.cpp:2631 msgid "Flip _Horizontal" @@ -24298,15 +23266,14 @@ msgstr "Retourner verticalement les objets sélectionnés" #: ../src/verbs.cpp:2637 msgid "Apply mask to selection (using the topmost object as mask)" -msgstr "" -"Appliquer un masque à la sélection (en utilisant l'objet le plus au-dessus " -"comme masque)" +msgstr "Appliquer un masque à la sélection (en utilisant l'objet le plus au-dessus comme masque)" #: ../src/verbs.cpp:2639 msgid "Edit mask" msgstr "Modifier le masque" -#: ../src/verbs.cpp:2640 ../src/verbs.cpp:2646 +#: ../src/verbs.cpp:2640 +#: ../src/verbs.cpp:2646 msgid "_Release" msgstr "_Retirer" @@ -24315,11 +23282,8 @@ msgid "Remove mask from selection" msgstr "Retirer le masque de la sélection" #: ../src/verbs.cpp:2643 -msgid "" -"Apply clipping path to selection (using the topmost object as clipping path)" -msgstr "" -"Appliquer un chemin de découpe à la sélection (en utilisant l'objet le plus " -"au-dessus comme chemin de découpe)" +msgid "Apply clipping path to selection (using the topmost object as clipping path)" +msgstr "Appliquer un chemin de découpe à la sélection (en utilisant l'objet le plus au-dessus comme chemin de découpe)" #: ../src/verbs.cpp:2645 msgid "Edit clipping path" @@ -24478,7 +23442,8 @@ msgctxt "ContextVerb" msgid "Dropper" msgstr "Pipette" -#: ../src/verbs.cpp:2685 ../src/widgets/sp-color-notebook.cpp:411 +#: ../src/verbs.cpp:2685 +#: ../src/widgets/sp-color-notebook.cpp:411 msgid "Pick colors from image" msgstr "Capturer des couleurs depuis l'image" @@ -24752,9 +23717,7 @@ msgstr "G_uides" #: ../src/verbs.cpp:2747 msgid "Show or hide guides (drag from a ruler to create a guide)" -msgstr "" -"Afficher ou non les guides (pour créer un guide, effectuer un cliquer-" -"déplacer depuis une règle)" +msgstr "Afficher ou non les guides (pour créer un guide, effectuer un cliquer-déplacer depuis une règle)" #: ../src/verbs.cpp:2748 msgid "Enable snapping" @@ -24852,7 +23815,8 @@ msgstr "Zoomer à 2:1" msgid "_Fullscreen" msgstr "Plein _écran" -#: ../src/verbs.cpp:2766 ../src/verbs.cpp:2768 +#: ../src/verbs.cpp:2766 +#: ../src/verbs.cpp:2768 msgid "Stretch this document window to full screen" msgstr "Afficher cette fenêtre (document) en plein écran" @@ -24885,7 +23849,8 @@ msgid "New View Preview" msgstr "Nouvel aperçu" #. "view_new_preview" -#: ../src/verbs.cpp:2778 ../src/verbs.cpp:2786 +#: ../src/verbs.cpp:2778 +#: ../src/verbs.cpp:2786 msgid "_Normal" msgstr "_Normal" @@ -24911,7 +23876,8 @@ msgstr "Passer en mode d'affichage contour (fil de fer)" #. new ZoomVerb(SP_VERB_VIEW_COLOR_MODE_PRINT_COLORS_PREVIEW, "ViewColorModePrintColorsPreview", N_("_Print Colors Preview"), #. N_("Switch to print colors preview mode"), NULL), -#: ../src/verbs.cpp:2784 ../src/verbs.cpp:2792 +#: ../src/verbs.cpp:2784 +#: ../src/verbs.cpp:2792 msgid "_Toggle" msgstr "Al_terner" @@ -24933,8 +23899,7 @@ msgstr "Passer en mode d'affichage niveaux de gris" #: ../src/verbs.cpp:2793 msgid "Toggle between normal and grayscale color display modes" -msgstr "" -"Alterner entre les modes d'affichage de couleur normal et niveaux de gris" +msgstr "Alterner entre les modes d'affichage de couleur normal et niveaux de gris" #: ../src/verbs.cpp:2795 msgid "Color-managed view" @@ -24942,9 +23907,7 @@ msgstr "Affichage avec gestion des couleurs" #: ../src/verbs.cpp:2796 msgid "Toggle color-managed display for this document window" -msgstr "" -"Alterner entre le mode d'affichage avec gestion des couleurs et le mode " -"normal pour cette fenêtre de document" +msgstr "Alterner entre le mode d'affichage avec gestion des couleurs et le mode normal pour cette fenêtre de document" #: ../src/verbs.cpp:2798 msgid "Ico_n Preview..." @@ -24952,8 +23915,7 @@ msgstr "Aperçu d'_icône..." #: ../src/verbs.cpp:2799 msgid "Open a window to preview objects at different icon resolutions" -msgstr "" -"Ouvrir une fenêtre d'aperçu des objets en icônes à différentes résolutions" +msgstr "Ouvrir une fenêtre d'aperçu des objets en icônes à différentes résolutions" #: ../src/verbs.cpp:2801 msgid "Zoom to fit page in window" @@ -25001,434 +23963,408 @@ msgid "Edit document metadata (to be saved with the document)" msgstr "Éditer les métadonnées du document (enregistrées avec celui-ci)" #: ../src/verbs.cpp:2817 -msgid "" -"Edit objects' colors, gradients, arrowheads, and other fill and stroke " -"properties..." -msgstr "" -"Éditer les couleurs de l'objet, ses dégradés, les têtes de flèches, et " -"autres propriétés de remplissage et contour..." +msgid "Edit objects' colors, gradients, arrowheads, and other fill and stroke properties..." +msgstr "Éditer les couleurs de l'objet, ses dégradés, les têtes de flèches, et autres propriétés de remplissage et contour..." -#: ../src/verbs.cpp:2818 +#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-font" icon +#: ../src/verbs.cpp:2819 msgid "Gl_yphs..." msgstr "Gl_yphes..." -#: ../src/verbs.cpp:2819 +#: ../src/verbs.cpp:2820 msgid "Select characters from a glyphs palette" msgstr "Sélectionner des caractères depuis une palette de glyphes" +#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-color" icon #. TRANSLATORS: "Swatches" means: color samples -#: ../src/verbs.cpp:2821 +#: ../src/verbs.cpp:2823 msgid "S_watches..." msgstr "_Palettes..." -#: ../src/verbs.cpp:2822 +#: ../src/verbs.cpp:2824 msgid "Select colors from a swatches palette" msgstr "Sélectionner des couleurs depuis une palette" -#: ../src/verbs.cpp:2823 +#: ../src/verbs.cpp:2825 msgid "S_ymbols..." msgstr "S_ymboles..." -#: ../src/verbs.cpp:2824 +#: ../src/verbs.cpp:2826 msgid "Select symbol from a symbols palette" msgstr "Sélectionnez un symbole depuis une palette" -#: ../src/verbs.cpp:2825 +#: ../src/verbs.cpp:2827 msgid "Transfor_m..." msgstr "_Transformer..." -#: ../src/verbs.cpp:2826 +#: ../src/verbs.cpp:2828 msgid "Precisely control objects' transformations" msgstr "Contrôler précisément les transformations d'objets" -#: ../src/verbs.cpp:2827 +#: ../src/verbs.cpp:2829 msgid "_Align and Distribute..." msgstr "Aligner et distri_buer..." -#: ../src/verbs.cpp:2828 +#: ../src/verbs.cpp:2830 msgid "Align and distribute objects" msgstr "Aligner et distribuer des objets" -#: ../src/verbs.cpp:2829 +#: ../src/verbs.cpp:2831 msgid "_Spray options..." msgstr "Options du pulvéri_sateur..." -#: ../src/verbs.cpp:2830 +#: ../src/verbs.cpp:2832 msgid "Some options for the spray" msgstr "Options pour l'aérographe" -#: ../src/verbs.cpp:2831 +#: ../src/verbs.cpp:2833 msgid "Undo _History..." msgstr "_Historique des annulations" -#: ../src/verbs.cpp:2832 +#: ../src/verbs.cpp:2834 msgid "Undo History" msgstr "Historique des annulations" -#: ../src/verbs.cpp:2834 +#: ../src/verbs.cpp:2836 msgid "View and select font family, font size and other text properties" -msgstr "" -"Voir et sélectionner une police, une taille de police et autres propriétés " -"de texte" +msgstr "Voir et sélectionner une police, une taille de police et autres propriétés de texte" -#: ../src/verbs.cpp:2835 +#: ../src/verbs.cpp:2837 msgid "_XML Editor..." msgstr "Éditeur _XML..." -#: ../src/verbs.cpp:2836 +#: ../src/verbs.cpp:2838 msgid "View and edit the XML tree of the document" msgstr "Voir et éditer l'arbre XML du document" -#: ../src/verbs.cpp:2837 +#: ../src/verbs.cpp:2839 msgid "_Find/Replace..." msgstr "Rechercher/_remplacer..." -#: ../src/verbs.cpp:2838 +#: ../src/verbs.cpp:2840 msgid "Find objects in document" msgstr "Rechercher des objets dans le document" -#: ../src/verbs.cpp:2839 +#: ../src/verbs.cpp:2841 msgid "Find and _Replace Text..." msgstr "Trouver et _remplacer le texte..." -#: ../src/verbs.cpp:2840 +#: ../src/verbs.cpp:2842 msgid "Find and replace text in document" msgstr "Rechercher et remplacer du texte dans le document" -#: ../src/verbs.cpp:2842 +#: ../src/verbs.cpp:2844 msgid "Check spelling of text in document" msgstr "Vérifier l'orthographe des texte du document" -#: ../src/verbs.cpp:2843 +#: ../src/verbs.cpp:2845 msgid "_Messages..." msgstr "_Messages..." -#: ../src/verbs.cpp:2844 +#: ../src/verbs.cpp:2846 msgid "View debug messages" msgstr "Voir les messages de débuggage" -#: ../src/verbs.cpp:2845 +#: ../src/verbs.cpp:2847 msgid "Show/Hide D_ialogs" msgstr "Afficher/cacher les boîtes de d_ialogue" -#: ../src/verbs.cpp:2846 +#: ../src/verbs.cpp:2848 msgid "Show or hide all open dialogs" msgstr "Afficher ou non les dialogues ouverts" -#: ../src/verbs.cpp:2847 +#: ../src/verbs.cpp:2849 msgid "Create Tiled Clones..." msgstr "Créer un pavage avec des clones..." -#: ../src/verbs.cpp:2848 -msgid "" -"Create multiple clones of selected object, arranging them into a pattern or " -"scattering" -msgstr "" -"Créer des clones multiple d'un objet, et les arranger selon un motif ou les " -"disperser" +#: ../src/verbs.cpp:2850 +msgid "Create multiple clones of selected object, arranging them into a pattern or scattering" +msgstr "Créer des clones multiple d'un objet, et les arranger selon un motif ou les disperser" -#: ../src/verbs.cpp:2849 +#: ../src/verbs.cpp:2851 msgid "_Object attributes..." msgstr "_Attributs de l'objet..." -#: ../src/verbs.cpp:2850 +#: ../src/verbs.cpp:2852 msgid "Edit the object attributes..." msgstr "Éditer les attributs de l'objet..." -#: ../src/verbs.cpp:2852 +#: ../src/verbs.cpp:2854 msgid "Edit the ID, locked and visible status, and other object properties" -msgstr "" -"Editer l'Id, les statuts de visibilité et de verrouillage et autres " -"propriétés des objets" +msgstr "Editer l'Id, les statuts de visibilité et de verrouillage et autres propriétés des objets" -#: ../src/verbs.cpp:2853 +#: ../src/verbs.cpp:2855 msgid "_Input Devices..." msgstr "Périp_hériques de saisie..." -#: ../src/verbs.cpp:2854 +#: ../src/verbs.cpp:2856 msgid "Configure extended input devices, such as a graphics tablet" -msgstr "" -"Configurer les périphériques de saisie étendus, comme une tablette graphique" +msgstr "Configurer les périphériques de saisie étendus, comme une tablette graphique" -#: ../src/verbs.cpp:2855 +#: ../src/verbs.cpp:2857 msgid "_Extensions..." msgstr "_Extensions..." -#: ../src/verbs.cpp:2856 +#: ../src/verbs.cpp:2858 msgid "Query information about extensions" msgstr "Demander des informations à propos des extensions" -#: ../src/verbs.cpp:2857 +#: ../src/verbs.cpp:2859 msgid "Layer_s..." msgstr "_Calques..." -#: ../src/verbs.cpp:2858 +#: ../src/verbs.cpp:2860 msgid "View Layers" msgstr "Afficher les calques" -#: ../src/verbs.cpp:2859 +#: ../src/verbs.cpp:2861 msgid "Path E_ffects ..." msgstr "E_ffets de chemin..." -#: ../src/verbs.cpp:2860 +#: ../src/verbs.cpp:2862 msgid "Manage, edit, and apply path effects" msgstr "Créer, modifier et appliquer des effets de chemin" -#: ../src/verbs.cpp:2861 +#: ../src/verbs.cpp:2863 msgid "Filter _Editor..." msgstr "Édit_eur de filtres..." -#: ../src/verbs.cpp:2862 +#: ../src/verbs.cpp:2864 msgid "Manage, edit, and apply SVG filters" msgstr "Gérer, modifier et appliquer des filtres SVG" -#: ../src/verbs.cpp:2863 +#: ../src/verbs.cpp:2865 msgid "SVG Font Editor..." msgstr "Éditeur de fontes SVG..." -#: ../src/verbs.cpp:2864 +#: ../src/verbs.cpp:2866 msgid "Edit SVG fonts" msgstr "Éditer les fontes SVG" -#: ../src/verbs.cpp:2865 +#: ../src/verbs.cpp:2867 msgid "Print Colors..." msgstr "Imprimer les couleurs..." -#: ../src/verbs.cpp:2866 -msgid "" -"Select which color separations to render in Print Colors Preview rendermode" -msgstr "" -"Sélectionner quelles séparations de couleur afficher en mode aperçu des " -"couleurs d'impression" +#: ../src/verbs.cpp:2868 +msgid "Select which color separations to render in Print Colors Preview rendermode" +msgstr "Sélectionner quelles séparations de couleur afficher en mode aperçu des couleurs d'impression" -#: ../src/verbs.cpp:2867 +#: ../src/verbs.cpp:2869 msgid "_Export PNG Image..." msgstr "_Exporter une image PNG..." -#: ../src/verbs.cpp:2868 +#: ../src/verbs.cpp:2870 msgid "Export this document or a selection as a PNG image" msgstr "Exporter ce document ou une sélection en une image PNG" #. Help -#: ../src/verbs.cpp:2870 +#: ../src/verbs.cpp:2872 msgid "About E_xtensions" msgstr "À propos des e_xtensions" -#: ../src/verbs.cpp:2871 +#: ../src/verbs.cpp:2873 msgid "Information on Inkscape extensions" msgstr "Information sur les extensions d'Inkscape" -#: ../src/verbs.cpp:2872 +#: ../src/verbs.cpp:2874 msgid "About _Memory" msgstr "Gestion _mémoire" -#: ../src/verbs.cpp:2873 +#: ../src/verbs.cpp:2875 msgid "Memory usage information" msgstr "Information sur l'utilisation de la mémoire" -#: ../src/verbs.cpp:2874 +#: ../src/verbs.cpp:2876 msgid "_About Inkscape" msgstr "À _propos d'Inkscape" -#: ../src/verbs.cpp:2875 +#: ../src/verbs.cpp:2877 msgid "Inkscape version, authors, license" msgstr "Version, auteurs et licence d'Inkscape" #. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"), #. N_("Distribution terms"), /*"show_license"*/"inkscape_options"), #. Tutorials -#: ../src/verbs.cpp:2880 +#: ../src/verbs.cpp:2882 msgid "Inkscape: _Basic" msgstr "Inkscape : _basique" -#: ../src/verbs.cpp:2881 +#: ../src/verbs.cpp:2883 msgid "Getting started with Inkscape" msgstr "Premiers pas avec Inkscape" #. "tutorial_basic" -#: ../src/verbs.cpp:2882 +#: ../src/verbs.cpp:2884 msgid "Inkscape: _Shapes" msgstr "Inkscape : _formes" -#: ../src/verbs.cpp:2883 +#: ../src/verbs.cpp:2885 msgid "Using shape tools to create and edit shapes" msgstr "Utilisation des outils de formes pour créer et éditer des formes" -#: ../src/verbs.cpp:2884 +#: ../src/verbs.cpp:2886 msgid "Inkscape: _Advanced" msgstr "Inkscape : _avancé" -#: ../src/verbs.cpp:2885 +#: ../src/verbs.cpp:2887 msgid "Advanced Inkscape topics" msgstr "Sujets avancés d'Inkscape" #. "tutorial_advanced" #. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize) -#: ../src/verbs.cpp:2887 +#: ../src/verbs.cpp:2889 msgid "Inkscape: T_racing" msgstr "Inkscape : _vectorisation" -#: ../src/verbs.cpp:2888 +#: ../src/verbs.cpp:2890 msgid "Using bitmap tracing" msgstr "Vectorisation de bitmap" #. "tutorial_tracing" -#: ../src/verbs.cpp:2889 +#: ../src/verbs.cpp:2891 #, fuzzy msgid "Inkscape: Tracing Pixel Art" msgstr "Inkscape : _vectorisation" -#: ../src/verbs.cpp:2890 +#: ../src/verbs.cpp:2892 msgid "Using Trace Pixel Art dialog" msgstr "" -#: ../src/verbs.cpp:2891 +#: ../src/verbs.cpp:2893 msgid "Inkscape: _Calligraphy" msgstr "Inkscape : _calligraphie" -#: ../src/verbs.cpp:2892 +#: ../src/verbs.cpp:2894 msgid "Using the Calligraphy pen tool" msgstr "Utilisation de la plume calligraphique d'Inkscape" -#: ../src/verbs.cpp:2893 +#: ../src/verbs.cpp:2895 msgid "Inkscape: _Interpolate" msgstr "Inkscape : _Interpolation" -#: ../src/verbs.cpp:2894 +#: ../src/verbs.cpp:2896 msgid "Using the interpolate extension" msgstr "Utiliser l'extension Interpoler" #. "tutorial_interpolate" -#: ../src/verbs.cpp:2895 +#: ../src/verbs.cpp:2897 msgid "_Elements of Design" msgstr "Rudiments de _design" -#: ../src/verbs.cpp:2896 +#: ../src/verbs.cpp:2898 msgid "Principles of design in the tutorial form" msgstr "Rudiments de design sous forme de didacticiel" #. "tutorial_design" -#: ../src/verbs.cpp:2897 +#: ../src/verbs.cpp:2899 msgid "_Tips and Tricks" msgstr "_Trucs et astuces" -#: ../src/verbs.cpp:2898 +#: ../src/verbs.cpp:2900 msgid "Miscellaneous tips and tricks" msgstr "Divers trucs et astuces" #. "tutorial_tips" #. Effect -- renamed Extension -#: ../src/verbs.cpp:2901 +#: ../src/verbs.cpp:2903 msgid "Previous Exte_nsion" msgstr "Exte_nsion précédente" -#: ../src/verbs.cpp:2902 +#: ../src/verbs.cpp:2904 msgid "Repeat the last extension with the same settings" msgstr "Répéter la dernière extension avec les mêmes paramètres" -#: ../src/verbs.cpp:2903 +#: ../src/verbs.cpp:2905 msgid "_Previous Extension Settings..." msgstr "_Paramètres de l'extension précédente..." -#: ../src/verbs.cpp:2904 +#: ../src/verbs.cpp:2906 msgid "Repeat the last extension with new settings" msgstr "Répéter la dernière extension avec les nouveaux paramètres" -#: ../src/verbs.cpp:2908 +#: ../src/verbs.cpp:2910 msgid "Fit the page to the current selection" msgstr "Ajuster la page à la sélection courante" -#: ../src/verbs.cpp:2910 +#: ../src/verbs.cpp:2912 msgid "Fit the page to the drawing" msgstr "Ajuster la page au dessin" -#: ../src/verbs.cpp:2912 -msgid "" -"Fit the page to the current selection or the drawing if there is no selection" -msgstr "" -"Ajuster la page à la sélection courante ou au dessin s'il n'y a pas de " -"sélection" +#: ../src/verbs.cpp:2914 +msgid "Fit the page to the current selection or the drawing if there is no selection" +msgstr "Ajuster la page à la sélection courante ou au dessin s'il n'y a pas de sélection" #. LockAndHide -#: ../src/verbs.cpp:2914 +#: ../src/verbs.cpp:2916 msgid "Unlock All" msgstr "Déverrouiller tout" -#: ../src/verbs.cpp:2916 +#: ../src/verbs.cpp:2918 msgid "Unlock All in All Layers" msgstr "Tout déverouiller dans tous les calques" -#: ../src/verbs.cpp:2918 +#: ../src/verbs.cpp:2920 msgid "Unhide All" msgstr "Montrer tout" -#: ../src/verbs.cpp:2920 +#: ../src/verbs.cpp:2922 msgid "Unhide All in All Layers" msgstr "Tout montrer dans tous les calques" -#: ../src/verbs.cpp:2924 +#: ../src/verbs.cpp:2926 msgid "Link an ICC color profile" msgstr "Lier un profil de couleur ICC" -#: ../src/verbs.cpp:2925 +#: ../src/verbs.cpp:2927 msgid "Remove Color Profile" msgstr "Supprimer le profil de couleur" -#: ../src/verbs.cpp:2926 +#: ../src/verbs.cpp:2928 msgid "Remove a linked ICC color profile" msgstr "Supprimer un profil de couleur ICC lié" -#: ../src/verbs.cpp:2929 -#, fuzzy +#: ../src/verbs.cpp:2931 msgid "Add External Script" -msgstr "Ajouter un programme externe..." +msgstr "Ajouter un programme externe" -#: ../src/verbs.cpp:2929 -#, fuzzy +#: ../src/verbs.cpp:2931 msgid "Add an external script" -msgstr "Ajouter un programme externe..." +msgstr "Ajouter un programme externe" -#: ../src/verbs.cpp:2931 -#, fuzzy +#: ../src/verbs.cpp:2933 msgid "Add Embedded Script" -msgstr "Ajouter un programme incorporé..." +msgstr "Ajouter un programme incorporé" -#: ../src/verbs.cpp:2931 -#, fuzzy +#: ../src/verbs.cpp:2933 msgid "Add an embedded script" -msgstr "Ajouter un programme incorporé..." +msgstr "Ajouter un programme incorporé" -#: ../src/verbs.cpp:2933 -#, fuzzy +#: ../src/verbs.cpp:2935 msgid "Edit Embedded Script" -msgstr "Retirer le programme incorporé" +msgstr "Éditer un programme incorporé" -#: ../src/verbs.cpp:2933 -#, fuzzy +#: ../src/verbs.cpp:2935 msgid "Edit an embedded script" -msgstr "Retirer le programme incorporé" +msgstr "Éditer un programme incorporé" -#: ../src/verbs.cpp:2935 -#, fuzzy +#: ../src/verbs.cpp:2937 msgid "Remove External Script" msgstr "Supprimer un programme externe" -#: ../src/verbs.cpp:2935 -#, fuzzy +#: ../src/verbs.cpp:2937 msgid "Remove an external script" msgstr "Supprimer un programme externe" -#: ../src/verbs.cpp:2937 -#, fuzzy +#: ../src/verbs.cpp:2939 msgid "Remove Embedded Script" -msgstr "Retirer le programme incorporé" +msgstr "Retirer un programme incorporé" -#: ../src/verbs.cpp:2937 -#, fuzzy +#: ../src/verbs.cpp:2939 msgid "Remove an embedded script" -msgstr "Retirer le programme incorporé" +msgstr "Retirer un programme incorporé" -#: ../src/verbs.cpp:2959 ../src/verbs.cpp:2960 +#: ../src/verbs.cpp:2961 +#: ../src/verbs.cpp:2962 msgid "Center on horizontal and vertical axis" msgstr "Centrer horizontalement et verticalement" @@ -25440,18 +24376,25 @@ msgstr "Arc : déplacer début/fin" msgid "Arc: Change open/closed" msgstr "Arc : modifier ouvert/fermé" -#: ../src/widgets/arc-toolbar.cpp:298 ../src/widgets/arc-toolbar.cpp:327 -#: ../src/widgets/rect-toolbar.cpp:265 ../src/widgets/rect-toolbar.cpp:303 -#: ../src/widgets/spiral-toolbar.cpp:225 ../src/widgets/spiral-toolbar.cpp:249 -#: ../src/widgets/star-toolbar.cpp:391 ../src/widgets/star-toolbar.cpp:452 +#: ../src/widgets/arc-toolbar.cpp:298 +#: ../src/widgets/arc-toolbar.cpp:327 +#: ../src/widgets/rect-toolbar.cpp:265 +#: ../src/widgets/rect-toolbar.cpp:303 +#: ../src/widgets/spiral-toolbar.cpp:225 +#: ../src/widgets/spiral-toolbar.cpp:249 +#: ../src/widgets/star-toolbar.cpp:391 +#: ../src/widgets/star-toolbar.cpp:452 msgid "New:" msgstr "Créer :" #. FIXME: implement averaging of all parameters for multiple selected #. gtk_label_set_markup(GTK_LABEL(l), _("Average:")); -#: ../src/widgets/arc-toolbar.cpp:301 ../src/widgets/arc-toolbar.cpp:312 -#: ../src/widgets/rect-toolbar.cpp:273 ../src/widgets/rect-toolbar.cpp:291 -#: ../src/widgets/spiral-toolbar.cpp:227 ../src/widgets/spiral-toolbar.cpp:238 +#: ../src/widgets/arc-toolbar.cpp:301 +#: ../src/widgets/arc-toolbar.cpp:312 +#: ../src/widgets/rect-toolbar.cpp:273 +#: ../src/widgets/rect-toolbar.cpp:291 +#: ../src/widgets/spiral-toolbar.cpp:227 +#: ../src/widgets/spiral-toolbar.cpp:238 #: ../src/widgets/star-toolbar.cpp:393 msgid "Change:" msgstr "Modifier :" @@ -25510,9 +24453,7 @@ msgstr "État du point de fuite dans la direction X" #: ../src/widgets/box3d-toolbar.cpp:340 msgid "Toggle VP in X direction between 'finite' and 'infinite' (=parallel)" -msgstr "" -"Alterner le point de fuite dans la direction X entre « fini » et " -"« infini » (=parallèles)" +msgstr "Alterner le point de fuite dans la direction X entre « fini » et « infini » (=parallèles)" #: ../src/widgets/box3d-toolbar.cpp:355 msgid "Angle in Y direction" @@ -25534,9 +24475,7 @@ msgstr "État du point de fuite dans la direction Y" #: ../src/widgets/box3d-toolbar.cpp:379 msgid "Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)" -msgstr "" -"Alterner le point de fuite dans la direction Y entre « fini » et " -"« infini » (=parallèles)" +msgstr "Alterner le point de fuite dans la direction Y entre « fini » et « infini » (=parallèles)" #: ../src/widgets/box3d-toolbar.cpp:394 msgid "Angle in Z direction" @@ -25554,9 +24493,7 @@ msgstr "État du point de fuite dans la direction Z" #: ../src/widgets/box3d-toolbar.cpp:418 msgid "Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)" -msgstr "" -"Alterner le point de fuite dans la direction Z entre « fini » et " -"« infini » (=parallèles)" +msgstr "Alterner le point de fuite dans la direction Z entre « fini » et « infini » (=parallèles)" #. gint preset_index = ege_select_one_action_get_active( sel ); #: ../src/widgets/calligraphy-toolbar.cpp:235 @@ -25576,11 +24513,16 @@ msgstr "(sans épaisseur)" #. Scale #: ../src/widgets/calligraphy-toolbar.cpp:444 #: ../src/widgets/calligraphy-toolbar.cpp:477 -#: ../src/widgets/eraser-toolbar.cpp:142 ../src/widgets/pencil-toolbar.cpp:298 -#: ../src/widgets/spray-toolbar.cpp:125 ../src/widgets/spray-toolbar.cpp:141 -#: ../src/widgets/spray-toolbar.cpp:157 ../src/widgets/spray-toolbar.cpp:217 -#: ../src/widgets/spray-toolbar.cpp:247 ../src/widgets/spray-toolbar.cpp:265 -#: ../src/widgets/tweak-toolbar.cpp:139 ../src/widgets/tweak-toolbar.cpp:156 +#: ../src/widgets/eraser-toolbar.cpp:142 +#: ../src/widgets/pencil-toolbar.cpp:298 +#: ../src/widgets/spray-toolbar.cpp:125 +#: ../src/widgets/spray-toolbar.cpp:141 +#: ../src/widgets/spray-toolbar.cpp:157 +#: ../src/widgets/spray-toolbar.cpp:217 +#: ../src/widgets/spray-toolbar.cpp:247 +#: ../src/widgets/spray-toolbar.cpp:265 +#: ../src/widgets/tweak-toolbar.cpp:139 +#: ../src/widgets/tweak-toolbar.cpp:156 #: ../src/widgets/tweak-toolbar.cpp:364 msgid "(default)" msgstr "(défaut)" @@ -25629,12 +24571,8 @@ msgid "Thinning:" msgstr "Amincissement :" #: ../src/widgets/calligraphy-toolbar.cpp:465 -msgid "" -"How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 " -"makes them broader, 0 makes width independent of velocity)" -msgstr "" -"Largeur du tracé en fonction de la vélocité. (>0 la vitesse du tracé diminue " -"sa largeur, <0 l'augmente, 0 ne l'influence pas)" +msgid "How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)" +msgstr "Largeur du tracé en fonction de la vélocité. (>0 la vitesse du tracé diminue sa largeur, <0 l'augmente, 0 ne l'influence pas)" #. Angle #: ../src/widgets/calligraphy-toolbar.cpp:477 @@ -25654,12 +24592,8 @@ msgid "Pen Angle" msgstr "Angle du stylo" #: ../src/widgets/calligraphy-toolbar.cpp:481 -msgid "" -"The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if " -"fixation = 0)" -msgstr "" -"Angle de la plume (en degrés; 0 = horizontal; n'a pas d'effet si orientation " -"= 0)" +msgid "The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if fixation = 0)" +msgstr "Angle de la plume (en degrés; 0 = horizontal; n'a pas d'effet si orientation = 0)" #. Fixation #: ../src/widgets/calligraphy-toolbar.cpp:495 @@ -25683,12 +24617,8 @@ msgid "Fixation:" msgstr "Fixité :" #: ../src/widgets/calligraphy-toolbar.cpp:499 -msgid "" -"Angle behavior (0 = nib always perpendicular to stroke direction, 100 = " -"fixed angle)" -msgstr "" -"Comportement de l'angle de la plume (0 = toujours perpendiculaire à la " -"direction du tracé, 100 = invariant)" +msgid "Angle behavior (0 = nib always perpendicular to stroke direction, 100 = fixed angle)" +msgstr "Comportement de l'angle de la plume (0 = toujours perpendiculaire à la direction du tracé, 100 = invariant)" #. Cap Rounding #: ../src/widgets/calligraphy-toolbar.cpp:511 @@ -25716,12 +24646,8 @@ msgid "Caps:" msgstr "Terminaisons :" #: ../src/widgets/calligraphy-toolbar.cpp:516 -msgid "" -"Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = " -"round caps)" -msgstr "" -"Augmenter ce paramètre pour que les extrémités du tracé soient plus " -"proéminentes (0 = pas de terminaison, 1 = terminaison arrondie)" +msgid "Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = round caps)" +msgstr "Augmenter ce paramètre pour que les extrémités du tracé soient plus proéminentes (0 = pas de terminaison, 1 = terminaison arrondie)" #. Tremor #: ../src/widgets/calligraphy-toolbar.cpp:528 @@ -25804,26 +24730,19 @@ msgstr "Inertie :" #: ../src/widgets/calligraphy-toolbar.cpp:567 msgid "Increase to make the pen drag behind, as if slowed by inertia" -msgstr "" -"Augmenter ce paramètre pour que la plume traîne, ralentie par son inertie" +msgstr "Augmenter ce paramètre pour que la plume traîne, ralentie par son inertie" #: ../src/widgets/calligraphy-toolbar.cpp:582 msgid "Trace Background" msgstr "Tracer selon le fond" #: ../src/widgets/calligraphy-toolbar.cpp:583 -msgid "" -"Trace the lightness of the background by the width of the pen (white - " -"minimum width, black - maximum width)" -msgstr "" -"Imiter la luminosité de l'arrière-plan avec l'épaisseur du trait (blanc - " -"trait fin, noir - trait épais)" +msgid "Trace the lightness of the background by the width of the pen (white - minimum width, black - maximum width)" +msgstr "Imiter la luminosité de l'arrière-plan avec l'épaisseur du trait (blanc - trait fin, noir - trait épais)" #: ../src/widgets/calligraphy-toolbar.cpp:596 msgid "Use the pressure of the input device to alter the width of the pen" -msgstr "" -"Utiliser la pression du périphérique d'entrée pour modifier la largeur de la " -"plume" +msgstr "Utiliser la pression du périphérique d'entrée pour modifier la largeur de la plume" #: ../src/widgets/calligraphy-toolbar.cpp:608 msgid "Tilt" @@ -25831,9 +24750,7 @@ msgstr "Inclinaison" #: ../src/widgets/calligraphy-toolbar.cpp:609 msgid "Use the tilt of the input device to alter the angle of the pen's nib" -msgstr "" -"Utiliser l'inclinaison du périphérique d'entrée pour modifier l'angle de la " -"plume" +msgstr "Utiliser l'inclinaison du périphérique d'entrée pour modifier l'angle de la plume" #: ../src/widgets/calligraphy-toolbar.cpp:624 msgid "Choose a preset" @@ -25901,8 +24818,7 @@ msgstr "Espacement :" #: ../src/widgets/connector-toolbar.cpp:373 msgid "The amount of space left around objects by auto-routing connectors" -msgstr "" -"Espace laissé autour des objets par les connecteurs routés automatiquement" +msgstr "Espace laissé autour des objets par les connecteurs routés automatiquement" #: ../src/widgets/connector-toolbar.cpp:384 msgid "Graph" @@ -25926,9 +24842,7 @@ msgstr "Vers le bas" #: ../src/widgets/connector-toolbar.cpp:408 msgid "Make connectors with end-markers (arrows) point downwards" -msgstr "" -"Faire que les connecteurs avec des marqueurs de fin (des flèches) pointent " -"vers le bas" +msgstr "Faire que les connecteurs avec des marqueurs de fin (des flèches) pointent vers le bas" #: ../src/widgets/connector-toolbar.cpp:424 msgid "Do not allow overlapping shapes" @@ -25942,128 +24856,119 @@ msgstr "Motif de pointillé" msgid "Pattern offset" msgstr "Décalage du motif" -#: ../src/widgets/desktop-widget.cpp:465 +#: ../src/widgets/desktop-widget.cpp:466 msgid "Zoom drawing if window size changes" msgstr "Zoomer le dessin si les dimensions de la fenêtre sont modifiées" -#: ../src/widgets/desktop-widget.cpp:669 +#: ../src/widgets/desktop-widget.cpp:670 msgid "Cursor coordinates" msgstr "Coordonnées du curseur" -#: ../src/widgets/desktop-widget.cpp:695 +#: ../src/widgets/desktop-widget.cpp:696 msgid "Z:" msgstr "Z :" #. display the initial welcome message in the statusbar -#: ../src/widgets/desktop-widget.cpp:738 -msgid "" -"Welcome to Inkscape! Use shape or freehand tools to create objects; " -"use selector (arrow) to move or transform them." -msgstr "" -"Bienvenue dans Inkscape! Utilisez les formes ou l'outil de dessin à " -"main levée pour créer des objets; utilisez les sélecteurs (flèches) pour les " -"déplacer ou les modifier." +#: ../src/widgets/desktop-widget.cpp:739 +msgid "Welcome to Inkscape! Use shape or freehand tools to create objects; use selector (arrow) to move or transform them." +msgstr "Bienvenue dans Inkscape! Utilisez les formes ou l'outil de dessin à main levée pour créer des objets; utilisez les sélecteurs (flèches) pour les déplacer ou les modifier." -#: ../src/widgets/desktop-widget.cpp:832 +#: ../src/widgets/desktop-widget.cpp:833 msgid "grayscale" msgstr "niveaux de gris" -#: ../src/widgets/desktop-widget.cpp:833 +#: ../src/widgets/desktop-widget.cpp:834 msgid ", grayscale" msgstr ", niveaux de gris" -#: ../src/widgets/desktop-widget.cpp:834 +#: ../src/widgets/desktop-widget.cpp:835 msgid "print colors preview" msgstr "aperçu avant impression" -#: ../src/widgets/desktop-widget.cpp:835 +#: ../src/widgets/desktop-widget.cpp:836 msgid ", print colors preview" msgstr ", aperçu avant impression" -#: ../src/widgets/desktop-widget.cpp:836 +#: ../src/widgets/desktop-widget.cpp:837 msgid "outline" msgstr "contour" -#: ../src/widgets/desktop-widget.cpp:837 +#: ../src/widgets/desktop-widget.cpp:838 msgid "no filters" msgstr "sans filtre" -#: ../src/widgets/desktop-widget.cpp:864 +#: ../src/widgets/desktop-widget.cpp:865 #, c-format msgid "%s%s: %d (%s%s) - Inkscape" msgstr "%s%s: %d (%s%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:866 ../src/widgets/desktop-widget.cpp:870 +#: ../src/widgets/desktop-widget.cpp:867 +#: ../src/widgets/desktop-widget.cpp:871 #, c-format msgid "%s%s: %d (%s) - Inkscape" msgstr "%s%s: %d (%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:872 +#: ../src/widgets/desktop-widget.cpp:873 #, c-format msgid "%s%s: %d - Inkscape" msgstr "%s%s: %d - Inkscape" -#: ../src/widgets/desktop-widget.cpp:878 +#: ../src/widgets/desktop-widget.cpp:879 #, c-format msgid "%s%s (%s%s) - Inkscape" msgstr "%s%s (%s%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:880 ../src/widgets/desktop-widget.cpp:884 +#: ../src/widgets/desktop-widget.cpp:881 +#: ../src/widgets/desktop-widget.cpp:885 #, c-format msgid "%s%s (%s) - Inkscape" msgstr "%s%s (%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:886 +#: ../src/widgets/desktop-widget.cpp:887 #, c-format msgid "%s%s - Inkscape" msgstr "%s%s - Inkscape" -#: ../src/widgets/desktop-widget.cpp:1055 +#: ../src/widgets/desktop-widget.cpp:1056 msgid "Color-managed display is enabled in this window" -msgstr "" -"L'affichage avec gestion des couleurs est activé dans cette fenêtre" +msgstr "L'affichage avec gestion des couleurs est activé dans cette fenêtre" -#: ../src/widgets/desktop-widget.cpp:1057 +#: ../src/widgets/desktop-widget.cpp:1058 msgid "Color-managed display is disabled in this window" -msgstr "" -"L'affichage avec gestion des couleurs est désactivé dans cette fenêtre" +msgstr "L'affichage avec gestion des couleurs est désactivé dans cette fenêtre" -#: ../src/widgets/desktop-widget.cpp:1112 +#: ../src/widgets/desktop-widget.cpp:1113 #, c-format msgid "" -"Save changes to document \"%s\" before " -"closing?\n" +"Save changes to document \"%s\" before closing?\n" "\n" "If you close without saving, your changes will be discarded." msgstr "" -"Enregistrer les modifications du " -"document « %s » avant de fermer ?\n" +"Enregistrer les modifications du document « %s » avant de fermer ?\n" "\n" "Si vous fermez sans enregistrer, vos modifications seront perdues." -#: ../src/widgets/desktop-widget.cpp:1122 -#: ../src/widgets/desktop-widget.cpp:1181 +#: ../src/widgets/desktop-widget.cpp:1123 +#: ../src/widgets/desktop-widget.cpp:1182 msgid "Close _without saving" msgstr "Fermer _sans enregistrer" -#: ../src/widgets/desktop-widget.cpp:1171 +#: ../src/widgets/desktop-widget.cpp:1172 #, c-format msgid "" -"The file \"%s\" was saved with a " -"format that may cause data loss!\n" +"The file \"%s\" was saved with a format that may cause data loss!\n" "\n" "Do you want to save this file as Inkscape SVG?" msgstr "" -"Le fichier « %s » a été enregistré " -"dans un format qui peut causer des pertes de données !\n" +"Le fichier « %s » a été enregistré dans un format qui peut causer des pertes de données !\n" "\n" "Voulez-vous enregistrer ce fichier au format SVG Inkscape ?" -#: ../src/widgets/desktop-widget.cpp:1183 +#: ../src/widgets/desktop-widget.cpp:1184 msgid "_Save as Inkscape SVG" msgstr "Enregi_strer comme SVG Inkscape" -#: ../src/widgets/desktop-widget.cpp:1393 +#: ../src/widgets/desktop-widget.cpp:1394 msgid "Note:" msgstr "Note :" @@ -26072,12 +24977,8 @@ msgid "Pick opacity" msgstr "Capturer l'opacité" #: ../src/widgets/dropper-toolbar.cpp:115 -msgid "" -"Pick both the color and the alpha (transparency) under cursor; otherwise, " -"pick only the visible color premultiplied by alpha" -msgstr "" -"Capturer à la fois la couleur et l'alpha (opacité) sous le curseur; Sinon, " -"ne capturer que la couleur visible prémultipliée par l'alpha" +msgid "Pick both the color and the alpha (transparency) under cursor; otherwise, pick only the visible color premultiplied by alpha" +msgstr "Capturer à la fois la couleur et l'alpha (opacité) sous le curseur; Sinon, ne capturer que la couleur visible prémultipliée par l'alpha" #: ../src/widgets/dropper-toolbar.cpp:118 msgid "Pick" @@ -26088,11 +24989,8 @@ msgid "Assign opacity" msgstr "Appliquer l'opacité" #: ../src/widgets/dropper-toolbar.cpp:128 -msgid "" -"If alpha was picked, assign it to selection as fill or stroke transparency" -msgstr "" -"Si l'alpha a été capturé, l'appliquer comme transparence de remplissage ou " -"de contour à la sélection" +msgid "If alpha was picked, assign it to selection as fill or stroke transparency" +msgstr "Si l'alpha a été capturé, l'appliquer comme transparence de remplissage ou de contour à la sélection" #: ../src/widgets/dropper-toolbar.cpp:131 msgid "Assign" @@ -26122,11 +25020,13 @@ msgstr "Largeur de la gomme (relativement à la zone de travail visible)" msgid "Change fill rule" msgstr "Modifier la règle de remplissage" -#: ../src/widgets/fill-style.cpp:447 ../src/widgets/fill-style.cpp:526 +#: ../src/widgets/fill-style.cpp:447 +#: ../src/widgets/fill-style.cpp:526 msgid "Set fill color" msgstr "Appliquer une couleur de remplissage" -#: ../src/widgets/fill-style.cpp:447 ../src/widgets/fill-style.cpp:526 +#: ../src/widgets/fill-style.cpp:447 +#: ../src/widgets/fill-style.cpp:526 msgid "Set stroke color" msgstr "Appliquer une couleur de contour" @@ -26146,7 +25046,8 @@ msgstr "Appliquer un motif de remplissage" msgid "Set pattern on stroke" msgstr "Appliquer un motif à un contour" -#: ../src/widgets/font-selector.cpp:134 ../src/widgets/text-toolbar.cpp:962 +#: ../src/widgets/font-selector.cpp:134 +#: ../src/widgets/text-toolbar.cpp:962 #: ../src/widgets/text-toolbar.cpp:1275 msgid "Font size" msgstr "Taille de police" @@ -26162,188 +25063,184 @@ msgctxt "Font selector" msgid "Style" msgstr "Style" -#: ../src/widgets/font-selector.cpp:242 ../share/extensions/dots.inx.h:3 +#: ../src/widgets/font-selector.cpp:242 +#: ../share/extensions/dots.inx.h:3 msgid "Font size:" msgstr "Taille de police :" -#: ../src/widgets/gradient-selector.cpp:208 +#: ../src/widgets/gradient-selector.cpp:214 msgid "Create a duplicate gradient" msgstr "Dupliquer un dégradé" -#: ../src/widgets/gradient-selector.cpp:218 +#: ../src/widgets/gradient-selector.cpp:230 msgid "Edit gradient" msgstr "Éditer le dégradé" -#: ../src/widgets/gradient-selector.cpp:289 +#: ../src/widgets/gradient-selector.cpp:306 #: ../src/widgets/paint-selector.cpp:244 msgid "Swatch" msgstr "Échantillon" -#: ../src/widgets/gradient-selector.cpp:339 +#: ../src/widgets/gradient-selector.cpp:356 msgid "Rename gradient" msgstr "Renommer le dégradé" -#: ../src/widgets/gradient-toolbar.cpp:171 -#: ../src/widgets/gradient-toolbar.cpp:184 -#: ../src/widgets/gradient-toolbar.cpp:776 -#: ../src/widgets/gradient-toolbar.cpp:1111 -#: ../src/widgets/gradient-toolbar.cpp:1158 +#: ../src/widgets/gradient-toolbar.cpp:172 +#: ../src/widgets/gradient-toolbar.cpp:185 +#: ../src/widgets/gradient-toolbar.cpp:777 +#: ../src/widgets/gradient-toolbar.cpp:1112 msgid "No gradient" msgstr "Pas de dégradés" -#: ../src/widgets/gradient-toolbar.cpp:190 +#: ../src/widgets/gradient-toolbar.cpp:191 msgid "Multiple gradients" msgstr "Plusieurs dégradés" -#: ../src/widgets/gradient-toolbar.cpp:696 +#: ../src/widgets/gradient-toolbar.cpp:697 msgid "Multiple stops" msgstr "Plusieurs stops" -#: ../src/widgets/gradient-toolbar.cpp:794 +#: ../src/widgets/gradient-toolbar.cpp:795 #: ../src/widgets/gradient-vector.cpp:629 msgid "No stops in gradient" msgstr "Il n'y a pas de stop dans le dégradé" -#: ../src/widgets/gradient-toolbar.cpp:947 +#: ../src/widgets/gradient-toolbar.cpp:948 msgid "Assign gradient to object" msgstr "Appliquer un dégradé à un objet" -#: ../src/widgets/gradient-toolbar.cpp:969 +#: ../src/widgets/gradient-toolbar.cpp:970 msgid "Set gradient repeat" msgstr "Défini la répétition du dégradé" -#: ../src/widgets/gradient-toolbar.cpp:1007 +#: ../src/widgets/gradient-toolbar.cpp:1008 #: ../src/widgets/gradient-vector.cpp:740 msgid "Change gradient stop offset" msgstr "Modifier le décalage d'un stop de dégradé" -#: ../src/widgets/gradient-toolbar.cpp:1051 +#: ../src/widgets/gradient-toolbar.cpp:1052 msgid "linear" msgstr "linéaire" -#: ../src/widgets/gradient-toolbar.cpp:1051 +#: ../src/widgets/gradient-toolbar.cpp:1052 msgid "Create linear gradient" msgstr "Créer un dégradé linéaire" -#: ../src/widgets/gradient-toolbar.cpp:1055 +#: ../src/widgets/gradient-toolbar.cpp:1056 msgid "radial" msgstr "radial" -#: ../src/widgets/gradient-toolbar.cpp:1055 +#: ../src/widgets/gradient-toolbar.cpp:1056 msgid "Create radial (elliptic or circular) gradient" msgstr "Créer un dégradé radial (elliptique ou circulaire)" -#: ../src/widgets/gradient-toolbar.cpp:1058 +#: ../src/widgets/gradient-toolbar.cpp:1059 #: ../src/widgets/mesh-toolbar.cpp:211 msgid "New:" msgstr "Créer :" -#: ../src/widgets/gradient-toolbar.cpp:1081 +#: ../src/widgets/gradient-toolbar.cpp:1082 #: ../src/widgets/mesh-toolbar.cpp:234 msgid "fill" msgstr "remplissage" -#: ../src/widgets/gradient-toolbar.cpp:1081 +#: ../src/widgets/gradient-toolbar.cpp:1082 #: ../src/widgets/mesh-toolbar.cpp:234 msgid "Create gradient in the fill" msgstr "Appliquer le dégradé au remplissage" -#: ../src/widgets/gradient-toolbar.cpp:1085 +#: ../src/widgets/gradient-toolbar.cpp:1086 #: ../src/widgets/mesh-toolbar.cpp:238 msgid "stroke" msgstr "contour" -#: ../src/widgets/gradient-toolbar.cpp:1085 +#: ../src/widgets/gradient-toolbar.cpp:1086 #: ../src/widgets/mesh-toolbar.cpp:238 msgid "Create gradient in the stroke" msgstr "Appliquer le dégradé au contour" -#: ../src/widgets/gradient-toolbar.cpp:1088 +#: ../src/widgets/gradient-toolbar.cpp:1089 #: ../src/widgets/mesh-toolbar.cpp:241 msgid "on:" msgstr "sur :" -#: ../src/widgets/gradient-toolbar.cpp:1113 +#: ../src/widgets/gradient-toolbar.cpp:1114 msgid "Select" msgstr "Sélectionner" -#: ../src/widgets/gradient-toolbar.cpp:1113 +#: ../src/widgets/gradient-toolbar.cpp:1114 msgid "Choose a gradient" msgstr "Choisir un dégradé" -#: ../src/widgets/gradient-toolbar.cpp:1114 +#: ../src/widgets/gradient-toolbar.cpp:1115 msgid "Select:" msgstr "Sélection :" -#: ../src/widgets/gradient-toolbar.cpp:1132 +#: ../src/widgets/gradient-toolbar.cpp:1133 msgid "Reflected" msgstr "Réfléchi" -#: ../src/widgets/gradient-toolbar.cpp:1135 +#: ../src/widgets/gradient-toolbar.cpp:1136 msgid "Direct" msgstr "Direct" -#: ../src/widgets/gradient-toolbar.cpp:1137 +#: ../src/widgets/gradient-toolbar.cpp:1138 msgid "Repeat" msgstr "Répétition :" #. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/pservers.html#LinearGradientSpreadMethodAttribute -#: ../src/widgets/gradient-toolbar.cpp:1139 -msgid "" -"Whether to fill with flat color beyond the ends of the gradient vector " -"(spreadMethod=\"pad\"), or repeat the gradient in the same direction " -"(spreadMethod=\"repeat\"), or repeat the gradient in alternating opposite " -"directions (spreadMethod=\"reflect\")" -msgstr "" -"Prolongement du dégradé au delà de la définition de son vecteur : prolonger " -"par une zone uniforme de la dernière couleur (aucune, spreadMethod=\"pad\"), " -"répéter le dégradé (directe, spreadMethod=\"repeat\") ou le réfléchir " -"(réflection, spreadMethod=\"reflect\")" +#: ../src/widgets/gradient-toolbar.cpp:1140 +msgid "Whether to fill with flat color beyond the ends of the gradient vector (spreadMethod=\"pad\"), or repeat the gradient in the same direction (spreadMethod=\"repeat\"), or repeat the gradient in alternating opposite directions (spreadMethod=\"reflect\")" +msgstr "Prolongement du dégradé au delà de la définition de son vecteur : prolonger par une zone uniforme de la dernière couleur (aucune, spreadMethod=\"pad\"), répéter le dégradé (directe, spreadMethod=\"repeat\") ou le réfléchir (réflection, spreadMethod=\"reflect\")" -#: ../src/widgets/gradient-toolbar.cpp:1144 +#: ../src/widgets/gradient-toolbar.cpp:1145 msgid "Repeat:" msgstr "Répétition :" -#: ../src/widgets/gradient-toolbar.cpp:1160 +#: ../src/widgets/gradient-toolbar.cpp:1159 +msgid "No stops" +msgstr "Aucun stop" + +#: ../src/widgets/gradient-toolbar.cpp:1161 msgid "Stops" msgstr "Stops" -#: ../src/widgets/gradient-toolbar.cpp:1160 +#: ../src/widgets/gradient-toolbar.cpp:1161 msgid "Select a stop for the current gradient" msgstr "Sélectionner un stop pour le dégradé courant" -#: ../src/widgets/gradient-toolbar.cpp:1161 +#: ../src/widgets/gradient-toolbar.cpp:1162 msgid "Stops:" msgstr "Stops :" -#: ../src/widgets/gradient-toolbar.cpp:1173 +#: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset of selected stop" msgstr "Décalage du stop sélectionné" -#: ../src/widgets/gradient-toolbar.cpp:1191 #: ../src/widgets/gradient-toolbar.cpp:1192 +#: ../src/widgets/gradient-toolbar.cpp:1193 msgid "Insert new stop" msgstr "Insérer un stop" -#: ../src/widgets/gradient-toolbar.cpp:1205 #: ../src/widgets/gradient-toolbar.cpp:1206 +#: ../src/widgets/gradient-toolbar.cpp:1207 #: ../src/widgets/gradient-vector.cpp:908 msgid "Delete stop" msgstr "Supprimer un stop" -#: ../src/widgets/gradient-toolbar.cpp:1219 +#: ../src/widgets/gradient-toolbar.cpp:1220 msgid "Reverse" msgstr "Inverser" -#: ../src/widgets/gradient-toolbar.cpp:1220 +#: ../src/widgets/gradient-toolbar.cpp:1221 msgid "Reverse the direction of the gradient" msgstr "Inverser la direction du dégradé" -#: ../src/widgets/gradient-toolbar.cpp:1234 +#: ../src/widgets/gradient-toolbar.cpp:1235 msgid "Link gradients" msgstr "Lier les dégradés" -#: ../src/widgets/gradient-toolbar.cpp:1235 +#: ../src/widgets/gradient-toolbar.cpp:1236 msgid "Link gradients to change all related gradients" msgstr "Lier et modifier tous les dégradés associés" @@ -26387,64 +25284,61 @@ msgstr "Éditeur de dégradé" msgid "Change gradient stop color" msgstr "Modifier la couleur d'un stop de dégradé" -#: ../src/widgets/lpe-toolbar.cpp:317 +#: ../src/widgets/lpe-toolbar.cpp:319 msgid "All inactive" msgstr "Tout inactif" -#: ../src/widgets/lpe-toolbar.cpp:318 +#: ../src/widgets/lpe-toolbar.cpp:320 msgid "No geometric tool is active" msgstr "Aucun outil géométrique n'est actif" -#: ../src/widgets/lpe-toolbar.cpp:351 +#: ../src/widgets/lpe-toolbar.cpp:353 msgid "Show limiting bounding box" msgstr "Montrer la boîte englobante limite" -#: ../src/widgets/lpe-toolbar.cpp:352 +#: ../src/widgets/lpe-toolbar.cpp:354 msgid "Show bounding box (used to cut infinite lines)" msgstr "Affiche la boîte englobante (utilisé pour couper les lignes infinies)" -#: ../src/widgets/lpe-toolbar.cpp:363 +#: ../src/widgets/lpe-toolbar.cpp:365 msgid "Get limiting bounding box from selection" msgstr "Obtenir la boîte englobante limite à partir de la sélection" -#: ../src/widgets/lpe-toolbar.cpp:364 -msgid "" -"Set limiting bounding box (used to cut infinite lines) to the bounding box " -"of current selection" -msgstr "" -"Définir la boîte englobante limite (utilisée pour couper les lignes " -"infinies) à la boîte englobante de la sélection" +#: ../src/widgets/lpe-toolbar.cpp:366 +msgid "Set limiting bounding box (used to cut infinite lines) to the bounding box of current selection" +msgstr "Définir la boîte englobante limite (utilisée pour couper les lignes infinies) à la boîte englobante de la sélection" -#: ../src/widgets/lpe-toolbar.cpp:376 +#: ../src/widgets/lpe-toolbar.cpp:378 msgid "Choose a line segment type" msgstr "Sélectionner un type de segment" -#: ../src/widgets/lpe-toolbar.cpp:392 +#: ../src/widgets/lpe-toolbar.cpp:394 msgid "Display measuring info" msgstr "Afficher les informations de mesure" -#: ../src/widgets/lpe-toolbar.cpp:393 +#: ../src/widgets/lpe-toolbar.cpp:395 msgid "Display measuring info for selected items" msgstr "Affiche les informations de mesure pour la sélection" #. Add the units menu. -#: ../src/widgets/lpe-toolbar.cpp:403 ../src/widgets/node-toolbar.cpp:625 +#: ../src/widgets/lpe-toolbar.cpp:405 +#: ../src/widgets/node-toolbar.cpp:626 #: ../src/widgets/paintbucket-toolbar.cpp:187 -#: ../src/widgets/rect-toolbar.cpp:382 ../src/widgets/select-toolbar.cpp:543 +#: ../src/widgets/rect-toolbar.cpp:382 +#: ../src/widgets/select-toolbar.cpp:544 msgid "Units" msgstr "Unités" -#: ../src/widgets/lpe-toolbar.cpp:413 +#: ../src/widgets/lpe-toolbar.cpp:415 msgid "Open LPE dialog" msgstr "Ouvrir la boîte de dialogue des effets de chemin" -#: ../src/widgets/lpe-toolbar.cpp:414 +#: ../src/widgets/lpe-toolbar.cpp:416 msgid "Open LPE dialog (to adapt parameters numerically)" -msgstr "" -"Ouvrir la boîte de dialogue des effets de chemin (pour adapter les " -"paramètres numériquement)" +msgstr "Ouvrir la boîte de dialogue des effets de chemin (pour adapter les paramètres numériquement)" -#: ../src/widgets/measure-toolbar.cpp:103 ../src/widgets/text-toolbar.cpp:1278 +#: ../src/widgets/measure-toolbar.cpp:103 +#: ../src/widgets/text-toolbar.cpp:1278 msgid "Font Size" msgstr "Taille de police" @@ -26484,7 +25378,8 @@ msgstr "Créer un dégradé linéaire" msgid "Rows" msgstr "Lignes" -#: ../src/widgets/mesh-toolbar.cpp:263 ../share/extensions/layout_nup.inx.h:12 +#: ../src/widgets/mesh-toolbar.cpp:263 +#: ../share/extensions/layout_nup.inx.h:12 msgid "Rows:" msgstr "Lignes :" @@ -26525,7 +25420,8 @@ msgstr "Éditer le contour" msgid "Edit stroke mesh" msgstr "Éditer le contour..." -#: ../src/widgets/mesh-toolbar.cpp:317 ../src/widgets/node-toolbar.cpp:533 +#: ../src/widgets/mesh-toolbar.cpp:317 +#: ../src/widgets/node-toolbar.cpp:534 msgid "Show Handles" msgstr "Afficher les poignées" @@ -26534,199 +25430,195 @@ msgstr "Afficher les poignées" msgid "Show side and tensor handles" msgstr "Afficher les poignées de transformation" -#: ../src/widgets/node-toolbar.cpp:353 +#: ../src/widgets/node-toolbar.cpp:354 msgid "Insert node" msgstr "Insérer un nœud" -#: ../src/widgets/node-toolbar.cpp:354 +#: ../src/widgets/node-toolbar.cpp:355 msgid "Insert new nodes into selected segments" msgstr "Insérer de nouveaux nœuds aux milieux des segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:357 +#: ../src/widgets/node-toolbar.cpp:358 msgid "Insert" msgstr "Insérer" -#: ../src/widgets/node-toolbar.cpp:368 +#: ../src/widgets/node-toolbar.cpp:369 msgid "Insert node at min X" msgstr "Insérer un nœud à l'abscisse minimale" -#: ../src/widgets/node-toolbar.cpp:369 +#: ../src/widgets/node-toolbar.cpp:370 msgid "Insert new nodes at min X into selected segments" -msgstr "" -"Insérer de nouveaux nœuds à l'abscisse minimale des segments sélectionnés" +msgstr "Insérer de nouveaux nœuds à l'abscisse minimale des segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:372 +#: ../src/widgets/node-toolbar.cpp:373 msgid "Insert min X" msgstr "Insérer à l'abscisse minimale" -#: ../src/widgets/node-toolbar.cpp:378 +#: ../src/widgets/node-toolbar.cpp:379 msgid "Insert node at max X" msgstr "Insérer un nœud à l'abscisse maximale" -#: ../src/widgets/node-toolbar.cpp:379 +#: ../src/widgets/node-toolbar.cpp:380 msgid "Insert new nodes at max X into selected segments" -msgstr "" -"Insérer de nouveaux nœuds à l'abscisse maximale des segments sélectionnés" +msgstr "Insérer de nouveaux nœuds à l'abscisse maximale des segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:382 +#: ../src/widgets/node-toolbar.cpp:383 msgid "Insert max X" msgstr "Insérer à l'abscisse maximale" -#: ../src/widgets/node-toolbar.cpp:388 +#: ../src/widgets/node-toolbar.cpp:389 msgid "Insert node at min Y" msgstr "Insérer un nœud à l'ordonnée minimale" -#: ../src/widgets/node-toolbar.cpp:389 +#: ../src/widgets/node-toolbar.cpp:390 msgid "Insert new nodes at min Y into selected segments" -msgstr "" -"Insérer de nouveaux nœuds à l'ordonnée minimale des segments sélectionnés" +msgstr "Insérer de nouveaux nœuds à l'ordonnée minimale des segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:392 +#: ../src/widgets/node-toolbar.cpp:393 msgid "Insert min Y" msgstr "Insérer à l'ordonnée minimale" -#: ../src/widgets/node-toolbar.cpp:398 +#: ../src/widgets/node-toolbar.cpp:399 msgid "Insert node at max Y" msgstr "Insérer un nœud à l'ordonnée maximale" -#: ../src/widgets/node-toolbar.cpp:399 +#: ../src/widgets/node-toolbar.cpp:400 msgid "Insert new nodes at max Y into selected segments" -msgstr "" -"Insérer de nouveaux nœuds à l'ordonnée maximale des segments sélectionnés" +msgstr "Insérer de nouveaux nœuds à l'ordonnée maximale des segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:402 +#: ../src/widgets/node-toolbar.cpp:403 msgid "Insert max Y" msgstr "Insérer à l'ordonnée maximale" -#: ../src/widgets/node-toolbar.cpp:410 +#: ../src/widgets/node-toolbar.cpp:411 msgid "Delete selected nodes" msgstr "Supprimer les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:421 +#: ../src/widgets/node-toolbar.cpp:422 msgid "Join selected nodes" msgstr "Joindre les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:424 +#: ../src/widgets/node-toolbar.cpp:425 msgid "Join" msgstr "Joindre" -#: ../src/widgets/node-toolbar.cpp:432 +#: ../src/widgets/node-toolbar.cpp:433 msgid "Break path at selected nodes" msgstr "Briser le chemin aux nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:442 +#: ../src/widgets/node-toolbar.cpp:443 msgid "Join with segment" msgstr "Joindre par un segment" -#: ../src/widgets/node-toolbar.cpp:443 +#: ../src/widgets/node-toolbar.cpp:444 msgid "Join selected endnodes with a new segment" msgstr "Joindre les nœuds terminaux sélectionnés par un nouveau segment" -#: ../src/widgets/node-toolbar.cpp:452 +#: ../src/widgets/node-toolbar.cpp:453 msgid "Delete segment" msgstr "Supprimer le segment" -#: ../src/widgets/node-toolbar.cpp:453 +#: ../src/widgets/node-toolbar.cpp:454 msgid "Delete segment between two non-endpoint nodes" msgstr "Supprimer un segment entre deux nœuds non terminaux" -#: ../src/widgets/node-toolbar.cpp:462 +#: ../src/widgets/node-toolbar.cpp:463 msgid "Node Cusp" msgstr "Point de rebroussement" -#: ../src/widgets/node-toolbar.cpp:463 +#: ../src/widgets/node-toolbar.cpp:464 msgid "Make selected nodes corner" msgstr "Rendre durs les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:472 +#: ../src/widgets/node-toolbar.cpp:473 msgid "Node Smooth" msgstr "Doux" -#: ../src/widgets/node-toolbar.cpp:473 +#: ../src/widgets/node-toolbar.cpp:474 msgid "Make selected nodes smooth" msgstr "Rendre doux les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:482 +#: ../src/widgets/node-toolbar.cpp:483 msgid "Node Symmetric" msgstr "Symétrique" -#: ../src/widgets/node-toolbar.cpp:483 +#: ../src/widgets/node-toolbar.cpp:484 msgid "Make selected nodes symmetric" msgstr "Rendre symétriques les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:492 +#: ../src/widgets/node-toolbar.cpp:493 msgid "Node Auto" msgstr "Nœud automatique" -#: ../src/widgets/node-toolbar.cpp:493 +#: ../src/widgets/node-toolbar.cpp:494 msgid "Make selected nodes auto-smooth" msgstr "Rendre automatiques les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:502 +#: ../src/widgets/node-toolbar.cpp:503 msgid "Node Line" msgstr "Rectiligne" -#: ../src/widgets/node-toolbar.cpp:503 +#: ../src/widgets/node-toolbar.cpp:504 msgid "Make selected segments lines" msgstr "Rendre rectilignes les segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:512 +#: ../src/widgets/node-toolbar.cpp:513 msgid "Node Curve" msgstr "Courbe" -#: ../src/widgets/node-toolbar.cpp:513 +#: ../src/widgets/node-toolbar.cpp:514 msgid "Make selected segments curves" msgstr "Rendre courbes les segments sélectionnés" -#: ../src/widgets/node-toolbar.cpp:522 +#: ../src/widgets/node-toolbar.cpp:523 msgid "Show Transform Handles" msgstr "Afficher les poignées de transformation" -#: ../src/widgets/node-toolbar.cpp:523 +#: ../src/widgets/node-toolbar.cpp:524 msgid "Show transformation handles for selected nodes" msgstr "Afficher les poignées de transformation pour les nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:534 +#: ../src/widgets/node-toolbar.cpp:535 msgid "Show Bezier handles of selected nodes" msgstr "Afficher les poignées de Bézier des nœuds sélectionnés" -#: ../src/widgets/node-toolbar.cpp:544 +#: ../src/widgets/node-toolbar.cpp:545 msgid "Show Outline" msgstr "Afficher le contour" -#: ../src/widgets/node-toolbar.cpp:545 +#: ../src/widgets/node-toolbar.cpp:546 msgid "Show path outline (without path effects)" msgstr "Afficher le contour du chemin (sans les effets de chemin)" -#: ../src/widgets/node-toolbar.cpp:567 +#: ../src/widgets/node-toolbar.cpp:568 msgid "Edit clipping paths" msgstr "Modifier les chemins de découpe" -#: ../src/widgets/node-toolbar.cpp:568 +#: ../src/widgets/node-toolbar.cpp:569 msgid "Show clipping path(s) of selected object(s)" msgstr "Afficher les chemins de découpe des objets sélectionnés" -#: ../src/widgets/node-toolbar.cpp:578 +#: ../src/widgets/node-toolbar.cpp:579 msgid "Edit masks" msgstr "Modifier les masques" -#: ../src/widgets/node-toolbar.cpp:579 +#: ../src/widgets/node-toolbar.cpp:580 msgid "Show mask(s) of selected object(s)" msgstr "Afficher les masques des objets sélectionnés" -#: ../src/widgets/node-toolbar.cpp:593 +#: ../src/widgets/node-toolbar.cpp:594 msgid "X coordinate:" msgstr "Coordonnée X :" -#: ../src/widgets/node-toolbar.cpp:593 +#: ../src/widgets/node-toolbar.cpp:594 msgid "X coordinate of selected node(s)" msgstr "Coordonnée X de la sélection" -#: ../src/widgets/node-toolbar.cpp:611 +#: ../src/widgets/node-toolbar.cpp:612 msgid "Y coordinate:" msgstr "Coordonnée Y :" -#: ../src/widgets/node-toolbar.cpp:611 +#: ../src/widgets/node-toolbar.cpp:612 msgid "Y coordinate of selected node(s)" msgstr "Coordonnée Y de la sélection" @@ -26743,12 +25635,8 @@ msgid "Fill Threshold" msgstr "Seuil de remplissage :" #: ../src/widgets/paintbucket-toolbar.cpp:168 -msgid "" -"The maximum allowed difference between the clicked pixel and the neighboring " -"pixels to be counted in the fill" -msgstr "" -"La différence maximale entre le pixel du clic et les pixels voisins pour " -"qu'ils soient ajoutés dans le remplissage" +msgid "The maximum allowed difference between the clicked pixel and the neighboring pixels to be counted in the fill" +msgstr "La différence maximale entre le pixel du clic et les pixels voisins pour qu'ils soient ajoutés dans le remplissage" #: ../src/widgets/paintbucket-toolbar.cpp:195 msgid "Grow/shrink by" @@ -26759,11 +25647,8 @@ msgid "Grow/shrink by:" msgstr "Agrandir/rétrécir de :" #: ../src/widgets/paintbucket-toolbar.cpp:196 -msgid "" -"The amount to grow (positive) or shrink (negative) the created fill path" -msgstr "" -"Agrandit (si positif) ou rétrécit (si négatif) de cette quantité le chemin " -"créé par remplissage." +msgid "The amount to grow (positive) or shrink (negative) the created fill path" +msgstr "Agrandit (si positif) ou rétrécit (si négatif) de cette quantité le chemin créé par remplissage." #: ../src/widgets/paintbucket-toolbar.cpp:221 msgid "Close gaps" @@ -26774,18 +25659,15 @@ msgid "Close gaps:" msgstr "Combler les vides :" #: ../src/widgets/paintbucket-toolbar.cpp:233 -#: ../src/widgets/pencil-toolbar.cpp:322 ../src/widgets/spiral-toolbar.cpp:300 +#: ../src/widgets/pencil-toolbar.cpp:322 +#: ../src/widgets/spiral-toolbar.cpp:300 #: ../src/widgets/star-toolbar.cpp:572 msgid "Defaults" msgstr "R-à-z" #: ../src/widgets/paintbucket-toolbar.cpp:234 -msgid "" -"Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools " -"to change defaults)" -msgstr "" -"Restaurer les préférences par défaut de l'outil de remplissage au seau " -"(changez les valeurs par défaut dans Inkscape Préférences>Outils)" +msgid "Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools to change defaults)" +msgstr "Restaurer les préférences par défaut de l'outil de remplissage au seau (changez les valeurs par défaut dans Inkscape Préférences>Outils)" #: ../src/widgets/paint-selector.cpp:234 msgid "No paint" @@ -26809,20 +25691,13 @@ msgstr "Remplissage indéfini (permettant ainsi qu'il soit hérité)" #. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty #: ../src/widgets/paint-selector.cpp:263 -msgid "" -"Any path self-intersections or subpaths create holes in the fill (fill-rule: " -"evenodd)" -msgstr "" -"Toute intersection d'un chemin avec lui-même ou avec un de ses sous-chemins " -"engendrera des lacunes dans le remplissage (fill-rule: evenodd)" +msgid "Any path self-intersections or subpaths create holes in the fill (fill-rule: evenodd)" +msgstr "Toute intersection d'un chemin avec lui-même ou avec un de ses sous-chemins engendrera des lacunes dans le remplissage (fill-rule: evenodd)" #. TRANSLATORS: for info, see http://www.w3.org/TR/2000/CR-SVG-20000802/painting.html#FillRuleProperty #: ../src/widgets/paint-selector.cpp:274 -msgid "" -"Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)" -msgstr "" -"Le remplissage est sans lacune, sauf si un sous-chemin est en sens inverse " -"(fill-rule: nonzero)" +msgid "Fill is solid unless a subpath is counterdirectional (fill-rule: nonzero)" +msgstr "Le remplissage est sans lacune, sauf si un sous-chemin est en sens inverse (fill-rule: nonzero)" #: ../src/widgets/paint-selector.cpp:590 msgid "No objects" @@ -26854,14 +25729,8 @@ msgid "Radial gradient" msgstr "Dégradé radial" #: ../src/widgets/paint-selector.cpp:1055 -msgid "" -"Use the Node tool to adjust position, scale, and rotation of the " -"pattern on canvas. Use Object > Pattern > Objects to Pattern to " -"create a new pattern from selection." -msgstr "" -"Utiliser l'outil nœud pour ajuster la position, l'échelle et l'angle " -"du motif sur la zone de travail. Utiliser Objet > Motifs > Objets " -"en Motif pour créer un nouveau motif à partir de la sélection." +msgid "Use the Node tool to adjust position, scale, and rotation of the pattern on canvas. Use Object > Pattern > Objects to Pattern to create a new pattern from selection." +msgstr "Utiliser l'outil nœud pour ajuster la position, l'échelle et l'angle du motif sur la zone de travail. Utiliser Objet > Motifs > Objets en Motif pour créer un nouveau motif à partir de la sélection." #: ../src/widgets/paint-selector.cpp:1068 msgid "Pattern fill" @@ -26915,7 +25784,8 @@ msgstr "Triangle croissant" msgid "From clipboard" msgstr "À partir du presse-papier" -#: ../src/widgets/pencil-toolbar.cpp:213 ../src/widgets/pencil-toolbar.cpp:214 +#: ../src/widgets/pencil-toolbar.cpp:213 +#: ../src/widgets/pencil-toolbar.cpp:214 msgid "Shape:" msgstr "Forme :" @@ -26944,12 +25814,8 @@ msgid "How much smoothing (simplifying) is applied to the line" msgstr "Quel niveau de lissage (simplification) est appliqué à la ligne" #: ../src/widgets/pencil-toolbar.cpp:323 -msgid "" -"Reset pencil parameters to defaults (use Inkscape Preferences > Tools to " -"change defaults)" -msgstr "" -"Restaurer les préférences du crayon par défaut (changez les valeurs par " -"défaut dans Préférences d'Inkscape>Outils)" +msgid "Reset pencil parameters to defaults (use Inkscape Preferences > Tools to change defaults)" +msgstr "Restaurer les préférences du crayon par défaut (changez les valeurs par défaut dans Préférences d'Inkscape>Outils)" #: ../src/widgets/rect-toolbar.cpp:129 msgid "Change rectangle" @@ -26971,7 +25837,8 @@ msgstr "H :" msgid "Height of rectangle" msgstr "Hauteur du rectangle" -#: ../src/widgets/rect-toolbar.cpp:352 ../src/widgets/rect-toolbar.cpp:367 +#: ../src/widgets/rect-toolbar.cpp:352 +#: ../src/widgets/rect-toolbar.cpp:367 msgid "not rounded" msgstr "pas d'arrondi" @@ -27049,147 +25916,116 @@ msgstr "Dimensions" msgid "Maximum size of the ruler" msgstr "" -#: ../src/widgets/select-toolbar.cpp:267 +#: ../src/widgets/select-toolbar.cpp:268 msgid "Transform by toolbar" msgstr "Transformer via la barre d'outils" -#: ../src/widgets/select-toolbar.cpp:346 +#: ../src/widgets/select-toolbar.cpp:347 msgid "Now stroke width is scaled when objects are scaled." -msgstr "" -"Maintenant l'épaisseur de contour est redimensionnée quand les " -"objets sont redimensionnés." +msgstr "Maintenant l'épaisseur de contour est redimensionnée quand les objets sont redimensionnés." -#: ../src/widgets/select-toolbar.cpp:348 +#: ../src/widgets/select-toolbar.cpp:349 msgid "Now stroke width is not scaled when objects are scaled." -msgstr "" -"Maintenant l'épaisseur de contour n'est pas redimensionnée " -"quand les objets sont redimensionnés." +msgstr "Maintenant l'épaisseur de contour n'est pas redimensionnée quand les objets sont redimensionnés." -#: ../src/widgets/select-toolbar.cpp:359 -msgid "" -"Now rounded rectangle corners are scaled when rectangles are " -"scaled." -msgstr "" -"Maintenant les coins arrondis de rectangles sont redimensionnés quand les rectangles sont redimensionnés." +#: ../src/widgets/select-toolbar.cpp:360 +msgid "Now rounded rectangle corners are scaled when rectangles are scaled." +msgstr "Maintenant les coins arrondis de rectangles sont redimensionnés quand les rectangles sont redimensionnés." -#: ../src/widgets/select-toolbar.cpp:361 -msgid "" -"Now rounded rectangle corners are not scaled when rectangles " -"are scaled." -msgstr "" -"Maintenant les coins arrondis de rectangles ne sont pas " -"redimensionnés quand les rectangles sont redimensionnés." +#: ../src/widgets/select-toolbar.cpp:362 +msgid "Now rounded rectangle corners are not scaled when rectangles are scaled." +msgstr "Maintenant les coins arrondis de rectangles ne sont pas redimensionnés quand les rectangles sont redimensionnés." -#: ../src/widgets/select-toolbar.cpp:372 -msgid "" -"Now gradients are transformed along with their objects when " -"those are transformed (moved, scaled, rotated, or skewed)." -msgstr "" -"Maintenant les dégradés sont transformés lors des " -"transformations de leurs objets (déplacement, redimensionnement, rotation ou " -"inclinaison)." +#: ../src/widgets/select-toolbar.cpp:373 +msgid "Now gradients are transformed along with their objects when those are transformed (moved, scaled, rotated, or skewed)." +msgstr "Maintenant les dégradés sont transformés lors des transformations de leurs objets (déplacement, redimensionnement, rotation ou inclinaison)." -#: ../src/widgets/select-toolbar.cpp:374 -msgid "" -"Now gradients remain fixed when objects are transformed " -"(moved, scaled, rotated, or skewed)." -msgstr "" -"Maintenant les dégradés restent fixes lors des transformations " -"de leurs objets (déplacement, redimensionnement, rotation, ou inclinaison)." +#: ../src/widgets/select-toolbar.cpp:375 +msgid "Now gradients remain fixed when objects are transformed (moved, scaled, rotated, or skewed)." +msgstr "Maintenant les dégradés restent fixes lors des transformations de leurs objets (déplacement, redimensionnement, rotation, ou inclinaison)." -#: ../src/widgets/select-toolbar.cpp:385 -msgid "" -"Now patterns are transformed along with their objects when " -"those are transformed (moved, scaled, rotated, or skewed)." -msgstr "" -"Maintenant les motifs sont transformés lors des " -"transformations de leurs objets (déplacement, redimensionnement, rotation ou " -"inclinaison)." +#: ../src/widgets/select-toolbar.cpp:386 +msgid "Now patterns are transformed along with their objects when those are transformed (moved, scaled, rotated, or skewed)." +msgstr "Maintenant les motifs sont transformés lors des transformations de leurs objets (déplacement, redimensionnement, rotation ou inclinaison)." -#: ../src/widgets/select-toolbar.cpp:387 -msgid "" -"Now patterns remain fixed when objects are transformed (moved, " -"scaled, rotated, or skewed)." -msgstr "" -"Maintenant les motifs restent fixes lors des transformations " -"de leurs objets (déplacement, redimensionnement, rotation, ou inclinaison)." +#: ../src/widgets/select-toolbar.cpp:388 +msgid "Now patterns remain fixed when objects are transformed (moved, scaled, rotated, or skewed)." +msgstr "Maintenant les motifs restent fixes lors des transformations de leurs objets (déplacement, redimensionnement, rotation, ou inclinaison)." #. four spinbuttons -#: ../src/widgets/select-toolbar.cpp:505 +#: ../src/widgets/select-toolbar.cpp:506 msgctxt "Select toolbar" msgid "X position" msgstr "Position X" -#: ../src/widgets/select-toolbar.cpp:505 +#: ../src/widgets/select-toolbar.cpp:506 msgctxt "Select toolbar" msgid "X:" msgstr "X :" -#: ../src/widgets/select-toolbar.cpp:507 +#: ../src/widgets/select-toolbar.cpp:508 msgid "Horizontal coordinate of selection" msgstr "Coordonnée horizontale de la sélection" -#: ../src/widgets/select-toolbar.cpp:511 +#: ../src/widgets/select-toolbar.cpp:512 msgctxt "Select toolbar" msgid "Y position" msgstr "Position Y" -#: ../src/widgets/select-toolbar.cpp:511 +#: ../src/widgets/select-toolbar.cpp:512 msgctxt "Select toolbar" msgid "Y:" msgstr "Y :" -#: ../src/widgets/select-toolbar.cpp:513 +#: ../src/widgets/select-toolbar.cpp:514 msgid "Vertical coordinate of selection" msgstr "Coordonnée verticale de la sélection" -#: ../src/widgets/select-toolbar.cpp:517 +#: ../src/widgets/select-toolbar.cpp:518 msgctxt "Select toolbar" msgid "Width" msgstr "Largeur" -#: ../src/widgets/select-toolbar.cpp:517 +#: ../src/widgets/select-toolbar.cpp:518 msgctxt "Select toolbar" msgid "W:" msgstr "L :" -#: ../src/widgets/select-toolbar.cpp:519 +#: ../src/widgets/select-toolbar.cpp:520 msgid "Width of selection" msgstr "Largeur de la sélection" -#: ../src/widgets/select-toolbar.cpp:526 +#: ../src/widgets/select-toolbar.cpp:527 msgid "Lock width and height" msgstr "Verrouiller la largeur et la hauteur" -#: ../src/widgets/select-toolbar.cpp:527 +#: ../src/widgets/select-toolbar.cpp:528 msgid "When locked, change both width and height by the same proportion" -msgstr "" -"Si coché, la hauteur et la largeur sont modifiées selon la même proportion" +msgstr "Si coché, la hauteur et la largeur sont modifiées selon la même proportion" -#: ../src/widgets/select-toolbar.cpp:536 +#: ../src/widgets/select-toolbar.cpp:537 msgctxt "Select toolbar" msgid "Height" msgstr "Hauteur" -#: ../src/widgets/select-toolbar.cpp:536 +#: ../src/widgets/select-toolbar.cpp:537 msgctxt "Select toolbar" msgid "H:" msgstr "H :" -#: ../src/widgets/select-toolbar.cpp:538 +#: ../src/widgets/select-toolbar.cpp:539 msgid "Height of selection" msgstr "Hauteur de la sélection" -#: ../src/widgets/select-toolbar.cpp:588 +#: ../src/widgets/select-toolbar.cpp:589 msgid "Scale rounded corners" msgstr "Redimensionner les coins arrondis des rectangles" -#: ../src/widgets/select-toolbar.cpp:599 +#: ../src/widgets/select-toolbar.cpp:600 msgid "Move gradients" msgstr "Déplacer les dégradés" -#: ../src/widgets/select-toolbar.cpp:610 +#: ../src/widgets/select-toolbar.cpp:611 msgid "Move patterns" msgstr "Déplacer les motifs" @@ -27220,11 +26056,6 @@ msgstr "_V :" msgid "_B:" msgstr "_B :" -# Green (in RGB) -#: ../src/widgets/sp-color-icc-selector.cpp:359 -msgid "G:" -msgstr "V :" - #: ../src/widgets/sp-color-icc-selector.cpp:359 msgid "Gray" msgstr "Niveaux de gris" @@ -27286,8 +26117,7 @@ msgstr "Fixer" #: ../src/widgets/sp-color-icc-selector.cpp:458 msgid "Fix RGB fallback to match icc-color() value." -msgstr "" -"Fixer une valeur RVB de secours pour correspondre à la valeur icc-color()." +msgstr "Fixer une valeur RVB de secours pour correspondre à la valeur icc-color()." # Alpha (opacity) #. Label @@ -27431,16 +26261,12 @@ msgstr "Rayon intérieur :" #: ../src/widgets/spiral-toolbar.cpp:288 msgid "Radius of the innermost revolution (relative to the spiral size)" -msgstr "" -"Rayon de la révolution intérieure (relatif aux dimensions de la spirale)" +msgstr "Rayon de la révolution intérieure (relatif aux dimensions de la spirale)" -#: ../src/widgets/spiral-toolbar.cpp:301 ../src/widgets/star-toolbar.cpp:573 -msgid "" -"Reset shape parameters to defaults (use Inkscape Preferences > Tools to " -"change defaults)" -msgstr "" -"Restaurer les préférences de la forme par défaut (changez les valeurs par " -"défaut dans Inkscape Préférences>Outils)" +#: ../src/widgets/spiral-toolbar.cpp:301 +#: ../src/widgets/star-toolbar.cpp:573 +msgid "Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)" +msgstr "Restaurer les préférences de la forme par défaut (changez les valeurs par défaut dans Inkscape Préférences>Outils)" #. Width #: ../src/widgets/spray-toolbar.cpp:125 @@ -27453,9 +26279,7 @@ msgstr "(pulvérisation large)" #: ../src/widgets/spray-toolbar.cpp:128 msgid "The width of the spray area (relative to the visible canvas area)" -msgstr "" -"Largeur de la zone de pulvérisation (relativement à la zone de travail " -"visible)" +msgstr "Largeur de la zone de pulvérisation (relativement à la zone de travail visible)" #: ../src/widgets/spray-toolbar.cpp:141 msgid "(maximum mean)" @@ -27471,9 +26295,7 @@ msgstr "Rayon :" #: ../src/widgets/spray-toolbar.cpp:144 msgid "0 to spray a spot; increase to enlarge the ring radius" -msgstr "" -"0 pour pulvériser sur un seul endroit ; augmenter pour élargir le rayon de " -"pulvérisation" +msgstr "0 pour pulvériser sur un seul endroit ; augmenter pour élargir le rayon de pulvérisation" #. Standard_deviation #: ../src/widgets/spray-toolbar.cpp:157 @@ -27514,7 +26336,8 @@ msgstr "Pulvérisation par union des formes" msgid "Spray objects in a single path" msgstr "Pulvérisation fusionnée en un chemin unique" -#: ../src/widgets/spray-toolbar.cpp:197 ../src/widgets/tweak-toolbar.cpp:267 +#: ../src/widgets/spray-toolbar.cpp:197 +#: ../src/widgets/tweak-toolbar.cpp:267 msgid "Mode" msgstr "Mode" @@ -27536,11 +26359,8 @@ msgid "Adjusts the number of items sprayed per click" msgstr "Ajuste le nombre de d'éléments pulvérisés par clic" #: ../src/widgets/spray-toolbar.cpp:237 -msgid "" -"Use the pressure of the input device to alter the amount of sprayed objects" -msgstr "" -"Utiliser la pression du périphérique d'entrée pour modifier la quantité " -"d'objets pulvérisés" +msgid "Use the pressure of the input device to alter the amount of sprayed objects" +msgstr "Utiliser la pression du périphérique d'entrée pour modifier la quantité d'objets pulvérisés" #: ../src/widgets/spray-toolbar.cpp:247 msgid "(high rotation variation)" @@ -27556,12 +26376,8 @@ msgstr "Rotation :" #: ../src/widgets/spray-toolbar.cpp:252 #, no-c-format -msgid "" -"Variation of the rotation of the sprayed objects; 0% for the same rotation " -"than the original object" -msgstr "" -"Variation de rotation des objets pulvérisés ; 0 % pour utiliser la même " -"rotation que l'objet original" +msgid "Variation of the rotation of the sprayed objects; 0% for the same rotation than the original object" +msgstr "Variation de rotation des objets pulvérisés ; 0 % pour utiliser la même rotation que l'objet original" #: ../src/widgets/spray-toolbar.cpp:265 msgid "(high scale variation)" @@ -27579,12 +26395,8 @@ msgstr "Échelle :" #: ../src/widgets/spray-toolbar.cpp:270 #, no-c-format -msgid "" -"Variation in the scale of the sprayed objects; 0% for the same scale than " -"the original object" -msgstr "" -"Variation de l'échelle des objets pulvérisés ; 0 % pour utiliser la même " -"taille que l'objet original" +msgid "Variation in the scale of the sprayed objects; 0% for the same scale than the original object" +msgstr "Variation de l'échelle des objets pulvérisés ; 0 % pour utiliser la même taille que l'objet original" #: ../src/widgets/sp-xmlview-attr-list.cpp:64 msgid "Value" @@ -27724,7 +26536,8 @@ msgstr "bien arrondi" msgid "amply rounded" msgstr "largement arrondi" -#: ../src/widgets/star-toolbar.cpp:539 ../src/widgets/star-toolbar.cpp:554 +#: ../src/widgets/star-toolbar.cpp:539 +#: ../src/widgets/star-toolbar.cpp:554 msgid "blown up" msgstr "gonflé" @@ -27837,27 +26650,22 @@ msgstr "Marqueurs :" #: ../src/widgets/stroke-style.cpp:357 msgid "Start Markers are drawn on the first node of a path or shape" -msgstr "" -"Les marqueurs de début sont dessinés sur le premier nœud d'un chemin ou objet" +msgstr "Les marqueurs de début sont dessinés sur le premier nœud d'un chemin ou objet" #: ../src/widgets/stroke-style.cpp:366 -msgid "" -"Mid Markers are drawn on every node of a path or shape except the first and " -"last nodes" -msgstr "" -"Les marqueurs intermédiaires sont dessinés sur chaque nœud d'un chemin ou " -"objet, à l'exception du premier et du dernier" +msgid "Mid Markers are drawn on every node of a path or shape except the first and last nodes" +msgstr "Les marqueurs intermédiaires sont dessinés sur chaque nœud d'un chemin ou objet, à l'exception du premier et du dernier" #: ../src/widgets/stroke-style.cpp:375 msgid "End Markers are drawn on the last node of a path or shape" -msgstr "" -"Les marqueurs de fin sont dessinés sur le dernier nœud d'un chemin ou objet" +msgstr "Les marqueurs de fin sont dessinés sur le dernier nœud d'un chemin ou objet" #: ../src/widgets/stroke-style.cpp:493 msgid "Set markers" msgstr "Appliquer des marqueurs" -#: ../src/widgets/stroke-style.cpp:1022 ../src/widgets/stroke-style.cpp:1107 +#: ../src/widgets/stroke-style.cpp:1022 +#: ../src/widgets/stroke-style.cpp:1107 msgid "Set stroke style" msgstr "Appliquer un style de contour" @@ -27995,7 +26803,8 @@ msgstr "Orientation du texte" msgid "Smaller spacing" msgstr "Espacement plus faible" -#: ../src/widgets/text-toolbar.cpp:1445 ../src/widgets/text-toolbar.cpp:1476 +#: ../src/widgets/text-toolbar.cpp:1445 +#: ../src/widgets/text-toolbar.cpp:1476 #: ../src/widgets/text-toolbar.cpp:1507 msgctxt "Text tool" msgid "Normal" @@ -28021,11 +26830,13 @@ msgid "Spacing between lines (times font size)" msgstr "Espacement entre les lignes (nombre de fois la taille de la police)" #. Drop down menu -#: ../src/widgets/text-toolbar.cpp:1476 ../src/widgets/text-toolbar.cpp:1507 +#: ../src/widgets/text-toolbar.cpp:1476 +#: ../src/widgets/text-toolbar.cpp:1507 msgid "Negative spacing" msgstr "Espacement négatif" -#: ../src/widgets/text-toolbar.cpp:1476 ../src/widgets/text-toolbar.cpp:1507 +#: ../src/widgets/text-toolbar.cpp:1476 +#: ../src/widgets/text-toolbar.cpp:1507 msgid "Positive spacing" msgstr "Espacement positif" @@ -28104,177 +26915,176 @@ msgstr "Rotation :" msgid "Character rotation (degrees)" msgstr "Rotation des caractères (degrés)" -#: ../src/widgets/toolbox.cpp:181 +#: ../src/widgets/toolbox.cpp:182 msgid "Color/opacity used for color tweaking" msgstr "Couleur et opacités pour ajuster les couleurs" -#: ../src/widgets/toolbox.cpp:189 +#: ../src/widgets/toolbox.cpp:190 msgid "Style of new stars" msgstr "Style des nouvelles étoiles" -#: ../src/widgets/toolbox.cpp:191 +#: ../src/widgets/toolbox.cpp:192 msgid "Style of new rectangles" msgstr "Style des nouveaux rectangles" -#: ../src/widgets/toolbox.cpp:193 +#: ../src/widgets/toolbox.cpp:194 msgid "Style of new 3D boxes" msgstr "Style des nouvelles boîtes 3D" -#: ../src/widgets/toolbox.cpp:195 +#: ../src/widgets/toolbox.cpp:196 msgid "Style of new ellipses" msgstr "Style des nouvelles ellipses" -#: ../src/widgets/toolbox.cpp:197 +#: ../src/widgets/toolbox.cpp:198 msgid "Style of new spirals" msgstr "Style des nouvelles spirales" -#: ../src/widgets/toolbox.cpp:199 +#: ../src/widgets/toolbox.cpp:200 msgid "Style of new paths created by Pencil" msgstr "Style des chemins créés par le crayon" -#: ../src/widgets/toolbox.cpp:201 +#: ../src/widgets/toolbox.cpp:202 msgid "Style of new paths created by Pen" msgstr "Style des chemins créés par le stylo" -#: ../src/widgets/toolbox.cpp:203 +#: ../src/widgets/toolbox.cpp:204 msgid "Style of new calligraphic strokes" msgstr "Style des nouveaux tracés calligraphiques" -#: ../src/widgets/toolbox.cpp:205 ../src/widgets/toolbox.cpp:207 +#: ../src/widgets/toolbox.cpp:206 +#: ../src/widgets/toolbox.cpp:208 msgid "TBD" msgstr "À définir" -#: ../src/widgets/toolbox.cpp:219 +#: ../src/widgets/toolbox.cpp:220 msgid "Style of Paint Bucket fill objects" msgstr "Style des objets créés par remplissage au seau" -#: ../src/widgets/toolbox.cpp:1680 +#: ../src/widgets/toolbox.cpp:1681 msgid "Bounding box" msgstr "Boîte englobante" -#: ../src/widgets/toolbox.cpp:1680 +#: ../src/widgets/toolbox.cpp:1681 msgid "Snap bounding boxes" msgstr "Aimanter aux boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1689 +#: ../src/widgets/toolbox.cpp:1690 msgid "Bounding box edges" msgstr "Bords des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1689 +#: ../src/widgets/toolbox.cpp:1690 msgid "Snap to edges of a bounding box" msgstr "Aimanter aux bords des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1698 +#: ../src/widgets/toolbox.cpp:1699 msgid "Bounding box corners" msgstr "Coins des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1698 +#: ../src/widgets/toolbox.cpp:1699 msgid "Snap bounding box corners" msgstr "Aimanter aux coins des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1707 +#: ../src/widgets/toolbox.cpp:1708 msgid "BBox Edge Midpoints" msgstr "Milieux des bords de la boîte englobante" -#: ../src/widgets/toolbox.cpp:1707 +#: ../src/widgets/toolbox.cpp:1708 msgid "Snap midpoints of bounding box edges" msgstr "Aimanter au milieu des bords des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1717 +#: ../src/widgets/toolbox.cpp:1718 msgid "BBox Centers" msgstr "Centre des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1717 +#: ../src/widgets/toolbox.cpp:1718 msgid "Snapping centers of bounding boxes" msgstr "Aimanter au centre des boîtes englobantes" -#: ../src/widgets/toolbox.cpp:1726 +#: ../src/widgets/toolbox.cpp:1727 msgid "Snap nodes, paths, and handles" msgstr "Aimanter aux nœuds, chemins et poignées" -#: ../src/widgets/toolbox.cpp:1734 +#: ../src/widgets/toolbox.cpp:1735 msgid "Snap to paths" msgstr "Aimanter aux chemins" -#: ../src/widgets/toolbox.cpp:1743 +#: ../src/widgets/toolbox.cpp:1744 msgid "Path intersections" msgstr "Intersections des chemins" -#: ../src/widgets/toolbox.cpp:1743 +#: ../src/widgets/toolbox.cpp:1744 msgid "Snap to path intersections" msgstr "Aimanter aux intersections des chemins" -#: ../src/widgets/toolbox.cpp:1752 +#: ../src/widgets/toolbox.cpp:1753 msgid "To nodes" msgstr "Aux nœuds" -#: ../src/widgets/toolbox.cpp:1752 +#: ../src/widgets/toolbox.cpp:1753 msgid "Snap cusp nodes, incl. rectangle corners" msgstr "" -#: ../src/widgets/toolbox.cpp:1761 +#: ../src/widgets/toolbox.cpp:1762 msgid "Smooth nodes" msgstr "Nœuds doux" -#: ../src/widgets/toolbox.cpp:1761 +#: ../src/widgets/toolbox.cpp:1762 msgid "Snap smooth nodes, incl. quadrant points of ellipses" msgstr "" -#: ../src/widgets/toolbox.cpp:1770 +#: ../src/widgets/toolbox.cpp:1771 msgid "Line Midpoints" msgstr "Milieu de ligne" -#: ../src/widgets/toolbox.cpp:1770 +#: ../src/widgets/toolbox.cpp:1771 msgid "Snap midpoints of line segments" msgstr "Aimanter au milieu des segments" -#: ../src/widgets/toolbox.cpp:1779 +#: ../src/widgets/toolbox.cpp:1780 msgid "Others" msgstr "Autres" -#: ../src/widgets/toolbox.cpp:1779 +#: ../src/widgets/toolbox.cpp:1780 msgid "Snap other points (centers, guide origins, gradient handles, etc.)" -msgstr "" -"Aimanter à d'autres points (centres, origines de guide, poignées de " -"gradients, etc.)" +msgstr "Aimanter à d'autres points (centres, origines de guide, poignées de gradients, etc.)" -#: ../src/widgets/toolbox.cpp:1787 +#: ../src/widgets/toolbox.cpp:1788 msgid "Object Centers" msgstr "Centres d'objet" -#: ../src/widgets/toolbox.cpp:1787 +#: ../src/widgets/toolbox.cpp:1788 msgid "Snap centers of objects" msgstr "Aimanter au centre des objets" -#: ../src/widgets/toolbox.cpp:1796 +#: ../src/widgets/toolbox.cpp:1797 msgid "Rotation Centers" msgstr "Centres de rotation" -#: ../src/widgets/toolbox.cpp:1796 +#: ../src/widgets/toolbox.cpp:1797 msgid "Snap an item's rotation center" msgstr "Aimanter au centre de rotation d'un objet" -#: ../src/widgets/toolbox.cpp:1805 +#: ../src/widgets/toolbox.cpp:1806 msgid "Text baseline" msgstr "Ligne de base de texte" -#: ../src/widgets/toolbox.cpp:1805 +#: ../src/widgets/toolbox.cpp:1806 msgid "Snap text anchors and baselines" msgstr "Aimanter aux ancres et lignes de base" -#: ../src/widgets/toolbox.cpp:1815 +#: ../src/widgets/toolbox.cpp:1816 msgid "Page border" msgstr "Bords de la page" -#: ../src/widgets/toolbox.cpp:1815 +#: ../src/widgets/toolbox.cpp:1816 msgid "Snap to the page border" msgstr "Aimanter aux bords de la page" -#: ../src/widgets/toolbox.cpp:1824 +#: ../src/widgets/toolbox.cpp:1825 msgid "Snap to grids" msgstr "Aimanter aux grilles" -#: ../src/widgets/toolbox.cpp:1833 +#: ../src/widgets/toolbox.cpp:1834 msgid "Snap guides" msgstr "Aimanter aux guides" @@ -28289,8 +27099,7 @@ msgstr "(ajustement large)" #: ../src/widgets/tweak-toolbar.cpp:142 msgid "The width of the tweak area (relative to the visible canvas area)" -msgstr "" -"Largeur de la zone d'ajustement (relativement à la zone de travail visible)" +msgstr "Largeur de la zone d'ajustement (relativement à la zone de travail visible)" #. Force #: ../src/widgets/tweak-toolbar.cpp:156 @@ -28351,8 +27160,7 @@ msgstr "Mode rotation" #: ../src/widgets/tweak-toolbar.cpp:206 msgid "Rotate objects, with Shift counterclockwise" -msgstr "" -"Applique une rotation dans le sens horaire ; avec Maj, le sens est inversé" +msgstr "Applique une rotation dans le sens horaire ; avec Maj, le sens est inversé" #: ../src/widgets/tweak-toolbar.cpp:212 msgid "Duplicate/delete mode" @@ -28384,8 +27192,7 @@ msgstr "Mode attraction/répulsion" #: ../src/widgets/tweak-toolbar.cpp:234 msgid "Attract parts of paths towards cursor; with Shift from cursor" -msgstr "" -"Attire les chemins vers le curseur ; avec Maj, éloigne les chemins du curseur" +msgstr "Attire les chemins vers le curseur ; avec Maj, éloigne les chemins du curseur" #: ../src/widgets/tweak-toolbar.cpp:240 msgid "Roughen mode" @@ -28480,18 +27287,12 @@ msgid "Fidelity:" msgstr "Fidélité:" #: ../src/widgets/tweak-toolbar.cpp:368 -msgid "" -"Low fidelity simplifies paths; high fidelity preserves path features but may " -"generate a lot of new nodes" -msgstr "" -"Une basse fidélité simplifie les chemins; Une haute fidélité préserve les " -"propriétés des chemins mais peut ajouter de nombreux nœuds." +msgid "Low fidelity simplifies paths; high fidelity preserves path features but may generate a lot of new nodes" +msgstr "Une basse fidélité simplifie les chemins; Une haute fidélité préserve les propriétés des chemins mais peut ajouter de nombreux nœuds." #: ../src/widgets/tweak-toolbar.cpp:387 msgid "Use the pressure of the input device to alter the force of tweak action" -msgstr "" -"Utiliser la pression du périphérique d'entrée pour modifier la force de " -"l'outil" +msgstr "Utiliser la pression du périphérique d'entrée pour modifier la force de l'outil" #: ../share/extensions/convert2dashes.py:93 msgid "" @@ -28507,9 +27308,7 @@ msgstr "Veuillez sélectionner un objet." #: ../share/extensions/dimension.py:133 msgid "Unable to process this object. Try changing it into a path first." -msgstr "" -"Traitement de l'objet impossible. Essayer tout d'abord de le transformer en " -"chemin." +msgstr "Traitement de l'objet impossible. Essayer tout d'abord de le transformer en chemin." #. report to the Inkscape console using errormsg #: ../share/extensions/draw_from_triangle.py:178 @@ -28546,23 +27345,15 @@ msgstr "Aire (px²) :" #: ../share/extensions/dxf_input.py:504 #, python-format -msgid "" -"%d ENTITIES of type POLYLINE encountered and ignored. Please try to convert " -"to Release 13 format using QCad." +msgid "%d ENTITIES of type POLYLINE encountered and ignored. Please try to convert to Release 13 format using QCad." msgstr "" #: ../share/extensions/dxf_outlines.py:49 -msgid "" -"Failed to import the numpy or numpy.linalg modules. These modules are " -"required by this extension. Please install them and try again." -msgstr "" -"Échec lors de l'import des modules numpy.linalg. Ces modules sont " -"nécessaires à cette extension. Veuillez les installer et réessayer." +msgid "Failed to import the numpy or numpy.linalg modules. These modules are required by this extension. Please install them and try again." +msgstr "Échec lors de l'import des modules numpy.linalg. Ces modules sont nécessaires à cette extension. Veuillez les installer et réessayer." #: ../share/extensions/dxf_outlines.py:300 -msgid "" -"Error: Field 'Layer match name' must be filled when using 'By name match' " -"option" +msgid "Error: Field 'Layer match name' must be filled when using 'By name match' option" msgstr "" #: ../share/extensions/dxf_outlines.py:341 @@ -28571,12 +27362,8 @@ msgid "Warning: Layer '%s' not found!" msgstr "Calque introuvable.\n" #: ../share/extensions/embedimage.py:84 -msgid "" -"No xlink:href or sodipodi:absref attributes found, or they do not point to " -"an existing file! Unable to embed image." -msgstr "" -"Les attributs xlink:href et sodipodi:absref n'ont pas été trouvés, ou " -"n'indiquent pas un fichier existant ! Impossible d'incorporer l'image." +msgid "No xlink:href or sodipodi:absref attributes found, or they do not point to an existing file! Unable to embed image." +msgstr "Les attributs xlink:href et sodipodi:absref n'ont pas été trouvés, ou n'indiquent pas un fichier existant ! Impossible d'incorporer l'image." #: ../share/extensions/embedimage.py:86 #, python-format @@ -28585,20 +27372,12 @@ msgstr "Désolé, nous ne pouvons pas localiser %s" #: ../share/extensions/embedimage.py:111 #, python-format -msgid "" -"%s is not of type image/png, image/jpeg, image/bmp, image/gif, image/tiff, " -"or image/x-icon" -msgstr "" -"%s n'est pas du type image/png, image/jpeg, image/bmp, image/gif, image/" -"tiff, ou image/x-icon" +msgid "%s is not of type image/png, image/jpeg, image/bmp, image/gif, image/tiff, or image/x-icon" +msgstr "%s n'est pas du type image/png, image/jpeg, image/bmp, image/gif, image/tiff, ou image/x-icon" #: ../share/extensions/export_gimp_palette.py:16 -msgid "" -"The export_gpl.py module requires PyXML. Please download the latest version " -"from http://pyxml.sourceforge.net/." -msgstr "" -"Le module d'exportation _gpl.py nécessite PyXML. Veuillez en télécharger la " -"dernière version à l'adresse http://pyxml.sourceforge.net/." +msgid "The export_gpl.py module requires PyXML. Please download the latest version from http://pyxml.sourceforge.net/." +msgstr "Le module d'exportation _gpl.py nécessite PyXML. Veuillez en télécharger la dernière version à l'adresse http://pyxml.sourceforge.net/." #: ../share/extensions/extractimage.py:68 #, python-format @@ -28632,21 +27411,15 @@ msgstr "Veuillez sélectionner un rectangle" #: ../share/extensions/gcodetools.py:6232 #: ../share/extensions/gcodetools.py:6427 msgid "No paths are selected! Trying to work on all available paths." -msgstr "" -"Aucun chemin n'est sélectionné ! Tentative d'utilisation de tous les chemins " -"disponibles." +msgstr "Aucun chemin n'est sélectionné ! Tentative d'utilisation de tous les chemins disponibles." #: ../share/extensions/gcodetools.py:3324 msgid "Noting is selected. Please select something." msgstr "Rien n'est sélectionné. Merci de sélectionner quelque chose." #: ../share/extensions/gcodetools.py:3864 -msgid "" -"Directory does not exist! Please specify existing directory at Preferences " -"tab!" -msgstr "" -"Le dossier n'existe pas ! Veuillez spécifier un dossier existant dans " -"l'onglet Préférences." +msgid "Directory does not exist! Please specify existing directory at Preferences tab!" +msgstr "Le dossier n'existe pas ! Veuillez spécifier un dossier existant dans l'onglet Préférences." #: ../share/extensions/gcodetools.py:3894 #, python-format @@ -28659,12 +27432,8 @@ msgstr "" #: ../share/extensions/gcodetools.py:4040 #, python-format -msgid "" -"Orientation points for '%s' layer have not been found! Please add " -"orientation points using Orientation tab!" -msgstr "" -"Les points d'orientation n'ont pas été définis pour le calque '%s'. Veuillez " -"ajouter des points d'orientation avec l'onglet Orientation." +msgid "Orientation points for '%s' layer have not been found! Please add orientation points using Orientation tab!" +msgstr "Les points d'orientation n'ont pas été définis pour le calque '%s'. Veuillez ajouter des points d'orientation avec l'onglet Orientation." #: ../share/extensions/gcodetools.py:4047 #, python-format @@ -28673,68 +27442,43 @@ msgstr "Le calque '%s' contient plus d'un groupe de points d'orientation" #: ../share/extensions/gcodetools.py:4078 #: ../share/extensions/gcodetools.py:4080 -msgid "" -"Orientation points are wrong! (if there are two orientation points they " -"should not be the same. If there are three orientation points they should " -"not be in a straight line.)" +msgid "Orientation points are wrong! (if there are two orientation points they should not be the same. If there are three orientation points they should not be in a straight line.)" msgstr "" #: ../share/extensions/gcodetools.py:4250 #, python-format -msgid "" -"Warning! Found bad orientation points in '%s' layer. Resulting Gcode could " -"be corrupt!" -msgstr "" -"Attention ! Des mauvais points d'orientation ont été trouvés dans le calque " -"'%s'. Le Gcode généré pourrait être corrompu !" +msgid "Warning! Found bad orientation points in '%s' layer. Resulting Gcode could be corrupt!" +msgstr "Attention ! Des mauvais points d'orientation ont été trouvés dans le calque '%s'. Le Gcode généré pourrait être corrompu !" #: ../share/extensions/gcodetools.py:4263 #, python-format -msgid "" -"Warning! Found bad graffiti reference point in '%s' layer. Resulting Gcode " -"could be corrupt!" -msgstr "" -"Attention ! Un mauvais point de référence graffiti a été trouvé dans le " -"calque '%s'. Le Gcode généré pourrait être corrompu !" +msgid "Warning! Found bad graffiti reference point in '%s' layer. Resulting Gcode could be corrupt!" +msgstr "Attention ! Un mauvais point de référence graffiti a été trouvé dans le calque '%s'. Le Gcode généré pourrait être corrompu !" #. xgettext:no-pango-format #: ../share/extensions/gcodetools.py:4284 msgid "" -"This extension works with Paths and Dynamic Offsets and groups of them only! " -"All other objects will be ignored!\n" +"This extension works with Paths and Dynamic Offsets and groups of them only! All other objects will be ignored!\n" "Solution 1: press Path->Object to path or Shift+Ctrl+C.\n" "Solution 2: Path->Dynamic offset or Ctrl+J.\n" -"Solution 3: export all contours to PostScript level 2 (File->Save As->.ps) " -"and File->Import this file." +"Solution 3: export all contours to PostScript level 2 (File->Save As->.ps) and File->Import this file." msgstr "" -"Cette extension ne fonctionne qu'avec des chemins ou des offsets dynamiques " -"(ou des groupes contenant seulement ces types d'objets). Tout autre objet " -"sera ignoré.\n" +"Cette extension ne fonctionne qu'avec des chemins ou des offsets dynamiques (ou des groupes contenant seulement ces types d'objets). Tout autre objet sera ignoré.\n" "Solution 1 : lancez la commande Chemin>Objet en chemin (ou Maj+Ctrl+C).\n" "Solution 2 : Chemin>Offset dynamique (ou Ctrl+J).\n" -"Solution 3 : exportez tous les contours en PostScript niveau 2 " -"(Fichier>Enregistrer sous>.ps) puis réimportez le fichier avec " -"Fichier>Importer." +"Solution 3 : exportez tous les contours en PostScript niveau 2 (Fichier>Enregistrer sous>.ps) puis réimportez le fichier avec Fichier>Importer." #: ../share/extensions/gcodetools.py:4290 -msgid "" -"Document has no layers! Add at least one layer using layers panel (Ctrl+Shift" -"+L)" -msgstr "" -"Le document n'a pas de calque ! Veuillez en ajouter au moins un avec la " -"boîte de dialogue des calques (Maj+Ctrl+L)" +msgid "Document has no layers! Add at least one layer using layers panel (Ctrl+Shift+L)" +msgstr "Le document n'a pas de calque ! Veuillez en ajouter au moins un avec la boîte de dialogue des calques (Maj+Ctrl+L)" #: ../share/extensions/gcodetools.py:4294 -msgid "" -"Warning! There are some paths in the root of the document, but not in any " -"layer! Using bottom-most layer for them." +msgid "Warning! There are some paths in the root of the document, but not in any layer! Using bottom-most layer for them." msgstr "" #: ../share/extensions/gcodetools.py:4371 #, python-format -msgid "" -"Warning! Tool's and default tool's parameter's (%s) types are not the same " -"( type('%s') != type('%s') )." +msgid "Warning! Tool's and default tool's parameter's (%s) types are not the same ( type('%s') != type('%s') )." msgstr "" #: ../share/extensions/gcodetools.py:4374 @@ -28749,23 +27493,16 @@ msgstr "Le calque '%s' contient plus d'un outil !" #: ../share/extensions/gcodetools.py:4391 #, python-format -msgid "" -"Can not find tool for '%s' layer! Please add one with Tools library tab!" +msgid "Can not find tool for '%s' layer! Please add one with Tools library tab!" msgstr "" #: ../share/extensions/gcodetools.py:4553 #: ../share/extensions/gcodetools.py:4708 -msgid "" -"Warning: One or more paths do not have 'd' parameter, try to Ungroup (Ctrl" -"+Shift+G) and Object to Path (Ctrl+Shift+C)!" -msgstr "" -"Attention : au moins un chemin n'a pas de paramètre 'd'. Veuillez dégrouper " -"(Maj+Ctrl+G) et transformer l'objet en chemin (Maj+Ctrl+C)." +msgid "Warning: One or more paths do not have 'd' parameter, try to Ungroup (Ctrl+Shift+G) and Object to Path (Ctrl+Shift+C)!" +msgstr "Attention : au moins un chemin n'a pas de paramètre 'd'. Veuillez dégrouper (Maj+Ctrl+G) et transformer l'objet en chemin (Maj+Ctrl+C)." #: ../share/extensions/gcodetools.py:4667 -msgid "" -"Noting is selected. Please select something to convert to drill point " -"(dxfpoint) or clear point sign." +msgid "Noting is selected. Please select something to convert to drill point (dxfpoint) or clear point sign." msgstr "" #: ../share/extensions/gcodetools.py:4750 @@ -28777,9 +27514,7 @@ msgstr "Cette extension nécessite la sélection d'un chemin." #: ../share/extensions/gcodetools.py:5002 #, python-format msgid "Tool diameter must be > 0 but tool's diameter on '%s' layer is not!" -msgstr "" -"Le diamètre d'outil doit être supérieur à 0, ce qui n'est pas le cas pour " -"l'outil du calque '%s' !" +msgstr "Le diamètre d'outil doit être supérieur à 0, ce qui n'est pas le cas pour l'outil du calque '%s' !" #: ../share/extensions/gcodetools.py:4767 #: ../share/extensions/gcodetools.py:4956 @@ -28810,18 +27545,12 @@ msgid "No need to engrave sharp angles." msgstr "Il n'est pas nécessaire de graver les angles aigus." #: ../share/extensions/gcodetools.py:5848 -msgid "" -"Active layer already has orientation points! Remove them or select another " -"layer!" -msgstr "" -"Le calque actif possède déjà des points d'orientation. Veuillez les " -"supprimer ou sélectionner un autre calque." +msgid "Active layer already has orientation points! Remove them or select another layer!" +msgstr "Le calque actif possède déjà des points d'orientation. Veuillez les supprimer ou sélectionner un autre calque." #: ../share/extensions/gcodetools.py:5893 msgid "Active layer already has a tool! Remove it or select another layer!" -msgstr "" -"Le calque actif possède déjà un outil. Veuillez le supprimer ou sélectionner " -"un autre calque." +msgstr "Le calque actif possède déjà un outil. Veuillez le supprimer ou sélectionner un autre calque." #: ../share/extensions/gcodetools.py:6008 msgid "Selection is empty! Will compute whole drawing." @@ -28852,27 +27581,20 @@ msgstr "" #: ../share/extensions/gcodetools.py:6662 #, python-format msgid "" -"Select one of the action tabs - Path to Gcode, Area, Engraving, DXF points, " -"Orientation, Offset, Lathe or Tools library.\n" +"Select one of the action tabs - Path to Gcode, Area, Engraving, DXF points, Orientation, Offset, Lathe or Tools library.\n" " Current active tab id is %s" msgstr "" #: ../share/extensions/gcodetools.py:6668 -msgid "" -"Orientation points have not been defined! A default set of orientation " -"points has been automatically added." +msgid "Orientation points have not been defined! A default set of orientation points has been automatically added." msgstr "" #: ../share/extensions/gcodetools.py:6672 -msgid "" -"Cutting tool has not been defined! A default tool has been automatically " -"added." +msgid "Cutting tool has not been defined! A default tool has been automatically added." msgstr "" #: ../share/extensions/generate_voronoi.py:35 -msgid "" -"Failed to import the subprocess module. Please report this as a bug at: " -"https://bugs.launchpad.net/inkscape." +msgid "Failed to import the subprocess module. Please report this as a bug at: https://bugs.launchpad.net/inkscape." msgstr "" #: ../share/extensions/generate_voronoi.py:36 @@ -28891,7 +27613,7 @@ msgstr "Gimp doit être installé et défini dans votre variable PATH." msgid "An error occurred while processing the XCF file." msgstr "Une erreur est apparue lors du traitement du fichier XCF." -#: ../share/extensions/gimp_xcf.py:171 +#: ../share/extensions/gimp_xcf.py:177 msgid "This extension requires at least one non empty layer." msgstr "Cette extension nécessite la sélection d'au moins un calque non vide." @@ -28899,45 +27621,53 @@ msgstr "Cette extension nécessite la sélection d'au moins un calque non vide." msgid "The sliced bitmaps have been saved as:" msgstr "L'image découpée a été enregistrée sous :" -#: ../share/extensions/hpgl_input.py:58 -msgid "" -"The HPGL data contained unknown (unsupported) commands, there is a " -"possibility that the drawing is missing some content." -msgstr "" +#: ../share/extensions/hpgl_decoder.py:44 +#, fuzzy +msgid "Movements" +msgstr "Déplacer les dégradés" + +#: ../share/extensions/hpgl_decoder.py:45 +#, fuzzy +msgid "Pen #" +msgstr "Inertie du stylo" #. issue error if no hpgl data found -#: ../share/extensions/hpgl_input.py:64 +#: ../share/extensions/hpgl_input.py:59 #, fuzzy msgid "No HPGL data found." msgstr "Aucune correspondance" +#: ../share/extensions/hpgl_input.py:67 +msgid "The HPGL data contained unknown (unsupported) commands, there is a possibility that the drawing is missing some content." +msgstr "" + #. issue error if no paths found -#: ../share/extensions/hpgl_output.py:59 -msgid "" -"No paths where found. Please convert all objects you want to save into paths." +#: ../share/extensions/hpgl_output.py:62 +msgid "No paths where found. Please convert all objects you want to save into paths." msgstr "" #: ../share/extensions/inkex.py:109 #, python-format msgid "" -"The fantastic lxml wrapper for libxml2 is required by inkex.py and therefore " -"this extension. Please download and install the latest version from http://" -"cheeseshop.python.org/pypi/lxml/, or install it through your package manager " -"by a command like: sudo apt-get install python-lxml\n" +"The fantastic lxml wrapper for libxml2 is required by inkex.py and therefore this extension. Please download and install the latest version from http://cheeseshop.python.org/pypi/lxml/, or install it through your package manager by a command like: sudo apt-get install python-lxml\n" "\n" "Technical details:\n" "%s" msgstr "" -"La fantastique classe lxml pour libxml2 est nécessaire à inkex.py et par " -"conséquent à cette extension. Veuillez en télécharger et installer la " -"dernière version à partir du site http://cheeseshop.python.org/pypi/lxml/, " -"ou l'installer directement avec votre gestionnaire de paquet avec une " -"commande du type : sudo apt-get install python-lxml\n" +"La fantastique classe lxml pour libxml2 est nécessaire à inkex.py et par conséquent à cette extension. Veuillez en télécharger et installer la dernière version à partir du site http://cheeseshop.python.org/pypi/lxml/, ou l'installer directement avec votre gestionnaire de paquet avec une commande du type : sudo apt-get install python-lxml\n" "\n" "Détails techniques :\n" "%s" -#: ../share/extensions/inkex.py:260 +#: ../share/extensions/inkex.py:162 +#: ../share/extensions/inkex.py:171 +#, fuzzy, python-format +msgid "Unable to open specified file: %s" +msgstr "" +"Échec de l'écriture dans le fichier spécifié.\n" +"%s" + +#: ../share/extensions/inkex.py:276 #, python-format msgid "No matching node for expression: %s" msgstr "Aucun nœud ne correspond à l'expression : %s" @@ -28957,16 +27687,10 @@ msgstr "Aucune sélection à interpoler" #: ../share/extensions/jessyInk_video.py:49 #: ../share/extensions/jessyInk_view.py:67 msgid "" -"The JessyInk script is not installed in this SVG file or has a different " -"version than the JessyInk extensions. Please select \"install/update...\" " -"from the \"JessyInk\" sub-menu of the \"Extensions\" menu to install or " -"update the JessyInk script.\n" +"The JessyInk script is not installed in this SVG file or has a different version than the JessyInk extensions. Please select \"install/update...\" from the \"JessyInk\" sub-menu of the \"Extensions\" menu to install or update the JessyInk script.\n" "\n" msgstr "" -"Le script JessyInk n'est pas installé dans ce fichier SVG ou est d'une " -"version différente de l'extension. Veuillez utiliser la commande " -"Extensions>JessyInk>Installation/mise à jour pour installer ou mettre à jour " -"le script.\n" +"Le script JessyInk n'est pas installé dans ce fichier SVG ou est d'une version différente de l'extension. Veuillez utiliser la commande Extensions>JessyInk>Installation/mise à jour pour installer ou mettre à jour le script.\n" "\n" #: ../share/extensions/jessyInk_autoTexts.py:48 @@ -28982,17 +27706,12 @@ msgid "" "Node with id '{0}' is not a suitable text node and was therefore ignored.\n" "\n" msgstr "" -"Le nœud d'id '{0}' n'est pas un nœud texte approprié et a été de fait " -"ignoré.\n" +"Le nœud d'id '{0}' n'est pas un nœud texte approprié et a été de fait ignoré.\n" "\n" #: ../share/extensions/jessyInk_effects.py:53 -msgid "" -"No object selected. Please select the object you want to assign an effect to " -"and then press apply.\n" -msgstr "" -"Aucun objet sélectionné. Veuillez préalablement sélectionner l'objet auquel " -"vous souhaitez assigner un effet.\n" +msgid "No object selected. Please select the object you want to assign an effect to and then press apply.\n" +msgstr "Aucun objet sélectionné. Veuillez préalablement sélectionner l'objet auquel vous souhaitez assigner un effet.\n" #: ../share/extensions/jessyInk_export.py:82 msgid "Could not find Inkscape command.\n" @@ -29003,9 +27722,7 @@ msgid "Layer not found. Removed current master slide selection.\n" msgstr "" #: ../share/extensions/jessyInk_masterSlide.py:58 -msgid "" -"More than one layer with this name found. Removed current master slide " -"selection.\n" +msgid "More than one layer with this name found. Removed current master slide selection.\n" msgstr "" #: ../share/extensions/jessyInk_summary.py:69 @@ -29062,8 +27779,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'objet d'identifiant \"{2}\") sera remplacé par \"{3}\"." +msgstr "{0}\t\"{1}\" (l'objet d'identifiant \"{2}\") sera remplacé par \"{3}\"." #: ../share/extensions/jessyInk_summary.py:168 msgid "" @@ -29126,13 +27842,10 @@ msgstr "" #: ../share/extensions/jessyInk_view.py:75 msgid "More than one object selected. Please select only one object.\n" -msgstr "" -"Plus d'un objet est sélectionné. Veuillez sélectionner un seul objet.\n" +msgstr "Plus d'un objet est sélectionné. Veuillez sélectionner un seul objet.\n" #: ../share/extensions/jessyInk_view.py:79 -msgid "" -"No object selected. Please select the object you want to assign a view to " -"and then press apply.\n" +msgid "No object selected. Please select the object you want to assign a view to and then press apply.\n" msgstr "" #: ../share/extensions/markers_strokepaint.py:83 @@ -29157,8 +27870,7 @@ msgid "" "Please choose a larger object or set 'Space between copies' > 0" msgstr "" "La taille du motif est trop petite.\n" -"Veuillez choisir un objet plus grand ou paramétrer « Espacement entre les " -"copies » avec une valeur supérieure à zéro." +"Veuillez choisir un objet plus grand ou paramétrer « Espacement entre les copies » avec une valeur supérieure à zéro." #: ../share/extensions/pathalongpath.py:277 msgid "" @@ -29172,16 +27884,8 @@ msgid "Please first convert objects to paths! (Got [%s].)" msgstr "Veuillez d'abord convertir les objets en chemins ! (Obtenu [%s].)" #: ../share/extensions/perspective.py:45 -msgid "" -"Failed to import the numpy or numpy.linalg modules. These modules are " -"required by this extension. Please install them and try again. On a Debian-" -"like system this can be done with the command, sudo apt-get install python-" -"numpy." -msgstr "" -"Échec lors de l'import des modules numpy.linalg. Ces modules sont " -"nécessaires à cette extension. Veuillez les installer et réessayer. Sur un " -"système de type Debian, cette installation peut être réalisée avec la " -"commande : sudo apt-get install python-numpy." +msgid "Failed to import the numpy or numpy.linalg modules. These modules are required by this extension. Please install them and try again. On a Debian-like system this can be done with the command, sudo apt-get install python-numpy." +msgstr "Échec lors de l'import des modules numpy.linalg. Ces modules sont nécessaires à cette extension. Veuillez les installer et réessayer. Sur un système de type Debian, cette installation peut être réalisée avec la commande : sudo apt-get install python-numpy." #: ../share/extensions/perspective.py:60 #: ../share/extensions/summersnight.py:51 @@ -29195,11 +27899,8 @@ msgstr "" #: ../share/extensions/perspective.py:67 #: ../share/extensions/summersnight.py:59 -msgid "" -"This extension requires that the second selected path be four nodes long." -msgstr "" -"Cette extension exige que le second chemin sélectionné contienne quatre " -"nœuds." +msgid "This extension requires that the second selected path be four nodes long." +msgstr "Cette extension exige que le second chemin sélectionné contienne quatre nœuds." #: ../share/extensions/perspective.py:93 #: ../share/extensions/summersnight.py:92 @@ -29228,32 +27929,22 @@ msgstr "" "Le premier objet sélectionné n'est pas un chemin.\n" "Essayez la commande Chemin>Objet en chemin." -#: ../share/extensions/plotter.py:62 -msgid "pySerial is not installed." +#. issue error if no paths found +#: ../share/extensions/plotter.py:70 +msgid "No paths where found. Please convert all objects you want to plot into paths." msgstr "" -#. issue error if no paths found -#: ../share/extensions/plotter.py:75 -msgid "" -"No paths where found. Please convert all objects you want to plot into paths." +#: ../share/extensions/plotter.py:131 +msgid "pySerial is not installed." msgstr "" -#: ../share/extensions/plotter.py:111 -msgid "" -"Could not send data. Please check that your plotter is running, connected " -"and the settings are correct." +#: ../share/extensions/plotter.py:151 +msgid "Could not open port. Please check that your plotter is running, connected and the settings are correct." msgstr "" #: ../share/extensions/polyhedron_3d.py:65 -msgid "" -"Failed to import the numpy module. This module is required by this " -"extension. Please install it and try again. On a Debian-like system this " -"can be done with the command 'sudo apt-get install python-numpy'." -msgstr "" -"Échec lors de l'import du module numpy. Ce module est nécessaire à cette " -"extension. Veuillez l'installer et réessayer. Sur un système de type Debian, " -"cette installation peut être réalisée avec la commande : sudo apt-get " -"install python-numpy." +msgid "Failed to import the numpy module. This module is required by this extension. Please install it and try again. On a Debian-like system this can be done with the command 'sudo apt-get install python-numpy'." +msgstr "Échec lors de l'import du module numpy. Ce module est nécessaire à cette extension. Veuillez l'installer et réessayer. Sur un système de type Debian, cette installation peut être réalisée avec la commande : sudo apt-get install python-numpy." #: ../share/extensions/polyhedron_3d.py:336 msgid "No face data found in specified file." @@ -29261,9 +27952,7 @@ msgstr "Le fichier spécifié ne contient aucune donnée de facette." #: ../share/extensions/polyhedron_3d.py:337 msgid "Try selecting \"Edge Specified\" in the Model File tab.\n" -msgstr "" -"Essayez de sélectionner « défini par les bords » dans l'onglet Fichier " -"modèle .\n" +msgstr "Essayez de sélectionner « défini par les bords » dans l'onglet Fichier modèle .\n" #: ../share/extensions/polyhedron_3d.py:343 msgid "No edge data found in specified file." @@ -29271,19 +27960,12 @@ msgstr "Le fichier spécifié ne contient aucune donnée de bord." #: ../share/extensions/polyhedron_3d.py:344 msgid "Try selecting \"Face Specified\" in the Model File tab.\n" -msgstr "" -"Essayez de sélectionner « défini par les facettes » dans l'onglet Fichier " -"modèle .\n" +msgstr "Essayez de sélectionner « défini par les facettes » dans l'onglet Fichier modèle .\n" #. we cannot generate a list of faces from the edges without a lot of computation #: ../share/extensions/polyhedron_3d.py:519 -msgid "" -"Face Data Not Found. Ensure file contains face data, and check the file is " -"imported as \"Face-Specified\" under the \"Model File\" tab.\n" -msgstr "" -"Aucune donnée de facette. Vérifiez que le fichier contient bien ces données, " -"et qu'il est bien importé avec l'option « Défini par les facettes » dans " -"l'onglet « Fichier modèle ».\n" +msgid "Face Data Not Found. Ensure file contains face data, and check the file is imported as \"Face-Specified\" under the \"Model File\" tab.\n" +msgstr "Aucune donnée de facette. Vérifiez que le fichier contient bien ces données, et qu'il est bien importé avec l'option « Défini par les facettes » dans l'onglet « Fichier modèle ».\n" #: ../share/extensions/polyhedron_3d.py:521 msgid "Internal Error. No view type selected\n" @@ -29318,12 +28000,8 @@ msgid "Please enter an input text" msgstr "Veuillez saisir une chaîne de caractères" #: ../share/extensions/replace_font.py:133 -msgid "" -"Couldn't find anything using that font, please ensure the spelling and " -"spacing is correct." -msgstr "" -"Aucune correspondance avec cette fonte, veuillez vous assurer que " -"l'orthographe et l'espacement sont corrects." +msgid "Couldn't find anything using that font, please ensure the spelling and spacing is correct." +msgstr "Aucune correspondance avec cette fonte, veuillez vous assurer que l'orthographe et l'espacement sont corrects." #: ../share/extensions/replace_font.py:140 #: ../share/extensions/svg_and_media_zip_output.py:193 @@ -29356,22 +28034,17 @@ msgstr "Veuillez saisir une chaîne de caractères dans le champs Rechercher." #: ../share/extensions/replace_font.py:248 msgid "Please enter a replacement font in the replace with box." -msgstr "" -"Veuillez saisir une police de remplacement dans le champs Remplacer par." +msgstr "Veuillez saisir une police de remplacement dans le champs Remplacer par." #: ../share/extensions/replace_font.py:253 msgid "Please enter a replacement font in the replace all box." -msgstr "" -"Veuillez saisir une police de remplacement dans le champs Remplacer toutes " -"les polices par." +msgstr "Veuillez saisir une police de remplacement dans le champs Remplacer toutes les polices par." #: ../share/extensions/summersnight.py:44 msgid "" "This extension requires two selected paths. \n" "The second path must be exactly four nodes long." -msgstr "" -"Cette extension nécessite la sélection de deux chemins. Le second chemin " -"sélectionné doit contenir exactement quatre nœuds." +msgstr "Cette extension nécessite la sélection de deux chemins. Le second chemin sélectionné doit contenir exactement quatre nœuds." #: ../share/extensions/svg_and_media_zip_output.py:128 #, python-format @@ -29398,18 +28071,12 @@ msgid "You must select at least two elements." msgstr "Vous devez sélectionner au moins deux éléments." #: ../share/extensions/webslicer_create_group.py:57 -msgid "" -"You must create and select some \"Slicer rectangles\" before trying to group." -msgstr "" -"Vous devez créer et sélectionner des « Rectangles de découpe » avant " -"d'essayer de grouper." +msgid "You must create and select some \"Slicer rectangles\" before trying to group." +msgstr "Vous devez créer et sélectionner des « Rectangles de découpe » avant d'essayer de grouper." #: ../share/extensions/webslicer_create_group.py:72 -msgid "" -"You must to select some \"Slicer rectangles\" or other \"Layout groups\"." -msgstr "" -"Vous devez sélectionner des « Rectangles de découpe » ou d'autres « Groupes " -"de mise en page »." +msgid "You must to select some \"Slicer rectangles\" or other \"Layout groups\"." +msgstr "Vous devez sélectionner des « Rectangles de découpe » ou d'autres « Groupes de mise en page »." #: ../share/extensions/webslicer_create_group.py:76 #, python-format @@ -29477,7 +28144,8 @@ msgstr "Nombre de segments :" #: ../share/extensions/addnodes.inx.h:7 #: ../share/extensions/convert2dashes.inx.h:2 -#: ../share/extensions/edge3d.inx.h:9 ../share/extensions/flatten.inx.h:3 +#: ../share/extensions/edge3d.inx.h:9 +#: ../share/extensions/flatten.inx.h:3 #: ../share/extensions/fractalize.inx.h:4 #: ../share/extensions/interp_att_g.inx.h:29 #: ../share/extensions/markers_strokepaint.inx.h:13 @@ -29486,7 +28154,8 @@ msgstr "Nombre de segments :" #: ../share/extensions/radiusrand.inx.h:10 #: ../share/extensions/rubberstretch.inx.h:6 #: ../share/extensions/straightseg.inx.h:4 -#: ../share/extensions/summersnight.inx.h:2 ../share/extensions/whirl.inx.h:4 +#: ../share/extensions/summersnight.inx.h:2 +#: ../share/extensions/whirl.inx.h:4 msgid "Modify Path" msgstr "Modifer le chemin" @@ -29519,9 +28188,8 @@ msgid "Corel DRAW Compressed Exchange files input (UC)" msgstr "Fichier d'entrée Corel DRAW Compressed Exchange (UC)" #: ../share/extensions/ccx_input.inx.h:2 -#, fuzzy msgid "Corel DRAW Compressed Exchange files (UC) (*.ccx)" -msgstr "Fichiers Corel DRAW Compressed Exchange (UC) (.ccx)" +msgstr "Fichiers Corel DRAW Compressed Exchange (UC) (*.ccx)" #: ../share/extensions/ccx_input.inx.h:3 msgid "Open compressed exchange files saved in Corel DRAW (UC)" @@ -29544,9 +28212,8 @@ msgid "Corel DRAW templates input (UC)" msgstr "Entrée modèle Corel DRAW (UC)" #: ../share/extensions/cdt_input.inx.h:2 -#, fuzzy msgid "Corel DRAW 7-13 template files (UC) (*.cdt)" -msgstr "Modèles Corel DRAW 7-13 (UC) (.cdt)" +msgstr "Modèles Corel DRAW 7-13 (UC) (*.cdt)" #: ../share/extensions/cdt_input.inx.h:3 msgid "Open files saved in Corel DRAW 7-13 (UC)" @@ -29557,9 +28224,8 @@ msgid "Computer Graphics Metafile files input" msgstr "Fichier d'entrée Computer Graphics Metafile" #: ../share/extensions/cgm_input.inx.h:2 -#, fuzzy msgid "Computer Graphics Metafile files (*.cgm)" -msgstr "Fichiers Computer Graphics Metafile (.cgm)" +msgstr "Fichiers Computer Graphics Metafile (*.cgm)" #: ../share/extensions/cgm_input.inx.h:3 msgid "Open Computer Graphics Metafile files" @@ -29570,9 +28236,8 @@ msgid "Corel DRAW Presentation Exchange files input (UC)" msgstr "Fichier d'entrée Corel DRAW Presentation Exchange (UC)" #: ../share/extensions/cmx_input.inx.h:2 -#, fuzzy msgid "Corel DRAW Presentation Exchange files (UC) (*.cmx)" -msgstr "Fichiers Corel DRAW Presentation Exchange (UC) (.cmx)" +msgstr "Fichiers Corel DRAW Presentation Exchange (UC) (*.cmx)" #: ../share/extensions/cmx_input.inx.h:3 msgid "Open presentation exchange files saved in Corel DRAW (UC)" @@ -29610,8 +28275,7 @@ msgstr "Plage des couleurs en entrée :" #: ../share/extensions/color_custom.inx.h:8 msgid "" "Allows you to evaluate different functions for each channel.\n" -"r, g and b are the normalized values of the red, green and blue channels. " -"The resulting RGB values are automatically clamped.\n" +"r, g and b are the normalized values of the red, green and blue channels. The resulting RGB values are automatically clamped.\n" " \n" "Example (half the red, swap green and blue):\n" " Red Function: r*0.5 \n" @@ -29619,8 +28283,7 @@ msgid "" " Blue Function: g" msgstr "" "Permet l'évaluation de différentes fonctions pour chaque canal.\n" -"r, g et b sont les valeurs normalisées pour les canaux rouge, vert et bleu. " -"Les valeurs RGB résultantes sont recalculées automatiquement.\n" +"r, g et b sont les valeurs normalisées pour les canaux rouge, vert et bleu. Les valeurs RGB résultantes sont recalculées automatiquement.\n" "\n" "Exemple (division du rouge par deux, échange du vert et du bleu) :\n" " Fonction pour le rouge : r*0.5\n" @@ -29673,8 +28336,7 @@ msgstr "Luminosité aléatoire" #: ../share/extensions/color_HSL_adjust.inx.h:13 #, no-c-format msgid "" -"Adjusts hue, saturation and lightness in the HSL representation of the " -"selected objects's color.\n" +"Adjusts hue, saturation and lightness in the HSL representation of the selected objects's color.\n" "Options:\n" " * Hue: rotate by degrees (wraps around).\n" " * Saturation: add/subtract % (min=-100, max=100).\n" @@ -29717,12 +28379,8 @@ msgid "Randomize" msgstr "Aléatoire" #: ../share/extensions/color_randomize.inx.h:7 -msgid "" -"Converts to HSL, randomizes hue and/or saturation and/or lightness and " -"converts it back to RGB." -msgstr "" -"Convertit en TSL, modifie aléatoirement la teinte, la saturation ou la " -"luminosité, puis convertit le résultat en RVB." +msgid "Converts to HSL, randomizes hue and/or saturation and/or lightness and converts it back to RGB." +msgstr "Convertit en TSL, modifie aléatoirement la teinte, la saturation ou la luminosité, puis convertit le résultat en RVB." #: ../share/extensions/color_removeblue.inx.h:1 msgid "Remove Blue" @@ -29782,22 +28440,12 @@ msgid "Dia Input" msgstr "Entrée Dia" #: ../share/extensions/dia.inx.h:2 -msgid "" -"The dia2svg.sh script should be installed with your Inkscape distribution. " -"If you do not have it, there is likely to be something wrong with your " -"Inkscape installation." -msgstr "" -"Le script dia2svg devrait être installé avec votre distribution d'Inkscape. " -"Si ce n'est pas le cas, il y a sans doute un problème avec votre " -"installation d'Inkscape." +msgid "The dia2svg.sh script should be installed with your Inkscape distribution. If you do not have it, there is likely to be something wrong with your Inkscape installation." +msgstr "Le script dia2svg devrait être installé avec votre distribution d'Inkscape. Si ce n'est pas le cas, il y a sans doute un problème avec votre installation d'Inkscape." #: ../share/extensions/dia.inx.h:3 -msgid "" -"In order to import Dia files, Dia itself must be installed. You can get Dia " -"at http://live.gnome.org/Dia" -msgstr "" -"Pour pouvoir importer des fichiers Dia, Dia doit aussi être installé. Vous " -"pouvez obtenir Dia sur http://www.gnome.org/projects/dia/ " +msgid "In order to import Dia files, Dia itself must be installed. You can get Dia at http://live.gnome.org/Dia" +msgstr "Pour pouvoir importer des fichiers Dia, Dia doit aussi être installé. Vous pouvez obtenir Dia sur http://www.gnome.org/projects/dia/ " #: ../share/extensions/dia.inx.h:4 msgid "Dia Diagram (*.dia)" @@ -29831,8 +28479,10 @@ msgstr "Géométrique" msgid "Visual" msgstr "Visuelle" -#: ../share/extensions/dimension.inx.h:7 ../share/extensions/dots.inx.h:13 -#: ../share/extensions/handles.inx.h:2 ../share/extensions/measure.inx.h:24 +#: ../share/extensions/dimension.inx.h:7 +#: ../share/extensions/dots.inx.h:13 +#: ../share/extensions/handles.inx.h:2 +#: ../share/extensions/measure.inx.h:24 msgid "Visualize Path" msgstr "Visualisation de chemin" @@ -29854,21 +28504,16 @@ msgstr "Incrément :" #: ../share/extensions/dots.inx.h:8 msgid "" -"This extension replaces the selection's nodes with numbered dots according " -"to the following options:\n" +"This extension replaces the selection's nodes with numbered dots according to the following options:\n" " * Font size: size of the node number labels (20px, 12pt...).\n" " * Dot size: diameter of the dots placed at path nodes (10px, 2mm...).\n" -" * Starting dot number: first number in the sequence, assigned to the " -"first node of the path.\n" +" * Starting dot number: first number in the sequence, assigned to the first node of the path.\n" " * Step: numbering step between two nodes." msgstr "" -"Cette extension remplace les nœuds de la sélection par des points numérotés " -"en fonction des options suivantes :\n" +"Cette extension remplace les nœuds de la sélection par des points numérotés en fonction des options suivantes :\n" " * Taille de police : taille du label de numéro de nœud (20px, 12pt...).\n" -" * Taille de point : diamètre des points placés sur les nœuds du chemin " -"(10px, 2mm...)\n" -" * Numéro du nœud de départ : premier numéro de la séquence, assigné au " -"premier nœud du chemin.\n" +" * Taille de point : diamètre des points placés sur les nœuds du chemin (10px, 2mm...)\n" +" * Numéro du nœud de départ : premier numéro de la séquence, assigné au premier nœud du chemin.\n" " * Incrément : incrément de numérotation entre deux nœuds." #: ../share/extensions/draw_from_triangle.inx.h:1 @@ -30010,19 +28655,15 @@ msgstr "Fonction triangle" #: ../share/extensions/draw_from_triangle.inx.h:36 msgid "" -"This extension draws constructions about a triangle defined by the first 3 " -"nodes of a selected path. You may select one of preset objects or create " -"your own ones.\n" +"This extension draws constructions about a triangle defined by the first 3 nodes of a selected path. You may select one of preset objects or create your own ones.\n" " \n" "All units are the Inkscape's pixel unit. Angles are all in radians.\n" -"You can specify a point by trilinear coordinates or by a triangle centre " -"function.\n" +"You can specify a point by trilinear coordinates or by a triangle centre function.\n" "Enter as functions of the side length or angles.\n" "Trilinear elements should be separated by a colon: ':'.\n" "Side lengths are represented as 's_a', 's_b' and 's_c'.\n" "Angles corresponding to these are 'a_a', 'a_b', and 'a_c'.\n" -"You can also use the semi-perimeter and area of the triangle as constants. " -"Write 'area' or 'semiperim' for these.\n" +"You can also use the semi-perimeter and area of the triangle as constants. Write 'area' or 'semiperim' for these.\n" "\n" "You can use any standard Python math function:\n" "ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i); \n" @@ -30034,26 +28675,18 @@ msgid "" "Also available are the inverse trigonometric functions:\n" "sec(x); csc(x); cot(x)\n" "\n" -"You can specify the radius of a circle around a custom point using a " -"formula, which may also contain the side lengths, angles, etc. You can also " -"plot the isogonal and isotomic conjugate of the point. Be aware that this " -"may cause a divide-by-zero error for certain points.\n" +"You can specify the radius of a circle around a custom point using a formula, which may also contain the side lengths, angles, etc. You can also plot the isogonal and isotomic conjugate of the point. Be aware that this may cause a divide-by-zero error for certain points.\n" " " msgstr "" -"Cette extension trace une construction à partir d'un triangle défini par les " -"trois premiers nœuds d'un chemin sélectionné. Vous devez sélectionner un " -"objet prédéfini ou en créer un nouveau.\n" +"Cette extension trace une construction à partir d'un triangle défini par les trois premiers nœuds d'un chemin sélectionné. Vous devez sélectionner un objet prédéfini ou en créer un nouveau.\n" " \n" -"Toutes les unités de mesure sont exprimées en pixels Inkscape. Les angles " -"sont en radians.\n" -"Vous pouvez spécifier un point par coordonnées trilinéaires ou une fonction " -"du centre du triangle.\n" +"Toutes les unités de mesure sont exprimées en pixels Inkscape. Les angles sont en radians.\n" +"Vous pouvez spécifier un point par coordonnées trilinéaires ou une fonction du centre du triangle.\n" "Entrez comme fonction la taille des côtés ou les angles.\n" "Les éléments trilinéaires doivent être séparés par un deux-points (:).\n" "Les tailles de côté sont représentées sous la forme 's_a', 's_b' et 's_c'.\n" "Les angles correspondants sont sous la forme 'a_a', 'a_b' et 'a_c'.\n" -"Vous pouvez également utiliser le semi-périmètre ou l'aire du triangle comme " -"constante. Dans ce cas, écrivez 'area' ou 'semiperim'.\n" +"Vous pouvez également utiliser le semi-périmètre ou l'aire du triangle comme constante. Dans ce cas, écrivez 'area' ou 'semiperim'.\n" "\n" "Vous pouvez utiliser les fonctions mathématiques standard de Python :\n" "ceil(x); fabs(x); floor(x); fmod(x,y); frexp(x); ldexp(x,i);\n" @@ -30065,11 +28698,7 @@ msgstr "" "Les fonctions trigonométriques inverses sont également disponibles :\n" "sec(x); csc(x); cot(x)\n" "\n" -"Vous pouvez spécifier le rayon d'un cercle autour d'un point personnalisé en " -"utilisant une fonction pouvant également contenir les tailles de côté, les " -"angles, etc. Vous pouvez également tracer les conjuguées isogonales et " -"isotomiques du point. Soyez conscient que cela peut provoquer une erreur de " -"type division par zéro pour certains points. " +"Vous pouvez spécifier le rayon d'un cercle autour d'un point personnalisé en utilisant une fonction pouvant également contenir les tailles de côté, les angles, etc. Vous pouvez également tracer les conjuguées isogonales et isotomiques du point. Soyez conscient que cela peut provoquer une erreur de type division par zéro pour certains points. " #: ../share/extensions/dxf_input.inx.h:1 msgid "DXF Input" @@ -30116,12 +28745,9 @@ msgstr "" "Pour AutoCAD version R13 ou plus récente.\n" "- Le dessin dxf doit être en mm.\n" "- Le dessin svg est en pixels, à 90 ppp.\n" -"- Le facteur d'échelle et l'origine ne s'applique qu'au redimensionnement " -"manuel.\n" -"- Les calques sont préservés par l'utilisation du menu Fichier>Ouvrir, mais " -"pas par Import.\n" -"- Le support des BLOCKS est limité. Préférez l'utilisation de AutoCAD " -"Explode Blocks si nécessaire." +"- Le facteur d'échelle et l'origine ne s'applique qu'au redimensionnement manuel.\n" +"- Les calques sont préservés par l'utilisation du menu Fichier>Ouvrir, mais pas par Import.\n" +"- Le support des BLOCKS est limité. Préférez l'utilisation de AutoCAD Explode Blocks si nécessaire." #: ../share/extensions/dxf_input.inx.h:17 msgid "AutoCAD DXF R13 (*.dxf)" @@ -30244,32 +28870,24 @@ msgstr "" #, fuzzy msgid "" "- AutoCAD Release 14 DXF format.\n" -"- The base unit parameter specifies in what unit the coordinates are output " -"(90 px = 1 in).\n" +"- The base unit parameter specifies in what unit the coordinates are output (90 px = 1 in).\n" "- Supported element types\n" " - paths (lines and splines)\n" " - rectangles\n" " - clones (the crossreference to the original is lost)\n" -"- ROBO-Master spline output is a specialized spline readable only by ROBO-" -"Master and AutoDesk viewers, not Inkscape.\n" -"- LWPOLYLINE output is a multiply-connected polyline, disable it to use a " -"legacy version of the LINE output.\n" -"- You can choose to export all layers, only visible ones or by name match " -"(case insensitive and use comma ',' as separator)" +"- ROBO-Master spline output is a specialized spline readable only by ROBO-Master and AutoDesk viewers, not Inkscape.\n" +"- LWPOLYLINE output is a multiply-connected polyline, disable it to use a legacy version of the LINE output.\n" +"- You can choose to export all layers, only visible ones or by name match (case insensitive and use comma ',' as separator)" msgstr "" "Format AutoCAD DXF Release 14.\n" -"- Le paramètre unité de base spécifie dans quelle unité les coordonnées sont " -"générées (90 px = 1 in).\n" +"- Le paramètre unité de base spécifie dans quelle unité les coordonnées sont générées (90 px = 1 in).\n" "- Types d'éléments supportés :\n" " - chemins (lignes et splines) ;\n" " - rectangles ;\n" " - clones (la référence croisée vers l'original est perdue).\n" -"- L'option ROBO-Master génère une spline spécialisée qui ne peut être " -"utilisée que par des lecteurs ROBO-Master et AutoDesk, pas Inkscape.\n" -"- La sortie LWPOLYLINE est une polyligne multi-connectée. Désactivez cette " -"option pour utiliser une ancienne version de la sortie LINE.\n" -"- Vous pouvez choisir d'exporter tous les calques ou seulement ceux qui sont " -"visibles." +"- L'option ROBO-Master génère une spline spécialisée qui ne peut être utilisée que par des lecteurs ROBO-Master et AutoDesk, pas Inkscape.\n" +"- La sortie LWPOLYLINE est une polyligne multi-connectée. Désactivez cette option pour utiliser une ancienne version de la sortie LINE.\n" +"- Vous pouvez choisir d'exporter tous les calques ou seulement ceux qui sont visibles." #: ../share/extensions/dxf_outlines.inx.h:34 msgid "Desktop Cutting Plotter (AutoCAD DXF R14) (*.dxf)" @@ -30281,9 +28899,7 @@ msgstr "Sortie DXF" #: ../share/extensions/dxf_output.inx.h:2 msgid "pstoedit must be installed to run; see http://www.pstoedit.net/pstoedit" -msgstr "" -"pstoedit doit être installé pour être exécuté; consultez le site http://www." -"pstoedit.net/pstoedit" +msgstr "pstoedit doit être installé pour être exécuté; consultez le site http://www.pstoedit.net/pstoedit" #: ../share/extensions/dxf_output.inx.h:3 msgid "AutoCAD DXF R12 (*.dxf)" @@ -30335,9 +28951,20 @@ msgid "Embed only selected images" msgstr "Incorporer seulement les images sélectionnées" #: ../share/extensions/embedselectedimages.inx.h:1 -#, fuzzy msgid "Embed Selected Images" -msgstr "Incorporer seulement les images sélectionnées" +msgstr "Incorporer les images sélectionnées" + +#: ../share/extensions/empty_page.inx.h:1 +msgid "Empty Page" +msgstr "" + +#: ../share/extensions/empty_page.inx.h:2 +msgid "Page size:" +msgstr "Taille de la page :" + +#: ../share/extensions/empty_page.inx.h:3 +msgid "Page orientation:" +msgstr "Orientation de la page :" #: ../share/extensions/eps_input.inx.h:1 msgid "EPS Input" @@ -30378,12 +29005,10 @@ msgstr "Répertoire où enregistrer l'image :" #: ../share/extensions/extractimage.inx.h:3 msgid "" "* Don't type the file extension, it is appended automatically.\n" -"* A relative path (or a filename without path) is relative to the user's " -"home directory." +"* A relative path (or a filename without path) is relative to the user's home directory." msgstr "" "* Ne pas saisir l'extension du fichier, elle est ajoutée automatiquement.\n" -"* Un chemin relatif (ou un nom de fichier seul) est relatif au dossier " -"personnel de l'utilisateur." +"* Un chemin relatif (ou un nom de fichier seul) est relatif au dossier personnel de l'utilisateur." #: ../share/extensions/extrude.inx.h:3 msgid "Lines" @@ -30484,11 +29109,8 @@ msgstr "Utiliser les coordonnées polaires" #: ../share/extensions/funcplot.inx.h:11 #: ../share/extensions/param_curves.inx.h:12 -msgid "" -"When set, Isotropic scaling uses smallest of width/xrange or height/yrange" -msgstr "" -"Lorsqu'il est activé, le redimensionnement isotrope utilise le plus petit " -"de : largeur/amplitude en X ou hauteur/amplitude en Y" +msgid "When set, Isotropic scaling uses smallest of width/xrange or height/yrange" +msgstr "Lorsqu'il est activé, le redimensionnement isotrope utilise le plus petit de : largeur/amplitude en X ou hauteur/amplitude en Y" #: ../share/extensions/funcplot.inx.h:12 #: ../share/extensions/param_curves.inx.h:13 @@ -30498,8 +29120,7 @@ msgstr "Utiliser" #: ../share/extensions/funcplot.inx.h:13 msgid "" "Select a rectangle before calling the extension,\n" -"it will determine X and Y scales. If you wish to fill the area, then add x-" -"axis endpoints.\n" +"it will determine X and Y scales. If you wish to fill the area, then add x-axis endpoints.\n" "\n" "With polar coordinates:\n" " Start and end X values define the angle range in radians.\n" @@ -30508,14 +29129,11 @@ msgid "" " First derivative is always determined numerically." msgstr "" "Sélectionner un rectangle avant d'appeler l'extension.\n" -"Le rectangle détermine les échelles X et Y. Si vous souhaitez remplir la " -"zone, ajoutez des points terminaux sur l'axe X.\n" +"Le rectangle détermine les échelles X et Y. Si vous souhaitez remplir la zone, ajoutez des points terminaux sur l'axe X.\n" "\n" "Avec des coordonnées polaires :\n" -" Les valeurs X de début et de fin définissent l'amplitude d'angle en " -"radians.\n" -" L'échelle X est fixée de manière à ce que les bords gauche et droit du " -"rectangle soient à +/-1.\n" +" Les valeurs X de début et de fin définissent l'amplitude d'angle en radians.\n" +" L'échelle X est fixée de manière à ce que les bords gauche et droit du rectangle soient à +/-1.\n" " Le redimensionnement isotrope est désactivé.\n" " La dérivée première est toujours déterminée numériquement." @@ -30582,21 +29200,8 @@ msgid "About" msgstr "À propos" #: ../share/extensions/gcodetools_about.inx.h:2 -msgid "" -"Gcodetools was developed to make simple Gcode from Inkscape's paths. Gcode " -"is a special format which is used in most of CNC machines. So Gcodetools " -"allows you to use Inkscape as CAM program. It can be use with a lot of " -"machine types: Mills Lathes Laser and Plasma cutters and engravers Mill " -"engravers Plotters etc. To get more info visit developers page at http://www." -"cnc-club.ru/gcodetools" -msgstr "" -"Gcodetools a été développé pour réaliser du code Gcode simple à partir des " -"chemins d'Inkscape. Gcode est un format spécial utilisé dans la plupart des " -"machines-outils à commande numérique. Ainsi Gcodetools vous permet " -"d'utiliser Inkscape comme un programme de fabrication assistée par " -"ordinateur. Il peut être utilisé avec un grand nombre de machines. Pour de " -"plus amples informations, visitez la page des développeurs sur le site " -"http://www.cnc-club.ru/gcodetools" +msgid "Gcodetools was developed to make simple Gcode from Inkscape's paths. Gcode is a special format which is used in most of CNC machines. So Gcodetools allows you to use Inkscape as CAM program. It can be use with a lot of machine types: Mills Lathes Laser and Plasma cutters and engravers Mill engravers Plotters etc. To get more info visit developers page at http://www.cnc-club.ru/gcodetools" +msgstr "Gcodetools a été développé pour réaliser du code Gcode simple à partir des chemins d'Inkscape. Gcode est un format spécial utilisé dans la plupart des machines-outils à commande numérique. Ainsi Gcodetools vous permet d'utiliser Inkscape comme un programme de fabrication assistée par ordinateur. Il peut être utilisé avec un grand nombre de machines. Pour de plus amples informations, visitez la page des développeurs sur le site http://www.cnc-club.ru/gcodetools" #: ../share/extensions/gcodetools_about.inx.h:4 #: ../share/extensions/gcodetools_area.inx.h:54 @@ -30609,14 +29214,7 @@ msgstr "" #: ../share/extensions/gcodetools_path_to_gcode.inx.h:36 #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:18 #: ../share/extensions/gcodetools_tools_library.inx.h:13 -msgid "" -"Gcodetools plug-in: converts paths to Gcode (using circular interpolation), " -"makes offset paths and engraves sharp corners using cone cutters. This plug-" -"in calculates Gcode for paths using circular interpolation or linear motion " -"when needed. Tutorials, manuals and support can be found at English support " -"forum: http://www.cnc-club.ru/gcodetools and Russian support forum: http://" -"www.cnc-club.ru/gcodetoolsru Credits: Nick Drobchenko, Vladimir Kalyaev, " -"John Brooker, Henry Nicolas, Chris Lusby Taylor. Gcodetools ver. 1.7" +msgid "Gcodetools plug-in: converts paths to Gcode (using circular interpolation), makes offset paths and engraves sharp corners using cone cutters. This plug-in calculates Gcode for paths using circular interpolation or linear motion when needed. Tutorials, manuals and support can be found at English support forum: http://www.cnc-club.ru/gcodetools and Russian support forum: http://www.cnc-club.ru/gcodetoolsru Credits: Nick Drobchenko, Vladimir Kalyaev, John Brooker, Henry Nicolas, Chris Lusby Taylor. Gcodetools ver. 1.7" msgstr "" #: ../share/extensions/gcodetools_about.inx.h:5 @@ -30650,12 +29248,7 @@ msgid "Area tool overlap (0..0.9):" msgstr "" #: ../share/extensions/gcodetools_area.inx.h:5 -msgid "" -"\"Create area offset\": creates several Inkscape path offsets to fill " -"original path's area up to \"Area radius\" value. Outlines start from \"1/2 D" -"\" up to \"Area width\" total width with \"D\" steps where D is taken from " -"the nearest tool definition (\"Tool diameter\" value). Only one offset will " -"be created if the \"Area width\" is equal to \"1/2 D\"." +msgid "\"Create area offset\": creates several Inkscape path offsets to fill original path's area up to \"Area radius\" value. Outlines start from \"1/2 D\" up to \"Area width\" total width with \"D\" steps where D is taken from the nearest tool definition (\"Tool diameter\" value). Only one offset will be created if the \"Area width\" is equal to \"1/2 D\"." msgstr "" #: ../share/extensions/gcodetools_area.inx.h:6 @@ -30704,10 +29297,7 @@ msgid "delete" msgstr "supprimer" #: ../share/extensions/gcodetools_area.inx.h:18 -msgid "" -"Usage: 1. Select all Area Offsets (gray outlines) 2. Object/Ungroup (Shift" -"+Ctrl+G) 3. Press Apply Suspected small objects will be marked out by " -"colored arrows." +msgid "Usage: 1. Select all Area Offsets (gray outlines) 2. Object/Ungroup (Shift+Ctrl+G) 3. Press Apply Suspected small objects will be marked out by colored arrows." msgstr "" #: ../share/extensions/gcodetools_area.inx.h:19 @@ -30769,13 +29359,7 @@ msgstr "Passe par passe" #: ../share/extensions/gcodetools_area.inx.h:28 #: ../share/extensions/gcodetools_lathe.inx.h:21 #: ../share/extensions/gcodetools_path_to_gcode.inx.h:10 -msgid "" -"Biarc interpolation tolerance is the maximum distance between path and its " -"approximation. The segment will be split into two segments if the distance " -"between path's segment and its approximation exceeds biarc interpolation " -"tolerance. For depth function c=color intensity from 0.0 (white) to 1.0 " -"(black), d is the depth defined by orientation points, s - surface defined " -"by orientation points." +msgid "Biarc interpolation tolerance is the maximum distance between path and its approximation. The segment will be split into two segments if the distance between path's segment and its approximation exceeds biarc interpolation tolerance. For depth function c=color intensity from 0.0 (white) to 1.0 (black), d is the depth defined by orientation points, s - surface defined by orientation points." msgstr "" #: ../share/extensions/gcodetools_area.inx.h:30 @@ -30976,11 +29560,7 @@ msgid "Convert selection:" msgstr "Convertir la sélection :" #: ../share/extensions/gcodetools_dxf_points.inx.h:4 -msgid "" -"Convert selected objects to drill points (as dxf_import plugin does). Also " -"you can save original shape. Only the start point of each curve will be " -"used. Also you can manually select object, open XML editor (Shift+Ctrl+X) " -"and add or remove XML tag 'dxfpoint' with any value." +msgid "Convert selected objects to drill points (as dxf_import plugin does). Also you can save original shape. Only the start point of each curve will be used. Also you can manually select object, open XML editor (Shift+Ctrl+X) and add or remove XML tag 'dxfpoint' with any value." msgstr "" #: ../share/extensions/gcodetools_dxf_points.inx.h:5 @@ -31017,13 +29597,7 @@ msgid "Draw additional graphics to see engraving path" msgstr "" #: ../share/extensions/gcodetools_engraving.inx.h:6 -msgid "" -"This function creates path to engrave letters or any shape with sharp " -"angles. Cutter's depth as a function of radius is defined by the tool. Depth " -"may be any Python expression. For instance: cone....(45 " -"degrees)......................: w cone....(height/diameter=10/3)..: 10*w/3 " -"sphere..(radius r)...........................: math.sqrt(max(0,r**2-w**2)) " -"ellipse.(minor axis r, major 4r).....: math.sqrt(max(0,r**2-w**2))*4" +msgid "This function creates path to engrave letters or any shape with sharp angles. Cutter's depth as a function of radius is defined by the tool. Depth may be any Python expression. For instance: cone....(45 degrees)......................: w cone....(height/diameter=10/3)..: 10*w/3 sphere..(radius r)...........................: math.sqrt(max(0,r**2-w**2)) ellipse.(minor axis r, major 4r).....: math.sqrt(max(0,r**2-w**2))*4" msgstr "" #: ../share/extensions/gcodetools_graffiti.inx.h:1 @@ -31099,15 +29673,7 @@ msgstr "Préférences des dégradés" #: ../share/extensions/gcodetools_graffiti.inx.h:20 #: ../share/extensions/gcodetools_orientation_points.inx.h:13 -msgid "" -"Orientation points are used to calculate transformation (offset,scale,mirror," -"rotation in XY plane) of the path. 3-points mode only: do not put all three " -"into one line (use 2-points mode instead). You can modify Z surface, Z depth " -"values later using text tool (3rd coordinates). If there are no orientation " -"points inside current layer they are taken from the upper layer. Do not " -"ungroup orientation points! You can select them using double click to enter " -"the group or by Ctrl+Click. Now press apply to create control points " -"(independent set for each layer)." +msgid "Orientation points are used to calculate transformation (offset,scale,mirror,rotation in XY plane) of the path. 3-points mode only: do not put all three into one line (use 2-points mode instead). You can modify Z surface, Z depth values later using text tool (3rd coordinates). If there are no orientation points inside current layer they are taken from the upper layer. Do not ungroup orientation points! You can select them using double click to enter the group or by Ctrl+Click. Now press apply to create control points (independent set for each layer)." msgstr "" #: ../share/extensions/gcodetools_lathe.inx.h:1 @@ -31155,9 +29721,7 @@ msgid "Lathe modify path" msgstr "Modifer le chemin" #: ../share/extensions/gcodetools_lathe.inx.h:11 -msgid "" -"This function modifies path so it will be able to be cut with the " -"rectangular cutter." +msgid "This function modifies path so it will be able to be cut with the rectangular cutter." msgstr "" #: ../share/extensions/gcodetools_orientation_points.inx.h:1 @@ -31270,11 +29834,7 @@ msgid "Just check tools" msgstr "" #: ../share/extensions/gcodetools_tools_library.inx.h:11 -msgid "" -"Selected tool type fills appropriate default values. You can change these " -"values using the Text tool later on. The topmost (z order) tool in the " -"active layer is used. If there is no tool inside the current layer it is " -"taken from the upper layer. Press Apply to create new tool." +msgid "Selected tool type fills appropriate default values. You can change these values using the Text tool later on. The topmost (z order) tool in the active layer is used. If there is no tool inside the current layer it is taken from the upper layer. Press Apply to create new tool." msgstr "" #: ../share/extensions/generate_voronoi.inx.h:1 @@ -31291,22 +29851,13 @@ msgstr "Taille de la bordure (px) :" #: ../share/extensions/generate_voronoi.inx.h:6 msgid "" -"Generate a random pattern of Voronoi cells. The pattern will be accessible " -"in the Fill and Stroke dialog. You must select an object or a group.\n" +"Generate a random pattern of Voronoi cells. The pattern will be accessible in the Fill and Stroke dialog. You must select an object or a group.\n" "\n" -"If border is zero, the pattern will be discontinuous at the edges. Use a " -"positive border, preferably greater than the cell size, to produce a smooth " -"join of the pattern at the edges. Use a negative border to reduce the size " -"of the pattern and get an empty border." -msgstr "" -"Génère un motif de cellules de Voronoï aléatoire. Le motif pourra être " -"utilisé dans la boîte de dialogue Remplissage et contour. Vous devez " -"sélectionner un objet ou un groupe.\n" +"If border is zero, the pattern will be discontinuous at the edges. Use a positive border, preferably greater than the cell size, to produce a smooth join of the pattern at the edges. Use a negative border to reduce the size of the pattern and get an empty border." +msgstr "" +"Génère un motif de cellules de Voronoï aléatoire. Le motif pourra être utilisé dans la boîte de dialogue Remplissage et contour. Vous devez sélectionner un objet ou un groupe.\n" "\n" -"Si la bordure est nulle, le motif sera discontinu sur ses bords. Utilisez " -"une valeur positive, de préférence plus grande que la taille de cellule, " -"pour produire un joint lisse du motif sur ses bords. Utilisez une valeur " -"négative pour réduire la taille du motif et obtenir une bordure vide." +"Si la bordure est nulle, le motif sera discontinu sur ses bords. Utilisez une valeur positive, de préférence plus grande que la taille de cellule, pour produire un joint lisse du motif sur ses bords. Utilisez une valeur négative pour réduire la taille du motif et obtenir une bordure vide." #: ../share/extensions/gimp_xcf.inx.h:1 msgid "GIMP XCF" @@ -31324,32 +29875,30 @@ msgstr "Enregistrer la grille" msgid "Save Background" msgstr "Exporter le fond" -#: ../share/extensions/gimp_xcf.inx.h:7 +#: ../share/extensions/gimp_xcf.inx.h:6 +#, fuzzy +msgid "File Resolution:" +msgstr "Résolution :" + +#: ../share/extensions/gimp_xcf.inx.h:8 +#, fuzzy msgid "" -"This extension exports the document to Gimp XCF format according to the " -"following options:\n" +"This extension exports the document to Gimp XCF format according to the following options:\n" " * Save Guides: convert all guides to Gimp guides.\n" -" * Save Grid: convert the first rectangular grid to a Gimp grid (note " -"that the default Inkscape grid is very narrow when shown in Gimp).\n" +" * Save Grid: convert the first rectangular grid to a Gimp grid (note that the default Inkscape grid is very narrow when shown in Gimp).\n" " * Save Background: add the document background to each converted layer.\n" +" * File Resolution: XCF file resolution, in DPI.\n" "\n" -"Each first level layer is converted to a Gimp layer. Sublayers are " -"concatenated and converted with their first level parent layer into a single " -"Gimp layer." +"Each first level layer is converted to a Gimp layer. Sublayers are concatenated and converted with their first level parent layer into a single Gimp layer." msgstr "" -"Cette extension exporte le document au format Gimp XCF en fonction des " -"options suivantes :\n" +"Cette extension exporte le document au format Gimp XCF en fonction des options suivantes :\n" " * Enregistrer les guides : converti tous les guides en guides Gimp.\n" -" * Enregistrer la grille : converti la première grille rectangulaire en une " -"grille Gimp (notez que la grille par défaut d'Inkscape est particulièrement " -"étroite lorsque visualisée dans Gimp).\n" +" * Enregistrer la grille : converti la première grille rectangulaire en une grille Gimp (notez que la grille par défaut d'Inkscape est particulièrement étroite lorsque visualisée dans Gimp).\n" " * Exporter le fond : ajoute le fond du document à chaque calque converti.\n" "\n" -"Chaque calque de premier niveau est converti en calque Gimp. Les sous-" -"calques sont concaténés et converti avec le calque de premier niveau " -"supérieur en un calque Gimp unique." +"Chaque calque de premier niveau est converti en calque Gimp. Les sous-calques sont concaténés et converti avec le calque de premier niveau supérieur en un calque Gimp unique." -#: ../share/extensions/gimp_xcf.inx.h:13 +#: ../share/extensions/gimp_xcf.inx.h:15 msgid "GIMP XCF maintaining layers (*.xcf)" msgstr "GIMP XCF avec conservation des calques (*.xcf)" @@ -31380,8 +29929,7 @@ msgstr "Subdivisions par marque principale sur l'axe X :" #: ../share/extensions/grid_cartesian.inx.h:7 msgid "Logarithmic X Subdiv. (Base given by entry above)" -msgstr "" -"Subdivision logarithmique sur l'axe X (base donnée par l'entrée précédente)" +msgstr "Subdivision logarithmique sur l'axe X (base donnée par l'entrée précédente)" #: ../share/extensions/grid_cartesian.inx.h:8 msgid "Subsubdivs. per X Subdivision:" @@ -31389,9 +29937,7 @@ msgstr "Sous-subdivisions par subdivision sur l'axe X :" #: ../share/extensions/grid_cartesian.inx.h:9 msgid "Halve X Subsubdiv. Frequency after 'n' Subdivs. (log only):" -msgstr "" -"Diviser par deux la fréquence des sous-subdivisions sur l'axe X après « n » " -"subdibvisions (log seulement) :" +msgstr "Diviser par deux la fréquence des sous-subdivisions sur l'axe X après « n » subdibvisions (log seulement) :" #: ../share/extensions/grid_cartesian.inx.h:10 msgid "Major X Division Thickness (px):" @@ -31423,8 +29969,7 @@ msgstr "Subdivisions par marque principale sur l'axe Y :" #: ../share/extensions/grid_cartesian.inx.h:17 msgid "Logarithmic Y Subdiv. (Base given by entry above)" -msgstr "" -"Subdivision logarithmique sur l'axe Y (base donnée par l'entrée ci-dessus)" +msgstr "Subdivision logarithmique sur l'axe Y (base donnée par l'entrée ci-dessus)" #: ../share/extensions/grid_cartesian.inx.h:18 msgid "Subsubdivs. per Y Subdivision:" @@ -31432,9 +29977,7 @@ msgstr "Sous-subdivisions par subdivision sur l'axe Y :" #: ../share/extensions/grid_cartesian.inx.h:19 msgid "Halve Y Subsubdiv. Frequency after 'n' Subdivs. (log only):" -msgstr "" -"Diviser par deux la fréquence des sous-subdivisions sur l'axe Y après « n » " -"subdibvisions (log seulement) :" +msgstr "Diviser par deux la fréquence des sous-subdivisions sur l'axe Y après « n » subdibvisions (log seulement) :" #: ../share/extensions/grid_cartesian.inx.h:20 msgid "Major Y Division Thickness (px):" @@ -31652,11 +30195,6 @@ msgstr "Nom de l'image (sans extension)" msgid "Ignore these settings and use export hints" msgstr "Ignorer ces paramètres et utiliser les suggestions d'exportation" -#: ../share/extensions/guillotine.inx.h:5 -#: ../share/extensions/print_win32_vector.inx.h:2 -msgid "Export" -msgstr "Exporter" - #: ../share/extensions/handles.inx.h:1 msgid "Draw Handles" msgstr "Dessiner les poignées" @@ -31678,11 +30216,11 @@ msgid "Text:" msgstr "Texte :" #: ../share/extensions/hershey.inx.h:4 -msgid " Action" +msgid " Action: " msgstr "" #: ../share/extensions/hershey.inx.h:5 -msgid " Font face " +msgid " Font face: " msgstr "" #: ../share/extensions/hershey.inx.h:6 @@ -31758,42 +30296,36 @@ msgid "Greek 1-stroke" msgstr "Définir le contour" #: ../share/extensions/hershey.inx.h:21 -#, fuzzy msgid "Greek medium" -msgstr "moyen" +msgstr "Grec moyen" #: ../share/extensions/hershey.inx.h:23 -#, fuzzy msgid "Japanese" -msgstr "Javanais" +msgstr "Japonais" #: ../share/extensions/hershey.inx.h:24 -#, fuzzy msgid "Astrology" -msgstr "Morphologie" +msgstr "Astrologie" #: ../share/extensions/hershey.inx.h:25 msgid "Math (lower)" msgstr "" #: ../share/extensions/hershey.inx.h:26 -#, fuzzy msgid "Math (upper)" -msgstr "chemin (perpendiculaire)" +msgstr "Math (supérieur)" #: ../share/extensions/hershey.inx.h:28 -#, fuzzy msgid "Meteorology" -msgstr "Morphologie" +msgstr "Météorologie" #: ../share/extensions/hershey.inx.h:29 msgid "Music" msgstr "" #: ../share/extensions/hershey.inx.h:30 -#, fuzzy msgid "Symbolic" -msgstr "Symbole" +msgstr "Symbolique" #: ../share/extensions/hershey.inx.h:31 msgid "" @@ -31804,9 +30336,8 @@ msgid "" msgstr "" #: ../share/extensions/hershey.inx.h:36 -#, fuzzy msgid "About..." -msgstr "À propos" +msgstr "À propos..." #: ../share/extensions/hershey.inx.h:37 msgid "" @@ -31833,50 +30364,47 @@ msgid "HPGL Input" msgstr "Entrée WPG" #: ../share/extensions/hpgl_input.inx.h:2 -msgid "" -"Please note that you can only open HPGL files written by Inkscape, to open " -"other HPGL files please change their file extension to .plt, make sure you " -"have UniConverter installed and open them again." +msgid "Please note that you can only open HPGL files written by Inkscape, to open other HPGL files please change their file extension to .plt, make sure you have UniConverter installed and open them again." msgstr "" #: ../share/extensions/hpgl_input.inx.h:3 -#: ../share/extensions/hpgl_output.inx.h:6 -#: ../share/extensions/plotter.inx.h:16 +#: ../share/extensions/hpgl_output.inx.h:4 +#: ../share/extensions/plotter.inx.h:20 #, fuzzy msgid "Resolution X (dpi)" msgstr "Résolution (ppp) :" #: ../share/extensions/hpgl_input.inx.h:4 -msgid "The amount of steps in one inch on the X axis (Default: 1016.0)" +msgid "The amount of steps in one inch on the X axis. (Default: 1016.0)" msgstr "" #: ../share/extensions/hpgl_input.inx.h:5 -#: ../share/extensions/hpgl_output.inx.h:8 -#: ../share/extensions/plotter.inx.h:18 +#: ../share/extensions/hpgl_output.inx.h:6 +#: ../share/extensions/plotter.inx.h:22 #, fuzzy msgid "Resolution Y (dpi)" msgstr "Résolution (ppp) :" #: ../share/extensions/hpgl_input.inx.h:6 -msgid "The amount of steps in one inch on the Y axis (Default: 1016.0)" +msgid "The amount of steps in one inch on the Y axis. (Default: 1016.0)" msgstr "" #: ../share/extensions/hpgl_input.inx.h:7 -msgid "Show Movements between paths" +msgid "Show movements between paths" msgstr "" #: ../share/extensions/hpgl_input.inx.h:8 -msgid "Check this to show movements between paths (Default: Unchecked)" +msgid "Check this to show movements between paths. (Default: Unchecked)" msgstr "" #: ../share/extensions/hpgl_input.inx.h:9 -#: ../share/extensions/hpgl_output.inx.h:36 +#: ../share/extensions/hpgl_output.inx.h:42 msgid "HP Graphics Language file (*.hpgl)" msgstr "Fichier HP Graphics Language (*.hpgl)" #: ../share/extensions/hpgl_input.inx.h:10 #, fuzzy -msgid "Import HP Graphics Language file" +msgid "Import an HP Graphics Language file" msgstr "Exporter vers un fichier HP Graphics Language" #: ../share/extensions/hpgl_output.inx.h:1 @@ -31884,201 +30412,205 @@ msgid "HPGL Output" msgstr "Sortie HPGL" #: ../share/extensions/hpgl_output.inx.h:2 -msgid "" -"Please make sure that all objects you want to save are converted to paths. " -"The drawing will be automatically aligned to the zero point. Please use the " -"plotter extension (Extensions menu) to plot directly on a plotter." +msgid "Please make sure that all objects you want to save are converted to paths. The drawing will be automatically aligned to the zero point. Please use the plotter extension (Extensions menu) to plot directly on a plotter." msgstr "" #: ../share/extensions/hpgl_output.inx.h:3 -#: ../share/extensions/plotter.inx.h:13 +#: ../share/extensions/plotter.inx.h:19 #, fuzzy msgid "Plotter Settings" msgstr "Propriétés de la page" -#: ../share/extensions/hpgl_output.inx.h:4 -#: ../share/extensions/plotter.inx.h:14 -#, fuzzy -msgid "Pen number" -msgstr "Numéro de stylo" - #: ../share/extensions/hpgl_output.inx.h:5 -#: ../share/extensions/plotter.inx.h:15 -msgid "The number of the pen (tool) to use, on most plotters 1 (Standard: '1')" +#: ../share/extensions/plotter.inx.h:21 +msgid "The amount of steps the cutter moves if it moves for 1 inch on the X axis. (Default: 1016.0)" msgstr "" #: ../share/extensions/hpgl_output.inx.h:7 -#: ../share/extensions/plotter.inx.h:17 -msgid "" -"The amount of steps the cutter moves if it moves for 1 inch on the X axis - " -"Try different settings to find the one that fits your plotter (Default: " -"1016.0)" +#: ../share/extensions/plotter.inx.h:23 +msgid "The amount of steps the cutter moves if it moves for 1 inch on the Y axis. (Default: 1016.0)" msgstr "" +#: ../share/extensions/hpgl_output.inx.h:8 +#: ../share/extensions/plotter.inx.h:24 +#, fuzzy +msgid "Pen number" +msgstr "Numéro de stylo" + #: ../share/extensions/hpgl_output.inx.h:9 -#: ../share/extensions/plotter.inx.h:19 -msgid "" -"The amount of steps the cutter moves if it moves for 1 inch on the Y axis - " -"Try different settings to find the one that fits your plotter (Default: " -"1016.0)" +#: ../share/extensions/plotter.inx.h:25 +msgid "The number of the pen (tool) to use. (Standard: '1')" msgstr "" #: ../share/extensions/hpgl_output.inx.h:10 -#: ../share/extensions/plotter.inx.h:20 -#, fuzzy -msgid "Mirror X-axis" -msgstr "Refléter sur l'axe Y" +#: ../share/extensions/plotter.inx.h:26 +msgid "Pen force (g)" +msgstr "" #: ../share/extensions/hpgl_output.inx.h:11 -msgid "" -"Check this to mirror the X axis - Try different settings to find the one " -"that fits your plotter (Default: Unchecked)" +#: ../share/extensions/plotter.inx.h:27 +msgid "The amount of force pushing down the pen in grams, set to 0 to omit command. Most plotters ignore this command. (Default: 24)" msgstr "" #: ../share/extensions/hpgl_output.inx.h:12 -#: ../share/extensions/plotter.inx.h:22 -msgid "Mirror Y-axis" -msgstr "Refléter sur l'axe Y" +#: ../share/extensions/plotter.inx.h:28 +msgid "Pen speed (cm/s)" +msgstr "" #: ../share/extensions/hpgl_output.inx.h:13 -#: ../share/extensions/plotter.inx.h:23 -msgid "" -"Check this to mirror the Y axis - Try different settings to find the one " -"that fits your plotter (Default: Unchecked)" +#: ../share/extensions/plotter.inx.h:29 +msgid "The speed the pen will move with in centimetres per second, set to 0 to omit command. Most plotters ignore this command. (Default: 20)" msgstr "" #: ../share/extensions/hpgl_output.inx.h:14 -#: ../share/extensions/plotter.inx.h:24 +#: ../share/extensions/plotter.inx.h:30 #, fuzzy msgid "Rotation (Clockwise)" msgstr "Rotation en sens horaire" #: ../share/extensions/hpgl_output.inx.h:15 -msgid "" -"Rotation of the drawing - Try different settings to find the one that fits " -"your plotter (Default: 0°)" +#: ../share/extensions/plotter.inx.h:31 +msgid "Rotation of the plot. (Default: 0°)" msgstr "" #: ../share/extensions/hpgl_output.inx.h:16 -#: ../share/extensions/plotter.inx.h:26 +#: ../share/extensions/plotter.inx.h:32 #, fuzzy -msgid "Center zero point" -msgstr "Centrer les lignes" +msgid "Mirror X axis" +msgstr "Refléter sur l'axe Y" #: ../share/extensions/hpgl_output.inx.h:17 -#: ../share/extensions/plotter.inx.h:27 -msgid "" -"Check this if your plotter uses a centered zero point - Try different " -"settings to find the one that fits your plotter (Default: Unchecked)" +#: ../share/extensions/plotter.inx.h:33 +msgid "Check this to mirror the X axis. (Default: Unchecked)" msgstr "" #: ../share/extensions/hpgl_output.inx.h:18 -#: ../share/extensions/plotter.inx.h:28 +#: ../share/extensions/plotter.inx.h:34 +#, fuzzy +msgid "Mirror Y axis" +msgstr "Refléter sur l'axe Y" + +#: ../share/extensions/hpgl_output.inx.h:19 +#: ../share/extensions/plotter.inx.h:35 +msgid "Check this to mirror the Y axis. (Default: Unchecked)" +msgstr "" + +#: ../share/extensions/hpgl_output.inx.h:20 +#: ../share/extensions/plotter.inx.h:36 +#, fuzzy +msgid "Center zero point" +msgstr "Centrer les lignes" + +#: ../share/extensions/hpgl_output.inx.h:21 +#: ../share/extensions/plotter.inx.h:37 +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:38 msgid "Overcut & Tool Offset" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:19 -#: ../share/extensions/plotter.inx.h:29 +#: ../share/extensions/hpgl_output.inx.h:23 +#: ../share/extensions/plotter.inx.h:39 #, fuzzy msgid "Use overcut" msgstr "Utiliser les valeurs par défaut" -#: ../share/extensions/hpgl_output.inx.h:20 -#: ../share/extensions/plotter.inx.h:30 -msgid "" -"Check this to use the overcut, if not checked the 'Overcut' parameter is " -"unused (Default: Checked)" +#: ../share/extensions/hpgl_output.inx.h:24 +#: ../share/extensions/plotter.inx.h:40 +msgid "Check this to use overcut, if not checked the 'Overcut' parameter is unused. (Default: Checked)" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:21 -#: ../share/extensions/plotter.inx.h:31 +#: ../share/extensions/hpgl_output.inx.h:25 +#: ../share/extensions/plotter.inx.h:41 #, fuzzy msgid "Overcut (mm)" msgstr "Utiliser les valeurs par défaut" -#: ../share/extensions/hpgl_output.inx.h:22 -#: ../share/extensions/plotter.inx.h:32 -msgid "" -"The distance in mm that will be cut over the starting point of the path to " -"prevent open paths (Default: 1.00)" +#: ../share/extensions/hpgl_output.inx.h:26 +#: ../share/extensions/plotter.inx.h:42 +msgid "The distance in mm that will be cut over the starting point of the path to prevent open paths. (Default: 1.00)" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:23 -#: ../share/extensions/plotter.inx.h:33 +#: ../share/extensions/hpgl_output.inx.h:27 +#: ../share/extensions/plotter.inx.h:43 msgid "Use tool offset correction" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:24 -#: ../share/extensions/plotter.inx.h:34 -msgid "" -"Check this to use the tool offset correction, if not checked the 'Tool " -"offset' and 'Precut' parameters are unused (Default: Checked)" +#: ../share/extensions/hpgl_output.inx.h:28 +#: ../share/extensions/plotter.inx.h:44 +msgid "Check this to use the tool offset correction, if not checked the 'Tool offset' and 'Precut' parameters are unused. (Default: Checked)" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:25 -#: ../share/extensions/plotter.inx.h:35 +#: ../share/extensions/hpgl_output.inx.h:29 +#: ../share/extensions/plotter.inx.h:45 #, fuzzy msgid "Tool offset (mm)" msgstr "Décalage de l'outil (mm) :" -#: ../share/extensions/hpgl_output.inx.h:26 -#: ../share/extensions/plotter.inx.h:36 -msgid "The offset from the tool tip to the tool axis in mm (Default: 0.25)" +#: ../share/extensions/hpgl_output.inx.h:30 +#: ../share/extensions/plotter.inx.h:46 +msgid "The offset from the tool tip to the tool axis in mm. (Default: 0.25)" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:27 -#: ../share/extensions/plotter.inx.h:37 +#: ../share/extensions/hpgl_output.inx.h:31 +#: ../share/extensions/plotter.inx.h:47 #, fuzzy msgid "Use precut" msgstr "Utiliser les valeurs par défaut" -#: ../share/extensions/hpgl_output.inx.h:28 -#: ../share/extensions/plotter.inx.h:38 -msgid "" -"Check this to cut a small line before the real drawing to align the tool " -"orientation for the first cut (Default: Checked)" +#: ../share/extensions/hpgl_output.inx.h:32 +#: ../share/extensions/plotter.inx.h:48 +msgid "Check this to plot a small line before the real plot to align the tool orientation for the first real plot. (Default: Checked)" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:29 -#: ../share/extensions/plotter.inx.h:39 -msgid "" -"Please note that using the tool offset correction will move your plot away " -"from the zero point by the length in mm specified by the tool offset." +#: ../share/extensions/hpgl_output.inx.h:33 +#: ../share/extensions/plotter.inx.h:49 +msgid "Please note that using the tool offset correction will move your plot away from the zero point by one tool offset length." msgstr "" -#: ../share/extensions/hpgl_output.inx.h:31 -#: ../share/extensions/plotter.inx.h:41 +#: ../share/extensions/hpgl_output.inx.h:35 +#: ../share/extensions/plotter.inx.h:51 #, fuzzy msgid "Curve flatness" msgstr "Aplatissement :" -#: ../share/extensions/hpgl_output.inx.h:32 -#: ../share/extensions/plotter.inx.h:42 -msgid "" -"Curves are divided into lines, this number controls how fine the curves will " -"be reproduced, the smaller the finer (Default: '1.2')" +#: ../share/extensions/hpgl_output.inx.h:36 +#: ../share/extensions/plotter.inx.h:52 +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:33 -#: ../share/extensions/plotter.inx.h:43 +#: ../share/extensions/hpgl_output.inx.h:37 +#: ../share/extensions/plotter.inx.h:53 #, fuzzy msgid "X offset (mm)" msgstr "Décalage en X (mm) :" -#: ../share/extensions/hpgl_output.inx.h:34 -msgid "" -"The offset to shift your plot away from the zero point in mm (Default: " -"'0.00')" +#: ../share/extensions/hpgl_output.inx.h:38 +#: ../share/extensions/plotter.inx.h:54 +msgid "The offset to move your plot away from the zero point on the X axis in mm. (Default: '0.00')" msgstr "" -#: ../share/extensions/hpgl_output.inx.h:35 -#: ../share/extensions/plotter.inx.h:45 +#: ../share/extensions/hpgl_output.inx.h:39 +#: ../share/extensions/plotter.inx.h:55 #, fuzzy msgid "Y offset (mm)" msgstr "Décalage en Y (mm) :" -#: ../share/extensions/hpgl_output.inx.h:37 -msgid "Export to an HP Graphics Language file" +#: ../share/extensions/hpgl_output.inx.h:40 +#: ../share/extensions/plotter.inx.h:56 +msgid "The offset to move your plot away from the zero point on the Y axis in mm. (Default: '0.00')" +msgstr "" + +#: ../share/extensions/hpgl_output.inx.h:41 +#: ../share/extensions/plotter.inx.h:59 +msgid "All these settings depend on the plotter you use, for more information please consult the manual or homepage for your plotter." +msgstr "" + +#: ../share/extensions/hpgl_output.inx.h:43 +#, fuzzy +msgid "Export an HP Graphics Language file" msgstr "Exporter vers un fichier HP Graphics Language" #: ../share/extensions/ink2canvas.inx.h:1 @@ -32200,12 +30732,8 @@ msgid "Other" msgstr "Autre" #: ../share/extensions/interp_att_g.inx.h:18 -msgid "" -"If you select \"Other\", you must know the SVG attributes to identify here " -"this \"other\"." -msgstr "" -"Si vous sélectionnez « Autre », vous devez connaître les attributs SVG " -"nécessaires pour identifier ici cet « autre »." +msgid "If you select \"Other\", you must know the SVG attributes to identify here this \"other\"." +msgstr "Si vous sélectionnez « Autre », vous devez connaître les attributs SVG nécessaires pour identifier ici cet « autre »." #: ../share/extensions/interp_att_g.inx.h:20 msgid "Integer Number" @@ -32237,13 +30765,8 @@ msgid "No Unit" msgstr "Pas d'unité" #: ../share/extensions/interp_att_g.inx.h:28 -msgid "" -"This effect applies a value for any interpolatable attribute for all " -"elements inside the selected group or for all elements in a multiple " -"selection." -msgstr "" -"Cet effet applique une valeur sur les attributs interpolables de l'ensemble " -"des éléments de la sélection." +msgid "This effect applies a value for any interpolatable attribute for all elements inside the selected group or for all elements in a multiple selection." +msgstr "Cet effet applique une valeur sur les attributs interpolables de l'ensemble des éléments de la sélection." #: ../share/extensions/interp.inx.h:1 msgid "Interpolate" @@ -32299,14 +30822,8 @@ msgid "Number of slides" msgstr "Nombre de diapositives" #: ../share/extensions/jessyInk_autoTexts.inx.h:9 -msgid "" -"This extension allows you to install, update and remove auto-texts for a " -"JessyInk presentation. Please see code.google.com/p/jessyink for more " -"details." -msgstr "" -"Cette extension vous permet d'installer, mettre à jour ou supprimer des " -"textes automatiques pour une présentation JessyInk. Des informations " -"complémentaires sont disponibles sur le site code.google.com/p/jessyink." +msgid "This extension allows you to install, update and remove auto-texts for a JessyInk presentation. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet d'installer, mettre à jour ou supprimer des textes automatiques pour une présentation JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_autoTexts.inx.h:10 #: ../share/extensions/jessyInk_effects.inx.h:15 @@ -32363,14 +30880,8 @@ msgid "Fade out" msgstr "Fermeture en fondu" #: ../share/extensions/jessyInk_effects.inx.h:14 -msgid "" -"This extension allows you to install, update and remove object effects for a " -"JessyInk presentation. Please see code.google.com/p/jessyink for more " -"details." -msgstr "" -"Cette extension vous permet d'installer, mettre à jour ou supprimer des " -"effets d'objet pour une présentation JessyInk. Des informations " -"complémentaires sont disponibles sur le site code.google.com/p/jessyink." +msgid "This extension allows you to install, update and remove object effects for a JessyInk presentation. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet d'installer, mettre à jour ou supprimer des effets d'objet pour une présentation JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_export.inx.h:1 msgid "JessyInk zipped pdf or png output" @@ -32389,40 +30900,24 @@ msgid "PNG" msgstr "PNG" #: ../share/extensions/jessyInk_export.inx.h:8 -msgid "" -"This extension allows you to export a JessyInk presentation once you created " -"an export layer in your browser. Please see code.google.com/p/jessyink for " -"more details." -msgstr "" -"Cette extension vous permet d'exporter une présentation JessyInk, après " -"avoir créé un calque d'exportation, vers un navigateur. Des informations " -"complémentaires sont disponibles sur le site code.google.com/p/jessyink." +msgid "This extension allows you to export a JessyInk presentation once you created an export layer in your browser. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet d'exporter une présentation JessyInk, après avoir créé un calque d'exportation, vers un navigateur. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_export.inx.h:9 msgid "JessyInk zipped pdf or png output (*.zip)" msgstr "Exportation JessyInk PDF ou PNG compressée (*.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 "" -"Crée un fichier zip contenant des PDF ou des PNG de toutes les diapositives " -"de la présentation JessyInk." +msgid "Creates a zip file containing pdfs or pngs of all slides of a JessyInk presentation." +msgstr "Crée un fichier zip contenant des PDF ou des PNG de toutes les diapositives de la présentation JessyInk." #: ../share/extensions/jessyInk_install.inx.h:1 msgid "Install/update" msgstr "Installation/mise à jour" #: ../share/extensions/jessyInk_install.inx.h:3 -msgid "" -"This extension allows you to install or update the JessyInk script in order " -"to turn your SVG file into a presentation. Please see code.google.com/p/" -"jessyink for more details." -msgstr "" -"Cette extension vous permet d'installer ou mettre à jour le script JessyInk " -"pour transformer le fichier SVG en une présentation. Des informations " -"complémentaires sont disponibles sur le site code.google.com/p/jessyink." +msgid "This extension allows you to install or update the JessyInk script in order to turn your SVG file into a presentation. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet d'installer ou mettre à jour le script JessyInk pour transformer le fichier SVG en une présentation. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_keyBindings.inx.h:1 msgid "Key bindings" @@ -32593,13 +31088,8 @@ msgid "Set number of columns to default:" msgstr "Définir le nombre de colonnes avec la valeur par défaut :" #: ../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 "" -"Cette extension vous permet de personnaliser les raccourcis clavier utilisés " -"par JessyInk. Des informations complémentaires sont disponibles sur le site " -"code.google.com/p/jessyink." +msgid "This extension allows you customise the key bindings JessyInk uses. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet de personnaliser les raccourcis clavier utilisés par JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_masterSlide.inx.h:1 msgid "Master slide" @@ -32612,17 +31102,11 @@ msgstr "Nom du calque :" #: ../share/extensions/jessyInk_masterSlide.inx.h:4 msgid "If no layer name is supplied, the master slide is unset." -msgstr "" -"En l'absence d'un nom de calque, la diapositive maîtresse est désactivée." +msgstr "En l'absence d'un nom de calque, la diapositive maîtresse est désactivée." #: ../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 "" -"Cette extension vous permet de modifier la diapositive maîtresse utilisée " -"par JessyInk. Des informations complémentaires sont disponibles sur le site " -"code.google.com/p/jessyink." +msgid "This extension allows you to change the master slide JessyInk uses. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet de modifier la diapositive maîtresse utilisée par JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_mouseHandler.inx.h:1 msgid "Mouse handler" @@ -32641,28 +31125,16 @@ msgid "Dragging/zoom" msgstr "Déplacement/zoom" #: ../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 "" -"Cette extension vous permet de personnaliser la gestion de la souris par " -"JessyInk. Des informations complémentaires sont disponibles sur le site code." -"google.com/p/jessyink." +msgid "This extension allows you customise the mouse handler JessyInk uses. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet de personnaliser la gestion de la souris par JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_summary.inx.h:1 msgid "Summary" msgstr "Résumé" #: ../share/extensions/jessyInk_summary.inx.h:3 -msgid "" -"This extension allows you to obtain information about the JessyInk script, " -"effects and transitions contained in this SVG file. Please see code.google." -"com/p/jessyink for more details." -msgstr "" -"Cette extension vous permet d'obtenir des informations sur le script " -"JessyInk et les effets et transitions contenus dans le fichier SVG. Des " -"informations complémentaires sont disponibles sur le site code.google.com/p/" -"jessyink." +msgid "This extension allows you to obtain information about the JessyInk script, effects and transitions contained in this SVG file. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet d'obtenir des informations sur le script JessyInk et les effets et transitions contenus dans le fichier SVG. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_transitions.inx.h:1 msgid "Transitions" @@ -32681,13 +31153,8 @@ msgid "Transition out effect" msgstr "Effets de transition sortante" #: ../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 "" -"Cette extension vous permet de modifier la transition utilisée par JessyInk " -"pour le calque sélectionné. Des informations complémentaires sont " -"disponibles sur le site code.google.com/p/jessyink." +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 "Cette extension vous permet de modifier la transition utilisée par JessyInk pour le calque sélectionné. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_uninstall.inx.h:1 msgid "Uninstall/remove" @@ -32719,33 +31186,19 @@ msgstr "Retirer les vues" #: ../share/extensions/jessyInk_uninstall.inx.h:9 msgid "Please select the parts of JessyInk you want to uninstall/remove." -msgstr "" -"Veuillez sélectionner les parties de JessyInk que vous souhaitez " -"désinstaller ou retirer." +msgstr "Veuillez sélectionner les parties de JessyInk que vous souhaitez désinstaller ou retirer." #: ../share/extensions/jessyInk_uninstall.inx.h:11 -msgid "" -"This extension allows you to uninstall the JessyInk script. Please see code." -"google.com/p/jessyink for more details." -msgstr "" -"Cette extension vous permet de désinstaller le script JessyInk. Des " -"informations complémentaires sont disponibles sur le site code.google.com/p/" -"jessyink." +msgid "This extension allows you to uninstall the JessyInk script. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension vous permet de désinstaller le script JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_video.inx.h:1 msgid "Video" msgstr "Vidéo" #: ../share/extensions/jessyInk_video.inx.h:3 -msgid "" -"This extension puts a JessyInk video element on the current slide (layer). " -"This element allows you to integrate a video into your JessyInk " -"presentation. Please see code.google.com/p/jessyink for more details." -msgstr "" -"Cette extension dépose un élément vidéo JessyInk sur la diapositive (calque) " -"courant. Cet élément peut ensuite être utilisé pour intégrer une vidéo dans " -"la présentation. Des informations complémentaires sont disponibles sur le " -"site code.google.com/p/jessyink." +msgid "This extension puts a JessyInk video element on the current slide (layer). This element allows you to integrate a video into your JessyInk presentation. Please see code.google.com/p/jessyink for more details." +msgstr "Cette extension dépose un élément vidéo JessyInk sur la diapositive (calque) courant. Cet élément peut ensuite être utilisé pour intégrer une vidéo dans la présentation. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/jessyInk_view.inx.h:5 msgid "Remove view" @@ -32753,17 +31206,11 @@ msgstr "Retirer la vue" #: ../share/extensions/jessyInk_view.inx.h:6 msgid "Choose order number 0 to set the initial view of a slide." -msgstr "" -"Choisir un numéro d'ordre 0 pour définir la vue initiale d'une diapositive." +msgstr "Choisir un numéro d'ordre 0 pour définir la vue initiale d'une diapositive." #: ../share/extensions/jessyInk_view.inx.h:8 -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 "" -"Cette extension vous permet de définir, mettre à jour ou supprimer des vues " -"de la présentation JessyInk. Des informations complémentaires sont " -"disponibles sur le site code.google.com/p/jessyink." +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 "Cette extension vous permet de définir, mettre à jour ou supprimer des vues de la présentation JessyInk. Des informations complémentaires sont disponibles sur le site code.google.com/p/jessyink." #: ../share/extensions/layers2svgfont.inx.h:1 msgid "3 - Convert Glyph Layers to SVG Font" @@ -32949,9 +31396,7 @@ msgid "" "]: return to remembered point\n" msgstr "" "\n" -"Le chemin est généré en appliquant des règles à un axiome, sur plusieurs " -"générations. Les commandes suivantes sont reconnues dans les champs Axiome " -"et Règles :\n" +"Le chemin est généré en appliquant des règles à un axiome, sur plusieurs générations. Les commandes suivantes sont reconnues dans les champs Axiome et Règles :\n" "\n" "A, B, C, D, E ou F : dessiner d'un pas en avant ;\n" "G, H, I, J, K ou L : déplacer d'un pas en avant ;\n" @@ -32977,14 +31422,8 @@ msgid "Paragraph length fluctuation (sentences):" msgstr "Fluctuation de la longueur des paragraphes (en phrases) :" #: ../share/extensions/lorem_ipsum.inx.h:7 -msgid "" -"This effect creates the standard \"Lorem Ipsum\" pseudolatin placeholder " -"text. If a flowed text is selected, Lorem Ipsum is added to it; otherwise a " -"new flowed text object, the size of the page, is created in a new layer." -msgstr "" -"Cette effet crée un texte bouche-trou « Lorem Ipsum » (du pseudo-latin). Si " -"un cadre de texte est sélectionné, y ajoute Lorem Ipsum; sinon, un nouveau " -"cadre de texte de la taille de la page est créé dans un nouveau calque." +msgid "This effect creates the standard \"Lorem Ipsum\" pseudolatin placeholder text. If a flowed text is selected, Lorem Ipsum is added to it; otherwise a new flowed text object, the size of the page, is created in a new layer." +msgstr "Cette effet crée un texte bouche-trou « Lorem Ipsum » (du pseudo-latin). Si un cadre de texte est sélectionné, y ajoute Lorem Ipsum; sinon, un nouveau cadre de texte de la taille de la page est créé dans un nouveau calque." #: ../share/extensions/markers_strokepaint.inx.h:1 msgid "Color Markers" @@ -33084,35 +31523,21 @@ msgstr "Angle fixe" #: ../share/extensions/measure.inx.h:17 #, no-c-format msgid "" -"This effect measures the length, or area, of the selected paths and adds it " -"as a text object with the selected units.\n" +"This effect measures the length, or area, of the selected paths and adds it as a text object with the selected units.\n" " \n" -" * Display format can be either Text-On-Path, or stand-alone text at a " -"specified angle.\n" -" * The number of significant digits can be controlled by the Precision " -"field.\n" +" * Display format can be either Text-On-Path, or stand-alone text at a specified angle.\n" +" * The number of significant digits can be controlled by the Precision field.\n" " * The Offset field controls the distance from the text to the path.\n" -" * The Scale factor can be used to make measurements in scaled drawings. " -"For example, if 1 cm in the drawing equals 2.5 m in the real world, Scale " -"must be set to 250.\n" -" * When calculating area, the result should be precise for polygons and " -"Bezier curves. If a circle is used, the area may be too high by as much as " -"0.03%." -msgstr "" -"Cet effet mesure la longueur ou l'aire du chemin sélectionné et l'ajoute " -"comme un objet texte avec l'unité sélectionnée.\n" +" * The Scale factor can be used to make measurements in scaled drawings. For example, if 1 cm in the drawing equals 2.5 m in the real world, Scale must be set to 250.\n" +" * When calculating area, the result should be precise for polygons and Bezier curves. If a circle is used, the area may be too high by as much as 0.03%." +msgstr "" +"Cet effet mesure la longueur ou l'aire du chemin sélectionné et l'ajoute comme un objet texte avec l'unité sélectionnée.\n" "\n" -" * L'affichage peut s'effectuer sur le chemin, ou comme texte indépendant " -"sur un angle choisi.\n" -" * Le nombre de chiffres affichés peut être contrôlé par le champ " -"Précision.\n" +" * L'affichage peut s'effectuer sur le chemin, ou comme texte indépendant sur un angle choisi.\n" +" * Le nombre de chiffres affichés peut être contrôlé par le champ Précision.\n" " * Le champ Décalage contrôle la distance entre le texte et le chemin.\n" -" * Le facteur d'échelle peut être utilisé pour réaliser des mesures dans " -"des dessins à l'échelle. Par exemple, si 1 cm dans le dessin est égal à 2,5 " -"m en réalité, le facteur d'échelle doit être réglé à 250.\n" -" * Lors du calcul de l'aire, le résultat devrait être précis pour les " -"polygones et les courbes de Bézier. Si un cercle est utilisé, l'aire " -"pourrait être jusqu'à 0,03 % supérieure à la valeur attendue." +" * Le facteur d'échelle peut être utilisé pour réaliser des mesures dans des dessins à l'échelle. Par exemple, si 1 cm dans le dessin est égal à 2,5 m en réalité, le facteur d'échelle doit être réglé à 250.\n" +" * Lors du calcul de l'aire, le résultat devrait être précis pour les polygones et les courbes de Bézier. Si un cercle est utilisé, l'aire pourrait être jusqu'à 0,03 % supérieure à la valeur attendue." #: ../share/extensions/motion.inx.h:1 msgid "Motion" @@ -33176,12 +31601,10 @@ msgstr "Échantillons :" #: ../share/extensions/param_curves.inx.h:14 msgid "" -"Select a rectangle before calling the extension, it will determine X and Y " -"scales.\n" +"Select a rectangle before calling the extension, it will determine X and Y scales.\n" "First derivatives are always determined numerically." msgstr "" -"Sélectionner un rectangle avant de lancer l'extension ; il déterminera les " -"échelles X et Y.\n" +"Sélectionner un rectangle avant de lancer l'extension ; il déterminera les échelles X et Y.\n" "Les dérivées premières sont toujours déterminées numériquement." #: ../share/extensions/param_curves.inx.h:26 @@ -33239,14 +31662,8 @@ msgstr "Ruban" #: ../share/extensions/pathalongpath.inx.h:17 #, fuzzy -msgid "" -"This effect scatters or bends a pattern along arbitrary \"skeleton\" paths. " -"The pattern is the topmost object in the selection. Groups of paths, shapes " -"or clones are allowed." -msgstr "" -"Cet effet disperse un motif le long de chemins « squelettes » arbitraires. " -"Le motif doit être l'objet le plus haut dans la sélection. Les groupes de " -"chemins, formes et clones sont permis." +msgid "This effect scatters or bends a pattern along arbitrary \"skeleton\" paths. The pattern is the topmost object in the selection. Groups of paths, shapes or clones are allowed." +msgstr "Cet effet disperse un motif le long de chemins « squelettes » arbitraires. Le motif doit être l'objet le plus haut dans la sélection. Les groupes de chemins, formes et clones sont permis." #: ../share/extensions/pathscatter.inx.h:3 msgid "Follow path orientation" @@ -33289,14 +31706,8 @@ msgid "Sequentially" msgstr "Séquentiellement" #: ../share/extensions/pathscatter.inx.h:19 -msgid "" -"This effect scatters a pattern along arbitrary \"skeleton\" paths. The " -"pattern must be the topmost object in the selection. Groups of paths, " -"shapes, clones are allowed." -msgstr "" -"Cet effet disperse un motif le long de chemins « squelettes » arbitraires. " -"Le motif doit être l'objet le plus haut dans la sélection. Les groupes de " -"chemins, formes et clones sont permis." +msgid "This effect scatters a pattern along arbitrary \"skeleton\" paths. The pattern must be the topmost object in the selection. Groups of paths, shapes, clones are allowed." +msgstr "Cet effet disperse un motif le long de chemins « squelettes » arbitraires. Le motif doit être l'objet le plus haut dans la sélection. Les groupes de chemins, formes et clones sont permis." #: ../share/extensions/perfectboundcover.inx.h:1 msgid "Perfect-Bound Cover Template" @@ -33369,8 +31780,7 @@ msgstr "Fond perdu (pouces) :" #: ../share/extensions/perfectboundcover.inx.h:18 msgid "Note: Bond Weight # calculations are a best-guess estimate." -msgstr "" -"Note : le calcul du poids de « bond » est la meilleure estimation possible" +msgstr "Note : le calcul du poids de « bond » est la meilleure estimation possible" #: ../share/extensions/perspective.inx.h:1 msgid "Perspective" @@ -33381,21 +31791,15 @@ msgid "PixelSnap" msgstr "Aligner au pixel" #: ../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 "" -"Aligne les chemins de la sélection sur les pixels. Les bordures sont " -"alignées sur des demi-points, et les remplissages sur des points." +msgid "Snap all paths in selection to pixels. Snaps borders to half-points and fills to full points." +msgstr "Aligne les chemins de la sélection sur les pixels. Les bordures sont alignées sur des demi-points, et les remplissages sur des points." #: ../share/extensions/plotter.inx.h:1 msgid "Plot" msgstr "" #: ../share/extensions/plotter.inx.h:2 -msgid "" -"Please make sure that all objects you want to plot are converted to paths. " -"The plot will automatically be aligned to the zero point." +msgid "Please make sure that all objects you want to plot are converted to paths. The plot will automatically be aligned to the zero point." msgstr "" #: ../share/extensions/plotter.inx.h:3 @@ -33405,22 +31809,20 @@ msgstr "Connecteurs" #: ../share/extensions/plotter.inx.h:4 #, fuzzy -msgid "Serial Port" +msgid "Serial port" msgstr "Port sériel :" #: ../share/extensions/plotter.inx.h:5 -msgid "" -"The port of your serial connection, on Windows something like 'COM1', on " -"Linux something like: '/dev/ttyUSB0' (Default: COM1)" +msgid "The port of your serial connection, on Windows something like 'COM1', on Linux something like: '/dev/ttyUSB0'. (Default: COM1)" msgstr "" #: ../share/extensions/plotter.inx.h:6 #, fuzzy -msgid "Serial Baud rate" +msgid "Serial baud rate" msgstr "Port sériel :" #: ../share/extensions/plotter.inx.h:7 -msgid "The Baud rate of your serial connection (Default: 9600)" +msgid "The Baud rate of your serial connection. (Default: 9600)" msgstr "" #: ../share/extensions/plotter.inx.h:8 @@ -33429,42 +31831,53 @@ msgid "Flow control" msgstr "Région d'encadrement" #: ../share/extensions/plotter.inx.h:9 -msgid "" -"Software / Hardware flow control - Try different settings to find the one " -"that fits your plotter (Default: None)" +msgid "The Software / Hardware flow control of your serial connection. (Default: Software)" msgstr "" #: ../share/extensions/plotter.inx.h:10 -msgid "" -"This can be a physical serial connection or a USB-to-Serial bridge. Ask your " -"plotter manufacturer for drivers if needed." -msgstr "" +#, fuzzy +msgid "Command language" +msgstr "Deuxième langue :" #: ../share/extensions/plotter.inx.h:11 -msgid "Please note that Parallel (LPT) connections are not supported." +msgid "The command language to use. (Default: HPGL)" msgstr "" #: ../share/extensions/plotter.inx.h:12 -msgid "" -"Please note that only the HPGL command language is supported at the moment." +msgid "Software (XON/XOFF)" msgstr "" -#: ../share/extensions/plotter.inx.h:21 -msgid "Check this to mirror the X axis (Default: Unchecked)" +#: ../share/extensions/plotter.inx.h:13 +#, fuzzy +msgid "Hardware (RTS/CTS)" +msgstr "Matériel" + +#: ../share/extensions/plotter.inx.h:14 +msgid "Hardware (DSR/DTR + RTS/CTS)" msgstr "" -#: ../share/extensions/plotter.inx.h:25 -msgid "" -"Rotation of the plot - Try different settings to find the one that fits your " -"plotter (Default: 0°)" +#: ../share/extensions/plotter.inx.h:16 +msgid "Using wrong settings can under certain circumstances cause Inkscape to freeze. Always save your work before plotting." msgstr "" -#: ../share/extensions/plotter.inx.h:44 -msgid "" -"The offset to move your plot away from the zero point in mm (Default: '0.00')" +#: ../share/extensions/plotter.inx.h:17 +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:46 +#: ../share/extensions/plotter.inx.h:18 +msgid "Parallel (LPT) connections are not supported." +msgstr "" + +#: ../share/extensions/plotter.inx.h:57 +#, fuzzy +msgid "Show debug information" +msgstr "Information sur l'utilisation de la mémoire" + +#: ../share/extensions/plotter.inx.h:58 +msgid "Check this to get verbose information about the plot without actually sending something to the plotter (A.k.a. data dump). (Default: Unchecked)" +msgstr "" + +#: ../share/extensions/plotter.inx.h:60 #, fuzzy msgid "Plotter" msgstr "Motif" @@ -33775,12 +32188,8 @@ msgid "Use normal distribution" msgstr "Utiliser une distribution normale" #: ../share/extensions/radiusrand.inx.h:9 -msgid "" -"This effect randomly shifts the nodes (and optionally node handles) of the " -"selected path." -msgstr "" -"Cet effet décale les nœuds du chemin sélectionné. Il peut aussi agir sur les " -"poignées." +msgid "This effect randomly shifts the nodes (and optionally node handles) of the selected path." +msgstr "Cet effet décale les nœuds du chemin sélectionné. Il peut aussi agir sur les poignées." #: ../share/extensions/render_alphabetsoup.inx.h:1 msgid "Alphabet Soup" @@ -33827,21 +32236,15 @@ msgstr "QR Code" #: ../share/extensions/render_barcode_qrcode.inx.h:2 msgid "See http://www.denso-wave.com/qrcode/index-e.html for details" -msgstr "" -"Voir http://www.denso-wave.com/qrcode/index-e.html pour de plus amples " -"détails" +msgstr "Voir http://www.denso-wave.com/qrcode/index-e.html pour de plus amples détails" #: ../share/extensions/render_barcode_qrcode.inx.h:5 msgid "Auto" msgstr "Auto" #: ../share/extensions/render_barcode_qrcode.inx.h:6 -msgid "" -"With \"Auto\", the size of the barcode depends on the length of the text and " -"the error correction level" -msgstr "" -"Avec \"Auto\", la taille du code-barres dépend de la longueur du texte et du " -"niveau de correction d'erreur" +msgid "With \"Auto\", the size of the barcode depends on the length of the text and the error correction level" +msgstr "Avec \"Auto\", la taille du code-barres dépend de la longueur du texte et du niveau de correction d'erreur" #: ../share/extensions/render_barcode_qrcode.inx.h:7 msgid "Error correction level:" @@ -33937,11 +32340,8 @@ msgid "List all fonts" msgstr "Lister toutes les polices" #: ../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 "" -"Choisissez cet onglet pour lister les polices utilisées ou trouvées dans le " -"document." +msgid "Choose this tab if you would like to see a list of the fonts used/found." +msgstr "Choisissez cet onglet pour lister les polices utilisées ou trouvées dans le document." #: ../share/extensions/replace_font.inx.h:8 msgid "Work on:" @@ -34125,8 +32525,7 @@ msgstr "Raccourcir les identifiants" #: ../share/extensions/scour.inx.h:22 msgid "Preserve manually created ID names not ending with digits" -msgstr "" -"Préserver les identifiants manuels qui ne se terminent pas par un chiffre" +msgstr "Préserver les identifiants manuels qui ne se terminent pas par un chiffre" #: ../share/extensions/scour.inx.h:23 msgid "Preserve these ID names, comma-separated:" @@ -34145,65 +32544,31 @@ msgstr "Aide (options)" msgid "" "This extension optimizes the SVG file according to the following options:\n" " * Shorten color names: convert all colors to #RRGGBB or #RGB format.\n" -" * Convert CSS attributes to XML attributes: convert styles from style " -"tags and inline style=\"\" declarations into XML attributes.\n" -" * Group collapsing: removes useless g elements, promoting their contents " -"up one level. Requires \"Remove unused ID names for elements\" to be set.\n" -" * Create groups for similar attributes: create g elements for runs of " -"elements having at least one attribute in common (e.g. fill color, stroke " -"opacity, ...).\n" +" * Convert CSS attributes to XML attributes: convert styles from style tags and inline style=\"\" declarations into XML attributes.\n" +" * Group collapsing: removes useless g elements, promoting their contents up one level. Requires \"Remove unused ID names for elements\" to be set.\n" +" * Create groups for similar attributes: create g elements for runs of elements having at least one attribute in common (e.g. fill color, stroke opacity, ...).\n" " * Embed rasters: embed raster images as base64-encoded data URLs.\n" -" * Keep editor data: don't remove Inkscape, Sodipodi or Adobe Illustrator " -"elements and attributes.\n" -" * Remove metadata: remove metadata tags along with all the information " -"in them, which may include license metadata, alternate versions for non-SVG-" -"enabled browsers, etc.\n" +" * Keep editor data: don't remove Inkscape, Sodipodi or Adobe Illustrator elements and attributes.\n" +" * Remove metadata: remove metadata tags along with all the information in them, which may include license metadata, alternate versions for non-SVG-enabled browsers, etc.\n" " * Remove comments: remove comment tags.\n" -" * Work around renderer bugs: emits slightly larger SVG data, but works " -"around a bug in librsvg's renderer, which is used in Eye of GNOME and other " -"various applications.\n" +" * Work around renderer bugs: emits slightly larger SVG data, but works around a bug in librsvg's renderer, which is used in Eye of GNOME and other various applications.\n" " * Enable viewboxing: size image to 100%/100% and introduce a viewBox.\n" -" * Number of significant digits for coords: all coordinates are output " -"with that number of significant digits. For example, if 3 is specified, the " -"coordinate 3.5153 is output as 3.51 and the coordinate 471.55 is output as " -"472.\n" -" * XML indentation (pretty-printing): either None for no indentation, " -"Space to use one space per nesting level, or Tab to use one tab per nesting " -"level." +" * Number of significant digits for coords: all coordinates are output with that number of significant digits. For example, if 3 is specified, the coordinate 3.5153 is output as 3.51 and the coordinate 471.55 is output as 472.\n" +" * XML indentation (pretty-printing): either None for no indentation, Space to use one space per nesting level, or Tab to use one tab per nesting level." msgstr "" "Cette extension optimise le fichier SVG en fonction des options suivantes :\n" -" * Raccourcir les valeurs de couleur : convertit toutes les couleurs au " -"format #RRGGBB ou #RGB.\n" -" * Convertir les attributs CSS en attributs XML : convertit les styles " -"défini à partir de l'étiquette style et des déclarations en ligne style=\"\" " -"en attributs XML.\n" -" * Réduire les groupes : supprime des éléments g inutiles, tout en " -"remontant leur contenu d'un niveau. L'option \"Supprimer les identifiants " -"d'éléments inutilisés\" doit également être activée.\n" -" * Créer des groupes pour les attributs similaires : crée des éléments g " -"pour les séries d'éléments ayant au moins un attribut en commun (couleur de " -"remplissage ou opacité du contour par exemple).\n" -" * Incorporer les images : incorpore les images matricielles sous la " -"forme de données encodées en base 64.\n" -" * Conserver les données d'édition : ne supprime pas les éléments et " -"attributs issus d'Inkscape, Sodipodi ou Adobe Illustrator.\n" -" * Supprimer les métadonnées : supprime les éléments de type metadata " -"ainsi que toutes les informations qu'ils contiennent, ce qui peut inclure " -"les métadonnées de licence, les versions alternatives pour les navigateurs " -"ne supportant pas SVG, etc.\n" -" * Supprimer les commentaires : supprime les éléments de type " -"commentaire.\n" -" * Contourner les défauts de rendu : génère des données SVG légèrement " -"plus volumineuses, mais contourne un défaut du moteur de rendu libsvg, qui " -"est utilisé par Eye of Gnome et diverses autres applications.\n" -" * Activer une viewBox : dimensionne l'image à 100 % et ajoute une " -"viewBox.\n" -" * Nombre de chiffres significatifs pour les coordonnées : toutes les " -"coordonnées sont générées avec une certain nombre de décimales " -"significatives. Si la valeur 3 est choisie, par exemple, la coordonnée " -"3.5153 sera réduite à 3.51 et la coordonnée 471.55 réduite à 472.\n" -" * Indentation du code XML (impression formatée) : type d'indentation de " -"l'exportation : aucune, espace ou tabulation (espace par défaut)." +" * Raccourcir les valeurs de couleur : convertit toutes les couleurs au format #RRGGBB ou #RGB.\n" +" * Convertir les attributs CSS en attributs XML : convertit les styles défini à partir de l'étiquette style et des déclarations en ligne style=\"\" en attributs XML.\n" +" * Réduire les groupes : supprime des éléments g inutiles, tout en remontant leur contenu d'un niveau. L'option \"Supprimer les identifiants d'éléments inutilisés\" doit également être activée.\n" +" * Créer des groupes pour les attributs similaires : crée des éléments g pour les séries d'éléments ayant au moins un attribut en commun (couleur de remplissage ou opacité du contour par exemple).\n" +" * Incorporer les images : incorpore les images matricielles sous la forme de données encodées en base 64.\n" +" * Conserver les données d'édition : ne supprime pas les éléments et attributs issus d'Inkscape, Sodipodi ou Adobe Illustrator.\n" +" * Supprimer les métadonnées : supprime les éléments de type metadata ainsi que toutes les informations qu'ils contiennent, ce qui peut inclure les métadonnées de licence, les versions alternatives pour les navigateurs ne supportant pas SVG, etc.\n" +" * Supprimer les commentaires : supprime les éléments de type commentaire.\n" +" * Contourner les défauts de rendu : génère des données SVG légèrement plus volumineuses, mais contourne un défaut du moteur de rendu libsvg, qui est utilisé par Eye of Gnome et diverses autres applications.\n" +" * Activer une viewBox : dimensionne l'image à 100 % et ajoute une viewBox.\n" +" * Nombre de chiffres significatifs pour les coordonnées : toutes les coordonnées sont générées avec une certain nombre de décimales significatives. Si la valeur 3 est choisie, par exemple, la coordonnée 3.5153 sera réduite à 3.51 et la coordonnée 471.55 réduite à 472.\n" +" * Indentation du code XML (impression formatée) : type d'indentation de l'exportation : aucune, espace ou tabulation (espace par défaut)." #: ../share/extensions/scour.inx.h:40 msgid "Help (Ids)" @@ -34212,38 +32577,18 @@ msgstr "Aide (identifiants)" #: ../share/extensions/scour.inx.h:41 msgid "" "Ids specific options:\n" -" * Remove unused ID names for elements: remove all unreferenced ID " -"attributes.\n" -" * Shorten IDs: reduce the length of all ID attributes, assigning the " -"shortest to the most-referenced elements. For instance, #linearGradient5621, " -"referenced 100 times, can become #a.\n" -" * Preserve manually created ID names not ending with digits: usually, " -"optimised SVG output removes these, but if they're needed for referencing (e." -"g. #middledot), you may use this option.\n" -" * Preserve these ID names, comma-separated: you can use this in " -"conjunction with the other preserve options if you wish to preserve some " -"more specific ID names.\n" -" * Preserve ID names starting with: usually, optimised SVG output removes " -"all unused ID names, but if all of your preserved ID names start with the " -"same prefix (e.g. #flag-mx, #flag-pt), you may use this option." +" * Remove unused ID names for elements: remove all unreferenced ID attributes.\n" +" * Shorten IDs: reduce the length of all ID attributes, assigning the shortest to the most-referenced elements. For instance, #linearGradient5621, referenced 100 times, can become #a.\n" +" * Preserve manually created ID names not ending with digits: usually, optimised SVG output removes these, but if they're needed for referencing (e.g. #middledot), you may use this option.\n" +" * Preserve these ID names, comma-separated: you can use this in conjunction with the other preserve options if you wish to preserve some more specific ID names.\n" +" * Preserve ID names starting with: usually, optimised SVG output removes all unused ID names, but if all of your preserved ID names start with the same prefix (e.g. #flag-mx, #flag-pt), you may use this option." msgstr "" "Options spécifiques aux identifiants :\n" -" * Supprimer les identifiants d'éléments inutilisés : supprimer tous les " -"attributs ID sans référence.\n" -" * Raccourcir les identifiants : réduit la longueur de tous les attributs " -"ID, en assignant les plus courts aux éléments les plus référencés. Par " -"exemple, un attribut #linearGradient5621 référencé 100 fois peut devenir " -"#a.\n" -" * Préserver les identifiants manuels qui ne se terminent pas par un " -"chiffre : normalement supprimés par l'extension, cochez cette option si ces " -"identifiants sont utilisés comme référence (par exemple #pointcentral).\n" -" * Préserver les identifiants suivants (séparés par des virgules) : vous " -"pouvez utiliser cette option en conjonction avec les autres options de " -"préservation si vous souhaitez conserver certain identifiants spécifiques.\n" -" * Préserver les identifiants débutant par : normalement, cette extension " -"supprime tous les identifiants inutilisés, mais si tous vos identifiants à " -"préserver commencent par le même préfixe, (#page-debut, #page-fin, par " -"exemple), vous pouvez utiliser cette option." +" * Supprimer les identifiants d'éléments inutilisés : supprimer tous les attributs ID sans référence.\n" +" * Raccourcir les identifiants : réduit la longueur de tous les attributs ID, en assignant les plus courts aux éléments les plus référencés. Par exemple, un attribut #linearGradient5621 référencé 100 fois peut devenir #a.\n" +" * Préserver les identifiants manuels qui ne se terminent pas par un chiffre : normalement supprimés par l'extension, cochez cette option si ces identifiants sont utilisés comme référence (par exemple #pointcentral).\n" +" * Préserver les identifiants suivants (séparés par des virgules) : vous pouvez utiliser cette option en conjonction avec les autres options de préservation si vous souhaitez conserver certain identifiants spécifiques.\n" +" * Préserver les identifiants débutant par : normalement, cette extension supprime tous les identifiants inutilisés, mais si tous vos identifiants à préserver commencent par le même préfixe, (#page-debut, #page-fin, par exemple), vous pouvez utiliser cette option." #: ../share/extensions/scour.inx.h:47 msgid "Optimized SVG (*.svg)" @@ -34289,8 +32634,7 @@ msgstr "Fichiers graphiques vectoriels sK1 (.sk1)" #: ../share/extensions/sk1_input.inx.h:3 msgid "Open files saved in sK1 vector graphics editor" -msgstr "" -"Ouvrir des fichiers enregistrés avec l'éditeur de graphismes vectoriels sK1" +msgstr "Ouvrir des fichiers enregistrés avec l'éditeur de graphismes vectoriels sK1" #: ../share/extensions/sk1_output.inx.h:1 msgid "sK1 vector graphics files output" @@ -34407,11 +32751,13 @@ msgstr "Format de fichier graphiques XML d'Adobe" msgid "XAML Output" msgstr "Sortie XAML" -#: ../share/extensions/svg2xaml.inx.h:2 ../share/extensions/xaml2svg.inx.h:2 +#: ../share/extensions/svg2xaml.inx.h:2 +#: ../share/extensions/xaml2svg.inx.h:2 msgid "Microsoft XAML (*.xaml)" msgstr "Microsoft XAML (*.xaml)" -#: ../share/extensions/svg2xaml.inx.h:3 ../share/extensions/xaml2svg.inx.h:3 +#: ../share/extensions/svg2xaml.inx.h:3 +#: ../share/extensions/xaml2svg.inx.h:3 msgid "Microsoft's GUI definition format" msgstr "Format de définition d'interfaces graphiques de Microsoft" @@ -34432,12 +32778,8 @@ msgid "Compressed Inkscape SVG with media (*.zip)" msgstr "SVG Inkscape compressé avec média (*.zip)" #: ../share/extensions/svg_and_media_zip_output.inx.h:5 -msgid "" -"Inkscape's native file format compressed with Zip and including all media " -"files" -msgstr "" -"Format de fichier natif d'Inkscape compressé avec Zip et incluant d'autres " -"fichiers de média" +msgid "Inkscape's native file format compressed with Zip and including all media files" +msgstr "Format de fichier natif d'Inkscape compressé avec Zip et incluant d'autres fichiers de média" #: ../share/extensions/svgcalendar.inx.h:1 msgid "Calendar" @@ -34501,8 +32843,7 @@ msgstr "Marge des mois :" #: ../share/extensions/svgcalendar.inx.h:18 msgid "The options below have no influence when the above is checked." -msgstr "" -"Les options suivantes ne s'appliquent pas si la case précédente est cochée." +msgstr "Les options suivantes ne s'appliquent pas si la case précédente est cochée." #: ../share/extensions/svgcalendar.inx.h:20 msgid "Year color:" @@ -34557,12 +32898,8 @@ msgid "You may change the names for other languages:" msgstr "Ajuster les noms en fonction de votre langue :" #: ../share/extensions/svgcalendar.inx.h:33 -msgid "" -"January February March April May June July August September October November " -"December" -msgstr "" -"Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre " -"Décembre" +msgid "January February March April May June July August September October November December" +msgstr "Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre Décembre" #: ../share/extensions/svgcalendar.inx.h:34 msgid "Sun Mon Tue Wed Thu Fri Sat" @@ -34577,12 +32914,8 @@ msgid "Wk" msgstr "S" #: ../share/extensions/svgcalendar.inx.h:37 -msgid "" -"Select your system encoding. More information at http://docs.python.org/" -"library/codecs.html#standard-encodings." -msgstr "" -"Sélectionnez votre encodage système. De plus amples informations à l'adresse " -"http://docs.python.org/library/codecs.html#standard-encodings." +msgid "Select your system encoding. More information at http://docs.python.org/library/codecs.html#standard-encodings." +msgstr "Sélectionnez votre encodage système. De plus amples informations à l'adresse http://docs.python.org/library/codecs.html#standard-encodings." #: ../share/extensions/svgfont2layers.inx.h:1 msgid "Convert SVG Font to Glyph Layers" @@ -34771,13 +33104,8 @@ msgid "Automatic from selected objects" msgstr "Automatique à partir des objets sélectionnés" #: ../share/extensions/voronoi2svg.inx.h:12 -msgid "" -"Select a set of objects. Their centroids will be used as the sites of the " -"Voronoi diagram. Text objects are not handled." -msgstr "" -"Sélectionnez un ensemble d'objets. Leurs barycentres seront utilisés comme " -"sites du diagramme de Voronoï. Les objets de type texte ne sont pas " -"supportés." +msgid "Select a set of objects. Their centroids will be used as the sites of the Voronoi diagram. Text objects are not handled." +msgstr "Sélectionnez un ensemble d'objets. Leurs barycentres seront utilisés comme sites du diagramme de Voronoï. Les objets de type texte ne sont pas supportés." #: ../share/extensions/web-set-att.inx.h:1 msgid "Set Attributes" @@ -34856,8 +33184,7 @@ msgstr "on element loaded" #: ../share/extensions/web-set-att.inx.h:18 msgid "The list of values must have the same size as the attributes list." -msgstr "" -"La liste des valeurs doit avoir la même taille que la liste des attributs." +msgstr "La liste des valeurs doit avoir la même taille que la liste des attributs." #: ../share/extensions/web-set-att.inx.h:19 #: ../share/extensions/web-transmit-att.inx.h:17 @@ -34872,8 +33199,7 @@ msgstr "Exécuter avant" #: ../share/extensions/web-set-att.inx.h:22 #: ../share/extensions/web-transmit-att.inx.h:20 msgid "The next parameter is useful when you select more than two elements" -msgstr "" -"Le paramètre suivant est utile si plus de deux éléments sont sélectionnés" +msgstr "Le paramètre suivant est utile si plus de deux éléments sont sélectionnés" #: ../share/extensions/web-set-att.inx.h:23 msgid "All selected ones set an attribute in the last one" @@ -34885,28 +33211,16 @@ msgstr "Le premier sélectionné définit un attribut pour tous les autres" #: ../share/extensions/web-set-att.inx.h:26 #: ../share/extensions/web-transmit-att.inx.h:24 -msgid "" -"This effect adds a feature visible (or usable) only on a SVG enabled web " -"browser (like Firefox)." -msgstr "" -"L'élément ajouté par cet effet sera visible (ou utilisable) seulement avec " -"un navigateur internet supportant SVG (comme Firefox)." +msgid "This effect adds a feature visible (or usable) only on a SVG enabled web browser (like Firefox)." +msgstr "L'élément ajouté par cet effet sera visible (ou utilisable) seulement avec un navigateur internet supportant SVG (comme Firefox)." #: ../share/extensions/web-set-att.inx.h:27 -msgid "" -"This effect sets one or more attributes in the second selected element, when " -"a defined event occurs on the first selected element." -msgstr "" -"Cet effet définit un ou plusieurs attributs sur le deuxième élément " -"sélectionné lorsqu'un événement intervient sur le premier." +msgid "This effect sets one or more attributes in the second selected element, when a defined event occurs on the first selected element." +msgstr "Cet effet définit un ou plusieurs attributs sur le deuxième élément sélectionné lorsqu'un événement intervient sur le premier." #: ../share/extensions/web-set-att.inx.h:28 -msgid "" -"If you want to set more than one attribute, you must separate this with a " -"space, and only with a space." -msgstr "" -"Si vous souhaitez définir plusieurs attributs, vous devez les séparer avec " -"le caractère « espace »." +msgid "If you want to set more than one attribute, you must separate this with a space, and only with a space." +msgstr "Si vous souhaitez définir plusieurs attributs, vous devez les séparer avec le caractère « espace »." #: ../share/extensions/web-set-att.inx.h:29 #: ../share/extensions/webslicer_create_group.inx.h:13 @@ -34956,13 +33270,8 @@ msgid "Undefined (relative to non-floating content size)" msgstr "Indéfini (relatif à une taille de contenu fixe)" #: ../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 "" -"Le but du groupe de composants est d'aider à générer un meilleur code (si " -"nécessaire). Pour l'utiliser, vous devez d'abord sélectionner des " -"« Rectangles de découpe »." +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 "Le but du groupe de composants est d'aider à générer un meilleur code (si nécessaire). Pour l'utiliser, vous devez d'abord sélectionner des « Rectangles de découpe »." #: ../share/extensions/webslicer_create_group.inx.h:14 msgid "Slicer" @@ -34983,8 +33292,7 @@ msgstr "Imposer la dimension :" #. 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 x" -msgstr "" -"La dimension imposée doit être définie sous la forme « x »" +msgstr "La dimension imposée doit être définie sous la forme « x »" #: ../share/extensions/webslicer_create_rect.inx.h:8 msgid "If set, this will replace DPI." @@ -34999,13 +33307,8 @@ msgid "Quality:" msgstr "Qualité :" #: ../share/extensions/webslicer_create_rect.inx.h:12 -msgid "" -"0 is the lowest image quality and highest compression, and 100 is the best " -"quality but least effective compression" -msgstr "" -"0 correspond à la plus faible qualité d'image et à la plus forte " -"compression, 100 à la meilleure qualité mais à une compression moins " -"efficace." +msgid "0 is the lowest image quality and highest compression, and 100 is the best quality but least effective compression" +msgstr "0 correspond à la plus faible qualité d'image et à la plus forte compression, 100 à la meilleure qualité mais à une compression moins efficace." #: ../share/extensions/webslicer_create_rect.inx.h:13 msgid "GIF specific options" @@ -35121,12 +33424,8 @@ msgstr "Avec HTML et CSS" #: ../share/extensions/webslicer_export.inx.h:7 #, fuzzy -msgid "" -"All sliced images, and optionally - code, will be generated as you had " -"configured and saved to one directory." -msgstr "" -"Les images découpées, et éventuellement le code, seront générés comme " -"configuré et enregistrés dans un dossier." +msgid "All sliced images, and optionally - code, will be generated as you had configured and saved to one directory." +msgstr "Les images découpées, et éventuellement le code, seront générés comme configuré et enregistrés dans un dossier." #: ../share/extensions/web-transmit-att.inx.h:1 msgid "Transmit Attributes" @@ -35153,20 +33452,12 @@ msgid "The first selected transmits to all others" msgstr "Le premier sélectionné transmet à tous les autres" #: ../share/extensions/web-transmit-att.inx.h:25 -msgid "" -"This effect transmits one or more attributes from the first selected element " -"to the second when an event occurs." -msgstr "" -"Cet effet transmet un ou plusieurs attributs du premier élément sélectionné " -"vers le deuxième lorsqu'un événement intervient." +msgid "This effect transmits one or more attributes from the first selected element to the second when an event occurs." +msgstr "Cet effet transmet un ou plusieurs attributs du premier élément sélectionné vers le deuxième lorsqu'un événement intervient." #: ../share/extensions/web-transmit-att.inx.h:26 -msgid "" -"If you want to transmit more than one attribute, you should separate this " -"with a space, and only with a space." -msgstr "" -"Si vous souhaitez transmettre plusieurs attributs, vous devez les séparer " -"avec le caractère « espace »." +msgid "If you want to transmit more than one attribute, you should separate this with a space, and only with a space." +msgstr "Si vous souhaitez transmettre plusieurs attributs, vous devez les séparer avec le caractère « espace »." #: ../share/extensions/whirl.inx.h:1 msgid "Whirl" @@ -35214,12 +33505,44 @@ msgstr "Un format graphique populaire pour les cliparts" msgid "XAML Input" msgstr "Entrée XAML" +#~ msgid "drawing-%d%s" +#~ msgstr "dessin-%d%s" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "2x2" +#~ msgstr "2x2" + +#~ msgid "4x4" +#~ msgstr "4x4" + +#~ msgid "8x8" +#~ msgstr "8x8" + +#~ msgid "Oversample bitmaps:" +#~ msgstr "Sur-échantilloner les bitmaps :" + +#~ msgid "Always embed" +#~ msgstr "Toujours incorporer" + +#~ msgid "Always link" +#~ msgstr "Toujours lier" + +#~ msgid "Ask" +#~ msgstr "Demander" + +#~ msgid "Bitmap import quality:" +#~ msgstr "Qualité de bitmap à l'importation :" + #~ msgid "Flowed text (%d character%s)" + #~ msgid_plural "Flowed text (%d characters%s)" #~ msgstr[0] "Texte encadré (%d caractère%s)" #~ msgstr[1] "Texte encadré (%d caractères%s)" #~ msgid "Linked flowed text (%d character%s)" + #~ msgid_plural "Linked flowed text (%d characters%s)" #~ msgstr[0] "Texte encadré lié (%d caractère%s)" #~ msgstr[1] "Texte encadré lié (%d caractères%s)" @@ -35328,38 +33651,42 @@ msgstr "Entrée XAML" #~ msgid "Extent or scope of this document" #~ msgstr "Étendue ou portée de ce document" - #~ msgctxt "Web" + #~ msgid "Link" #~ msgstr "Lien" #~ msgid "Polyline" #~ msgstr "Polyligne" - #~ msgctxt "Object" + #~ msgid "Text" #~ msgstr "Texte" - #~ msgctxt "Object" + #~ msgid "Clone" #~ msgstr "Clone" #~ msgid "%i object of type %s" + #~ msgid_plural "%i objects of type %s" #~ msgstr[0] "%i objet de type %s" #~ msgstr[1] "%i objets de type %s" #~ msgid "%i object of types %s, %s" + #~ msgid_plural "%i objects of types %s, %s" #~ msgstr[0] "%i objets de types %s, %s" #~ msgstr[1] "%i objets de types %s, %s" #~ msgid "%i object of types %s, %s, %s" + #~ msgid_plural "%i objects of types %s, %s, %s" #~ msgstr[0] "%i objet de types %s, %s, %s" #~ msgstr[1] "%i objets de types %s, %s, %s" #~ msgid "%i object of %i types" + #~ msgid_plural "%i objects of %i types" #~ msgstr[0] "%i objet de %i types" #~ msgstr[1] "%i objets de %i types" @@ -35392,11 +33719,13 @@ msgstr "Entrée XAML" #~ msgstr "Offset dynamique, %s de %f pt" #~ msgid "Path (%i node, path effect: %s)" + #~ msgid_plural "Path (%i nodes, path effect: %s)" #~ msgstr[0] "Chemin (%i nœud, effet de chemin : %s)" #~ msgstr[1] "Chemin (%i nœuds, effet de chemin : %s)" #~ msgid "Path (%i node)" + #~ msgid_plural "Path (%i nodes)" #~ msgstr[0] "Chemin (%i nœud)" #~ msgstr[1] "Chemin (%i nœuds)" @@ -35405,6 +33734,7 @@ msgstr "Entrée XAML" #~ msgstr "Rectangle" #~ msgid "Polygon with %d vertex" + #~ msgid_plural "Polygon with %d vertices" #~ msgstr[0] "Polygone à %d sommet" #~ msgstr[1] "Polygone à %d sommets" @@ -35811,8 +34141,8 @@ msgstr "Entrée XAML" #~ msgid "Majenta" #~ msgstr "Magenta" - #~ msgctxt "Filesystem" + #~ msgid "_Path:" #~ msgstr "_Chemin :" @@ -35821,20 +34151,20 @@ msgstr "Entrée XAML" #~ msgid "_Description" #~ msgstr "_Description" - #~ msgctxt "Interpolator" + #~ msgid "Linear" #~ msgstr "Linéaire" - #~ msgctxt "Line cap" + #~ msgid "Round" #~ msgstr "Arrondie" - #~ msgctxt "Line join" + #~ msgid "Rounded" #~ msgstr "Arrondi" - #~ msgctxt "Line join" + #~ msgid "Spiro" #~ msgstr "Spiro" @@ -35882,8 +34212,8 @@ msgstr "Entrée XAML" #~ msgid "_Select Same Fill and Stroke" #~ msgstr "_Sélectionner le même remplissage et contour" - #~ msgctxt "Measurement tool" + #~ msgid "Measure" #~ msgstr "Mesurer" @@ -36133,9 +34463,6 @@ msgstr "Entrée XAML" #~ msgid "No effect applied" #~ msgstr "Pas d'effet appliqué" -#~ msgid "Empty selection" -#~ msgstr "Sélection vide" - #~ msgid "" #~ "Enable log display by setting dialogs.debug 'redirect' attribute to 1 in " #~ "preferences.xml" @@ -36835,881 +35162,998 @@ msgstr "Entrée XAML" #~ msgid "_Blend mode:" #~ msgstr "Mode de _fondu :" - #~ msgctxt "Palette" + #~ msgid "Blue1" #~ msgstr "Bleu1" - #~ msgctxt "Palette" + #~ msgid "Blue2" #~ msgstr "Bleu2" - #~ msgctxt "Palette" + #~ msgid "Blue3" #~ msgstr "Bleu3" - #~ msgctxt "Palette" + #~ msgid "Red1" #~ msgstr "Rouge1" - #~ msgctxt "Palette" + #~ msgid "Red2" #~ msgstr "Rouge2" - #~ msgctxt "Palette" + #~ msgid "Red3" #~ msgstr "Rouge3" - #~ msgctxt "Palette" + #~ msgid "Orange1" #~ msgstr "Orange1" - #~ msgctxt "Palette" + #~ msgid "Orange2" #~ msgstr "Orange2" - #~ msgctxt "Palette" + #~ msgid "Orange3" #~ msgstr "Orange3" - #~ msgctxt "Palette" + #~ msgid "Brown1" #~ msgstr "Brun1" - #~ msgctxt "Palette" + #~ msgid "Brown2" #~ msgstr "Brun2" - #~ msgctxt "Palette" + #~ msgid "Brown3" #~ msgstr "Brun3" - #~ msgctxt "Palette" + #~ msgid "Green1" #~ msgstr "Vert1" - #~ msgctxt "Palette" + #~ msgid "Green2" #~ msgstr "Vert2" - #~ msgctxt "Palette" + #~ msgid "Green3" #~ msgstr "Vert3" - #~ msgctxt "Palette" + #~ msgid "Purple1" #~ msgstr "Violet1" - #~ msgctxt "Palette" + #~ msgid "Purple2" #~ msgstr "Violet2" - #~ msgctxt "Palette" + #~ msgid "Purple3" #~ msgstr "Violet3" - #~ msgctxt "Palette" + #~ msgid "Metalic1" #~ msgstr "Métallique1" - #~ msgctxt "Palette" + #~ msgid "Metalic2" #~ msgstr "Métallique2" - #~ msgctxt "Palette" + #~ msgid "Metalic3" #~ msgstr "Métallique3" - #~ msgctxt "Palette" + #~ msgid "Metalic4" #~ msgstr "Métallique4" - #~ msgctxt "Palette" + #~ msgid "Grey1" #~ msgstr "Gris1" - #~ msgctxt "Palette" + #~ msgid "Grey2" #~ msgstr "Gris2" - #~ msgctxt "Palette" + #~ msgid "Grey3" #~ msgstr "Gris3" - #~ msgctxt "Palette" + #~ msgid "Grey4" #~ msgstr "Gris4" - #~ msgctxt "Palette" + #~ msgid "Grey5" #~ msgstr "Gris5" - #~ msgctxt "Palette" + #~ msgid "default outer 1" #~ msgstr "extérieur 1 (défaut)" - #~ msgctxt "Palette" + #~ msgid "default outer 2" #~ msgstr "extérieur 2 (défaut)" - #~ msgctxt "Palette" + #~ msgid "default outer 3" #~ msgstr "extérieur 3 (défaut)" - #~ msgctxt "Palette" + #~ msgid "default block" #~ msgstr "bloc (défaut)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default added blue" #~ msgstr "bleu ajouté (défaut)" - #~ msgctxt "Palette" + #~ msgid "default block header" #~ msgstr "en-tête de bloc (défaut)" - #~ msgctxt "Palette" + #~ msgid "default alert block" #~ msgstr "bloc d'alerte (défaut)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default added red" #~ msgstr "rouge ajouté (défaut)" - #~ msgctxt "Palette" + #~ msgid "default alert block header" #~ msgstr "en-tête de bloc d'alerte (défaut)" - #~ msgctxt "Palette" + #~ msgid "default example block" #~ msgstr "bloc d'exemple (défaut)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default added green" #~ msgstr "vert ajouté (défaut)" - #~ msgctxt "Palette" + #~ msgid "default example block header" #~ msgstr "en-tête de bloc d'exemple (défaut)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default covered text" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default covered bullet" #~ msgstr "Créer un texte encadré" - #~ msgctxt "Palette" + #~ msgid "default text" #~ msgstr "texte (défaut)" - #~ msgctxt "Palette" + #~ msgid "default light outer 1" #~ msgstr "extérieur 1 (default light)" - #~ msgctxt "Palette" + #~ msgid "default light outer 2" #~ msgstr "extérieur 2 (default light)" - #~ msgctxt "Palette" + #~ msgid "default light outer 3" #~ msgstr "extérieur 3 (default light)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light block" #~ msgstr "Titre par défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light block header" #~ msgstr "Titre par défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light block header text" #~ msgstr "Paramètres par défaut de l'interface" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light alert block" #~ msgstr "Titre par défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light alert block header" #~ msgstr "Titre par défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light alert block header text" #~ msgstr "Paramètres par défaut de l'interface" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light example block" #~ msgstr "Titre par défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light example block header" #~ msgstr "Titre par défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light example block header text" #~ msgstr "Paramètres par défaut de l'interface" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light covered text" #~ msgstr "Paramètres par défaut de l'interface" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light covered bullet" #~ msgstr "Paramètres par défaut de l'interface" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light background" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "default light text" #~ msgstr "Titre par défaut" - #~ msgctxt "Palette" + #~ msgid "beetle outer 1" #~ msgstr "extérieur 1 (beetle)" - #~ msgctxt "Palette" + #~ msgid "beetle outer 2" #~ msgstr "extérieur 2 (beetle)" - #~ msgctxt "Palette" + #~ msgid "beetle outer 3" #~ msgstr "extérieur 3 (beetle)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle added red" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle alert block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle added green" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle example block header text" #~ msgstr "Test en-tête de groupe" - #~ msgctxt "Palette" + #~ msgid "beetle header text" #~ msgstr "en-tête de texte (beetle)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle added grey" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle covered bullet" #~ msgstr "Créer un texte encadré" - #~ msgctxt "Palette" + #~ msgid "beetle background" #~ msgstr "arrière-plan (beetle)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beetle covered text" #~ msgstr "Créer un texte encadré" - #~ msgctxt "Palette" + #~ msgid "beetle text" #~ msgstr "texte (beetle)" - #~ msgctxt "Palette" + #~ msgid "albatross outer 1" #~ msgstr "extérieur 1 (albatross)" - #~ msgctxt "Palette" + #~ msgid "albatross outer 2" #~ msgstr "extérieur 2 (albatross)" - #~ msgctxt "Palette" + #~ msgid "albatross outer 3" #~ msgstr "extérieur 3 (albatross)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross background" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross block" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross block header" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross bullet" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross covered bullet" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross covered text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross added red" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross alert block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross added green" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross example block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross added yellow" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "albatross added white" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly text" #~ msgstr "Taper du texte" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly added grey" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly outer" #~ msgstr "filtre" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly background" #~ msgstr "Fond" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly covered bullet" #~ msgstr "Texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly covered text" #~ msgstr "Texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly added red" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly alert block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly added green" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly example block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "fly added blue" #~ msgstr "Test en-tête de groupe" - #~ msgctxt "Palette" + #~ msgid "seagull outer 1" #~ msgstr "extérieur 1 (seagull)" - #~ msgctxt "Palette" + #~ msgid "seagull outer 2" #~ msgstr "extérieur 2 (seagull)" - #~ msgctxt "Palette" + #~ msgid "seagull outer 3" #~ msgstr "extérieur 3 (seagull)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull block" #~ msgstr "défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull added grey" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull block header" #~ msgstr "Déverrouiller le calque" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull covered text" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull covered bullet" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull background" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "seagull text" #~ msgstr "Texte vertical" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver outer frame" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver added red" #~ msgstr "Créer et éditer des dégradés" - #~ msgctxt "Palette" + #~ msgid "beaver outer 1" #~ msgstr "extérieur 1 (beaver)" - #~ msgctxt "Palette" + #~ msgid "beaver outer 2" #~ msgstr "extérieur 2 (beaver)" - #~ msgctxt "Palette" + #~ msgid "beaver outer 3" #~ msgstr "extérieur 3 (beaver)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver added blue" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver added green" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver example block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver alert block header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver covered text" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver covered bullet" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver background" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "beaver text" #~ msgstr "Créer un texte" - #~ msgctxt "Palette" + #~ msgid "crane outer 1" #~ msgstr "extérieur 1 (crane)" - #~ msgctxt "Palette" + #~ msgid "crane outer 2" #~ msgstr "extérieur 2 (crane)" - #~ msgctxt "Palette" + #~ msgid "crane outer 3" #~ msgstr "extérieur 3 (crane)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane block" #~ msgstr "Déverrouiller le calque" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane added orange" #~ msgstr "angle contraint" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane block header" #~ msgstr "Déverrouiller le calque" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane alert block" #~ msgstr "défaut" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane added red" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane alert block header" #~ msgstr "Déverrouiller le calque" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane example block header" #~ msgstr "Déverrouiller le calque" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane covered text" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane covered bullet" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane bullet" #~ msgstr "Créer un texte" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane background" #~ msgstr "Tracer selon le fond" #, fuzzy #~ msgctxt "Palette" + #~ msgid "crane text" #~ msgstr "Créer un texte" - #~ msgctxt "Palette" + #~ msgid "wolverine outer 1" #~ msgstr "extérieur 1 (wolverine)" - #~ msgctxt "Palette" + #~ msgid "wolverine outer 2" #~ msgstr "extérieur 2 (wolverine)" - #~ msgctxt "Palette" + #~ msgid "wolverine outer 3" #~ msgstr "extérieur 3 (wolverine)" - #~ msgctxt "Palette" + #~ msgid "wolverine outer 4" #~ msgstr "extérieur 4 (wolverine)" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine added yellow" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine added blue" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine header text" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine added green" #~ msgstr "Créer et éditer des dégradés" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine example block title" #~ msgstr "Test en-tête de groupe" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine covered text" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine covered bullet" #~ msgstr "Créer un texte encadré" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine background" #~ msgstr "Retirer l'arrière-plan" #, fuzzy #~ msgctxt "Palette" + #~ msgid "wolverine text" #~ msgstr "Supprimer le texte" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Orange Hilight" #~ msgstr "Hauteur de ligne" - #~ msgctxt "Palette" + #~ msgid "Orange" #~ msgstr "Orange" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Orange Base" #~ msgstr "Orange 1" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Orange Shadow" #~ msgstr "Ombre interne" - #~ msgctxt "Palette" + #~ msgid "Yellow" #~ msgstr "Jaune" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Yellow Base" #~ msgstr "Casse des phrases" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Yellow Shadow" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Orange" #~ msgstr "Triangle exinscrit" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Red" #~ msgstr "centre" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Red Base" #~ msgstr "Casse des phrases" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Deep Red" #~ msgstr "centre" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Human Highlight" #~ msgstr "Hauteur de ligne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Human" #~ msgstr "Han" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Human Base" #~ msgstr "Han" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Environmental Shadow" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Environmental Blue Highlight" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Environmental Blue Medium" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Environmental Blue Base" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Environmental Blue Shadow" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Blue Shadow" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Blue" #~ msgstr "centre" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Blue Base" #~ msgstr "Casse des phrases" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Green Highlight" #~ msgstr "Centre du cercle inscrit" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Green" #~ msgstr "Centre du cercle inscrit" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Green Base" #~ msgstr "Casse des phrases" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Green Shadow" #~ msgstr "Ombre interne" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Magenta Highlight" #~ msgstr "Magenta" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Magenta" #~ msgstr "Magenta" #, fuzzy #~ msgctxt "Palette" + #~ msgid "Accent Dark Violet" #~ msgstr "Magenta" - #~ msgctxt "Palette" + #~ msgid "Grey 1" #~ msgstr "Gris 1" - #~ msgctxt "Palette" + #~ msgid "Grey 2" #~ msgstr "Gris 2" - #~ msgctxt "Palette" + #~ msgid "Grey 3" #~ msgstr "Gris 3" - #~ msgctxt "Palette" + #~ msgid "Grey 4" #~ msgstr "Gris 4" - #~ msgctxt "Palette" + #~ msgid "Grey 5" #~ msgstr "Gris 5" - #~ msgctxt "Palette" + #~ msgid "Grey 6" #~ msgstr "Gris 6" - #~ msgctxt "Node tool tip" + #~ msgid "" #~ "%u of %u nodes selected. Drag to select nodes, click to edit only " #~ "this object (more: Shift)" #~ msgstr "" #~ "%u sur %u nœuds sélectionnés. Cliquer-glisser pour sélectionner " #~ "des nœuds, cliquer pour éditer seulement cet objet (modificateur : Maj)" - #~ msgctxt "Node tool tip" + #~ msgid "" #~ "%u of %u nodes selected. Drag to select nodes, click clear the " #~ "selection" diff --git a/po/inkscape.pot b/po/inkscape.pot index 4768dbaff..ada382aab 100644 --- a/po/inkscape.pot +++ b/po/inkscape.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-07 16:33+0100\n" +"POT-Creation-Date: 2014-01-15 19:06+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -980,13 +980,13 @@ msgstr "" #: ../src/filter-enums.cpp:67 ../src/ui/dialog/clonetiler.cpp:832 #: ../src/ui/dialog/clonetiler.cpp:983 #: ../src/ui/dialog/document-properties.cpp:154 -#: ../share/extensions/color_HSL_adjust.inx.h:20 #: ../share/extensions/color_blackandwhite.inx.h:2 #: ../share/extensions/color_brighter.inx.h:2 #: ../share/extensions/color_custom.inx.h:15 #: ../share/extensions/color_darker.inx.h:2 #: ../share/extensions/color_desaturate.inx.h:2 #: ../share/extensions/color_grayscale.inx.h:2 +#: ../share/extensions/color_HSL_adjust.inx.h:20 #: ../share/extensions/color_lesshue.inx.h:2 #: ../share/extensions/color_lesslight.inx.h:2 #: ../share/extensions/color_lesssaturation.inx.h:2 @@ -3223,6 +3223,370 @@ msgstr "" msgid "Old paint (bitmap)" msgstr "" +#: ../share/templates/templates.h:1 +msgid "A4 Landscape Page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 landscape sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty landscape" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "A4 Page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Black Opaque" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty black page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "black opaque empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "White Opaque" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty white page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "white opaque empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Business Card 85x54mm" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty business card template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "business card empty 85x54" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Business Card 90x50mm" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "business card empty 90x50" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD Cover 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty CD box cover." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD cover disc disk 300dpi box" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD Label 120x120 " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Simple CD Label template with disc's pattern." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD label 120x120 disc disk" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Regular 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover regular 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Slim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD slim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover slim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Superslim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD superslim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover superslim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Ultraslim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD ultraslim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover ultraslim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1024x768" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty desktop size sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 1024x768 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1600x1200" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 1600x1200 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 640x480" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 640x480 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 800x600" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 800x600 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Fontforge Glyph" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "font fontforge glyph 1000x1000" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 16x16" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Small 16x16 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 16x16 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 32x32" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "32x32 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 32x32 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 48x48" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "48x48 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 48x48 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 64x64" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "64x64 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 64x64 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Letter Landscape" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Standard letter landscape sheet - 792x612" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "letter landscape 792x612 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Letter" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Standard letter sheet - 612x792" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "letter 612x792 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "No Borders" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no borders" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "no borders empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "No Layers" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no layers" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "no layers empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video HDTV 1920x1080" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "HDTV video template for 1920x1080 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "HDTV video empty 1920x1080" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video NTSC 720x486" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "NTSC video template for 720x486 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "NTSC video empty 720x486" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video PAL 728x576" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "PAL video template for 728x576 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "PAL video empty 728x576" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 468x60" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty 468x60 web banner template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "web banner 468x60 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 728x90" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty 728x90 web banner template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "web banner 728x90 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "LaTeX Beamer" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "LaTeX beamer template with helping grid." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "LaTex LaTeX latex grid beamer" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Typography Canvas" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty typography canvas with helping guidelines." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "guidelines typography canvas" +msgstr "" + #. 3D box #: ../src/box3d.cpp:259 ../src/box3d.cpp:1329 #: ../src/ui/dialog/inkscape-preferences.cpp:398 @@ -3240,7 +3604,7 @@ msgstr "" #: ../src/color-profile.cpp:911 ../src/filter-enums.cpp:119 #: ../src/live_effects/lpe-ruler.cpp:32 -#: ../src/ui/dialog/filter-effects-dialog.cpp:518 +#: ../src/ui/dialog/filter-effects-dialog.cpp:549 #: ../src/ui/dialog/inkscape-preferences.cpp:332 #: ../src/ui/dialog/inkscape-preferences.cpp:641 #: ../src/ui/dialog/inkscape-preferences.cpp:1259 @@ -3269,6 +3633,14 @@ msgstr "" msgid "Current layer is locked. Unlock it to be able to draw on it." msgstr "" +#: ../src/desktop.cpp:858 +msgid "No previous zoom." +msgstr "" + +#: ../src/desktop.cpp:879 +msgid "No next zoom." +msgstr "" + #: ../src/desktop-events.cpp:225 msgid "Create guide" msgstr "" @@ -3277,24 +3649,16 @@ msgstr "" msgid "Move guide" msgstr "" -#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:535 +#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:536 #: ../src/ui/dialog/guides.cpp:144 msgid "Delete guide" msgstr "" -#: ../src/desktop-events.cpp:515 +#: ../src/desktop-events.cpp:516 #, c-format msgid "Guideline: %s" msgstr "" -#: ../src/desktop.cpp:852 -msgid "No previous zoom." -msgstr "" - -#: ../src/desktop.cpp:873 -msgid "No next zoom." -msgstr "" - #: ../src/display/canvas-axonomgrid.cpp:317 ../src/display/canvas-grid.cpp:693 msgid "Grid _units:" msgstr "" @@ -3877,8 +4241,8 @@ msgstr "" #: ../src/extension/internal/bitmap/equalize.cpp:40 #: ../src/extension/internal/bitmap/gaussianBlur.cpp:45 #: ../src/extension/internal/bitmap/implode.cpp:43 -#: ../src/extension/internal/bitmap/level.cpp:49 #: ../src/extension/internal/bitmap/levelChannel.cpp:71 +#: ../src/extension/internal/bitmap/level.cpp:49 #: ../src/extension/internal/bitmap/medianFilter.cpp:43 #: ../src/extension/internal/bitmap/modulate.cpp:48 #: ../src/extension/internal/bitmap/negate.cpp:41 @@ -3914,8 +4278,8 @@ msgstr "" #: ../src/extension/internal/filter/color.h:1585 #: ../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:2627 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 #: ../src/ui/dialog/object-attributes.cpp:49 #: ../share/extensions/jessyInk_effects.inx.h:5 #: ../share/extensions/jessyInk_export.inx.h:3 @@ -3967,7 +4331,7 @@ msgstr "" #: ../src/extension/internal/bitmap/oilPaint.cpp:39 #: ../src/extension/internal/bitmap/sharpen.cpp:40 #: ../src/extension/internal/bitmap/unsharpmask.cpp:43 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2684 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2885 msgid "Radius:" msgstr "" @@ -4175,48 +4539,48 @@ msgstr "" msgid "Implode selected bitmap(s)" msgstr "" -#: ../src/extension/internal/bitmap/level.cpp:41 -#: ../src/extension/internal/filter/color.h:742 -#: ../src/extension/internal/filter/image.h:56 -#: ../src/extension/internal/filter/morphology.h:66 -#: ../src/extension/internal/filter/paint.h:345 -msgid "Level" +#: ../src/extension/internal/bitmap/levelChannel.cpp:52 +msgid "Level (with Channel)" +msgstr "" + +#: ../src/extension/internal/bitmap/levelChannel.cpp:54 +#: ../src/extension/internal/filter/color.h:636 +msgid "Channel:" msgstr "" -#: ../src/extension/internal/bitmap/level.cpp:43 #: ../src/extension/internal/bitmap/levelChannel.cpp:65 +#: ../src/extension/internal/bitmap/level.cpp:43 msgid "Black Point:" msgstr "" -#: ../src/extension/internal/bitmap/level.cpp:44 #: ../src/extension/internal/bitmap/levelChannel.cpp:66 +#: ../src/extension/internal/bitmap/level.cpp:44 msgid "White Point:" msgstr "" -#: ../src/extension/internal/bitmap/level.cpp:45 #: ../src/extension/internal/bitmap/levelChannel.cpp:67 +#: ../src/extension/internal/bitmap/level.cpp:45 msgid "Gamma Correction:" msgstr "" -#: ../src/extension/internal/bitmap/level.cpp:51 +#: ../src/extension/internal/bitmap/levelChannel.cpp:73 msgid "" -"Level selected bitmap(s) by scaling values falling between the given ranges " -"to the full color range" -msgstr "" - -#: ../src/extension/internal/bitmap/levelChannel.cpp:52 -msgid "Level (with Channel)" +"Level the specified channel of selected bitmap(s) by scaling values falling " +"between the given ranges to the full color range" msgstr "" -#: ../src/extension/internal/bitmap/levelChannel.cpp:54 -#: ../src/extension/internal/filter/color.h:636 -msgid "Channel:" +#: ../src/extension/internal/bitmap/level.cpp:41 +#: ../src/extension/internal/filter/color.h:742 +#: ../src/extension/internal/filter/image.h:56 +#: ../src/extension/internal/filter/morphology.h:66 +#: ../src/extension/internal/filter/paint.h:345 +msgid "Level" msgstr "" -#: ../src/extension/internal/bitmap/levelChannel.cpp:73 +#: ../src/extension/internal/bitmap/level.cpp:51 msgid "" -"Level the specified channel of selected bitmap(s) by scaling values falling " -"between the given ranges to the full color range" +"Level selected bitmap(s) by scaling values falling between the given ranges " +"to the full color range" msgstr "" #: ../src/extension/internal/bitmap/medianFilter.cpp:37 @@ -4285,7 +4649,7 @@ msgid "Opacity" msgstr "" #: ../src/extension/internal/bitmap/opacity.cpp:40 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2674 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2875 #: ../src/widgets/dropper-toolbar.cpp:107 msgid "Opacity:" msgstr "" @@ -4455,100 +4819,100 @@ msgid "PostScript" msgstr "" #: ../src/extension/internal/cairo-ps-out.cpp:329 -#: ../src/extension/internal/cairo-ps-out.cpp:370 +#: ../src/extension/internal/cairo-ps-out.cpp:368 msgid "Restrict to PS level:" msgstr "" #: ../src/extension/internal/cairo-ps-out.cpp:330 -#: ../src/extension/internal/cairo-ps-out.cpp:371 +#: ../src/extension/internal/cairo-ps-out.cpp:369 msgid "PostScript level 3" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:332 -#: ../src/extension/internal/cairo-ps-out.cpp:373 +#: ../src/extension/internal/cairo-ps-out.cpp:331 +#: ../src/extension/internal/cairo-ps-out.cpp:370 msgid "PostScript level 2" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:335 -#: ../src/extension/internal/cairo-ps-out.cpp:376 +#: ../src/extension/internal/cairo-ps-out.cpp:333 +#: ../src/extension/internal/cairo-ps-out.cpp:372 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250 #: ../src/extension/internal/emf-inout.cpp:3551 #: ../src/extension/internal/wmf-inout.cpp:3236 msgid "Convert texts to paths" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:334 msgid "PS+LaTeX: Omit text in PS, and create LaTeX file" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:337 -#: ../src/extension/internal/cairo-ps-out.cpp:378 +#: ../src/extension/internal/cairo-ps-out.cpp:335 +#: ../src/extension/internal/cairo-ps-out.cpp:374 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:252 msgid "Rasterize filter effects" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:338 -#: ../src/extension/internal/cairo-ps-out.cpp:379 +#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:375 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:253 msgid "Resolution for rasterization (dpi):" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:339 -#: ../src/extension/internal/cairo-ps-out.cpp:380 +#: ../src/extension/internal/cairo-ps-out.cpp:337 +#: ../src/extension/internal/cairo-ps-out.cpp:376 msgid "Output page size" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:340 -#: ../src/extension/internal/cairo-ps-out.cpp:381 +#: ../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 msgid "Use document's page size" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:341 -#: ../src/extension/internal/cairo-ps-out.cpp:382 +#: ../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 msgid "Use exported object's size" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:343 +#: ../src/extension/internal/cairo-ps-out.cpp:341 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258 msgid "Bleed/margin (mm):" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:344 -#: ../src/extension/internal/cairo-ps-out.cpp:385 +#: ../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 msgid "Limit export to the object with ID:" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:348 +#: ../src/extension/internal/cairo-ps-out.cpp:346 #: ../share/extensions/ps_input.inx.h:2 msgid "PostScript (*.ps)" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:349 +#: ../src/extension/internal/cairo-ps-out.cpp:347 msgid "PostScript File" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:368 +#: ../src/extension/internal/cairo-ps-out.cpp:366 #: ../share/extensions/eps_input.inx.h:3 msgid "Encapsulated PostScript" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:377 +#: ../src/extension/internal/cairo-ps-out.cpp:373 msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:384 +#: ../src/extension/internal/cairo-ps-out.cpp:380 msgid "Bleed/margin (mm)" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:389 +#: ../src/extension/internal/cairo-ps-out.cpp:385 #: ../share/extensions/eps_input.inx.h:2 msgid "Encapsulated PostScript (*.eps)" msgstr "" -#: ../src/extension/internal/cairo-ps-out.cpp:390 +#: ../src/extension/internal/cairo-ps-out.cpp:386 msgid "Encapsulated PostScript File" msgstr "" @@ -4767,8 +5131,8 @@ msgstr "" #: ../src/extension/internal/filter/color.h:1615 #: ../src/extension/internal/filter/distort.h:95 #: ../src/extension/internal/filter/distort.h:204 -#: ../src/extension/internal/filter/filter-file.cpp:151 #: ../src/extension/internal/filter/filter.cpp:214 +#: ../src/extension/internal/filter/filter-file.cpp:151 #: ../src/extension/internal/filter/image.h:61 #: ../src/extension/internal/filter/morphology.h:75 #: ../src/extension/internal/filter/morphology.h:202 @@ -5085,8 +5449,8 @@ msgid "Diffuse" msgstr "" #: ../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/extension/internal/filter/bumps.h:329 ../src/libgdl/gdl-dock.c:199 +#: ../src/libgdl/gdl-dock-placeholder.c:175 #: ../src/widgets/rect-toolbar.cpp:338 #: ../share/extensions/interp_att_g.inx.h:11 msgid "Height" @@ -5140,13 +5504,13 @@ msgstr "" #: ../src/extension/internal/filter/bumps.h:110 #: ../src/extension/internal/filter/bumps.h:332 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Azimuth" msgstr "" #: ../src/extension/internal/filter/bumps.h:111 #: ../src/extension/internal/filter/bumps.h:333 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Elevation" msgstr "" @@ -5367,11 +5731,13 @@ msgstr "" #: ../src/extension/internal/filter/color.h:428 #: ../src/extension/internal/filter/paint.h:498 ../src/filter-enums.cpp:108 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1050 msgid "Table" msgstr "" #: ../src/extension/internal/filter/color.h:429 #: ../src/extension/internal/filter/paint.h:499 ../src/filter-enums.cpp:109 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1053 msgid "Discrete" msgstr "" @@ -5565,6 +5931,7 @@ msgstr "" #: ../src/extension/internal/filter/paint.h:356 ../src/filter-enums.cpp:32 #: ../src/live_effects/effect.cpp:97 ../src/live_effects/lpe-offset.cpp:31 #: ../src/live_effects/lpe-parallel.cpp:50 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1047 #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset" msgstr "" @@ -5847,8 +6214,8 @@ msgid "Detect:" msgstr "" #: ../src/extension/internal/filter/image.h:52 -#: ../src/ui/dialog/template-load-tab.cpp:104 -#: ../src/ui/dialog/template-load-tab.cpp:141 +#: ../src/ui/dialog/template-load-tab.cpp:105 +#: ../src/ui/dialog/template-load-tab.cpp:142 msgid "All" msgstr "" @@ -5887,7 +6254,7 @@ msgid "Open" msgstr "" #: ../src/extension/internal/filter/morphology.h:65 -#: ../src/libgdl/gdl-dock-placeholder.c:167 ../src/libgdl/gdl-dock.c:191 +#: ../src/libgdl/gdl-dock.c:191 ../src/libgdl/gdl-dock-placeholder.c:167 #: ../src/widgets/rect-toolbar.cpp:321 ../src/widgets/spray-toolbar.cpp:128 #: ../src/widgets/tweak-toolbar.cpp:142 #: ../share/extensions/interp_att_g.inx.h:10 @@ -5998,8 +6365,8 @@ msgstr "" #: ../src/extension/internal/filter/paint.h:690 #: ../src/extension/internal/filter/shadows.h:60 ../src/ui/dialog/find.cpp:87 #: ../src/ui/dialog/tracedialog.cpp:747 -#: ../share/extensions/color_HSL_adjust.inx.h:2 #: ../share/extensions/color_custom.inx.h:2 +#: ../share/extensions/color_HSL_adjust.inx.h:2 #: ../share/extensions/color_randomize.inx.h:2 #: ../share/extensions/dots.inx.h:2 ../share/extensions/dxf_input.inx.h:2 #: ../share/extensions/dxf_outlines.inx.h:2 @@ -6018,9 +6385,9 @@ msgstr "" #: ../share/extensions/radiusrand.inx.h:2 ../share/extensions/scour.inx.h:2 #: ../share/extensions/split.inx.h:2 ../share/extensions/voronoi2svg.inx.h:2 #: ../share/extensions/web-set-att.inx.h:2 -#: ../share/extensions/web-transmit-att.inx.h:2 #: ../share/extensions/webslicer_create_group.inx.h:2 #: ../share/extensions/webslicer_export.inx.h:2 +#: ../share/extensions/web-transmit-att.inx.h:2 msgid "Options" msgstr "" @@ -6122,7 +6489,7 @@ msgstr "" #: ../src/extension/internal/filter/paint.h:331 #: ../src/ui/dialog/align-and-distribute.cpp:1004 -#: ../src/widgets/desktop-widget.cpp:2007 +#: ../src/widgets/desktop-widget.cpp:1998 msgid "Drawing" msgstr "" @@ -6409,7 +6776,7 @@ msgid "Background" msgstr "" #: ../src/extension/internal/filter/transparency.h:59 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2624 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2830 #: ../src/ui/dialog/input.cpp:1088 ../src/widgets/eraser-toolbar.cpp:123 #: ../src/widgets/pencil-toolbar.cpp:156 ../src/widgets/spray-toolbar.cpp:198 #: ../src/widgets/tweak-toolbar.cpp:268 ../share/extensions/extrude.inx.h:2 @@ -6569,8 +6936,8 @@ msgstr "" #: ../share/extensions/polyhedron_3d.inx.h:56 #: ../share/extensions/printing_marks.inx.h:20 #: ../share/extensions/render_alphabetsoup.inx.h:5 -#: ../share/extensions/render_barcode.inx.h:5 #: ../share/extensions/render_barcode_datamatrix.inx.h:5 +#: ../share/extensions/render_barcode.inx.h:5 #: ../share/extensions/render_barcode_qrcode.inx.h:18 #: ../share/extensions/render_gear_rack.inx.h:5 #: ../share/extensions/render_gears.inx.h:11 ../share/extensions/rtree.inx.h:4 @@ -6604,6 +6971,10 @@ msgstr "" msgid "JavaFX Raytracer File" msgstr "" +#: ../src/extension/internal/latex-pstricks.cpp:334 +msgid "LaTeX Print" +msgstr "" + #: ../src/extension/internal/latex-pstricks-out.cpp:95 msgid "LaTeX Output" msgstr "" @@ -6616,10 +6987,6 @@ msgstr "" msgid "LaTeX PSTricks File" msgstr "" -#: ../src/extension/internal/latex-pstricks.cpp:334 -msgid "LaTeX Print" -msgstr "" - #: ../src/extension/internal/odf.cpp:2149 msgid "OpenDocument Drawing Output" msgstr "" @@ -6960,7 +7327,7 @@ msgstr "" msgid "Broken links have been changed to point to existing files." msgstr "" -#: ../src/file.cpp:331 ../src/file.cpp:1250 +#: ../src/file.cpp:331 ../src/file.cpp:1247 #, c-format msgid "Failed to load the requested file %s" msgstr "" @@ -6970,108 +7337,107 @@ msgid "Document not saved yet. Cannot revert." msgstr "" #: ../src/file.cpp:363 -#, c-format -msgid "Changes will be lost! Are you sure you want to reload document %s?" +msgid "Changes will be lost! Are you sure you want to reload document %1?" msgstr "" -#: ../src/file.cpp:392 +#: ../src/file.cpp:389 msgid "Document reverted." msgstr "" -#: ../src/file.cpp:394 +#: ../src/file.cpp:391 msgid "Document not reverted." msgstr "" -#: ../src/file.cpp:544 +#: ../src/file.cpp:541 msgid "Select file to open" msgstr "" -#: ../src/file.cpp:626 +#: ../src/file.cpp:623 msgid "Clean up document" msgstr "" -#: ../src/file.cpp:633 +#: ../src/file.cpp:630 #, c-format msgid "Removed %i unused definition in <defs>." msgid_plural "Removed %i unused definitions in <defs>." msgstr[0] "" msgstr[1] "" -#: ../src/file.cpp:638 +#: ../src/file.cpp:635 msgid "No unused definitions in <defs>." msgstr "" -#: ../src/file.cpp:670 +#: ../src/file.cpp:667 #, c-format msgid "" "No Inkscape extension found to save document (%s). This may have been " "caused by an unknown filename extension." msgstr "" -#: ../src/file.cpp:671 ../src/file.cpp:679 ../src/file.cpp:687 -#: ../src/file.cpp:693 ../src/file.cpp:698 +#: ../src/file.cpp:668 ../src/file.cpp:676 ../src/file.cpp:684 +#: ../src/file.cpp:690 ../src/file.cpp:695 msgid "Document not saved." msgstr "" -#: ../src/file.cpp:678 +#: ../src/file.cpp:675 #, c-format msgid "" "File %s is write protected. Please remove write protection and try again." msgstr "" -#: ../src/file.cpp:686 +#: ../src/file.cpp:683 #, c-format msgid "File %s could not be saved." msgstr "" -#: ../src/file.cpp:716 ../src/file.cpp:718 +#: ../src/file.cpp:713 ../src/file.cpp:715 msgid "Document saved." msgstr "" #. We are saving for the first time; create a unique default filename -#: ../src/file.cpp:861 +#: ../src/file.cpp:858 msgid "drawing" msgstr "" -#: ../src/file.cpp:866 +#: ../src/file.cpp:863 msgid "drawing-%1" msgstr "" -#: ../src/file.cpp:883 +#: ../src/file.cpp:880 msgid "Select file to save a copy to" msgstr "" -#: ../src/file.cpp:885 +#: ../src/file.cpp:882 msgid "Select file to save to" msgstr "" -#: ../src/file.cpp:990 ../src/file.cpp:992 +#: ../src/file.cpp:987 ../src/file.cpp:989 msgid "No changes need to be saved." msgstr "" -#: ../src/file.cpp:1011 +#: ../src/file.cpp:1008 msgid "Saving document..." msgstr "" -#: ../src/file.cpp:1247 ../src/ui/dialog/inkscape-preferences.cpp:1439 +#: ../src/file.cpp:1244 ../src/ui/dialog/inkscape-preferences.cpp:1439 #: ../src/ui/dialog/ocaldialogs.cpp:1246 msgid "Import" msgstr "" -#: ../src/file.cpp:1297 +#: ../src/file.cpp:1294 msgid "Select file to import" msgstr "" -#: ../src/file.cpp:1413 +#: ../src/file.cpp:1410 #, c-format msgid "drawing%s" msgstr "" -#: ../src/file.cpp:1435 +#: ../src/file.cpp:1432 msgid "Select file to export to" msgstr "" -#: ../src/file.cpp:1688 +#: ../src/file.cpp:1685 msgid "Import Clip Art" msgstr "" @@ -7504,8 +7870,8 @@ msgid "" msgstr "" #: ../src/interface.cpp:1395 ../src/ui/dialog/export.cpp:1298 -#: ../src/widgets/desktop-widget.cpp:1126 -#: ../src/widgets/desktop-widget.cpp:1188 +#: ../src/widgets/desktop-widget.cpp:1127 +#: ../src/widgets/desktop-widget.cpp:1189 msgid "_Cancel" msgstr "" @@ -7712,21 +8078,50 @@ msgstr "" msgid "Dockbar style to show items on it" msgstr "" -#: ../src/libgdl/gdl-dock-item-grip.c:399 -msgid "Iconify this dock" +#: ../src/libgdl/gdl-dock.c:176 ../src/ui/dialog/inkscape-preferences.cpp:631 +#: ../src/ui/dialog/inkscape-preferences.cpp:674 +msgid "Floating" msgstr "" -#: ../src/libgdl/gdl-dock-item-grip.c:401 -msgid "Close this dock" +#: ../src/libgdl/gdl-dock.c:177 +msgid "Whether the dock is floating in its own window" msgstr "" -#: ../src/libgdl/gdl-dock-item-grip.c:721 -#: ../src/libgdl/gdl-dock-tablabel.c:125 -msgid "Controlling dock item" +#: ../src/libgdl/gdl-dock.c:184 ../src/libgdl/gdl-dock-master.c:141 +msgid "Default title" msgstr "" -#: ../src/libgdl/gdl-dock-item-grip.c:722 -msgid "Dockitem which 'owns' this grip" +#: ../src/libgdl/gdl-dock.c:185 +msgid "Default title for the newly created floating docks" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:192 +msgid "Width for the dock when it's of floating type" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:200 +msgid "Height for the dock when it's of floating type" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:207 +msgid "Float X" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:208 +msgid "X coordinate for a floating dock" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:215 +msgid "Float Y" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:216 +msgid "Y coordinate for a floating dock" +msgstr "" + +#: ../src/libgdl/gdl-dock.c:478 +#, c-format +msgid "Dock #%d" msgstr "" #. Name @@ -7823,8 +8218,21 @@ msgstr "" msgid "Attempt to bind an unbound item %p" msgstr "" -#: ../src/libgdl/gdl-dock-master.c:141 ../src/libgdl/gdl-dock.c:184 -msgid "Default title" +#: ../src/libgdl/gdl-dock-item-grip.c:399 +msgid "Iconify this dock" +msgstr "" + +#: ../src/libgdl/gdl-dock-item-grip.c:401 +msgid "Close this dock" +msgstr "" + +#: ../src/libgdl/gdl-dock-item-grip.c:721 +#: ../src/libgdl/gdl-dock-tablabel.c:125 +msgid "Controlling dock item" +msgstr "" + +#: ../src/libgdl/gdl-dock-item-grip.c:722 +msgid "Dockitem which 'owns' this grip" msgstr "" #: ../src/libgdl/gdl-dock-master.c:142 @@ -7863,7 +8271,7 @@ msgstr "" #: ../src/ui/dialog/align-and-distribute.cpp:1003 #: ../src/ui/dialog/document-properties.cpp:150 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1551 -#: ../src/widgets/desktop-widget.cpp:2003 +#: ../src/widgets/desktop-widget.cpp:1994 #: ../share/extensions/voronoi2svg.inx.h:9 msgid "Page" msgstr "" @@ -8029,48 +8437,6 @@ msgstr "" msgid "Dockitem which 'owns' this tablabel" msgstr "" -#: ../src/libgdl/gdl-dock.c:176 ../src/ui/dialog/inkscape-preferences.cpp:631 -#: ../src/ui/dialog/inkscape-preferences.cpp:674 -msgid "Floating" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:177 -msgid "Whether the dock is floating in its own window" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:185 -msgid "Default title for the newly created floating docks" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:192 -msgid "Width for the dock when it's of floating type" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:200 -msgid "Height for the dock when it's of floating type" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:207 -msgid "Float X" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:208 -msgid "X coordinate for a floating dock" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:215 -msgid "Float Y" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:216 -msgid "Y coordinate for a floating dock" -msgstr "" - -#: ../src/libgdl/gdl-dock.c:478 -#, c-format -msgid "Dock #%d" -msgstr "" - #: ../src/libnrtype/FontFactory.cpp:964 msgid "Ignoring font without family that will crash Pango" msgstr "" @@ -8231,12 +8597,12 @@ msgstr "" msgid "Please specify a parameter path for the LPE '%s' with %d mouse clicks" msgstr "" -#: ../src/live_effects/effect.cpp:632 +#: ../src/live_effects/effect.cpp:626 #, c-format msgid "Editing parameter %s." msgstr "" -#: ../src/live_effects/effect.cpp:637 +#: ../src/live_effects/effect.cpp:631 msgid "None of the applied path effect's parameters can be edited on-canvas." msgstr "" @@ -8699,60 +9065,60 @@ msgid "" msgstr "" #. initialise your parameters here: -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Fi_xed width:" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Size of hidden region of lower string" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "_In units of stroke width" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "Consider 'Interruption width' as a ratio of stroke width" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "St_roke width" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "Add the stroke width to the interruption size" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "_Crossing path stroke width" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "Add crossed stroke width to the interruption size" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "S_witcher size:" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "Orientation indicator/switcher size" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossing Signs" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossings signs" msgstr "" -#: ../src/live_effects/lpe-knot.cpp:617 +#: ../src/live_effects/lpe-knot.cpp:620 msgid "Drag to select a crossing, click to flip it" msgstr "" #. / @todo Is this the right verb? -#: ../src/live_effects/lpe-knot.cpp:655 +#: ../src/live_effects/lpe-knot.cpp:658 msgid "Change knot crossing" msgstr "" @@ -8955,7 +9321,7 @@ msgstr "" #: ../src/live_effects/lpe-path_length.cpp:26 #: ../src/live_effects/lpe-sketch.cpp:58 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 #: ../share/extensions/render_alphabetsoup.inx.h:3 msgid "Scale:" msgstr "" @@ -10386,30 +10752,6 @@ msgstr "" msgid "Toggle multiple vanishing points" msgstr "" -#: ../src/preferences-skeleton.h:101 -msgid "Dip pen" -msgstr "" - -#: ../src/preferences-skeleton.h:102 -msgid "Marker" -msgstr "" - -#: ../src/preferences-skeleton.h:103 -msgid "Brush" -msgstr "" - -#: ../src/preferences-skeleton.h:104 -msgid "Wiggly" -msgstr "" - -#: ../src/preferences-skeleton.h:105 -msgid "Splotchy" -msgstr "" - -#: ../src/preferences-skeleton.h:106 -msgid "Tracing" -msgstr "" - #: ../src/preferences.cpp:134 msgid "" "Inkscape will run with default settings, and new settings will not be saved. " @@ -10459,6 +10801,30 @@ msgstr "" msgid "The file %s is not a valid Inkscape preferences file." msgstr "" +#: ../src/preferences-skeleton.h:101 +msgid "Dip pen" +msgstr "" + +#: ../src/preferences-skeleton.h:102 +msgid "Marker" +msgstr "" + +#: ../src/preferences-skeleton.h:103 +msgid "Brush" +msgstr "" + +#: ../src/preferences-skeleton.h:104 +msgid "Wiggly" +msgstr "" + +#: ../src/preferences-skeleton.h:105 +msgid "Splotchy" +msgstr "" + +#: ../src/preferences-skeleton.h:106 +msgid "Tracing" +msgstr "" + #: ../src/rdf.cpp:175 msgid "CC Attribution" msgstr "" @@ -10760,7 +11126,7 @@ msgid "Select object(s) to remove filters from." msgstr "" #: ../src/selection-chemistry.cpp:1235 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1462 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1669 msgid "Remove filter" msgstr "" @@ -10961,84 +11327,84 @@ msgstr "" msgid "Select only one symbol to convert to group." msgstr "" -#: ../src/selection-chemistry.cpp:3088 +#: ../src/selection-chemistry.cpp:3089 msgid "Group from symbol" msgstr "" -#: ../src/selection-chemistry.cpp:3105 +#: ../src/selection-chemistry.cpp:3106 msgid "Select object(s) to convert to pattern." msgstr "" -#: ../src/selection-chemistry.cpp:3195 +#: ../src/selection-chemistry.cpp:3196 msgid "Objects to pattern" msgstr "" -#: ../src/selection-chemistry.cpp:3211 +#: ../src/selection-chemistry.cpp:3212 msgid "Select an object with pattern fill to extract objects from." msgstr "" -#: ../src/selection-chemistry.cpp:3266 +#: ../src/selection-chemistry.cpp:3267 msgid "No pattern fills in the selection." msgstr "" -#: ../src/selection-chemistry.cpp:3269 +#: ../src/selection-chemistry.cpp:3270 msgid "Pattern to objects" msgstr "" -#: ../src/selection-chemistry.cpp:3360 +#: ../src/selection-chemistry.cpp:3361 msgid "Select object(s) to make a bitmap copy." msgstr "" -#: ../src/selection-chemistry.cpp:3364 +#: ../src/selection-chemistry.cpp:3365 msgid "Rendering bitmap..." msgstr "" -#: ../src/selection-chemistry.cpp:3543 +#: ../src/selection-chemistry.cpp:3544 msgid "Create bitmap" msgstr "" -#: ../src/selection-chemistry.cpp:3575 +#: ../src/selection-chemistry.cpp:3576 msgid "Select object(s) to create clippath or mask from." msgstr "" -#: ../src/selection-chemistry.cpp:3578 +#: ../src/selection-chemistry.cpp:3579 msgid "Select mask object and object(s) to apply clippath or mask to." msgstr "" -#: ../src/selection-chemistry.cpp:3761 +#: ../src/selection-chemistry.cpp:3762 msgid "Set clipping path" msgstr "" -#: ../src/selection-chemistry.cpp:3763 +#: ../src/selection-chemistry.cpp:3764 msgid "Set mask" msgstr "" -#: ../src/selection-chemistry.cpp:3778 +#: ../src/selection-chemistry.cpp:3779 msgid "Select object(s) to remove clippath or mask from." msgstr "" -#: ../src/selection-chemistry.cpp:3889 +#: ../src/selection-chemistry.cpp:3890 msgid "Release clipping path" msgstr "" -#: ../src/selection-chemistry.cpp:3891 +#: ../src/selection-chemistry.cpp:3892 msgid "Release mask" msgstr "" -#: ../src/selection-chemistry.cpp:3910 +#: ../src/selection-chemistry.cpp:3911 msgid "Select object(s) to fit canvas to." msgstr "" #. Fit Page -#: ../src/selection-chemistry.cpp:3930 ../src/verbs.cpp:2909 +#: ../src/selection-chemistry.cpp:3931 ../src/verbs.cpp:2909 msgid "Fit Page to Selection" msgstr "" -#: ../src/selection-chemistry.cpp:3959 ../src/verbs.cpp:2911 +#: ../src/selection-chemistry.cpp:3960 ../src/verbs.cpp:2911 msgid "Fit Page to Drawing" msgstr "" -#: ../src/selection-chemistry.cpp:3980 ../src/verbs.cpp:2913 +#: ../src/selection-chemistry.cpp:3981 ../src/verbs.cpp:2913 msgid "Fit Page to Selection or Drawing" msgstr "" @@ -11126,36 +11492,6 @@ msgid_plural "; %d filtered objects " msgstr[0] "" msgstr[1] "" -#: ../src/seltrans-handles.cpp:9 -msgid "" -"Squeeze or stretch selection; with Ctrl to scale uniformly; " -"with Shift to scale around rotation center" -msgstr "" - -#: ../src/seltrans-handles.cpp:10 -msgid "" -"Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" -msgstr "" - -#: ../src/seltrans-handles.cpp:11 -msgid "" -"Skew selection; with Ctrl to snap angle; with Shift to " -"skew around the opposite side" -msgstr "" - -#: ../src/seltrans-handles.cpp:12 -msgid "" -"Rotate selection; with Ctrl to snap angle; with Shift " -"to rotate around the opposite corner" -msgstr "" - -#: ../src/seltrans-handles.cpp:13 -msgid "" -"Center of rotation and skewing: drag to reposition; scaling with " -"Shift also uses this center" -msgstr "" - #: ../src/seltrans.cpp:471 ../src/ui/dialog/transformation.cpp:982 msgid "Skew" msgstr "" @@ -11203,6 +11539,36 @@ msgid "" "with Shift to disable snapping" msgstr "" +#: ../src/seltrans-handles.cpp:9 +msgid "" +"Squeeze or stretch selection; with Ctrl to scale uniformly; " +"with Shift to scale around rotation center" +msgstr "" + +#: ../src/seltrans-handles.cpp:10 +msgid "" +"Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" +msgstr "" + +#: ../src/seltrans-handles.cpp:11 +msgid "" +"Skew selection; with Ctrl to snap angle; with Shift to " +"skew around the opposite side" +msgstr "" + +#: ../src/seltrans-handles.cpp:12 +msgid "" +"Rotate selection; with Ctrl to snap angle; with Shift " +"to rotate around the opposite corner" +msgstr "" + +#: ../src/seltrans-handles.cpp:13 +msgid "" +"Center of rotation and skewing: drag to reposition; scaling with " +"Shift also uses this center" +msgstr "" + #: ../src/shortcuts.cpp:226 #, c-format msgid "Keyboard directory (%s) is unavailable." @@ -11326,16 +11692,6 @@ msgstr "" msgid "%d × %d: %s" msgstr "" -#: ../src/sp-item-group.cpp:337 ../src/sp-switch.cpp:82 -#, c-format -msgid "of %d object" -msgstr "" - -#: ../src/sp-item-group.cpp:337 ../src/sp-switch.cpp:82 -#, c-format -msgid "of %d objects" -msgstr "" - #: ../src/sp-item.cpp:942 ../src/verbs.cpp:213 msgid "Object" msgstr "" @@ -11360,10 +11716,123 @@ msgstr "" msgid "%s; filtered" msgstr "" +#: ../src/sp-item-group.cpp:337 ../src/sp-switch.cpp:82 +#, c-format +msgid "of %d object" +msgstr "" + +#: ../src/sp-item-group.cpp:337 ../src/sp-switch.cpp:82 +#, c-format +msgid "of %d objects" +msgstr "" + #: ../src/sp-line.cpp:126 msgid "Line" msgstr "" +#: ../src/splivarot.cpp:82 +msgid "Intersection" +msgstr "" + +#: ../src/splivarot.cpp:105 +msgid "Division" +msgstr "" + +#: ../src/splivarot.cpp:110 +msgid "Cut path" +msgstr "" + +#: ../src/splivarot.cpp:333 +msgid "Select at least 2 paths to perform a boolean operation." +msgstr "" + +#: ../src/splivarot.cpp:337 +msgid "Select at least 1 path to perform a boolean union." +msgstr "" + +#: ../src/splivarot.cpp:345 +msgid "" +"Select exactly 2 paths to perform difference, division, or path cut." +msgstr "" + +#: ../src/splivarot.cpp:361 ../src/splivarot.cpp:376 +msgid "" +"Unable to determine the z-order of the objects selected for " +"difference, XOR, division, or path cut." +msgstr "" + +#: ../src/splivarot.cpp:407 +msgid "" +"One of the objects is not a path, cannot perform boolean operation." +msgstr "" + +#: ../src/splivarot.cpp:1156 +msgid "Select stroked path(s) to convert stroke to path." +msgstr "" + +#: ../src/splivarot.cpp:1511 +msgid "Convert stroke to path" +msgstr "" + +#. TRANSLATORS: "to outline" means "to convert stroke to path" +#: ../src/splivarot.cpp:1514 +msgid "No stroked paths in the selection." +msgstr "" + +#: ../src/splivarot.cpp:1585 +msgid "Selected object is not a path, cannot inset/outset." +msgstr "" + +#: ../src/splivarot.cpp:1676 ../src/splivarot.cpp:1741 +msgid "Create linked offset" +msgstr "" + +#: ../src/splivarot.cpp:1677 ../src/splivarot.cpp:1742 +msgid "Create dynamic offset" +msgstr "" + +#: ../src/splivarot.cpp:1767 +msgid "Select path(s) to inset/outset." +msgstr "" + +#: ../src/splivarot.cpp:1963 +msgid "Outset path" +msgstr "" + +#: ../src/splivarot.cpp:1963 +msgid "Inset path" +msgstr "" + +#: ../src/splivarot.cpp:1965 +msgid "No paths to inset/outset in the selection." +msgstr "" + +#: ../src/splivarot.cpp:2127 +msgid "Simplifying paths (separately):" +msgstr "" + +#: ../src/splivarot.cpp:2129 +msgid "Simplifying paths:" +msgstr "" + +#: ../src/splivarot.cpp:2166 +#, c-format +msgid "%s %d of %d paths simplified..." +msgstr "" + +#: ../src/splivarot.cpp:2179 +#, c-format +msgid "%d paths simplified." +msgstr "" + +#: ../src/splivarot.cpp:2193 +msgid "Select path(s) to simplify." +msgstr "" + +#: ../src/splivarot.cpp:2209 +msgid "No paths to simplify in the selection." +msgstr "" + #: ../src/sp-lpe-item.cpp:249 msgid "An exception occurred during execution of the Path Effect." msgstr "" @@ -11532,109 +12001,6 @@ msgstr "" msgid "of: %s" msgstr "" -#: ../src/splivarot.cpp:82 -msgid "Intersection" -msgstr "" - -#: ../src/splivarot.cpp:105 -msgid "Division" -msgstr "" - -#: ../src/splivarot.cpp:110 -msgid "Cut path" -msgstr "" - -#: ../src/splivarot.cpp:333 -msgid "Select at least 2 paths to perform a boolean operation." -msgstr "" - -#: ../src/splivarot.cpp:337 -msgid "Select at least 1 path to perform a boolean union." -msgstr "" - -#: ../src/splivarot.cpp:345 -msgid "" -"Select exactly 2 paths to perform difference, division, or path cut." -msgstr "" - -#: ../src/splivarot.cpp:361 ../src/splivarot.cpp:376 -msgid "" -"Unable to determine the z-order of the objects selected for " -"difference, XOR, division, or path cut." -msgstr "" - -#: ../src/splivarot.cpp:407 -msgid "" -"One of the objects is not a path, cannot perform boolean operation." -msgstr "" - -#: ../src/splivarot.cpp:1156 -msgid "Select stroked path(s) to convert stroke to path." -msgstr "" - -#: ../src/splivarot.cpp:1511 -msgid "Convert stroke to path" -msgstr "" - -#. TRANSLATORS: "to outline" means "to convert stroke to path" -#: ../src/splivarot.cpp:1514 -msgid "No stroked paths in the selection." -msgstr "" - -#: ../src/splivarot.cpp:1585 -msgid "Selected object is not a path, cannot inset/outset." -msgstr "" - -#: ../src/splivarot.cpp:1676 ../src/splivarot.cpp:1741 -msgid "Create linked offset" -msgstr "" - -#: ../src/splivarot.cpp:1677 ../src/splivarot.cpp:1742 -msgid "Create dynamic offset" -msgstr "" - -#: ../src/splivarot.cpp:1767 -msgid "Select path(s) to inset/outset." -msgstr "" - -#: ../src/splivarot.cpp:1963 -msgid "Outset path" -msgstr "" - -#: ../src/splivarot.cpp:1963 -msgid "Inset path" -msgstr "" - -#: ../src/splivarot.cpp:1965 -msgid "No paths to inset/outset in the selection." -msgstr "" - -#: ../src/splivarot.cpp:2127 -msgid "Simplifying paths (separately):" -msgstr "" - -#: ../src/splivarot.cpp:2129 -msgid "Simplifying paths:" -msgstr "" - -#: ../src/splivarot.cpp:2166 -#, c-format -msgid "%s %d of %d paths simplified..." -msgstr "" - -#: ../src/splivarot.cpp:2179 -#, c-format -msgid "%d paths simplified." -msgstr "" - -#: ../src/splivarot.cpp:2193 -msgid "Select path(s) to simplify." -msgstr "" - -#: ../src/splivarot.cpp:2209 -msgid "No paths to simplify in the selection." -msgstr "" - #: ../src/text-chemistry.cpp:94 msgid "Select a text and a path to put text on path." msgstr "" @@ -12217,7 +12583,7 @@ msgstr "" #: ../src/ui/dialog/align-and-distribute.cpp:1005 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1555 ../src/verbs.cpp:175 -#: ../src/widgets/desktop-widget.cpp:2011 +#: ../src/widgets/desktop-widget.cpp:2002 #: ../share/extensions/printing_marks.inx.h:18 msgid "Selection" msgstr "" @@ -13589,7 +13955,7 @@ msgid "Export aborted." msgstr "" #: ../src/ui/dialog/export.cpp:1299 ../src/ui/dialog/input.cpp:1082 -#: ../src/verbs.cpp:2361 ../src/widgets/desktop-widget.cpp:1127 +#: ../src/verbs.cpp:2361 ../src/widgets/desktop-widget.cpp:1128 msgid "_Save" msgstr "" @@ -13598,8 +13964,8 @@ msgid "Information" msgstr "" #: ../src/ui/dialog/extension-editor.cpp:82 ../src/verbs.cpp:290 -#: ../src/verbs.cpp:309 ../share/extensions/color_HSL_adjust.inx.h:11 -#: ../share/extensions/color_custom.inx.h:7 +#: ../src/verbs.cpp:309 ../share/extensions/color_custom.inx.h:7 +#: ../share/extensions/color_HSL_adjust.inx.h:11 #: ../share/extensions/color_randomize.inx.h:6 #: ../share/extensions/dots.inx.h:7 #: ../share/extensions/draw_from_triangle.inx.h:35 @@ -13617,7 +13983,7 @@ msgstr "" #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:17 #: ../share/extensions/gcodetools_tools_library.inx.h:12 #: ../share/extensions/generate_voronoi.inx.h:5 -#: ../share/extensions/gimp_xcf.inx.h:6 +#: ../share/extensions/gimp_xcf.inx.h:7 #: ../share/extensions/interp_att_g.inx.h:27 #: ../share/extensions/jessyInk_autoTexts.inx.h:8 #: ../share/extensions/jessyInk_effects.inx.h:13 @@ -13640,9 +14006,9 @@ msgstr "" #: ../share/extensions/radiusrand.inx.h:8 ../share/extensions/split.inx.h:8 #: ../share/extensions/voronoi2svg.inx.h:11 #: ../share/extensions/web-set-att.inx.h:25 -#: ../share/extensions/web-transmit-att.inx.h:23 #: ../share/extensions/webslicer_create_group.inx.h:11 #: ../share/extensions/webslicer_export.inx.h:6 +#: ../share/extensions/web-transmit-att.inx.h:23 msgid "Help" msgstr "" @@ -13800,7 +14166,7 @@ msgid "Stroke st_yle" msgstr "" #. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor -#: ../src/ui/dialog/filter-effects-dialog.cpp:515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:546 msgid "" "This matrix determines a linear transform on color space. Each line affects " "one of the color components. Each column determines how much of each color " @@ -13808,194 +14174,214 @@ msgid "" "depend on input colors, so can be used to adjust a constant component value." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:625 +#: ../src/ui/dialog/filter-effects-dialog.cpp:656 msgid "Image File" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:659 msgid "Selected SVG Element" msgstr "" #. TODO: any image, not just svg -#: ../src/ui/dialog/filter-effects-dialog.cpp:698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:729 msgid "Select an image to be used as feImage input" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:821 msgid "This SVG filter effect does not require any parameters." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:796 +#: ../src/ui/dialog/filter-effects-dialog.cpp:827 msgid "This SVG filter effect is not yet implemented in Inkscape." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:984 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1041 +msgid "Slope" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1042 +msgid "Intercept" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1045 +msgid "Amplitude" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1046 +msgid "Exponent" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1143 +msgid "New transfer function type" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1178 msgid "Light Source:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Direction angle for the light source on the XY plane, in degrees" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Direction angle for the light source on the YZ plane, in degrees" msgstr "" #. default x: #. default y: #. default z: -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 msgid "Location:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "X coordinate" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Y coordinate" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Z coordinate" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Points At" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Specular Exponent" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Exponent value controlling the focus for the light source" msgstr "" #. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option. -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "Cone Angle" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "" "This is the angle between the spot light axis (i.e. the axis between the " "light source and the point to which it is pointing at) and the spot light " "cone. No light is projected outside this cone." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1077 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1274 msgid "New light source" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1118 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1325 msgid "_Duplicate" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1152 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1359 msgid "_Filter" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1174 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1381 msgid "R_ename" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1304 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1511 msgid "Rename filter" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1349 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1556 msgid "Apply filter" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1419 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1626 msgid "filter" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1426 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1633 msgid "Add filter" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1478 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1685 msgid "Duplicate filter" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1577 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1784 msgid "_Effect" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1587 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1794 msgid "Connections" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1725 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1932 msgid "Remove filter primitive" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2313 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2520 msgid "Remove merge node" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2433 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2640 msgid "Reorder filter primitive" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2513 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2720 msgid "Add Effect:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2514 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 msgid "No effect selected" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2722 msgid "No filter selected" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2561 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2767 msgid "Effect parameters" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2562 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2768 msgid "Filter General Settings" msgstr "" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Coordinates:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "X coordinate of the left corners of filter effects region" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Y coordinate of the upper corners of filter effects region" msgstr "" #. default width: #. default height: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Dimensions:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Width of filter effects region" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Height of filter effects region" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2627 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 msgid "" "Indicates the type of matrix operation. The keyword 'matrix' indicates that " "a full 5x4 matrix of values will be provided. The other keywords represent " @@ -14003,78 +14389,95 @@ msgid "" "performed without specifying a complete matrix." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2834 msgid "Value(s):" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2643 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2838 +msgid "R:" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2839 +#: ../src/widgets/sp-color-icc-selector.cpp:359 +msgid "G:" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2840 +msgid "B:" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2841 +msgid "A:" +msgstr "" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2844 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "Operator:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 msgid "K1:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "" "If the arithmetic operation is chosen, each result pixel is computed using " "the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel " "values of the first and second inputs respectively." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 msgid "K2:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 msgid "K3:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "K4:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "Size:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "width of the convolve matrix" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "height of the convolve matrix" msgstr "" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 #: ../src/ui/dialog/object-attributes.cpp:48 msgid "Target:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "" "X coordinate of the target point in the convolve matrix. The convolution is " "applied to pixels around this point." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "" "Y coordinate of the target point in the convolve matrix. The convolution is " "applied to pixels around this point." msgstr "" #. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix) -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "Kernel:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "" "This matrix describes the convolve operation that is applied to the input " "image in order to calculate the pixel colors at the output. Different " @@ -14084,11 +14487,11 @@ msgid "" "would lead to a common blur effect." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "Divisor:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "" "After applying the kernelMatrix to the input image to yield a number, that " "number is divided by divisor to yield the final destination color value. A " @@ -14096,189 +14499,189 @@ msgid "" "effect on the overall color intensity of the result." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "Bias:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "" "This value is added to each component. This is useful to define a constant " "value as the zero response of the filter." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "Edge Mode:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "" "Determines how to extend the input image as necessary with color values so " "that the matrix operations can be applied when the kernel is positioned at " "or near the edge of the input image." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "Preserve Alpha" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "If set, the alpha channel won't be altered by this filter primitive." msgstr "" #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 msgid "Diffuse Color:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Defines the color of the light source" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "Surface Scale:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "" "This value amplifies the heights of the bump map defined by the input alpha " "channel" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "Constant:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "This constant affects the Phong lighting model." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2664 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2865 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2899 msgid "Kernel Unit Length:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 msgid "This defines the intensity of the displacement effect." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "X displacement:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "Color component that controls the displacement in the X direction" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Y displacement:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Color component that controls the displacement in the Y direction" msgstr "" #. default: black -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "Flood Color:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "The whole filter region will be filled with this color." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "Standard Deviation:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "The standard deviation for the blur operation." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "" "Erode: performs \"thinning\" of input image.\n" "Dilate: performs \"fattenning\" of input image." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2687 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2888 msgid "Source of Image:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "Delta X:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "This is how far the input image gets shifted to the right" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "Delta Y:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "This is how far the input image gets shifted downwards" msgstr "" #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Specular Color:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 #: ../share/extensions/interp.inx.h:2 msgid "Exponent:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 msgid "Exponent for specular term, larger is more \"shiny\"." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 msgid "" "Indicates whether the filter primitive should perform a noise or turbulence " "function." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2707 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2908 msgid "Base Frequency:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2708 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2909 msgid "Octaves:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "Seed:" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "The starting number for the pseudo random number generator." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2922 msgid "Add filter primitive" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2738 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2939 msgid "" "The feBlend filter primitive provides 4 image blending modes: screen, " "multiply, darken and lighten." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2742 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2943 msgid "" "The feColorMatrix filter primitive applies a matrix transformation to " "color of each rendered pixel. This allows for effects like turning object to " "grayscale, modifying color saturation and changing color hue." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2746 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2947 msgid "" "The feComponentTransfer filter primitive manipulates the input's " "color components (red, green, blue, and alpha) according to particular " @@ -14286,7 +14689,7 @@ msgid "" "adjustment, color balance, and thresholding." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2750 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2951 msgid "" "The feComposite filter primitive composites two images using one of " "the Porter-Duff blending modes or the arithmetic mode described in SVG " @@ -14294,7 +14697,7 @@ msgid "" "between the corresponding pixel values of the images." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2754 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2955 msgid "" "The feConvolveMatrix lets you specify a Convolution to be applied on " "the image. Common effects created using convolution matrices are blur, " @@ -14303,7 +14706,7 @@ msgid "" "is faster and resolution-independent." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2758 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2959 msgid "" "The feDiffuseLighting and feSpecularLighting filter primitives create " "\"embossed\" shadings. The input's alpha channel is used to provide depth " @@ -14311,7 +14714,7 @@ msgid "" "opacity areas recede away from the viewer." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2762 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2963 msgid "" "The feDisplacementMap filter primitive displaces the pixels in the " "first input using the second input as a displacement map, that shows from " @@ -14319,26 +14722,26 @@ msgid "" "effects." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2766 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2967 msgid "" "The feFlood filter primitive fills the region with a given color and " "opacity. It is usually used as an input to other filters to apply color to " "a graphic." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2770 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2971 msgid "" "The feGaussianBlur filter primitive uniformly blurs its input. It is " "commonly used together with feOffset to create a drop shadow effect." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2774 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2975 msgid "" "The feImage filter primitive fills the region with an external image " "or another part of the document." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2778 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2979 msgid "" "The feMerge filter primitive composites several temporary images " "inside the filter primitive to a single image. It uses normal alpha " @@ -14346,21 +14749,21 @@ msgid "" "in 'normal' mode or several feComposite primitives in 'over' mode." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2782 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2983 msgid "" "The feMorphology filter primitive provides erode and dilate effects. " "For single-color objects erode makes the object thinner and dilate makes it " "thicker." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2786 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2987 msgid "" "The feOffset filter primitive offsets the image by an user-defined " "amount. For example, this is useful for drop shadows, where the shadow is in " "a slightly different position than the actual object." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2991 msgid "" "The feDiffuseLighting and feSpecularLighting filter primitives " "create \"embossed\" shadings. The input's alpha channel is used to provide " @@ -14368,23 +14771,23 @@ msgid "" "lower opacity areas recede away from the viewer." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2794 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2995 msgid "" "The feTile filter primitive tiles a region with its input graphic" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2798 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2999 msgid "" "The feTurbulence filter primitive renders Perlin noise. This kind of " "noise is useful in simulating several nature phenomena like clouds, fire and " "smoke and in generating complex textures like marble or granite." msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2817 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3018 msgid "Duplicate filter primitive" msgstr "" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3071 msgid "Set filter primitive attribute" msgstr "" @@ -15822,7 +16225,7 @@ msgstr "" #. Zoom #: ../src/ui/dialog/inkscape-preferences.cpp:376 -#: ../src/widgets/desktop-widget.cpp:635 +#: ../src/widgets/desktop-widget.cpp:636 msgid "Zoom" msgstr "" @@ -17917,7 +18320,7 @@ msgid "Shortcut file:" msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:1484 -#: ../src/ui/dialog/template-load-tab.cpp:49 +#: ../src/ui/dialog/template-load-tab.cpp:48 msgid "Search:" msgstr "" @@ -18482,13 +18885,13 @@ msgstr "" #: ../src/ui/dialog/object-attributes.cpp:66 #: ../src/ui/dialog/object-attributes.cpp:75 ../src/ui/dialog/tile.cpp:618 -#: ../src/widgets/desktop-widget.cpp:670 ../src/widgets/node-toolbar.cpp:594 +#: ../src/widgets/desktop-widget.cpp:671 ../src/widgets/node-toolbar.cpp:594 msgid "X:" msgstr "" #: ../src/ui/dialog/object-attributes.cpp:67 #: ../src/ui/dialog/object-attributes.cpp:76 ../src/ui/dialog/tile.cpp:619 -#: ../src/widgets/desktop-widget.cpp:680 ../src/widgets/node-toolbar.cpp:612 +#: ../src/widgets/desktop-widget.cpp:681 ../src/widgets/node-toolbar.cpp:612 msgid "Y:" msgstr "" @@ -19050,36 +19453,36 @@ msgid "Palettes directory (%s) is unavailable." msgstr "" #. ******************* Symbol Sets ************************ -#: ../src/ui/dialog/symbols.cpp:128 +#: ../src/ui/dialog/symbols.cpp:126 msgid "Symbol set: " msgstr "" #. Fill in later -#: ../src/ui/dialog/symbols.cpp:137 ../src/ui/dialog/symbols.cpp:138 +#: ../src/ui/dialog/symbols.cpp:135 ../src/ui/dialog/symbols.cpp:136 msgid "Current Document" msgstr "" -#: ../src/ui/dialog/symbols.cpp:205 +#: ../src/ui/dialog/symbols.cpp:203 msgid "Add Symbol from the current document." msgstr "" -#: ../src/ui/dialog/symbols.cpp:214 +#: ../src/ui/dialog/symbols.cpp:212 msgid "Remove Symbol from the current document." msgstr "" -#: ../src/ui/dialog/symbols.cpp:227 +#: ../src/ui/dialog/symbols.cpp:225 msgid "Make Icons bigger by zooming in." msgstr "" -#: ../src/ui/dialog/symbols.cpp:236 +#: ../src/ui/dialog/symbols.cpp:234 msgid "Make Icons smaller by zooming out." msgstr "" -#: ../src/ui/dialog/symbols.cpp:245 +#: ../src/ui/dialog/symbols.cpp:243 msgid "Toggle 'fit' symbols in icon space." msgstr "" -#: ../src/ui/dialog/symbols.cpp:558 +#: ../src/ui/dialog/symbols.cpp:565 msgid "Unnamed Symbols" msgstr "" @@ -19760,95 +20163,95 @@ msgid "" "node, click to select (more: Shift, Ctrl+Alt)" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 msgid "Retract handles" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 ../src/ui/tool/node.cpp:270 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 ../src/ui/tool/node.cpp:270 msgid "Change node type" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:334 +#: ../src/ui/tool/multi-path-manipulator.cpp:323 msgid "Straighten segments" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:336 +#: ../src/ui/tool/multi-path-manipulator.cpp:325 msgid "Make segments curves" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:344 +#: ../src/ui/tool/multi-path-manipulator.cpp:333 msgid "Add nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:350 +#: ../src/ui/tool/multi-path-manipulator.cpp:339 msgid "Add extremum nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:357 +#: ../src/ui/tool/multi-path-manipulator.cpp:346 msgid "Duplicate nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:420 +#: ../src/ui/tool/multi-path-manipulator.cpp:409 #: ../src/widgets/node-toolbar.cpp:421 msgid "Join nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:427 +#: ../src/ui/tool/multi-path-manipulator.cpp:416 #: ../src/widgets/node-toolbar.cpp:432 msgid "Break nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:434 +#: ../src/ui/tool/multi-path-manipulator.cpp:423 msgid "Delete nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:757 msgid "Move nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:771 +#: ../src/ui/tool/multi-path-manipulator.cpp:760 msgid "Move nodes horizontally" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:764 msgid "Move nodes vertically" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:779 -#: ../src/ui/tool/multi-path-manipulator.cpp:782 +#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:771 msgid "Rotate nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:786 -#: ../src/ui/tool/multi-path-manipulator.cpp:792 +#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:781 msgid "Scale nodes uniformly" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:789 +#: ../src/ui/tool/multi-path-manipulator.cpp:778 msgid "Scale nodes" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:796 +#: ../src/ui/tool/multi-path-manipulator.cpp:785 msgid "Scale nodes horizontally" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:800 +#: ../src/ui/tool/multi-path-manipulator.cpp:789 msgid "Scale nodes vertically" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:804 +#: ../src/ui/tool/multi-path-manipulator.cpp:793 msgid "Skew nodes horizontally" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:808 +#: ../src/ui/tool/multi-path-manipulator.cpp:797 msgid "Skew nodes vertically" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:812 +#: ../src/ui/tool/multi-path-manipulator.cpp:801 msgid "Flip nodes horizontally" msgstr "" -#: ../src/ui/tool/multi-path-manipulator.cpp:815 +#: ../src/ui/tool/multi-path-manipulator.cpp:804 msgid "Flip nodes vertically" msgstr "" @@ -20027,118 +20430,6 @@ msgstr "" msgid "Retract handle" msgstr "" -#: ../src/ui/tool/transform-handle-set.cpp:195 -msgctxt "Transform handle tip" -msgid "Shift+Ctrl: scale uniformly about the rotation center" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:197 -msgctxt "Transform handle tip" -msgid "Ctrl: scale uniformly" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:202 -msgctxt "Transform handle tip" -msgid "" -"Shift+Alt: scale using an integer ratio about the rotation center" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:204 -msgctxt "Transform handle tip" -msgid "Shift: scale from the rotation center" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:207 -msgctxt "Transform handle tip" -msgid "Alt: scale using an integer ratio" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:209 -msgctxt "Transform handle tip" -msgid "Scale handle: drag to scale the selection" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:214 -#, c-format -msgctxt "Transform handle tip" -msgid "Scale by %.2f%% x %.2f%%" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:438 -#, c-format -msgctxt "Transform handle tip" -msgid "" -"Shift+Ctrl: rotate around the opposite corner and snap angle to %f° " -"increments" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:441 -msgctxt "Transform handle tip" -msgid "Shift: rotate around the opposite corner" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:445 -#, c-format -msgctxt "Transform handle tip" -msgid "Ctrl: snap angle to %f° increments" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:447 -msgctxt "Transform handle tip" -msgid "" -"Rotation handle: drag to rotate the selection around the rotation " -"center" -msgstr "" - -#. event -#: ../src/ui/tool/transform-handle-set.cpp:452 -#, c-format -msgctxt "Transform handle tip" -msgid "Rotate by %.2f°" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:578 -#, c-format -msgctxt "Transform handle tip" -msgid "" -"Shift+Ctrl: skew about the rotation center with snapping to %f° " -"increments" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:581 -msgctxt "Transform handle tip" -msgid "Shift: skew about the rotation center" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:585 -#, c-format -msgctxt "Transform handle tip" -msgid "Ctrl: snap skew angle to %f° increments" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:588 -msgctxt "Transform handle tip" -msgid "" -"Skew handle: drag to skew (shear) selection about the opposite handle" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:594 -#, c-format -msgctxt "Transform handle tip" -msgid "Skew horizontally by %.2f°" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:597 -#, c-format -msgctxt "Transform handle tip" -msgid "Skew vertically by %.2f°" -msgstr "" - -#: ../src/ui/tool/transform-handle-set.cpp:656 -msgctxt "Transform handle tip" -msgid "Rotation center: drag to change the origin of transforms" -msgstr "" - #: ../src/ui/tools/arc-tool.cpp:269 msgid "" "Ctrl: make circle or integer-ratio ellipse, snap arc/segment angle" @@ -20562,22 +20853,49 @@ msgctxt "Node tool tip" msgid "Drag to select objects to edit" msgstr "" -#: ../src/ui/tools/pen-tool.cpp:193 ../src/ui/tools/pencil-tool.cpp:504 -msgid "Drawing cancelled" -msgstr "" - -#: ../src/ui/tools/pen-tool.cpp:413 ../src/ui/tools/pencil-tool.cpp:229 +#: ../src/ui/tools/pencil-tool.cpp:229 ../src/ui/tools/pen-tool.cpp:413 msgid "Continuing selected path" msgstr "" -#: ../src/ui/tools/pen-tool.cpp:423 ../src/ui/tools/pencil-tool.cpp:237 +#: ../src/ui/tools/pencil-tool.cpp:237 ../src/ui/tools/pen-tool.cpp:423 msgid "Creating new path" msgstr "" -#: ../src/ui/tools/pen-tool.cpp:425 ../src/ui/tools/pencil-tool.cpp:240 +#: ../src/ui/tools/pencil-tool.cpp:240 ../src/ui/tools/pen-tool.cpp:425 msgid "Appending to selected path" msgstr "" +#: ../src/ui/tools/pencil-tool.cpp:345 +msgid "Release here to close and finish the path." +msgstr "" + +#: ../src/ui/tools/pencil-tool.cpp:351 +msgid "Drawing a freehand path" +msgstr "" + +#: ../src/ui/tools/pencil-tool.cpp:356 +msgid "Drag to continue the path from this point." +msgstr "" + +#. Write curves to object +#: ../src/ui/tools/pencil-tool.cpp:448 +msgid "Finishing freehand" +msgstr "" + +#: ../src/ui/tools/pencil-tool.cpp:504 ../src/ui/tools/pen-tool.cpp:193 +msgid "Drawing cancelled" +msgstr "" + +#: ../src/ui/tools/pencil-tool.cpp:554 +msgid "" +"Sketch mode: holding Alt interpolates between sketched paths. " +"Release Alt to finalize." +msgstr "" + +#: ../src/ui/tools/pencil-tool.cpp:582 +msgid "Finishing freehand sketch" +msgstr "" + #: ../src/ui/tools/pen-tool.cpp:585 msgid "Click or click and drag to close and finish the path." msgstr "" @@ -20626,33 +20944,6 @@ msgstr "" msgid "Drawing finished" msgstr "" -#: ../src/ui/tools/pencil-tool.cpp:345 -msgid "Release here to close and finish the path." -msgstr "" - -#: ../src/ui/tools/pencil-tool.cpp:351 -msgid "Drawing a freehand path" -msgstr "" - -#: ../src/ui/tools/pencil-tool.cpp:356 -msgid "Drag to continue the path from this point." -msgstr "" - -#. Write curves to object -#: ../src/ui/tools/pencil-tool.cpp:448 -msgid "Finishing freehand" -msgstr "" - -#: ../src/ui/tools/pencil-tool.cpp:554 -msgid "" -"Sketch mode: holding Alt interpolates between sketched paths. " -"Release Alt to finalize." -msgstr "" - -#: ../src/ui/tools/pencil-tool.cpp:582 -msgid "Finishing freehand sketch" -msgstr "" - #: ../src/ui/tools/rect-tool.cpp:296 msgid "" "Ctrl: make square or integer-ratio rect, lock a rounded corner " @@ -21096,6 +21387,118 @@ msgstr "" msgid "Blur tweak" msgstr "" +#: ../src/ui/tool/transform-handle-set.cpp:195 +msgctxt "Transform handle tip" +msgid "Shift+Ctrl: scale uniformly about the rotation center" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:197 +msgctxt "Transform handle tip" +msgid "Ctrl: scale uniformly" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:202 +msgctxt "Transform handle tip" +msgid "" +"Shift+Alt: scale using an integer ratio about the rotation center" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:204 +msgctxt "Transform handle tip" +msgid "Shift: scale from the rotation center" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:207 +msgctxt "Transform handle tip" +msgid "Alt: scale using an integer ratio" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:209 +msgctxt "Transform handle tip" +msgid "Scale handle: drag to scale the selection" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:214 +#, c-format +msgctxt "Transform handle tip" +msgid "Scale by %.2f%% x %.2f%%" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:438 +#, c-format +msgctxt "Transform handle tip" +msgid "" +"Shift+Ctrl: rotate around the opposite corner and snap angle to %f° " +"increments" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:441 +msgctxt "Transform handle tip" +msgid "Shift: rotate around the opposite corner" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:445 +#, c-format +msgctxt "Transform handle tip" +msgid "Ctrl: snap angle to %f° increments" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:447 +msgctxt "Transform handle tip" +msgid "" +"Rotation handle: drag to rotate the selection around the rotation " +"center" +msgstr "" + +#. event +#: ../src/ui/tool/transform-handle-set.cpp:452 +#, c-format +msgctxt "Transform handle tip" +msgid "Rotate by %.2f°" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:578 +#, c-format +msgctxt "Transform handle tip" +msgid "" +"Shift+Ctrl: skew about the rotation center with snapping to %f° " +"increments" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:581 +msgctxt "Transform handle tip" +msgid "Shift: skew about the rotation center" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:585 +#, c-format +msgctxt "Transform handle tip" +msgid "Ctrl: snap skew angle to %f° increments" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:588 +msgctxt "Transform handle tip" +msgid "" +"Skew handle: drag to skew (shear) selection about the opposite handle" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:594 +#, c-format +msgctxt "Transform handle tip" +msgid "Skew horizontally by %.2f°" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:597 +#, c-format +msgctxt "Transform handle tip" +msgid "Skew vertically by %.2f°" +msgstr "" + +#: ../src/ui/tool/transform-handle-set.cpp:656 +msgctxt "Transform handle tip" +msgid "Rotation center: drag to change the origin of transforms" +msgstr "" + #: ../src/ui/widget/filter-effect-chooser.cpp:27 msgid "Blur (%)" msgstr "" @@ -24519,88 +24922,88 @@ msgstr "" msgid "Pattern offset" msgstr "" -#: ../src/widgets/desktop-widget.cpp:465 +#: ../src/widgets/desktop-widget.cpp:466 msgid "Zoom drawing if window size changes" msgstr "" -#: ../src/widgets/desktop-widget.cpp:669 +#: ../src/widgets/desktop-widget.cpp:670 msgid "Cursor coordinates" msgstr "" -#: ../src/widgets/desktop-widget.cpp:695 +#: ../src/widgets/desktop-widget.cpp:696 msgid "Z:" msgstr "" #. display the initial welcome message in the statusbar -#: ../src/widgets/desktop-widget.cpp:738 +#: ../src/widgets/desktop-widget.cpp:739 msgid "" "Welcome to Inkscape! Use shape or freehand tools to create objects; " "use selector (arrow) to move or transform them." msgstr "" -#: ../src/widgets/desktop-widget.cpp:832 +#: ../src/widgets/desktop-widget.cpp:833 msgid "grayscale" msgstr "" -#: ../src/widgets/desktop-widget.cpp:833 +#: ../src/widgets/desktop-widget.cpp:834 msgid ", grayscale" msgstr "" -#: ../src/widgets/desktop-widget.cpp:834 +#: ../src/widgets/desktop-widget.cpp:835 msgid "print colors preview" msgstr "" -#: ../src/widgets/desktop-widget.cpp:835 +#: ../src/widgets/desktop-widget.cpp:836 msgid ", print colors preview" msgstr "" -#: ../src/widgets/desktop-widget.cpp:836 +#: ../src/widgets/desktop-widget.cpp:837 msgid "outline" msgstr "" -#: ../src/widgets/desktop-widget.cpp:837 +#: ../src/widgets/desktop-widget.cpp:838 msgid "no filters" msgstr "" -#: ../src/widgets/desktop-widget.cpp:864 +#: ../src/widgets/desktop-widget.cpp:865 #, c-format msgid "%s%s: %d (%s%s) - Inkscape" msgstr "" -#: ../src/widgets/desktop-widget.cpp:866 ../src/widgets/desktop-widget.cpp:870 +#: ../src/widgets/desktop-widget.cpp:867 ../src/widgets/desktop-widget.cpp:871 #, c-format msgid "%s%s: %d (%s) - Inkscape" msgstr "" -#: ../src/widgets/desktop-widget.cpp:872 +#: ../src/widgets/desktop-widget.cpp:873 #, c-format msgid "%s%s: %d - Inkscape" msgstr "" -#: ../src/widgets/desktop-widget.cpp:878 +#: ../src/widgets/desktop-widget.cpp:879 #, c-format msgid "%s%s (%s%s) - Inkscape" msgstr "" -#: ../src/widgets/desktop-widget.cpp:880 ../src/widgets/desktop-widget.cpp:884 +#: ../src/widgets/desktop-widget.cpp:881 ../src/widgets/desktop-widget.cpp:885 #, c-format msgid "%s%s (%s) - Inkscape" msgstr "" -#: ../src/widgets/desktop-widget.cpp:886 +#: ../src/widgets/desktop-widget.cpp:887 #, c-format msgid "%s%s - Inkscape" msgstr "" -#: ../src/widgets/desktop-widget.cpp:1055 +#: ../src/widgets/desktop-widget.cpp:1056 msgid "Color-managed display is enabled in this window" msgstr "" -#: ../src/widgets/desktop-widget.cpp:1057 +#: ../src/widgets/desktop-widget.cpp:1058 msgid "Color-managed display is disabled in this window" msgstr "" -#: ../src/widgets/desktop-widget.cpp:1112 +#: ../src/widgets/desktop-widget.cpp:1113 #, c-format msgid "" "Save changes to document \"%s\" before " @@ -24609,12 +25012,12 @@ msgid "" "If you close without saving, your changes will be discarded." msgstr "" -#: ../src/widgets/desktop-widget.cpp:1122 -#: ../src/widgets/desktop-widget.cpp:1181 +#: ../src/widgets/desktop-widget.cpp:1123 +#: ../src/widgets/desktop-widget.cpp:1182 msgid "Close _without saving" msgstr "" -#: ../src/widgets/desktop-widget.cpp:1171 +#: ../src/widgets/desktop-widget.cpp:1172 #, c-format msgid "" "The file \"%s\" was saved with a " @@ -24623,11 +25026,11 @@ msgid "" "Do you want to save this file as Inkscape SVG?" msgstr "" -#: ../src/widgets/desktop-widget.cpp:1183 +#: ../src/widgets/desktop-widget.cpp:1184 msgid "_Save as Inkscape SVG" msgstr "" -#: ../src/widgets/desktop-widget.cpp:1393 +#: ../src/widgets/desktop-widget.cpp:1394 msgid "Note:" msgstr "" @@ -25274,6 +25677,57 @@ msgstr "" msgid "Y coordinate of selected node(s)" msgstr "" +#: ../src/widgets/paintbucket-toolbar.cpp:154 +msgid "Fill by" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:155 +msgid "Fill by:" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:167 +msgid "Fill Threshold" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:168 +msgid "" +"The maximum allowed difference between the clicked pixel and the neighboring " +"pixels to be counted in the fill" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:195 +msgid "Grow/shrink by" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:195 +msgid "Grow/shrink by:" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:196 +msgid "" +"The amount to grow (positive) or shrink (negative) the created fill path" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:221 +msgid "Close gaps" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:222 +msgid "Close gaps:" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:233 +#: ../src/widgets/pencil-toolbar.cpp:322 ../src/widgets/spiral-toolbar.cpp:300 +#: ../src/widgets/star-toolbar.cpp:572 +msgid "Defaults" +msgstr "" + +#: ../src/widgets/paintbucket-toolbar.cpp:234 +msgid "" +"Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools " +"to change defaults)" +msgstr "" + #: ../src/widgets/paint-selector.cpp:234 msgid "No paint" msgstr "" @@ -25351,57 +25805,6 @@ msgstr "" msgid "Swatch fill" msgstr "" -#: ../src/widgets/paintbucket-toolbar.cpp:154 -msgid "Fill by" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:155 -msgid "Fill by:" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:167 -msgid "Fill Threshold" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:168 -msgid "" -"The maximum allowed difference between the clicked pixel and the neighboring " -"pixels to be counted in the fill" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:195 -msgid "Grow/shrink by" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:195 -msgid "Grow/shrink by:" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:196 -msgid "" -"The amount to grow (positive) or shrink (negative) the created fill path" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:221 -msgid "Close gaps" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:222 -msgid "Close gaps:" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:233 -#: ../src/widgets/pencil-toolbar.cpp:322 ../src/widgets/spiral-toolbar.cpp:300 -#: ../src/widgets/star-toolbar.cpp:572 -msgid "Defaults" -msgstr "" - -#: ../src/widgets/paintbucket-toolbar.cpp:234 -msgid "" -"Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools " -"to change defaults)" -msgstr "" - #: ../src/widgets/pencil-toolbar.cpp:125 msgid "Bezier" msgstr "" @@ -25721,10 +26124,6 @@ msgstr "" msgid "_B:" msgstr "" -#: ../src/widgets/sp-color-icc-selector.cpp:359 -msgid "G:" -msgstr "" - #: ../src/widgets/sp-color-icc-selector.cpp:359 msgid "Gray" msgstr "" @@ -25841,14 +26240,6 @@ msgstr "" msgid "Unnamed" msgstr "" -#: ../src/widgets/sp-xmlview-attr-list.cpp:64 -msgid "Value" -msgstr "" - -#: ../src/widgets/sp-xmlview-content.cpp:179 -msgid "Type text in a text node" -msgstr "" - #: ../src/widgets/spiral-toolbar.cpp:111 msgid "Change spiral" msgstr "" @@ -26073,6 +26464,14 @@ msgid "" "the original object" msgstr "" +#: ../src/widgets/sp-xmlview-attr-list.cpp:64 +msgid "Value" +msgstr "" + +#: ../src/widgets/sp-xmlview-content.cpp:179 +msgid "Type text in a text node" +msgstr "" + #: ../src/widgets/star-toolbar.cpp:110 msgid "Star: Change number of corners" msgstr "" @@ -27306,7 +27705,7 @@ msgstr "" msgid "An error occurred while processing the XCF file." msgstr "" -#: ../share/extensions/gimp_xcf.py:171 +#: ../share/extensions/gimp_xcf.py:177 msgid "This extension requires at least one non empty layer." msgstr "" @@ -27351,7 +27750,12 @@ msgid "" "%s" msgstr "" -#: ../share/extensions/inkex.py:260 +#: ../share/extensions/inkex.py:162 ../share/extensions/inkex.py:171 +#, python-format +msgid "Unable to open specified file: %s" +msgstr "" + +#: ../share/extensions/inkex.py:276 #, python-format msgid "No matching node for expression: %s" msgstr "" @@ -27922,49 +28326,6 @@ msgstr "" msgid "Open presentation exchange files saved in Corel DRAW (UC)" msgstr "" -#: ../share/extensions/color_HSL_adjust.inx.h:1 -msgid "HSL Adjust" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:3 -msgid "Hue (°)" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:4 -msgid "Random hue" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:6 -#, no-c-format -msgid "Saturation (%)" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:7 -msgid "Random saturation" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:9 -#, no-c-format -msgid "Lightness (%)" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:10 -msgid "Random lightness" -msgstr "" - -#: ../share/extensions/color_HSL_adjust.inx.h:13 -#, no-c-format -msgid "" -"Adjusts hue, saturation and lightness in the HSL representation of the " -"selected objects's color.\n" -"Options:\n" -" * Hue: rotate by degrees (wraps around).\n" -" * Saturation: add/subtract % (min=-100, max=100).\n" -" * Lightness: add/subtract % (min=-100, max=100).\n" -" * Random Hue/Saturation/Lightness: randomize the parameter's value.\n" -" " -msgstr "" - #: ../share/extensions/color_blackandwhite.inx.h:1 msgid "Black and White" msgstr "" @@ -28019,6 +28380,49 @@ msgstr "" msgid "Grayscale" msgstr "" +#: ../share/extensions/color_HSL_adjust.inx.h:1 +msgid "HSL Adjust" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:3 +msgid "Hue (°)" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:4 +msgid "Random hue" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:6 +#, no-c-format +msgid "Saturation (%)" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:7 +msgid "Random saturation" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:9 +#, no-c-format +msgid "Lightness (%)" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:10 +msgid "Random lightness" +msgstr "" + +#: ../share/extensions/color_HSL_adjust.inx.h:13 +#, no-c-format +msgid "" +"Adjusts hue, saturation and lightness in the HSL representation of the " +"selected objects's color.\n" +"Options:\n" +" * Hue: rotate by degrees (wraps around).\n" +" * Saturation: add/subtract % (min=-100, max=100).\n" +" * Lightness: add/subtract % (min=-100, max=100).\n" +" * Random Hue/Saturation/Lightness: randomize the parameter's value.\n" +" " +msgstr "" + #: ../share/extensions/color_lesshue.inx.h:1 msgid "Less Hue" msgstr "" @@ -29537,7 +29941,11 @@ msgstr "" msgid "Save Background" msgstr "" -#: ../share/extensions/gimp_xcf.inx.h:7 +#: ../share/extensions/gimp_xcf.inx.h:6 +msgid "File Resolution:" +msgstr "" + +#: ../share/extensions/gimp_xcf.inx.h:8 msgid "" "This extension exports the document to Gimp XCF format according to the " "following options:\n" @@ -29545,13 +29953,14 @@ msgid "" " * Save Grid: convert the first rectangular grid to a Gimp grid (note " "that the default Inkscape grid is very narrow when shown in Gimp).\n" " * Save Background: add the document background to each converted layer.\n" +" * File Resolution: XCF file resolution, in DPI.\n" "\n" "Each first level layer is converted to a Gimp layer. Sublayers are " "concatenated and converted with their first level parent layer into a single " "Gimp layer." msgstr "" -#: ../share/extensions/gimp_xcf.inx.h:13 +#: ../share/extensions/gimp_xcf.inx.h:15 msgid "GIMP XCF maintaining layers (*.xcf)" msgstr "" @@ -30325,26 +30734,6 @@ msgstr "" msgid "SVG 1.1 Specification" msgstr "" -#: ../share/extensions/interp.inx.h:1 -msgid "Interpolate" -msgstr "" - -#: ../share/extensions/interp.inx.h:3 -msgid "Interpolation steps:" -msgstr "" - -#: ../share/extensions/interp.inx.h:4 -msgid "Interpolation method:" -msgstr "" - -#: ../share/extensions/interp.inx.h:5 -msgid "Duplicate endpaths" -msgstr "" - -#: ../share/extensions/interp.inx.h:6 -msgid "Interpolate style" -msgstr "" - #: ../share/extensions/interp_att_g.inx.h:1 msgid "Interpolate Attribute in a group" msgstr "" @@ -30432,6 +30821,26 @@ msgid "" "selection." msgstr "" +#: ../share/extensions/interp.inx.h:1 +msgid "Interpolate" +msgstr "" + +#: ../share/extensions/interp.inx.h:3 +msgid "Interpolation steps:" +msgstr "" + +#: ../share/extensions/interp.inx.h:4 +msgid "Interpolation method:" +msgstr "" + +#: ../share/extensions/interp.inx.h:5 +msgid "Duplicate endpaths" +msgstr "" + +#: ../share/extensions/interp.inx.h:6 +msgid "Interpolate style" +msgstr "" + #: ../share/extensions/jessyInk_autoTexts.inx.h:1 msgid "Auto-texts" msgstr "" @@ -31790,10 +32199,6 @@ msgstr "" msgid "View Previous Glyph" msgstr "" -#: ../share/extensions/print_win32_vector.inx.h:1 -msgid "Win32 Vector Print" -msgstr "" - #: ../share/extensions/printing_marks.inx.h:1 msgid "Printing Marks" msgstr "" @@ -31838,6 +32243,10 @@ msgstr "" msgid "Bleed Margin" msgstr "" +#: ../share/extensions/print_win32_vector.inx.h:1 +msgid "Win32 Vector Print" +msgstr "" + #: ../share/extensions/ps_input.inx.h:1 msgid "PostScript Input" msgstr "" @@ -31876,39 +32285,39 @@ msgstr "" msgid "Alphabet Soup" msgstr "" -#: ../share/extensions/render_barcode.inx.h:1 -msgid "Classic" -msgstr "" - -#: ../share/extensions/render_barcode.inx.h:2 -msgid "Barcode Type:" +#: ../share/extensions/render_barcode_datamatrix.inx.h:1 +msgid "Datamatrix" msgstr "" -#: ../share/extensions/render_barcode.inx.h:3 -msgid "Barcode Data:" +#: ../share/extensions/render_barcode_datamatrix.inx.h:3 +#: ../share/extensions/render_barcode_qrcode.inx.h:4 +msgid "Size, in unit squares:" msgstr "" -#: ../share/extensions/render_barcode.inx.h:4 -msgid "Bar Height:" +#: ../share/extensions/render_barcode_datamatrix.inx.h:4 +msgid "Square Size (px):" msgstr "" -#: ../share/extensions/render_barcode.inx.h:6 #: ../share/extensions/render_barcode_datamatrix.inx.h:6 +#: ../share/extensions/render_barcode.inx.h:6 #: ../share/extensions/render_barcode_qrcode.inx.h:19 msgid "Barcode" msgstr "" -#: ../share/extensions/render_barcode_datamatrix.inx.h:1 -msgid "Datamatrix" +#: ../share/extensions/render_barcode.inx.h:1 +msgid "Classic" msgstr "" -#: ../share/extensions/render_barcode_datamatrix.inx.h:3 -#: ../share/extensions/render_barcode_qrcode.inx.h:4 -msgid "Size, in unit squares:" +#: ../share/extensions/render_barcode.inx.h:2 +msgid "Barcode Type:" msgstr "" -#: ../share/extensions/render_barcode_datamatrix.inx.h:4 -msgid "Square Size (px):" +#: ../share/extensions/render_barcode.inx.h:3 +msgid "Barcode Data:" +msgstr "" + +#: ../share/extensions/render_barcode.inx.h:4 +msgid "Bar Height:" msgstr "" #: ../share/extensions/render_barcode_qrcode.inx.h:1 @@ -32920,49 +33329,13 @@ msgid "" msgstr "" #: ../share/extensions/web-set-att.inx.h:29 -#: ../share/extensions/web-transmit-att.inx.h:27 #: ../share/extensions/webslicer_create_group.inx.h:13 #: ../share/extensions/webslicer_create_rect.inx.h:41 #: ../share/extensions/webslicer_export.inx.h:8 +#: ../share/extensions/web-transmit-att.inx.h:27 msgid "Web" msgstr "" -#: ../share/extensions/web-transmit-att.inx.h:1 -msgid "Transmit Attributes" -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:3 -msgid "Attribute to transmit:" -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:4 -msgid "When to transmit:" -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:6 -msgid "Source and destination of transmitting:" -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:21 -msgid "All selected ones transmit to the last one" -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:22 -msgid "The first selected transmits to all others" -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:25 -msgid "" -"This effect transmits one or more attributes from the first selected element " -"to the second when an event occurs." -msgstr "" - -#: ../share/extensions/web-transmit-att.inx.h:26 -msgid "" -"If you want to transmit more than one attribute, you should separate this " -"with a space, and only with a space." -msgstr "" - #: ../share/extensions/webslicer_create_group.inx.h:1 msgid "Set a layout group" msgstr "" @@ -33165,6 +33538,42 @@ msgid "" "configured and saved to one directory." msgstr "" +#: ../share/extensions/web-transmit-att.inx.h:1 +msgid "Transmit Attributes" +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:3 +msgid "Attribute to transmit:" +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:4 +msgid "When to transmit:" +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:6 +msgid "Source and destination of transmitting:" +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:21 +msgid "All selected ones transmit to the last one" +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:22 +msgid "The first selected transmits to all others" +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:25 +msgid "" +"This effect transmits one or more attributes from the first selected element " +"to the second when an event occurs." +msgstr "" + +#: ../share/extensions/web-transmit-att.inx.h:26 +msgid "" +"If you want to transmit more than one attribute, you should separate this " +"with a space, and only with a space." +msgstr "" + #: ../share/extensions/whirl.inx.h:1 msgid "Whirl" msgstr "" diff --git a/share/palettes/README b/share/palettes/README index 8b04470b7..b6e7fd759 100644 --- a/share/palettes/README +++ b/share/palettes/README @@ -1,4 +1,11 @@ This is the directory with the Inkscape color palettes. They are in Gimp format (.gpl). Within Inkscape, they can be accessed by a drop-down menu in the Swatches -dialog (Ctrl+Shift+W). \ No newline at end of file +dialog (Ctrl+Shift+W). + +Internationalization + +This file is internationalized the same way as share/filters/filters/svg +The i18n.py script called from the makefile will extract strings from the *.svg +into a *.svg.h file. Intltool is then able to extracts these strings just like +from normal .h files. diff --git a/share/templates/Makefile.am b/share/templates/Makefile.am index 02acbfcf5..41c6a3f84 100644 --- a/share/templates/Makefile.am +++ b/share/templates/Makefile.am @@ -10,7 +10,7 @@ templates_DATA = \ business_card_85x54mm.svg \ business_card_90x50mm.svg \ CD_cover_300dpi.svg \ - CD_label_120x120.svg \ + CD_label_120x120.svg \ DVD_cover_regular_300dpi.svg \ DVD_cover_slim_300dpi.svg \ DVD_cover_superslim_300dpi.svg \ @@ -30,7 +30,62 @@ templates_DATA = \ default.ja.svg \ default.lt.svg \ default.nl.svg \ - default.pl.svg \ + default.pl.svg \ + default.pt_BR.svg \ + default.sk.svg \ + default_mm.svg \ + default_pt.svg \ + desktop_1024x768.svg \ + desktop_1600x1200.svg \ + desktop_640x480.svg \ + desktop_800x600.svg \ + fontforge_glyph.svg \ + icon_16x16.svg \ + icon_32x32.svg \ + icon_48x48.svg \ + icon_64x64.svg \ + Letter_landscape.svg \ + Letter.svg \ + no_borders.svg \ + no_layers.svg \ + video_HDTV_1920x1080.svg \ + video_NTSC_720x486.svg \ + video_PAL_720x576.svg \ + web_banner_468x60.svg \ + web_banner_728x90.svg \ + LaTeX_Beamer.svg \ + Typography_Canvas.svg \ + templates.h + +templates_i18n = \ + A4_landscape.svg \ + A4.svg \ + black_opaque.svg \ + white_opaque.svg \ + business_card_85x54mm.svg \ + business_card_90x50mm.svg \ + CD_cover_300dpi.svg \ + CD_label_120x120.svg \ + DVD_cover_regular_300dpi.svg \ + DVD_cover_slim_300dpi.svg \ + DVD_cover_superslim_300dpi.svg \ + DVD_cover_ultraslim_300dpi.svg \ + default.svg \ + default.be.svg \ + default.ca.svg \ + default.cs.svg \ + default.de.svg \ + default.eo.svg \ + default.eu.svg \ + default.es.svg \ + default.fi.svg \ + default.fr.svg \ + default.hu.svg \ + default.it.svg \ + default.ja.svg \ + default.lt.svg \ + default.nl.svg \ + default.pl.svg \ default.pt_BR.svg \ default.sk.svg \ default_mm.svg \ @@ -56,5 +111,9 @@ templates_DATA = \ LaTeX_Beamer.svg \ Typography_Canvas.svg +templates.h: i18n.py $(templates_i18n) + $(srcdir)/i18n.py $(foreach i,$(templates_i18n),$(srcdir)/$(i)) > $(srcdir)/templates.h -EXTRA_DIST = $(templates_DATA) +EXTRA_DIST = $(templates_DATA) \ + i18n.py + diff --git a/share/templates/README b/share/templates/README index c611da431..2959dd6a6 100644 --- a/share/templates/README +++ b/share/templates/README @@ -10,3 +10,9 @@ different languages. The default.svg itself is in English. These translations co a translated name of the default layer and possibly different canvas size. Each language version of Inkscape will only use one of these templates and ignore the rest. +Internationalization + +This file is internationalized the same way as share/filters/filters/svg +The i18n.py script called from the makefile will extract strings from the *.svg +into a *.svg.h file. Intltool is then able to extracts these strings just like +from normal .h files. diff --git a/share/templates/i18n.py b/share/templates/i18n.py new file mode 100755 index 000000000..6180d2546 --- /dev/null +++ b/share/templates/i18n.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +from xml.dom import minidom +import sys + +elements = ["inkscape:_name", "inkscape:_shortdesc", "inkscape:_keywords"] + +sys.stdout.write("char * stringlst = [") + +for filename in sys.argv[1:]: + doc = minidom.parse(filename) + templates = doc.getElementsByTagName('inkscape:_templateinfo') + + if templates: + for element in elements: + lines = templates[0].getElementsByTagName(element) + if lines: + sys.stdout.write("N_(\"" + lines[0].firstChild.nodeValue + "\"),") + +sys.stdout.write("];") diff --git a/src/ui/dialog/template-load-tab.cpp b/src/ui/dialog/template-load-tab.cpp index 1b9b734fc..4f2d51ef7 100644 --- a/src/ui/dialog/template-load-tab.cpp +++ b/src/ui/dialog/template-load-tab.cpp @@ -291,26 +291,26 @@ void TemplateLoadTab::_getDataFromNode(Inkscape::XML::Node *dataNode, TemplateDa { Inkscape::XML::Node *currentData; if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:_name")) != NULL) - data.display_name = dgettext("Document template name", currentData->firstChild()->content()); + data.display_name = _(currentData->firstChild()->content()); if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:author")) != NULL) data.author = currentData->firstChild()->content(); if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:_shortdesc")) != NULL) - data.short_description = dgettext("Document template short description", currentData->firstChild()->content()); + data.short_description = _( currentData->firstChild()->content()); if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:_long") )!= NULL) - data.long_description = dgettext("Document template long description", currentData->firstChild()->content()); + data.long_description = _(currentData->firstChild()->content()); if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:preview")) != NULL) data.preview_name = currentData->firstChild()->content(); if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:date")) != NULL) data.creation_date = currentData->firstChild()->content(); if ((currentData = sp_repr_lookup_name(dataNode, "inkscape:_keywords")) != NULL){ - Glib::ustring tplKeywords = currentData->firstChild()->content(); + Glib::ustring tplKeywords = _(currentData->firstChild()->content()); while (!tplKeywords.empty()){ std::size_t pos = tplKeywords.find_first_of(" "); if (pos == Glib::ustring::npos) pos = tplKeywords.size(); - Glib::ustring keyword = dgettext("Document template keyword", tplKeywords.substr(0, pos).data()); + Glib::ustring keyword = tplKeywords.substr(0, pos).data(); data.keywords.insert(keyword.lowercase()); _keywords.insert(keyword.lowercase()); -- cgit v1.2.3 From c3192e6f74fdb061313dca5c654f46010ded3c18 Mon Sep 17 00:00:00 2001 From: su_v Date: Thu, 16 Jan 2014 13:22:55 +0100 Subject: bzrignore: update ignore list to include new i18n file (follow-up to r12937) (bzr r12938) --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 1dc89336f..525926f76 100644 --- a/.bzrignore +++ b/.bzrignore @@ -145,6 +145,7 @@ share/screens/Makefile share/screens/Makefile.in share/templates/Makefile share/templates/Makefile.in +share/templates/templates.h share/tutorials/Makefile share/tutorials/Makefile.in share/ui/Makefile -- cgit v1.2.3 From b31224a81f04f0ff9b412983f2f35fa63c0e7e41 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Thu, 16 Jan 2014 12:20:34 -0500 Subject: Add the ability to load external documents in xlink:hrefs such as the use element. See bug #1269880 Fixed bugs: - https://launchpad.net/bugs/1269880 (bzr r12939) --- src/uri-references.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/uri-references.cpp b/src/uri-references.cpp index 2c09695d4..718b2d451 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -12,6 +12,7 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ +#include #include #include @@ -21,6 +22,7 @@ #include "uri-references.h" #include "extract-uri.h" +#include #include namespace Inkscape { @@ -45,15 +47,31 @@ URIReference::~URIReference() void URIReference::attach(const URI &uri) throw(BadURIException) { - SPDocument *document; + SPDocument *document = NULL; + + // Attempt to get the document that contains the URI if (_owner) { document = _owner->document; } else if (_owner_document) { document = _owner_document; - } else { - g_assert_not_reached(); } + // The path contains references to seperate document files to load. + const char *path = uri.getPath(); + if(path) { + if(document != NULL) { + // Calculate the absolute path from an available document + std::string basePath = std::string( document->getBase() ); + std::string absPath = Glib::build_filename(basePath, std::string( path ) ); + path = absPath.c_str(); + } + // TODO: This is inefficient because it will load the same svg file + // many times if it's used many times. A global list of documents would + // be useful for tracking linked items. + document = SPDocument::createNewDoc(path, FALSE); + } + g_return_if_fail(document != NULL); + gchar const *fragment = uri.getFragment(); if ( !uri.isRelative() || uri.getQuery() || !fragment ) { throw UnsupportedURIException(); -- cgit v1.2.3 From 096e6a7b96509afc811c4dafef94b53ccbb15638 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Thu, 16 Jan 2014 18:45:17 +0100 Subject: 2geom: remove accidentally forgotten debug message (bzr r12940) --- src/2geom/nearest-point.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/2geom/nearest-point.cpp b/src/2geom/nearest-point.cpp index 75e1ebaad..c5dfc133c 100644 --- a/src/2geom/nearest-point.cpp +++ b/src/2geom/nearest-point.cpp @@ -61,7 +61,7 @@ double nearest_point( Point const& p, } if (c.isConstant()) return from; SBasis dd = dot(c - p, dc); - std::cout << dd << std::endl; + //std::cout << dd << std::endl; std::vector zeros = Geom::roots(dd); double closest = from; -- cgit v1.2.3 From ca96c851e8a89543a49a96f2b02cd43fe3fb124c Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Thu, 16 Jan 2014 20:43:44 +0100 Subject: Fixing edit-clear icon in the star tool (partial fix for Bug #1269698). Fixed bugs: - https://launchpad.net/bugs/1269698 (bzr r12941) --- src/widgets/star-toolbar.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/widgets/star-toolbar.cpp b/src/widgets/star-toolbar.cpp index 1691a9b25..28b2c7e0c 100644 --- a/src/widgets/star-toolbar.cpp +++ b/src/widgets/star-toolbar.cpp @@ -568,13 +568,14 @@ void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje { /* Reset */ { - GtkAction* act = gtk_action_new( "StarResetAction", + InkAction* inky = ink_action_new( "StarResetAction", _("Defaults"), _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), - INKSCAPE_ICON("edit-clear")); - g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_stb_defaults), holder ); - gtk_action_group_add_action( mainActions, act ); - gtk_action_set_sensitive( act, TRUE ); + INKSCAPE_ICON("edit-clear"), + Inkscape::ICON_SIZE_SMALL_TOOLBAR); + g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_stb_defaults), holder ); + gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); + gtk_action_set_sensitive( GTK_ACTION(inky), TRUE ); } } -- cgit v1.2.3 From d41eb702951c69bfd362e70bd072a869bf73967a Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Thu, 16 Jan 2014 16:05:23 -0500 Subject: Clean up sp-image's read_image, remove duplicate code (bzr r12942) --- src/sp-image.cpp | 57 ++++++++++++++------------------------------------------ 1 file changed, 14 insertions(+), 43 deletions(-) diff --git a/src/sp-image.cpp b/src/sp-image.cpp index 8f7a60ca6..9044257f4 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -649,56 +649,27 @@ Inkscape::DrawingItem* SPImage::show(Inkscape::Drawing &drawing, unsigned int /* Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absref, gchar const *base) { Inkscape::Pixbuf *inkpb = 0; - gchar const *filename = href; - + if (filename != NULL) { if (strncmp (filename,"file:",5) == 0) { - gchar *fullname = g_filename_from_uri(filename, NULL, NULL); - if (fullname) { - inkpb = Inkscape::Pixbuf::create_from_file(fullname); - g_free(fullname); - if (inkpb != NULL) { - return inkpb; - } - } + filename = g_filename_from_uri(filename, NULL, NULL); } else if (strncmp (filename,"data:",5) == 0) { /* data URI - embedded image */ filename += 5; - inkpb = Inkscape::Pixbuf::create_from_data_uri(filename); - if (inkpb != NULL) { - return inkpb; - } - } else { - - if (!g_path_is_absolute (filename)) { - /* try to load from relative pos combined with document base*/ - const gchar *docbase = base; - if (!docbase) { - docbase = "."; - } - gchar *fullname = g_build_filename(docbase, filename, NULL); - - // document base can be wrong (on the temporary doc when importing bitmap from a - // different dir) or unset (when doc is not saved yet), so we check for base+href existence first, - // and if it fails, we also try to use bare href regardless of its g_path_is_absolute - if (g_file_test (fullname, G_FILE_TEST_EXISTS) && !g_file_test (fullname, G_FILE_TEST_IS_DIR)) { - inkpb = Inkscape::Pixbuf::create_from_file(fullname); - if (inkpb != NULL) { - g_free (fullname); - return inkpb; - } - } - g_free (fullname); - } + } else if (!g_path_is_absolute (filename)) { + /* try to load from relative pos combined with document base*/ + const gchar *docbase = base; + if (!docbase) docbase = "."; + filename = g_build_filename(docbase, filename, NULL); + } + } - /* try filename as absolute */ - if (g_file_test (filename, G_FILE_TEST_EXISTS) && !g_file_test (filename, G_FILE_TEST_IS_DIR)) { - inkpb = Inkscape::Pixbuf::create_from_file(filename); - if (inkpb != NULL) { - return inkpb; - } - } + if (filename && g_file_test(filename, G_FILE_TEST_EXISTS) ) { + inkpb = Inkscape::Pixbuf::create_from_file(filename); + if (inkpb != NULL) { + // g_free filename? + return inkpb; } } -- cgit v1.2.3 From 4531eff8dbddaabfb1c67d7907879480a8fd7309 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Thu, 16 Jan 2014 22:12:33 +0100 Subject: fix null pointer dereference (bzr r12943) --- src/ui/tools/gradient-tool.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp index e4ab7b424..10f78a8a8 100644 --- a/src/ui/tools/gradient-tool.cpp +++ b/src/ui/tools/gradient-tool.cpp @@ -339,10 +339,12 @@ sp_gradient_context_add_stops_between_selected_stops (GradientTool *rc) SPGradient *gradient = getGradient(d->item, d->fill_or_stroke); SPGradient *vector = sp_gradient_get_forked_vector_if_necessary (gradient, false); SPStop *this_stop = sp_get_stop_i (vector, d->point_i); - SPStop *next_stop = this_stop->getNextStop(); - if (this_stop && next_stop) { - these_stops = g_slist_prepend (these_stops, this_stop); - next_stops = g_slist_prepend (next_stops, next_stop); + if (this_stop) { + SPStop *next_stop = this_stop->getNextStop(); + if (next_stop) { + these_stops = g_slist_prepend (these_stops, this_stop); + next_stops = g_slist_prepend (next_stops, next_stop); + } } } } -- cgit v1.2.3 From 79faac5dcf70ef3c046787805959d1cbfe00af02 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Thu, 16 Jan 2014 22:25:19 +0100 Subject: prevent compiler warnings (bzr r12944) --- src/filters/mergenode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/filters/mergenode.cpp b/src/filters/mergenode.cpp index 1b06db706..ba237c776 100644 --- a/src/filters/mergenode.cpp +++ b/src/filters/mergenode.cpp @@ -45,7 +45,7 @@ SPFeMergeNode::~SPFeMergeNode() { * our name must be associated with a repr via "sp_object_type_register". Best done through * sp-object-repr.cpp's repr_name_entries array. */ -void SPFeMergeNode::build(SPDocument *document, Inkscape::XML::Node *repr) { +void SPFeMergeNode::build(SPDocument */*document*/, Inkscape::XML::Node */*repr*/) { this->readAttr( "in" ); } -- cgit v1.2.3 From 47edb3f774f4eca0716960c66cdcdea3954c86b1 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Thu, 16 Jan 2014 22:31:43 -0500 Subject: More cleaning of the image tag handler and seperate filename from load. (bzr r12945) --- src/sp-image.cpp | 50 ++++++++++++++++++++++++-------------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/sp-image.cpp b/src/sp-image.cpp index 9044257f4..f4995ce31 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -24,6 +24,7 @@ #include <2geom/rect.h> #include <2geom/transforms.h> #include +#include #include "display/drawing-image.h" #include "display/cairo-utils.h" @@ -75,7 +76,7 @@ static void sp_image_set_curve(SPImage *image); -static Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absref, gchar const *base ); +gchar const *sp_image_repr_read_filename(gchar const *href, gchar const *absref, gchar const *base ); static void sp_image_update_arenaitem (SPImage *img, Inkscape::DrawingImage *ai); static void sp_image_update_canvas_image (SPImage *image); @@ -333,11 +334,26 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { if (this->href) { Inkscape::Pixbuf *pixbuf = NULL; - pixbuf = sp_image_repr_read_image ( + + gchar const* filename = sp_image_repr_read_filename ( this->getRepr()->attribute("xlink:href"), this->getRepr()->attribute("sodipodi:absref"), doc->getBase()); - + + if(filename && g_str_has_suffix(filename, ".svg")) { + // TODO: We want to deal with svg images properly. This + // space allows us to do so later. + g_warning("Including svg images tags is not yet supported."); + } else if (filename) { + pixbuf = Inkscape::Pixbuf::create_from_file(filename); + } else { + /* Nope: We do not find any valid pixmap file :-( */ + pixbuf = new Inkscape::Pixbuf( + gdk_pixbuf_new_from_xpm_data((const gchar **) brokenimage_xpm)); + + /* If the xpm doesn't load, our libraries are broken */ + g_assert (pixbuf != NULL); + } if (pixbuf) { // BLIP #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) @@ -646,9 +662,8 @@ Inkscape::DrawingItem* SPImage::show(Inkscape::Drawing &drawing, unsigned int /* return ai; } -Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absref, gchar const *base) +gchar const *sp_image_repr_read_filename(gchar const *href, gchar const *absref, gchar const *base) { - Inkscape::Pixbuf *inkpb = 0; gchar const *filename = href; if (filename != NULL) { @@ -666,37 +681,20 @@ Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absre } if (filename && g_file_test(filename, G_FILE_TEST_EXISTS) ) { - inkpb = Inkscape::Pixbuf::create_from_file(filename); - if (inkpb != NULL) { - // g_free filename? - return inkpb; - } + return filename; } /* at last try to load from sp absolute path name */ - filename = absref; - if (filename != NULL) { + if (absref != NULL && g_file_test(absref, G_FILE_TEST_EXISTS)) { // using absref is outside of SVG rules, so we must at least warn the user if ( base != NULL && href != NULL ) { g_warning (" did not resolve to a valid image file (base dir is %s), now trying sodipodi:absref=\"%s\"", href, base, absref); } else { g_warning ("xlink:href did not resolve to a valid image file, now trying sodipodi:absref=\"%s\"", absref); } - - inkpb = Inkscape::Pixbuf::create_from_file(filename); - if (inkpb != NULL) { - return inkpb; - } + return absref; } - /* Nope: We do not find any valid pixmap file :-( */ - GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **) brokenimage_xpm); - inkpb = new Inkscape::Pixbuf(pixbuf); - - /* It should be included xpm, so if it still does not does load, */ - /* our libraries are broken */ - g_assert (inkpb != NULL); - - return inkpb; + return NULL; } /* We assert that realpixbuf is either NULL or identical size to pixbuf */ -- cgit v1.2.3 From 90867e5163a560f8905badd1a91f1688b6d9b36c Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Fri, 17 Jan 2014 14:29:51 +0100 Subject: i18n. Symbols are now translatable (see Bug #1261198); POT file and French translation updated. (bzr r12946) --- .bzrignore | 7 +- CMakeScripts/cmake_consistency_check_config.py | 3 +- generate_POTFILES.sh | 3 + po/POTFILES.in | 1 + po/fr.po | 1773 +++++++++++++++++++++++- po/inkscape.pot | 1596 ++++++++++++++++++++- share/symbols/Makefile.am | 13 +- share/symbols/README | 6 + share/symbols/i18n.py | 16 + src/ui/dialog/symbols.cpp | 7 +- 10 files changed, 3302 insertions(+), 123 deletions(-) create mode 100644 share/symbols/README create mode 100755 share/symbols/i18n.py diff --git a/.bzrignore b/.bzrignore index 525926f76..a1b385474 100644 --- a/.bzrignore +++ b/.bzrignore @@ -112,8 +112,6 @@ share/extensions/alphabet_soup/Makefile share/extensions/alphabet_soup/Makefile.in share/extensions/ink2canvas/Makefile share/extensions/ink2canvas/Makefile.in -share/symbols/Makefile -share/symbols/Makefile.in share/extensions/test/Makefile share/extensions/xaml2svg/Makefile share/extensions/xaml2svg/Makefile.in @@ -138,11 +136,15 @@ share/markers/Makefile share/markers/Makefile.in share/palettes/Makefile share/palettes/Makefile.in +share/palettes/palettes.hs share/patterns/Makefile share/patterns/Makefile.in share/patterns/patterns.svg.h share/screens/Makefile share/screens/Makefile.in +share/symbols/Makefile +share/symbols/Makefile.in +share/symbols/symbols.h share/templates/Makefile share/templates/Makefile.in share/templates/templates.h @@ -208,7 +210,6 @@ src/svg/test-svg.cpp src/util/test-util.cpp src/xml/test-xml.cpp gc.log -share/palettes/palettes.h ltmain.sh backup.bzr mkinstalldirs diff --git a/CMakeScripts/cmake_consistency_check_config.py b/CMakeScripts/cmake_consistency_check_config.py index 3ee6d4449..24cb22002 100644 --- a/CMakeScripts/cmake_consistency_check_config.py +++ b/CMakeScripts/cmake_consistency_check_config.py @@ -40,8 +40,9 @@ IGNORE = ( # header files "share/filters/filters.svg.h", "share/palettes/palettes.h", - "share/palettes/palettes.h", "share/patterns/patterns.svg.h", + "share/templates/templates.h", + "share/symbols/symbols.h", "src/libcola/cycle_detector.h", "src/libnr/in-svg-plane-test.h", "src/libnr/nr-point-fns-test.h", diff --git a/generate_POTFILES.sh b/generate_POTFILES.sh index a5b8cb170..b3da403a1 100755 --- a/generate_POTFILES.sh +++ b/generate_POTFILES.sh @@ -22,6 +22,9 @@ rm -f po/POTFILES.in.new echo "share/filters/filters.svg.h" echo "share/palettes/palettes.h" echo "share/patterns/patterns.svg.h" + echo "share/symbols/symbols.h" + echo "share/templates/templates.h" + find src \( -name '*.cpp' -o -name '*.[ch]' \) -type f -print0 | xargs -0 egrep -l '(\<[QNC]?_|gettext) *\(' | sort find share/extensions -name '*.py' -type f -print0 | xargs -0 egrep -l '(\<[QNC]?_|gettext) *\(' | sort diff --git a/po/POTFILES.in b/po/POTFILES.in index 06d49864f..dd7f97f45 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -6,6 +6,7 @@ inkscape.desktop.in share/filters/filters.svg.h share/palettes/palettes.h share/patterns/patterns.svg.h +share/symbols/symbols.h share/templates/templates.h src/box3d.cpp src/color-profile.cpp diff --git a/po/fr.po b/po/fr.po index 5b8f9b7bb..d4b115916 100644 --- a/po/fr.po +++ b/po/fr.po @@ -17,8 +17,8 @@ msgid "" msgstr "" "Project-Id-Version: inkscape\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-15 19:06+0100\n" -"PO-Revision-Date: 2014-01-15 22:00+0100\n" +"POT-Creation-Date: 2014-01-17 13:35+0100\n" +"PO-Revision-Date: 2014-01-17 14:10+0100\n" "Last-Translator: Nicolas Dufour \n" "Language-Team: \n" "Language: \n" @@ -3232,6 +3232,1663 @@ msgstr "Textile (bitmap)" msgid "Old paint (bitmap)" msgstr "Peinture vieillie (bitmap)" +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:2 +msgctxt "Symbol" +msgid "AIGA Symbol Signs" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:3 +#: ../share/symbols/symbols.h:4 +msgctxt "Symbol" +msgid "Telephone" +msgstr "Téléphone" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:5 +#: ../share/symbols/symbols.h:6 +msgctxt "Symbol" +msgid "Mail" +msgstr "Courriel" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:7 +#: ../share/symbols/symbols.h:8 +#, fuzzy +msgctxt "Symbol" +msgid "Currency Exchange" +msgstr "Calque courant" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:9 +#: ../share/symbols/symbols.h:10 +#, fuzzy +msgctxt "Symbol" +msgid "Currency Exchange - Euro" +msgstr "Calque courant" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:11 +#: ../share/symbols/symbols.h:12 +msgctxt "Symbol" +msgid "Cashier" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:13 +#: ../share/symbols/symbols.h:14 +#, fuzzy +msgctxt "Symbol" +msgid "First Aid" +msgstr "Première diapositive :" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:15 +#: ../share/symbols/symbols.h:16 +#, fuzzy +msgctxt "Symbol" +msgid "Lost and Found" +msgstr "Objets trouvés" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:17 +#: ../share/symbols/symbols.h:18 +msgctxt "Symbol" +msgid "Coat Check" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:19 +#: ../share/symbols/symbols.h:20 +msgctxt "Symbol" +msgid "Bagage Lockers" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:21 +#: ../share/symbols/symbols.h:22 +msgctxt "Symbol" +msgid "Escalator" +msgstr "Escalator montant" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:23 +#: ../share/symbols/symbols.h:24 +msgctxt "Symbol" +msgid "Escalator Down" +msgstr "Escalator descendant" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:25 +#: ../share/symbols/symbols.h:26 +msgctxt "Symbol" +msgid "Escalator Up" +msgstr "Escalator montant" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:27 +#: ../share/symbols/symbols.h:28 +msgctxt "Symbol" +msgid "Stairs" +msgstr "Escaliers" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:29 +#: ../share/symbols/symbols.h:30 +msgctxt "Symbol" +msgid "Stairs Down" +msgstr "Escaliers descendants" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:31 +#: ../share/symbols/symbols.h:32 +msgctxt "Symbol" +msgid "Stairs Up" +msgstr "Escaliers montants" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:33 +#: ../share/symbols/symbols.h:34 +#, fuzzy +msgctxt "Symbol" +msgid "Elevator" +msgstr "Élévation" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:35 +#: ../share/symbols/symbols.h:36 +msgctxt "Symbol" +msgid "Toilets - Men" +msgstr "Toilettes - Hommes" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:37 +#: ../share/symbols/symbols.h:38 +msgctxt "Symbol" +msgid "Toilets - Women" +msgstr "Toilettes - Femmes" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:39 +#: ../share/symbols/symbols.h:40 +msgctxt "Symbol" +msgid "Toilets" +msgstr "Toilettes" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:41 +#: ../share/symbols/symbols.h:42 +#: ../share/symbols/symbols.h:217 +msgctxt "Symbol" +msgid "Nursery" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:43 +#: ../share/symbols/symbols.h:44 +msgctxt "Symbol" +msgid "Drinking Fountain" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:45 +#: ../share/symbols/symbols.h:46 +msgctxt "Symbol" +msgid "Waiting Room" +msgstr "Salle d'attente" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:47 +#: ../share/symbols/symbols.h:48 +msgctxt "Symbol" +msgid "Information" +msgstr "Information" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:49 +#: ../share/symbols/symbols.h:50 +#, fuzzy +msgctxt "Symbol" +msgid "Hotel Information" +msgstr "Information sur la page" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:51 +#: ../share/symbols/symbols.h:52 +#, fuzzy +msgctxt "Symbol" +msgid "Air Transportation" +msgstr "Transformation" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:53 +#: ../share/symbols/symbols.h:54 +#: ../share/symbols/symbols.h:308 +#, fuzzy +msgctxt "Symbol" +msgid "Heliport" +msgstr "Port sériel :" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:55 +#: ../share/symbols/symbols.h:56 +#: ../share/symbols/symbols.h:304 +msgctxt "Symbol" +msgid "Taxi" +msgstr "Taxi" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:57 +#: ../share/symbols/symbols.h:58 +msgctxt "Symbol" +msgid "Bus" +msgstr "Bus" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:59 +#: ../share/symbols/symbols.h:60 +#, fuzzy +msgctxt "Symbol" +msgid "Ground Transportation" +msgstr "Transformation" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:61 +#: ../share/symbols/symbols.h:62 +#, fuzzy +msgctxt "Symbol" +msgid "Rail Transportation" +msgstr "Transformation" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:63 +#: ../share/symbols/symbols.h:64 +#, fuzzy +msgctxt "Symbol" +msgid "Water Transportation" +msgstr "Transformation" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:65 +#: ../share/symbols/symbols.h:66 +#: ../share/symbols/symbols.h:306 +#, fuzzy +msgctxt "Symbol" +msgid "Car Rental" +msgstr "Location de vélo" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:67 +#: ../share/symbols/symbols.h:68 +#: ../share/symbols/symbols.h:218 +msgctxt "Symbol" +msgid "Restaurant" +msgstr "Restaurant" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:69 +#: ../share/symbols/symbols.h:70 +msgctxt "Symbol" +msgid "Coffeeshop" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:71 +#: ../share/symbols/symbols.h:72 +msgctxt "Symbol" +msgid "Bar" +msgstr "Bar" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:73 +#: ../share/symbols/symbols.h:74 +msgctxt "Symbol" +msgid "Shops" +msgstr "Boutiques" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:75 +#: ../share/symbols/symbols.h:76 +#, fuzzy +msgctxt "Symbol" +msgid "Barber Shop - Beauty Salon" +msgstr "Salon de beauté" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:77 +#: ../share/symbols/symbols.h:78 +msgctxt "Symbol" +msgid "Barber Shop" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:79 +#: ../share/symbols/symbols.h:80 +msgctxt "Symbol" +msgid "Beauty Salon" +msgstr "Salon de beauté" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:81 +#: ../share/symbols/symbols.h:82 +msgctxt "Symbol" +msgid "Ticket Purchase" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:83 +#: ../share/symbols/symbols.h:84 +msgctxt "Symbol" +msgid "Baggage Check In" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:85 +#: ../share/symbols/symbols.h:86 +msgctxt "Symbol" +msgid "Baggage Claim" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:87 +#: ../share/symbols/symbols.h:88 +msgctxt "Symbol" +msgid "Customs" +msgstr "Douane" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:89 +#: ../share/symbols/symbols.h:90 +msgctxt "Symbol" +msgid "Immigration" +msgstr "Immigration" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:91 +#: ../share/symbols/symbols.h:92 +#, fuzzy +msgctxt "Symbol" +msgid "Departing Flights" +msgstr "Hauteur de destination" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:93 +#: ../share/symbols/symbols.h:94 +#, fuzzy +msgctxt "Symbol" +msgid "Arriving Flights" +msgstr "Luminosité du grain" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:95 +#: ../share/symbols/symbols.h:96 +msgctxt "Symbol" +msgid "Smoking" +msgstr "Fumeur" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:97 +#: ../share/symbols/symbols.h:98 +#, fuzzy +msgctxt "Symbol" +msgid "No Smoking" +msgstr "Non fumeur" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:99 +#: ../share/symbols/symbols.h:100 +#: ../share/symbols/symbols.h:315 +#, fuzzy +msgctxt "Symbol" +msgid "Parking" +msgstr "Désactivé" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:101 +#: ../share/symbols/symbols.h:102 +msgctxt "Symbol" +msgid "No Parking" +msgstr "Non fumeur" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:103 +#: ../share/symbols/symbols.h:104 +msgctxt "Symbol" +msgid "No Dogs" +msgstr "Interdit aux chiens" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:105 +#: ../share/symbols/symbols.h:106 +msgctxt "Symbol" +msgid "No Entry" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:107 +#: ../share/symbols/symbols.h:108 +#: ../share/symbols/symbols.h:208 +msgctxt "Symbol" +msgid "Exit" +msgstr "Sortie" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:109 +#: ../share/symbols/symbols.h:110 +msgctxt "Symbol" +msgid "Fire Extinguisher" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:111 +#: ../share/symbols/symbols.h:112 +#, fuzzy +msgctxt "Symbol" +msgid "Right Arrow" +msgstr "Flèche vers la droite" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:113 +#: ../share/symbols/symbols.h:114 +#, fuzzy +msgctxt "Symbol" +msgid "Forward and Right Arrow" +msgstr "Flèche vers la droite" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:115 +#: ../share/symbols/symbols.h:116 +#, fuzzy +msgctxt "Symbol" +msgid "Up Arrow" +msgstr "Flèche vers le haut" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:117 +#: ../share/symbols/symbols.h:118 +#, fuzzy +msgctxt "Symbol" +msgid "Forward and Left Arrow" +msgstr "Flèche vers la gauche" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:119 +#: ../share/symbols/symbols.h:120 +#, fuzzy +msgctxt "Symbol" +msgid "Left Arrow" +msgstr "Flèche vers la gauche" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:121 +#: ../share/symbols/symbols.h:122 +#, fuzzy +msgctxt "Symbol" +msgid "Left and Down Arrow" +msgstr "Flèche vers le bas" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:123 +#: ../share/symbols/symbols.h:124 +#, fuzzy +msgctxt "Symbol" +msgid "Down Arrow" +msgstr "Flèche vers le bas" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:125 +#: ../share/symbols/symbols.h:126 +#, fuzzy +msgctxt "Symbol" +msgid "Right and Down Arrow" +msgstr "Flèche vers la droite" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:127 +#: ../share/symbols/symbols.h:128 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessable - 1996" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:129 +#: ../share/symbols/symbols.h:130 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessable" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:131 +#: ../share/symbols/symbols.h:132 +msgctxt "Symbol" +msgid "New Wheelchair Accessable" +msgstr "" + +#. Symbols: ././BalloonSymbols.svg +#: ../share/symbols/symbols.h:133 +msgctxt "Symbol" +msgid "Word Balloons" +msgstr "" + +#. Symbols: ././BalloonSymbols.svg +#: ../share/symbols/symbols.h:134 +msgctxt "Symbol" +msgid "Thought Balloon" +msgstr "" + +#. Symbols: ././BalloonSymbols.svg +#: ../share/symbols/symbols.h:135 +msgctxt "Symbol" +msgid "Dream Speaking" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:136 +msgctxt "Symbol" +msgid "Flow Chart Shapes" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:137 +#, fuzzy +msgctxt "Symbol" +msgid "Process" +msgstr "Post-processeur :" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:138 +msgctxt "Symbol" +msgid "Predefined Process" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:139 +msgctxt "Symbol" +msgid "Alternate Process" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:140 +#, fuzzy +msgctxt "Symbol" +msgid "Extract" +msgstr "Extraire" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:141 +#, fuzzy +msgctxt "Symbol" +msgid "Manual Input" +msgstr "Entrée EMF" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:142 +#, fuzzy +msgctxt "Symbol" +msgid "Merge" +msgstr "Fusionner" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:143 +msgctxt "Symbol" +msgid "Delay" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:144 +msgctxt "Symbol" +msgid "Data I/O" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:145 +#, fuzzy +msgctxt "Symbol" +msgid "Internal Storage" +msgstr "Pages intérieures" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:146 +msgctxt "Symbol" +msgid "Card" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:147 +#, fuzzy +msgctxt "Symbol" +msgid "Document" +msgstr "Document" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:148 +msgctxt "Symbol" +msgid "Direct Access Storage" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:149 +msgctxt "Symbol" +msgid "Stored Data" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:150 +msgctxt "Symbol" +msgid "Magnetic Disk (Database)" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:151 +msgctxt "Symbol" +msgid "Punched Tape" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:152 +#, fuzzy +msgctxt "Symbol" +msgid "Terminator" +msgstr "_Traducteurs" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:153 +#, fuzzy +msgctxt "Symbol" +msgid "Thick Arrow" +msgstr "Acrylique épaisse" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:154 +#, fuzzy +msgctxt "Symbol" +msgid "Transfer" +msgstr "Transformations" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:155 +#, fuzzy +msgctxt "Symbol" +msgid "Decision" +msgstr "Précision" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:156 +#, fuzzy +msgctxt "Symbol" +msgid "Flow Arrow" +msgstr "Région d'encadrement" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:157 +#, fuzzy +msgctxt "Symbol" +msgid "Circle Arrow" +msgstr "Cercle" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:158 +#, fuzzy +msgctxt "Symbol" +msgid "Off-Page Connector" +msgstr "Connecteur" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:159 +#, fuzzy +msgctxt "Symbol" +msgid "Connector" +msgstr "Connecteur" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:160 +#, fuzzy +msgctxt "Symbol" +msgid "Logical Or" +msgstr "Ou logique" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:161 +#, fuzzy +msgctxt "Symbol" +msgid "Logical And" +msgstr "Et logique" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:162 +#, fuzzy +msgctxt "Symbol" +msgid "Manual Operation" +msgstr "Opérateurs mathématiques" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:163 +#, fuzzy +msgctxt "Symbol" +msgid "Preparation" +msgstr "Pré-saturation" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:164 +#, fuzzy +msgctxt "Symbol" +msgid "Display" +msgstr "Ajustement de l'affichage" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:165 +msgctxt "Symbol" +msgid "Sort" +msgstr "Tri" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:166 +#, fuzzy +msgctxt "Symbol" +msgid "Collate" +msgstr "Chocolat 1" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:167 +msgctxt "Symbol" +msgid "Logic Symbols" +msgstr "Symboles logiques" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:168 +#, fuzzy +msgctxt "Symbol" +msgid "Xnor Gate" +msgstr "Porte " + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:169 +#, fuzzy +msgctxt "Symbol" +msgid "Xor Gate" +msgstr "Porte ou exclusif" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:170 +#, fuzzy +msgctxt "Symbol" +msgid "Nor Gate" +msgstr "Porte ou exclusif" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:171 +#, fuzzy +msgctxt "Symbol" +msgid "Or Gate" +msgstr "Porte ou" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:172 +#, fuzzy +msgctxt "Symbol" +msgid "Nand Gate" +msgstr "Porte " + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:173 +#, fuzzy +msgctxt "Symbol" +msgid "And Gate" +msgstr "Porte " + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:174 +msgctxt "Symbol" +msgid "Buffer" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:175 +#, fuzzy +msgctxt "Symbol" +msgid "Not Gate" +msgstr "Porte ou exclusif" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:176 +msgctxt "Symbol" +msgid "Buffer Small" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:177 +msgctxt "Symbol" +msgid "Not Gate Small" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:178 +#, fuzzy +msgctxt "Symbol" +msgid "Map Symbols" +msgstr "Déposer le symbole" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:179 +#, fuzzy +msgctxt "Symbol" +msgid "Bed and Breakfast" +msgstr "Rouge et vert" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:180 +msgctxt "Symbol" +msgid "Youth Hostel" +msgstr "Auberge de jeunesse" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:181 +#, fuzzy +msgctxt "Symbol" +msgid "Shelter" +msgstr "filtre" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:182 +msgctxt "Symbol" +msgid "Motel" +msgstr "Motel" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:183 +msgctxt "Symbol" +msgid "Hotel" +msgstr "Hôtel" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:184 +#, fuzzy +msgctxt "Symbol" +msgid "Hostel" +msgstr "Hôte" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:185 +#, fuzzy +msgctxt "Symbol" +msgid "Chalet" +msgstr "Palette" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:186 +msgctxt "Symbol" +msgid "Caravan Park" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:187 +#, fuzzy +msgctxt "Symbol" +msgid "Camping" +msgstr "Clapotis" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:188 +msgctxt "Symbol" +msgid "Alpine Hut" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:189 +msgctxt "Symbol" +msgid "Bench or Park" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:190 +#, fuzzy +msgctxt "Symbol" +msgid "Playground" +msgstr "Fond" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:191 +#, fuzzy +msgctxt "Symbol" +msgid "Fountain" +msgstr "Vitrail" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:192 +msgctxt "Symbol" +msgid "Library" +msgstr "Bibliothèque" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:193 +msgctxt "Symbol" +msgid "Town Hall" +msgstr "Mairie" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:194 +msgctxt "Symbol" +msgid "Court" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:195 +#, fuzzy +msgctxt "Symbol" +msgid "Fire Station / House" +msgstr "Relation :" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:196 +msgctxt "Symbol" +msgid "Police Station" +msgstr "Poste de police" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:197 +msgctxt "Symbol" +msgid "Prison" +msgstr "Prison" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:198 +msgctxt "Symbol" +msgid "Post Office" +msgstr "Bureau de poste" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:199 +msgctxt "Symbol" +msgid "Public Building" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:200 +msgctxt "Symbol" +msgid "Recycling" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:201 +#, fuzzy +msgctxt "Symbol" +msgid "Survey Point" +msgstr "Point de Gergonne" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:202 +msgctxt "Symbol" +msgid "Toll Booth" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:203 +#, fuzzy +msgctxt "Symbol" +msgid "Lift Gate" +msgstr "Porte ou" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:204 +#, fuzzy +msgctxt "Symbol" +msgid "Steps" +msgstr "Incréments" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:205 +msgctxt "Symbol" +msgid "Stile" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:206 +#, fuzzy +msgctxt "Symbol" +msgid "Kissing Gate" +msgstr "Glyphe manquant :" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:207 +#, fuzzy +msgctxt "Symbol" +msgid "Gate" +msgstr "Porte ou" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:209 +#, fuzzy +msgctxt "Symbol" +msgid "Entrance" +msgstr "Améliorer" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:210 +msgctxt "Symbol" +msgid "Cycle Barrier" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:211 +#, fuzzy +msgctxt "Symbol" +msgid "Cattle Grid" +msgstr "Grille cartésienne" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:212 +msgctxt "Symbol" +msgid "Bollard" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:213 +msgctxt "Symbol" +msgid "University" +msgstr "Université" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:214 +#, fuzzy +msgctxt "Symbol" +msgid "High/Secondary School" +msgstr "Flou secondaire :" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:215 +msgctxt "Symbol" +msgid "School" +msgstr "École" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:216 +msgctxt "Symbol" +msgid "Kindergatten" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:219 +msgctxt "Symbol" +msgid "Pub" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:220 +msgctxt "Symbol" +msgid "Deserts/Cakes Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:221 +msgctxt "Symbol" +msgid "Fast Food" +msgstr "Restauration rapide" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:222 +msgctxt "Symbol" +msgid "Public Tap/Water" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:223 +msgctxt "Symbol" +msgid "Cafe" +msgstr "Café" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:224 +msgctxt "Symbol" +msgid "Beer Garden" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:225 +msgctxt "Symbol" +msgid "Wine Bar" +msgstr "Bar à vin" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:226 +msgctxt "Symbol" +msgid "Opticians/Eye Doctors" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:227 +msgctxt "Symbol" +msgid "Dentist" +msgstr "Dentiste" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:228 +msgctxt "Symbol" +msgid "Veterinarian" +msgstr "Vétérinaire" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:229 +msgctxt "Symbol" +msgid "Drugs Dispensary" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:230 +msgctxt "Symbol" +msgid "Pharmacy" +msgstr "Pharmacie" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:231 +#, fuzzy +msgctxt "Symbol" +msgid "Accident & Emergency" +msgstr "Centre du cercle inscrit" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:232 +msgctxt "Symbol" +msgid "Hospital" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:233 +msgctxt "Symbol" +msgid "Doctors" +msgstr "Docteurs" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:234 +msgctxt "Symbol" +msgid "Scrub Land" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:235 +msgctxt "Symbol" +msgid "Swamp" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:236 +msgctxt "Symbol" +msgid "Hills" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:237 +msgctxt "Symbol" +msgid "Grass Land" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:238 +msgctxt "Symbol" +msgid "Deciduous Forest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:239 +msgctxt "Symbol" +msgid "Mixed Forest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:240 +msgctxt "Symbol" +msgid "Coniferous Forest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:241 +msgctxt "Symbol" +msgid "Church or Place of Worship" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:242 +msgctxt "Symbol" +msgid "Bank" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:243 +#, fuzzy +msgctxt "Symbol" +msgid "Power Lines" +msgstr "Rectiligne" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:244 +msgctxt "Symbol" +msgid "Watch Tower" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:245 +#, fuzzy +msgctxt "Symbol" +msgid "Transmitter" +msgstr "Transformer les motifs de remplissage" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:246 +msgctxt "Symbol" +msgid "Village" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:247 +#, fuzzy +msgctxt "Symbol" +msgid "Town" +msgstr "Mairie" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:248 +msgctxt "Symbol" +msgid "Hamlet" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:249 +msgctxt "Symbol" +msgid "City" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:250 +#, fuzzy +msgctxt "Symbol" +msgid "Peak" +msgstr "En arête" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:251 +#, fuzzy +msgctxt "Symbol" +msgid "Mountain Pass" +msgstr "Vitrail" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:252 +msgctxt "Symbol" +msgid "Mine" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:253 +msgctxt "Symbol" +msgid "Military Complex" +msgstr "Complexe militaire" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:254 +msgctxt "Symbol" +msgid "Embassy" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:255 +msgctxt "Symbol" +msgid "Toy Shop" +msgstr "Magasin de jouets" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:256 +msgctxt "Symbol" +msgid "Supermarket" +msgstr "Supermarché" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:257 +msgctxt "Symbol" +msgid "Jewlers" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:258 +msgctxt "Symbol" +msgid "Hairdressers" +msgstr "Coiffeur" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:259 +#, fuzzy +msgctxt "Symbol" +msgid "Greengrocer" +msgstr "Vert" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:260 +#, fuzzy +msgctxt "Symbol" +msgid "Gift Shop" +msgstr "Boutique" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:261 +#, fuzzy +msgctxt "Symbol" +msgid "Garden Center" +msgstr "Haut et centre" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:262 +msgctxt "Symbol" +msgid "Florist" +msgstr "Fleuriste" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:263 +msgctxt "Symbol" +msgid "Fish Monger" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:264 +msgctxt "Symbol" +msgid "Real Estate" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:265 +#, fuzzy +msgctxt "Symbol" +msgid "Hardware / DIY" +msgstr "Matériel" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:266 +msgctxt "Symbol" +msgid "Shop" +msgstr "Boutique" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:267 +#, fuzzy +msgctxt "Symbol" +msgid "Confectioner" +msgstr "Connecteurs" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:268 +msgctxt "Symbol" +msgid "Computer Shop" +msgstr "Magasin informatique" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:269 +#, fuzzy +msgctxt "Symbol" +msgid "Clothing" +msgstr "Lissage :" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:270 +msgctxt "Symbol" +msgid "Mechanic" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:271 +msgctxt "Symbol" +msgid "Car Dealer" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:272 +msgctxt "Symbol" +msgid "Butcher" +msgstr "Boucher" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:273 +#, fuzzy +msgctxt "Symbol" +msgid "Meat Shop" +msgstr "Boutique" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:274 +msgctxt "Symbol" +msgid "Bicycle Shop" +msgstr "Magasin de jouets" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:275 +msgctxt "Symbol" +msgid "Baker" +msgstr "Boulanger" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:276 +msgctxt "Symbol" +msgid "Off License / Liquor Store" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:277 +msgctxt "Symbol" +msgid "Wind Surfing" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:278 +msgctxt "Symbol" +msgid "Tennis" +msgstr "Tennis" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:279 +msgctxt "Symbol" +msgid "Outdoor Pool" +msgstr "Piscine extérieure" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:280 +msgctxt "Symbol" +msgid "Indoor Pool" +msgstr "Piscine couverte" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:281 +msgctxt "Symbol" +msgid "Skiing" +msgstr "Ski" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:282 +msgctxt "Symbol" +msgid "Sailing" +msgstr "Voile" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:283 +#, fuzzy +msgctxt "Symbol" +msgid "Leasure Center" +msgstr "Rétablir le centre" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:284 +#, fuzzy +msgctxt "Symbol" +msgid "Ice Skating" +msgstr "Satin" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:285 +msgctxt "Symbol" +msgid "Equine Sports" +msgstr "Sports équestres" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:286 +msgctxt "Symbol" +msgid "Rock Climbing" +msgstr "Escalade" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:287 +msgctxt "Symbol" +msgid "Gym" +msgstr "Gymnastique" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:288 +msgctxt "Symbol" +msgid "Golf" +msgstr "Golf" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:289 +#, fuzzy +msgctxt "Symbol" +msgid "Diving" +msgstr "Division" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:290 +msgctxt "Symbol" +msgid "Archery" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:291 +msgctxt "Symbol" +msgid "Zoo" +msgstr "Zoo" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:292 +msgctxt "Symbol" +msgid "Wreck" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:293 +#, fuzzy +msgctxt "Symbol" +msgid "Water Wheel" +msgstr "Roue" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:294 +msgctxt "Symbol" +msgid "Point of Interest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:295 +msgctxt "Symbol" +msgid "Theater" +msgstr "Théatre" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:296 +msgctxt "Symbol" +msgid "Park / Picnick Area" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:297 +msgctxt "Symbol" +msgid "Monument" +msgstr "Monument" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:298 +msgctxt "Symbol" +msgid "Intormation" +msgstr "Information" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:299 +msgctxt "Symbol" +msgid "Beach" +msgstr "Plage" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:300 +#, fuzzy +msgctxt "Symbol" +msgid "Battle Location" +msgstr "Localisation :" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:301 +msgctxt "Symbol" +msgid "Archaeology / Ruins" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:302 +msgctxt "Symbol" +msgid "Walking" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:303 +msgctxt "Symbol" +msgid "Train" +msgstr "Train" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:305 +msgctxt "Symbol" +msgid "Underground Rail" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:307 +msgctxt "Symbol" +msgid "Bike Rental" +msgstr "Location de vélo" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:309 +msgctxt "Symbol" +msgid "Carpool" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:310 +#, fuzzy +msgctxt "Symbol" +msgid "Flood Gate" +msgstr "Remplissage" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:311 +#, fuzzy +msgctxt "Symbol" +msgid "Shipping" +msgstr "Ruissellement" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:312 +#, fuzzy +msgctxt "Symbol" +msgid "Disabled Parking" +msgstr "Désactivé" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:313 +#, fuzzy +msgctxt "Symbol" +msgid "Paid Parking" +msgstr "Désactivé" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:314 +#, fuzzy +msgctxt "Symbol" +msgid "Bike Parking" +msgstr "Désactivé" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:316 +msgctxt "Symbol" +msgid "Marina" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:317 +#, fuzzy +msgctxt "Symbol" +msgid "Fuel Station" +msgstr "Relation :" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:318 +#, fuzzy +msgctxt "Symbol" +msgid "Bus Stop" +msgstr "_Arrêter" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:319 +#, fuzzy +msgctxt "Symbol" +msgid "Bus Station" +msgstr "Diminuer la saturation" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:320 +#, fuzzy +msgctxt "Symbol" +msgid "Airport" +msgstr "Importer" + #: ../share/templates/templates.h:1 msgid "A4 Landscape Page" msgstr "Page A4 paysage" @@ -5611,7 +7268,7 @@ msgstr "Fond :" #: ../src/extension/internal/filter/bumps.h:322 #: ../src/extension/internal/filter/transparency.h:57 #: ../src/filter-enums.cpp:29 -#: ../src/sp-image.cpp:616 +#: ../src/sp-image.cpp:632 msgid "Image" msgstr "Image" @@ -11147,7 +12804,7 @@ msgstr "Rien n'a été supprimé." #: ../src/selection-chemistry.cpp:421 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:75 #: ../src/ui/dialog/swatches.cpp:278 -#: ../src/ui/tools/text-tool.cpp:994 +#: ../src/ui/tools/text-tool.cpp:995 #: ../src/widgets/eraser-toolbar.cpp:110 #: ../src/widgets/gradient-toolbar.cpp:1196 #: ../src/widgets/gradient-toolbar.cpp:1210 @@ -11777,7 +13434,7 @@ msgstr "Texte encadré" #: ../src/sp-flowtext.cpp:298 #: ../src/sp-text.cpp:357 -#: ../src/ui/tools/text-tool.cpp:1599 +#: ../src/ui/tools/text-tool.cpp:1600 msgid " [truncated]" msgstr " [tronqué]" @@ -11821,16 +13478,16 @@ msgstr "horizontale, à %s" msgid "at %d degrees, through (%s,%s)" msgstr "à %d degrés, passe par (%s,%s)" -#: ../src/sp-image.cpp:624 +#: ../src/sp-image.cpp:640 msgid "embedded" msgstr "embarquée" -#: ../src/sp-image.cpp:632 +#: ../src/sp-image.cpp:648 #, fuzzy, c-format msgid "[bad reference]: %s" msgstr "Préférences des étoiles" -#: ../src/sp-image.cpp:633 +#: ../src/sp-image.cpp:649 #, fuzzy, c-format msgid "%d × %d: %s" msgstr "Image %d × %d : %s" @@ -12290,7 +13947,7 @@ msgid "Drag to draw a calligraphic stroke; with Ctrl to track a gu msgstr "Cliquer-déplacer pour calligraphier; Ctrl pour suivre un guide. Les flèches gauche/droite ajustent la largeur de la plume, haut/bas son angle." #: ../src/tools-switch.cpp:103 -#: ../src/ui/tools/text-tool.cpp:1626 +#: ../src/ui/tools/text-tool.cpp:1627 msgid "Click to select or create text, drag to create flowed text; then type." msgstr "Cliquer pour sélectionner ou créer un texte, cliquer-déplacer pour créer un texte encadré; puis taper le texte." @@ -19416,8 +21073,8 @@ msgid "Preview Text:" msgstr "Texte de l'aperçu :" #: ../src/ui/dialog/swatches.cpp:203 -#: ../src/ui/tools/gradient-tool.cpp:369 -#: ../src/ui/tools/gradient-tool.cpp:467 +#: ../src/ui/tools/gradient-tool.cpp:371 +#: ../src/ui/tools/gradient-tool.cpp:469 #: ../src/widgets/gradient-vector.cpp:814 msgid "Add gradient stop" msgstr "Ajouter un stop au dégradé" @@ -19565,7 +21222,7 @@ msgstr "Décalage magenta" #: ../src/ui/dialog/text-edit.cpp:588 #: ../src/ui/dialog/text-edit.cpp:662 -#: ../src/ui/tools/text-tool.cpp:1487 +#: ../src/ui/tools/text-tool.cpp:1488 msgid "Set text style" msgstr "Appliquer un style à un texte" @@ -20697,28 +22354,28 @@ msgid_plural "No gradient handles selected out of %d on %d selected objec msgstr[0] "Aucune poignée sélectionnée sur %d dans %d objet sélectionné" msgstr[1] "Aucune poignée sélectionnée sur %d dans %d objets sélectionnés" -#: ../src/ui/tools/gradient-tool.cpp:442 +#: ../src/ui/tools/gradient-tool.cpp:444 msgid "Simplify gradient" msgstr "Simplifier le dégradé" -#: ../src/ui/tools/gradient-tool.cpp:518 +#: ../src/ui/tools/gradient-tool.cpp:520 msgid "Create default gradient" msgstr "Créer un dégradé par défaut" -#: ../src/ui/tools/gradient-tool.cpp:577 +#: ../src/ui/tools/gradient-tool.cpp:579 #: ../src/ui/tools/mesh-tool.cpp:572 msgid "Draw around handles to select them" msgstr "Dessiner autour des poignées pour les sélectionner" -#: ../src/ui/tools/gradient-tool.cpp:700 +#: ../src/ui/tools/gradient-tool.cpp:702 msgid "Ctrl: snap gradient angle" msgstr "Ctrl : pour forcer la modification de l'inclinaison du dégradé par incréments" -#: ../src/ui/tools/gradient-tool.cpp:701 +#: ../src/ui/tools/gradient-tool.cpp:703 msgid "Shift: draw gradient around the starting point" msgstr "Maj : pour dessiner le dégradé autour du point de départ" -#: ../src/ui/tools/gradient-tool.cpp:955 +#: ../src/ui/tools/gradient-tool.cpp:957 #: ../src/ui/tools/mesh-tool.cpp:995 #, c-format msgid "Gradient for %d object; with Ctrl to snap angle" @@ -20726,7 +22383,7 @@ msgid_plural "Gradient for %d objects; with Ctrl to snap angle" msgstr[0] "Dégradé appliqué à %d objet; déplacer avec Ctrl pour forcer la modification de l'inclinaison par incréments" msgstr[1] "Dégradé appliqué à %d objets; déplacer avec Ctrl pour forcer la modification de l'inclinaison par incréments" -#: ../src/ui/tools/gradient-tool.cpp:959 +#: ../src/ui/tools/gradient-tool.cpp:961 #: ../src/ui/tools/mesh-tool.cpp:999 msgid "Select objects on which to create gradient." msgstr "Sélectionner des objets auxquels appliquer un dégradé." @@ -21081,140 +22738,140 @@ msgstr "Étoile : rayon %s, angle %5g° ; Ctrl pour tourner/ msgid "Create star" msgstr "Créer une étoile" -#: ../src/ui/tools/text-tool.cpp:392 +#: ../src/ui/tools/text-tool.cpp:393 msgid "Click to edit the text, drag to select part of the text." msgstr "Cliquer pour éditer le texte, cliquer-déplacer pour sélectionner une partie du texte." -#: ../src/ui/tools/text-tool.cpp:394 +#: ../src/ui/tools/text-tool.cpp:395 msgid "Click to edit the flowed text, drag to select part of the text." msgstr "Cliquer pour éditer le texte encadré, cliquer-déplacer pour sélectionner une partie du texte." -#: ../src/ui/tools/text-tool.cpp:448 +#: ../src/ui/tools/text-tool.cpp:449 msgid "Create text" msgstr "Créer un texte" -#: ../src/ui/tools/text-tool.cpp:473 +#: ../src/ui/tools/text-tool.cpp:474 msgid "Non-printable character" msgstr "Caractère non imprimable" -#: ../src/ui/tools/text-tool.cpp:488 +#: ../src/ui/tools/text-tool.cpp:489 msgid "Insert Unicode character" msgstr "Insérer un caractère Unicode" -#: ../src/ui/tools/text-tool.cpp:523 +#: ../src/ui/tools/text-tool.cpp:524 #, c-format msgid "Unicode (Enter to finish): %s: %s" msgstr "Unicode (Entrée pour terminer) : %s: %s" -#: ../src/ui/tools/text-tool.cpp:525 -#: ../src/ui/tools/text-tool.cpp:832 +#: ../src/ui/tools/text-tool.cpp:526 +#: ../src/ui/tools/text-tool.cpp:833 msgid "Unicode (Enter to finish): " msgstr "Unicode (Entrée pour terminer) : " -#: ../src/ui/tools/text-tool.cpp:608 +#: ../src/ui/tools/text-tool.cpp:609 #, c-format msgid "Flowed text frame: %s × %s" msgstr "Cadre de texte : %s × %s" -#: ../src/ui/tools/text-tool.cpp:666 +#: ../src/ui/tools/text-tool.cpp:667 msgid "Type text; Enter to start new line." msgstr "Taper le texte ; Entrée pour commencer une nouvelle ligne." -#: ../src/ui/tools/text-tool.cpp:677 +#: ../src/ui/tools/text-tool.cpp:678 msgid "Flowed text is created." msgstr "Le texte encadré est créé." -#: ../src/ui/tools/text-tool.cpp:679 +#: ../src/ui/tools/text-tool.cpp:680 msgid "Create flowed text" msgstr "Créer un texte encadré" -#: ../src/ui/tools/text-tool.cpp:681 +#: ../src/ui/tools/text-tool.cpp:682 msgid "The frame is too small for the current font size. Flowed text not created." msgstr "Le cadre est trop petit pour la taille de police courante. Le texte encadré n'a pas été créé." -#: ../src/ui/tools/text-tool.cpp:817 +#: ../src/ui/tools/text-tool.cpp:818 msgid "No-break space" msgstr "Espace insécable" -#: ../src/ui/tools/text-tool.cpp:819 +#: ../src/ui/tools/text-tool.cpp:820 msgid "Insert no-break space" msgstr "Insérer un espace insécable" -#: ../src/ui/tools/text-tool.cpp:856 +#: ../src/ui/tools/text-tool.cpp:857 msgid "Make bold" msgstr "Rendre gras" -#: ../src/ui/tools/text-tool.cpp:874 +#: ../src/ui/tools/text-tool.cpp:875 msgid "Make italic" msgstr "Rendre italique" -#: ../src/ui/tools/text-tool.cpp:913 +#: ../src/ui/tools/text-tool.cpp:914 msgid "New line" msgstr "Nouvelle ligne" -#: ../src/ui/tools/text-tool.cpp:955 +#: ../src/ui/tools/text-tool.cpp:956 msgid "Backspace" msgstr "Retour arrière" -#: ../src/ui/tools/text-tool.cpp:1011 +#: ../src/ui/tools/text-tool.cpp:1012 msgid "Kern to the left" msgstr "Créner vers la gauche" -#: ../src/ui/tools/text-tool.cpp:1036 +#: ../src/ui/tools/text-tool.cpp:1037 msgid "Kern to the right" msgstr "Créner vers la droite" -#: ../src/ui/tools/text-tool.cpp:1061 +#: ../src/ui/tools/text-tool.cpp:1062 msgid "Kern up" msgstr "Créner vers le haut" -#: ../src/ui/tools/text-tool.cpp:1086 +#: ../src/ui/tools/text-tool.cpp:1087 msgid "Kern down" msgstr "Créner vers le bas" -#: ../src/ui/tools/text-tool.cpp:1162 +#: ../src/ui/tools/text-tool.cpp:1163 msgid "Rotate counterclockwise" msgstr "Tourner dans le sens anti-horaire" -#: ../src/ui/tools/text-tool.cpp:1183 +#: ../src/ui/tools/text-tool.cpp:1184 msgid "Rotate clockwise" msgstr "Tourner dans le sens horaire" -#: ../src/ui/tools/text-tool.cpp:1200 +#: ../src/ui/tools/text-tool.cpp:1201 msgid "Contract line spacing" msgstr "Diminuer l'espacement entre les lignes" -#: ../src/ui/tools/text-tool.cpp:1207 +#: ../src/ui/tools/text-tool.cpp:1208 msgid "Contract letter spacing" msgstr "Diminuer l'espacement des lettres" -#: ../src/ui/tools/text-tool.cpp:1225 +#: ../src/ui/tools/text-tool.cpp:1226 msgid "Expand line spacing" msgstr "Augmenter l'espacement entre les lignes" -#: ../src/ui/tools/text-tool.cpp:1232 +#: ../src/ui/tools/text-tool.cpp:1233 msgid "Expand letter spacing" msgstr "Augmenter l'espacement des lettres" -#: ../src/ui/tools/text-tool.cpp:1362 +#: ../src/ui/tools/text-tool.cpp:1363 msgid "Paste text" msgstr "Coller le texte" -#: ../src/ui/tools/text-tool.cpp:1616 +#: ../src/ui/tools/text-tool.cpp:1617 #, c-format msgid "Type or edit flowed text (%d character%s); Enter to start new paragraph." msgid_plural "Type or edit flowed text (%d characters%s); Enter to start new paragraph." msgstr[0] "Saisir ou modifier le texte encadré (%d caractère%s) ; Entrée pour commencer un nouveau paragraphe." msgstr[1] "Saisir ou modifier le texte encadré (%d caractères%s) ; Entrée pour commencer un nouveau paragraphe." -#: ../src/ui/tools/text-tool.cpp:1618 +#: ../src/ui/tools/text-tool.cpp:1619 #, c-format msgid "Type or edit text (%d character%s); Enter to start new line." msgid_plural "Type or edit text (%d characters%s); Enter to start new line." msgstr[0] "Saisir ou modifier le texte (%d caractère%s) ; Entrée pour commencer une nouvelle ligne." msgstr[1] "Saisir ou modifier le texte (%d caractères%s) ; Entrée pour commencer une nouvelle ligne." -#: ../src/ui/tools/text-tool.cpp:1728 +#: ../src/ui/tools/text-tool.cpp:1729 msgid "Type text" msgstr "Taper du texte" @@ -34515,9 +36172,6 @@ msgstr "Entrée XAML" #~ msgid "Dark version of non realistic smooth shading" #~ msgstr "Version sombre de l'ombrage doux non réaliste" -#~ msgid "Satin" -#~ msgstr "Satin" - #~ msgid "Silky close to mother of pearl shading" #~ msgstr "Soyeux, proche d'un rendu nacré" @@ -35150,9 +36804,6 @@ msgstr "Entrée XAML" #~ msgid "Primary blur:" #~ msgstr "Flou primaire :" -#~ msgid "Secondary blur:" -#~ msgstr "Flou secondaire :" - #, fuzzy #~ msgid "Smooth all" #~ msgstr "Adoucir" @@ -36088,12 +37739,6 @@ msgstr "Entrée XAML" #, fuzzy #~ msgctxt "Palette" -#~ msgid "Accent Green" -#~ msgstr "Centre du cercle inscrit" - -#, fuzzy -#~ msgctxt "Palette" - #~ msgid "Accent Green Base" #~ msgstr "Casse des phrases" diff --git a/po/inkscape.pot b/po/inkscape.pot index ada382aab..607bf4330 100644 --- a/po/inkscape.pot +++ b/po/inkscape.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-15 19:06+0100\n" +"POT-Creation-Date: 2014-01-17 13:35+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3223,6 +3223,1502 @@ msgstr "" msgid "Old paint (bitmap)" msgstr "" +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:2 +msgctxt "Symbol" +msgid "AIGA Symbol Signs" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:3 ../share/symbols/symbols.h:4 +msgctxt "Symbol" +msgid "Telephone" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:5 ../share/symbols/symbols.h:6 +msgctxt "Symbol" +msgid "Mail" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:7 ../share/symbols/symbols.h:8 +msgctxt "Symbol" +msgid "Currency Exchange" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:9 ../share/symbols/symbols.h:10 +msgctxt "Symbol" +msgid "Currency Exchange - Euro" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:11 ../share/symbols/symbols.h:12 +msgctxt "Symbol" +msgid "Cashier" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:13 ../share/symbols/symbols.h:14 +msgctxt "Symbol" +msgid "First Aid" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:15 ../share/symbols/symbols.h:16 +msgctxt "Symbol" +msgid "Lost and Found" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:17 ../share/symbols/symbols.h:18 +msgctxt "Symbol" +msgid "Coat Check" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:19 ../share/symbols/symbols.h:20 +msgctxt "Symbol" +msgid "Bagage Lockers" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:21 ../share/symbols/symbols.h:22 +msgctxt "Symbol" +msgid "Escalator" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:23 ../share/symbols/symbols.h:24 +msgctxt "Symbol" +msgid "Escalator Down" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:25 ../share/symbols/symbols.h:26 +msgctxt "Symbol" +msgid "Escalator Up" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:27 ../share/symbols/symbols.h:28 +msgctxt "Symbol" +msgid "Stairs" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:29 ../share/symbols/symbols.h:30 +msgctxt "Symbol" +msgid "Stairs Down" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:31 ../share/symbols/symbols.h:32 +msgctxt "Symbol" +msgid "Stairs Up" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:33 ../share/symbols/symbols.h:34 +msgctxt "Symbol" +msgid "Elevator" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:35 ../share/symbols/symbols.h:36 +msgctxt "Symbol" +msgid "Toilets - Men" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:37 ../share/symbols/symbols.h:38 +msgctxt "Symbol" +msgid "Toilets - Women" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:39 ../share/symbols/symbols.h:40 +msgctxt "Symbol" +msgid "Toilets" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:41 ../share/symbols/symbols.h:42 +#: ../share/symbols/symbols.h:217 +msgctxt "Symbol" +msgid "Nursery" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:43 ../share/symbols/symbols.h:44 +msgctxt "Symbol" +msgid "Drinking Fountain" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:45 ../share/symbols/symbols.h:46 +msgctxt "Symbol" +msgid "Waiting Room" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:47 ../share/symbols/symbols.h:48 +msgctxt "Symbol" +msgid "Information" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:49 ../share/symbols/symbols.h:50 +msgctxt "Symbol" +msgid "Hotel Information" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:51 ../share/symbols/symbols.h:52 +msgctxt "Symbol" +msgid "Air Transportation" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:53 ../share/symbols/symbols.h:54 +#: ../share/symbols/symbols.h:308 +msgctxt "Symbol" +msgid "Heliport" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:55 ../share/symbols/symbols.h:56 +#: ../share/symbols/symbols.h:304 +msgctxt "Symbol" +msgid "Taxi" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:57 ../share/symbols/symbols.h:58 +msgctxt "Symbol" +msgid "Bus" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:59 ../share/symbols/symbols.h:60 +msgctxt "Symbol" +msgid "Ground Transportation" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:61 ../share/symbols/symbols.h:62 +msgctxt "Symbol" +msgid "Rail Transportation" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:63 ../share/symbols/symbols.h:64 +msgctxt "Symbol" +msgid "Water Transportation" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:65 ../share/symbols/symbols.h:66 +#: ../share/symbols/symbols.h:306 +msgctxt "Symbol" +msgid "Car Rental" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:67 ../share/symbols/symbols.h:68 +#: ../share/symbols/symbols.h:218 +msgctxt "Symbol" +msgid "Restaurant" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:69 ../share/symbols/symbols.h:70 +msgctxt "Symbol" +msgid "Coffeeshop" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:71 ../share/symbols/symbols.h:72 +msgctxt "Symbol" +msgid "Bar" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:73 ../share/symbols/symbols.h:74 +msgctxt "Symbol" +msgid "Shops" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:75 ../share/symbols/symbols.h:76 +msgctxt "Symbol" +msgid "Barber Shop - Beauty Salon" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:77 ../share/symbols/symbols.h:78 +msgctxt "Symbol" +msgid "Barber Shop" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:79 ../share/symbols/symbols.h:80 +msgctxt "Symbol" +msgid "Beauty Salon" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:81 ../share/symbols/symbols.h:82 +msgctxt "Symbol" +msgid "Ticket Purchase" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:83 ../share/symbols/symbols.h:84 +msgctxt "Symbol" +msgid "Baggage Check In" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:85 ../share/symbols/symbols.h:86 +msgctxt "Symbol" +msgid "Baggage Claim" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:87 ../share/symbols/symbols.h:88 +msgctxt "Symbol" +msgid "Customs" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:89 ../share/symbols/symbols.h:90 +msgctxt "Symbol" +msgid "Immigration" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:91 ../share/symbols/symbols.h:92 +msgctxt "Symbol" +msgid "Departing Flights" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:93 ../share/symbols/symbols.h:94 +msgctxt "Symbol" +msgid "Arriving Flights" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:95 ../share/symbols/symbols.h:96 +msgctxt "Symbol" +msgid "Smoking" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:97 ../share/symbols/symbols.h:98 +msgctxt "Symbol" +msgid "No Smoking" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:99 ../share/symbols/symbols.h:100 +#: ../share/symbols/symbols.h:315 +msgctxt "Symbol" +msgid "Parking" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:101 ../share/symbols/symbols.h:102 +msgctxt "Symbol" +msgid "No Parking" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:103 ../share/symbols/symbols.h:104 +msgctxt "Symbol" +msgid "No Dogs" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:105 ../share/symbols/symbols.h:106 +msgctxt "Symbol" +msgid "No Entry" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:107 ../share/symbols/symbols.h:108 +#: ../share/symbols/symbols.h:208 +msgctxt "Symbol" +msgid "Exit" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:109 ../share/symbols/symbols.h:110 +msgctxt "Symbol" +msgid "Fire Extinguisher" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:111 ../share/symbols/symbols.h:112 +msgctxt "Symbol" +msgid "Right Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:113 ../share/symbols/symbols.h:114 +msgctxt "Symbol" +msgid "Forward and Right Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:115 ../share/symbols/symbols.h:116 +msgctxt "Symbol" +msgid "Up Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:117 ../share/symbols/symbols.h:118 +msgctxt "Symbol" +msgid "Forward and Left Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:119 ../share/symbols/symbols.h:120 +msgctxt "Symbol" +msgid "Left Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:121 ../share/symbols/symbols.h:122 +msgctxt "Symbol" +msgid "Left and Down Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:123 ../share/symbols/symbols.h:124 +msgctxt "Symbol" +msgid "Down Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:125 ../share/symbols/symbols.h:126 +msgctxt "Symbol" +msgid "Right and Down Arrow" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:127 ../share/symbols/symbols.h:128 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessable - 1996" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:129 ../share/symbols/symbols.h:130 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessable" +msgstr "" + +#. Symbols: ././AigaSymbols.svg +#: ../share/symbols/symbols.h:131 ../share/symbols/symbols.h:132 +msgctxt "Symbol" +msgid "New Wheelchair Accessable" +msgstr "" + +#. Symbols: ././BalloonSymbols.svg +#: ../share/symbols/symbols.h:133 +msgctxt "Symbol" +msgid "Word Balloons" +msgstr "" + +#. Symbols: ././BalloonSymbols.svg +#: ../share/symbols/symbols.h:134 +msgctxt "Symbol" +msgid "Thought Balloon" +msgstr "" + +#. Symbols: ././BalloonSymbols.svg +#: ../share/symbols/symbols.h:135 +msgctxt "Symbol" +msgid "Dream Speaking" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:136 +msgctxt "Symbol" +msgid "Flow Chart Shapes" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:137 +msgctxt "Symbol" +msgid "Process" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:138 +msgctxt "Symbol" +msgid "Predefined Process" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:139 +msgctxt "Symbol" +msgid "Alternate Process" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:140 +msgctxt "Symbol" +msgid "Extract" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:141 +msgctxt "Symbol" +msgid "Manual Input" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:142 +msgctxt "Symbol" +msgid "Merge" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:143 +msgctxt "Symbol" +msgid "Delay" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:144 +msgctxt "Symbol" +msgid "Data I/O" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:145 +msgctxt "Symbol" +msgid "Internal Storage" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:146 +msgctxt "Symbol" +msgid "Card" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:147 +msgctxt "Symbol" +msgid "Document" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:148 +msgctxt "Symbol" +msgid "Direct Access Storage" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:149 +msgctxt "Symbol" +msgid "Stored Data" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:150 +msgctxt "Symbol" +msgid "Magnetic Disk (Database)" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:151 +msgctxt "Symbol" +msgid "Punched Tape" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:152 +msgctxt "Symbol" +msgid "Terminator" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:153 +msgctxt "Symbol" +msgid "Thick Arrow" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:154 +msgctxt "Symbol" +msgid "Transfer" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:155 +msgctxt "Symbol" +msgid "Decision" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:156 +msgctxt "Symbol" +msgid "Flow Arrow" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:157 +msgctxt "Symbol" +msgid "Circle Arrow" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:158 +msgctxt "Symbol" +msgid "Off-Page Connector" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:159 +msgctxt "Symbol" +msgid "Connector" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:160 +msgctxt "Symbol" +msgid "Logical Or" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:161 +msgctxt "Symbol" +msgid "Logical And" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:162 +msgctxt "Symbol" +msgid "Manual Operation" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:163 +msgctxt "Symbol" +msgid "Preparation" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:164 +msgctxt "Symbol" +msgid "Display" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:165 +msgctxt "Symbol" +msgid "Sort" +msgstr "" + +#. Symbols: ././FlowSymbols.svg +#: ../share/symbols/symbols.h:166 +msgctxt "Symbol" +msgid "Collate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:167 +msgctxt "Symbol" +msgid "Logic Symbols" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:168 +msgctxt "Symbol" +msgid "Xnor Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:169 +msgctxt "Symbol" +msgid "Xor Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:170 +msgctxt "Symbol" +msgid "Nor Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:171 +msgctxt "Symbol" +msgid "Or Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:172 +msgctxt "Symbol" +msgid "Nand Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:173 +msgctxt "Symbol" +msgid "And Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:174 +msgctxt "Symbol" +msgid "Buffer" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:175 +msgctxt "Symbol" +msgid "Not Gate" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:176 +msgctxt "Symbol" +msgid "Buffer Small" +msgstr "" + +#. Symbols: ././LogicSymbols.svg +#: ../share/symbols/symbols.h:177 +msgctxt "Symbol" +msgid "Not Gate Small" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:178 +msgctxt "Symbol" +msgid "Map Symbols" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:179 +msgctxt "Symbol" +msgid "Bed and Breakfast" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:180 +msgctxt "Symbol" +msgid "Youth Hostel" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:181 +msgctxt "Symbol" +msgid "Shelter" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:182 +msgctxt "Symbol" +msgid "Motel" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:183 +msgctxt "Symbol" +msgid "Hotel" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:184 +msgctxt "Symbol" +msgid "Hostel" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:185 +msgctxt "Symbol" +msgid "Chalet" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:186 +msgctxt "Symbol" +msgid "Caravan Park" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:187 +msgctxt "Symbol" +msgid "Camping" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:188 +msgctxt "Symbol" +msgid "Alpine Hut" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:189 +msgctxt "Symbol" +msgid "Bench or Park" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:190 +msgctxt "Symbol" +msgid "Playground" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:191 +msgctxt "Symbol" +msgid "Fountain" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:192 +msgctxt "Symbol" +msgid "Library" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:193 +msgctxt "Symbol" +msgid "Town Hall" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:194 +msgctxt "Symbol" +msgid "Court" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:195 +msgctxt "Symbol" +msgid "Fire Station / House" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:196 +msgctxt "Symbol" +msgid "Police Station" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:197 +msgctxt "Symbol" +msgid "Prison" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:198 +msgctxt "Symbol" +msgid "Post Office" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:199 +msgctxt "Symbol" +msgid "Public Building" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:200 +msgctxt "Symbol" +msgid "Recycling" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:201 +msgctxt "Symbol" +msgid "Survey Point" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:202 +msgctxt "Symbol" +msgid "Toll Booth" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:203 +msgctxt "Symbol" +msgid "Lift Gate" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:204 +msgctxt "Symbol" +msgid "Steps" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:205 +msgctxt "Symbol" +msgid "Stile" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:206 +msgctxt "Symbol" +msgid "Kissing Gate" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:207 +msgctxt "Symbol" +msgid "Gate" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:209 +msgctxt "Symbol" +msgid "Entrance" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:210 +msgctxt "Symbol" +msgid "Cycle Barrier" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:211 +msgctxt "Symbol" +msgid "Cattle Grid" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:212 +msgctxt "Symbol" +msgid "Bollard" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:213 +msgctxt "Symbol" +msgid "University" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:214 +msgctxt "Symbol" +msgid "High/Secondary School" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:215 +msgctxt "Symbol" +msgid "School" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:216 +msgctxt "Symbol" +msgid "Kindergatten" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:219 +msgctxt "Symbol" +msgid "Pub" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:220 +msgctxt "Symbol" +msgid "Deserts/Cakes Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:221 +msgctxt "Symbol" +msgid "Fast Food" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:222 +msgctxt "Symbol" +msgid "Public Tap/Water" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:223 +msgctxt "Symbol" +msgid "Cafe" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:224 +msgctxt "Symbol" +msgid "Beer Garden" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:225 +msgctxt "Symbol" +msgid "Wine Bar" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:226 +msgctxt "Symbol" +msgid "Opticians/Eye Doctors" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:227 +msgctxt "Symbol" +msgid "Dentist" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:228 +msgctxt "Symbol" +msgid "Veterinarian" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:229 +msgctxt "Symbol" +msgid "Drugs Dispensary" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:230 +msgctxt "Symbol" +msgid "Pharmacy" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:231 +msgctxt "Symbol" +msgid "Accident & Emergency" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:232 +msgctxt "Symbol" +msgid "Hospital" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:233 +msgctxt "Symbol" +msgid "Doctors" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:234 +msgctxt "Symbol" +msgid "Scrub Land" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:235 +msgctxt "Symbol" +msgid "Swamp" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:236 +msgctxt "Symbol" +msgid "Hills" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:237 +msgctxt "Symbol" +msgid "Grass Land" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:238 +msgctxt "Symbol" +msgid "Deciduous Forest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:239 +msgctxt "Symbol" +msgid "Mixed Forest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:240 +msgctxt "Symbol" +msgid "Coniferous Forest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:241 +msgctxt "Symbol" +msgid "Church or Place of Worship" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:242 +msgctxt "Symbol" +msgid "Bank" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:243 +msgctxt "Symbol" +msgid "Power Lines" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:244 +msgctxt "Symbol" +msgid "Watch Tower" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:245 +msgctxt "Symbol" +msgid "Transmitter" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:246 +msgctxt "Symbol" +msgid "Village" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:247 +msgctxt "Symbol" +msgid "Town" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:248 +msgctxt "Symbol" +msgid "Hamlet" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:249 +msgctxt "Symbol" +msgid "City" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:250 +msgctxt "Symbol" +msgid "Peak" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:251 +msgctxt "Symbol" +msgid "Mountain Pass" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:252 +msgctxt "Symbol" +msgid "Mine" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:253 +msgctxt "Symbol" +msgid "Military Complex" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:254 +msgctxt "Symbol" +msgid "Embassy" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:255 +msgctxt "Symbol" +msgid "Toy Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:256 +msgctxt "Symbol" +msgid "Supermarket" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:257 +msgctxt "Symbol" +msgid "Jewlers" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:258 +msgctxt "Symbol" +msgid "Hairdressers" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:259 +msgctxt "Symbol" +msgid "Greengrocer" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:260 +msgctxt "Symbol" +msgid "Gift Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:261 +msgctxt "Symbol" +msgid "Garden Center" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:262 +msgctxt "Symbol" +msgid "Florist" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:263 +msgctxt "Symbol" +msgid "Fish Monger" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:264 +msgctxt "Symbol" +msgid "Real Estate" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:265 +msgctxt "Symbol" +msgid "Hardware / DIY" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:266 +msgctxt "Symbol" +msgid "Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:267 +msgctxt "Symbol" +msgid "Confectioner" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:268 +msgctxt "Symbol" +msgid "Computer Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:269 +msgctxt "Symbol" +msgid "Clothing" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:270 +msgctxt "Symbol" +msgid "Mechanic" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:271 +msgctxt "Symbol" +msgid "Car Dealer" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:272 +msgctxt "Symbol" +msgid "Butcher" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:273 +msgctxt "Symbol" +msgid "Meat Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:274 +msgctxt "Symbol" +msgid "Bicycle Shop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:275 +msgctxt "Symbol" +msgid "Baker" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:276 +msgctxt "Symbol" +msgid "Off License / Liquor Store" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:277 +msgctxt "Symbol" +msgid "Wind Surfing" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:278 +msgctxt "Symbol" +msgid "Tennis" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:279 +msgctxt "Symbol" +msgid "Outdoor Pool" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:280 +msgctxt "Symbol" +msgid "Indoor Pool" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:281 +msgctxt "Symbol" +msgid "Skiing" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:282 +msgctxt "Symbol" +msgid "Sailing" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:283 +msgctxt "Symbol" +msgid "Leasure Center" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:284 +msgctxt "Symbol" +msgid "Ice Skating" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:285 +msgctxt "Symbol" +msgid "Equine Sports" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:286 +msgctxt "Symbol" +msgid "Rock Climbing" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:287 +msgctxt "Symbol" +msgid "Gym" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:288 +msgctxt "Symbol" +msgid "Golf" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:289 +msgctxt "Symbol" +msgid "Diving" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:290 +msgctxt "Symbol" +msgid "Archery" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:291 +msgctxt "Symbol" +msgid "Zoo" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:292 +msgctxt "Symbol" +msgid "Wreck" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:293 +msgctxt "Symbol" +msgid "Water Wheel" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:294 +msgctxt "Symbol" +msgid "Point of Interest" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:295 +msgctxt "Symbol" +msgid "Theater" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:296 +msgctxt "Symbol" +msgid "Park / Picnick Area" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:297 +msgctxt "Symbol" +msgid "Monument" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:298 +msgctxt "Symbol" +msgid "Intormation" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:299 +msgctxt "Symbol" +msgid "Beach" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:300 +msgctxt "Symbol" +msgid "Battle Location" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:301 +msgctxt "Symbol" +msgid "Archaeology / Ruins" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:302 +msgctxt "Symbol" +msgid "Walking" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:303 +msgctxt "Symbol" +msgid "Train" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:305 +msgctxt "Symbol" +msgid "Underground Rail" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:307 +msgctxt "Symbol" +msgid "Bike Rental" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:309 +msgctxt "Symbol" +msgid "Carpool" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:310 +msgctxt "Symbol" +msgid "Flood Gate" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:311 +msgctxt "Symbol" +msgid "Shipping" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:312 +msgctxt "Symbol" +msgid "Disabled Parking" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:313 +msgctxt "Symbol" +msgid "Paid Parking" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:314 +msgctxt "Symbol" +msgid "Bike Parking" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:316 +msgctxt "Symbol" +msgid "Marina" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:317 +msgctxt "Symbol" +msgid "Fuel Station" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:318 +msgctxt "Symbol" +msgid "Bus Stop" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:319 +msgctxt "Symbol" +msgid "Bus Station" +msgstr "" + +#. Symbols: ././MapSymbols.svg +#: ../share/symbols/symbols.h:320 +msgctxt "Symbol" +msgid "Airport" +msgstr "" + #: ../share/templates/templates.h:1 msgid "A4 Landscape Page" msgstr "" @@ -5579,7 +7075,7 @@ msgstr "" #: ../src/extension/internal/filter/bumps.h:322 #: ../src/extension/internal/filter/transparency.h:57 -#: ../src/filter-enums.cpp:29 ../src/sp-image.cpp:616 +#: ../src/filter-enums.cpp:29 ../src/sp-image.cpp:632 msgid "Image" msgstr "" @@ -11014,7 +12510,7 @@ msgstr "" #: ../src/selection-chemistry.cpp:421 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:75 -#: ../src/ui/dialog/swatches.cpp:278 ../src/ui/tools/text-tool.cpp:994 +#: ../src/ui/dialog/swatches.cpp:278 ../src/ui/tools/text-tool.cpp:995 #: ../src/widgets/eraser-toolbar.cpp:110 #: ../src/widgets/gradient-toolbar.cpp:1196 #: ../src/widgets/gradient-toolbar.cpp:1210 @@ -11633,7 +13129,7 @@ msgid "Linked Flowed Text" msgstr "" #: ../src/sp-flowtext.cpp:298 ../src/sp-text.cpp:357 -#: ../src/ui/tools/text-tool.cpp:1599 +#: ../src/ui/tools/text-tool.cpp:1600 msgid " [truncated]" msgstr "" @@ -11678,16 +13174,16 @@ msgstr "" msgid "at %d degrees, through (%s,%s)" msgstr "" -#: ../src/sp-image.cpp:624 +#: ../src/sp-image.cpp:640 msgid "embedded" msgstr "" -#: ../src/sp-image.cpp:632 +#: ../src/sp-image.cpp:648 #, c-format msgid "[bad reference]: %s" msgstr "" -#: ../src/sp-image.cpp:633 +#: ../src/sp-image.cpp:649 #, c-format msgid "%d × %d: %s" msgstr "" @@ -12153,7 +13649,7 @@ msgid "" "path. Arrow keys adjust width (left/right) and angle (up/down)." msgstr "" -#: ../src/tools-switch.cpp:103 ../src/ui/tools/text-tool.cpp:1626 +#: ../src/tools-switch.cpp:103 ../src/ui/tools/text-tool.cpp:1627 msgid "" "Click to select or create text, drag to create flowed text; " "then type." @@ -19423,8 +20919,8 @@ msgstr "" msgid "Preview Text:" msgstr "" -#: ../src/ui/dialog/swatches.cpp:203 ../src/ui/tools/gradient-tool.cpp:369 -#: ../src/ui/tools/gradient-tool.cpp:467 +#: ../src/ui/dialog/swatches.cpp:203 ../src/ui/tools/gradient-tool.cpp:371 +#: ../src/ui/tools/gradient-tool.cpp:469 #: ../src/widgets/gradient-vector.cpp:814 msgid "Add gradient stop" msgstr "" @@ -19560,7 +21056,7 @@ msgid "Text path offset" msgstr "" #: ../src/ui/dialog/text-edit.cpp:588 ../src/ui/dialog/text-edit.cpp:662 -#: ../src/ui/tools/text-tool.cpp:1487 +#: ../src/ui/tools/text-tool.cpp:1488 msgid "Set text style" msgstr "" @@ -20708,34 +22204,34 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/ui/tools/gradient-tool.cpp:442 +#: ../src/ui/tools/gradient-tool.cpp:444 msgid "Simplify gradient" msgstr "" -#: ../src/ui/tools/gradient-tool.cpp:518 +#: ../src/ui/tools/gradient-tool.cpp:520 msgid "Create default gradient" msgstr "" -#: ../src/ui/tools/gradient-tool.cpp:577 ../src/ui/tools/mesh-tool.cpp:572 +#: ../src/ui/tools/gradient-tool.cpp:579 ../src/ui/tools/mesh-tool.cpp:572 msgid "Draw around handles to select them" msgstr "" -#: ../src/ui/tools/gradient-tool.cpp:700 +#: ../src/ui/tools/gradient-tool.cpp:702 msgid "Ctrl: snap gradient angle" msgstr "" -#: ../src/ui/tools/gradient-tool.cpp:701 +#: ../src/ui/tools/gradient-tool.cpp:703 msgid "Shift: draw gradient around the starting point" msgstr "" -#: ../src/ui/tools/gradient-tool.cpp:955 ../src/ui/tools/mesh-tool.cpp:995 +#: ../src/ui/tools/gradient-tool.cpp:957 ../src/ui/tools/mesh-tool.cpp:995 #, c-format msgid "Gradient for %d object; with Ctrl to snap angle" msgid_plural "Gradient for %d objects; with Ctrl to snap angle" msgstr[0] "" msgstr[1] "" -#: ../src/ui/tools/gradient-tool.cpp:959 ../src/ui/tools/mesh-tool.cpp:999 +#: ../src/ui/tools/gradient-tool.cpp:961 ../src/ui/tools/mesh-tool.cpp:999 msgid "Select objects on which to create gradient." msgstr "" @@ -21115,128 +22611,128 @@ msgstr "" msgid "Create star" msgstr "" -#: ../src/ui/tools/text-tool.cpp:392 +#: ../src/ui/tools/text-tool.cpp:393 msgid "Click to edit the text, drag to select part of the text." msgstr "" -#: ../src/ui/tools/text-tool.cpp:394 +#: ../src/ui/tools/text-tool.cpp:395 msgid "" "Click to edit the flowed text, drag to select part of the text." msgstr "" -#: ../src/ui/tools/text-tool.cpp:448 +#: ../src/ui/tools/text-tool.cpp:449 msgid "Create text" msgstr "" -#: ../src/ui/tools/text-tool.cpp:473 +#: ../src/ui/tools/text-tool.cpp:474 msgid "Non-printable character" msgstr "" -#: ../src/ui/tools/text-tool.cpp:488 +#: ../src/ui/tools/text-tool.cpp:489 msgid "Insert Unicode character" msgstr "" -#: ../src/ui/tools/text-tool.cpp:523 +#: ../src/ui/tools/text-tool.cpp:524 #, c-format msgid "Unicode (Enter to finish): %s: %s" msgstr "" -#: ../src/ui/tools/text-tool.cpp:525 ../src/ui/tools/text-tool.cpp:832 +#: ../src/ui/tools/text-tool.cpp:526 ../src/ui/tools/text-tool.cpp:833 msgid "Unicode (Enter to finish): " msgstr "" -#: ../src/ui/tools/text-tool.cpp:608 +#: ../src/ui/tools/text-tool.cpp:609 #, c-format msgid "Flowed text frame: %s × %s" msgstr "" -#: ../src/ui/tools/text-tool.cpp:666 +#: ../src/ui/tools/text-tool.cpp:667 msgid "Type text; Enter to start new line." msgstr "" -#: ../src/ui/tools/text-tool.cpp:677 +#: ../src/ui/tools/text-tool.cpp:678 msgid "Flowed text is created." msgstr "" -#: ../src/ui/tools/text-tool.cpp:679 +#: ../src/ui/tools/text-tool.cpp:680 msgid "Create flowed text" msgstr "" -#: ../src/ui/tools/text-tool.cpp:681 +#: ../src/ui/tools/text-tool.cpp:682 msgid "" "The frame is too small for the current font size. Flowed text not " "created." msgstr "" -#: ../src/ui/tools/text-tool.cpp:817 +#: ../src/ui/tools/text-tool.cpp:818 msgid "No-break space" msgstr "" -#: ../src/ui/tools/text-tool.cpp:819 +#: ../src/ui/tools/text-tool.cpp:820 msgid "Insert no-break space" msgstr "" -#: ../src/ui/tools/text-tool.cpp:856 +#: ../src/ui/tools/text-tool.cpp:857 msgid "Make bold" msgstr "" -#: ../src/ui/tools/text-tool.cpp:874 +#: ../src/ui/tools/text-tool.cpp:875 msgid "Make italic" msgstr "" -#: ../src/ui/tools/text-tool.cpp:913 +#: ../src/ui/tools/text-tool.cpp:914 msgid "New line" msgstr "" -#: ../src/ui/tools/text-tool.cpp:955 +#: ../src/ui/tools/text-tool.cpp:956 msgid "Backspace" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1011 +#: ../src/ui/tools/text-tool.cpp:1012 msgid "Kern to the left" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1036 +#: ../src/ui/tools/text-tool.cpp:1037 msgid "Kern to the right" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1061 +#: ../src/ui/tools/text-tool.cpp:1062 msgid "Kern up" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1086 +#: ../src/ui/tools/text-tool.cpp:1087 msgid "Kern down" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1162 +#: ../src/ui/tools/text-tool.cpp:1163 msgid "Rotate counterclockwise" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1183 +#: ../src/ui/tools/text-tool.cpp:1184 msgid "Rotate clockwise" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1200 +#: ../src/ui/tools/text-tool.cpp:1201 msgid "Contract line spacing" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1207 +#: ../src/ui/tools/text-tool.cpp:1208 msgid "Contract letter spacing" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1225 +#: ../src/ui/tools/text-tool.cpp:1226 msgid "Expand line spacing" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1232 +#: ../src/ui/tools/text-tool.cpp:1233 msgid "Expand letter spacing" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1362 +#: ../src/ui/tools/text-tool.cpp:1363 msgid "Paste text" msgstr "" -#: ../src/ui/tools/text-tool.cpp:1616 +#: ../src/ui/tools/text-tool.cpp:1617 #, c-format msgid "" "Type or edit flowed text (%d character%s); Enter to start new " @@ -21247,7 +22743,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/ui/tools/text-tool.cpp:1618 +#: ../src/ui/tools/text-tool.cpp:1619 #, c-format msgid "Type or edit text (%d character%s); Enter to start new line." msgid_plural "" @@ -21255,7 +22751,7 @@ msgid_plural "" msgstr[0] "" msgstr[1] "" -#: ../src/ui/tools/text-tool.cpp:1728 +#: ../src/ui/tools/text-tool.cpp:1729 msgid "Type text" msgstr "" diff --git a/share/symbols/Makefile.am b/share/symbols/Makefile.am index 5ddaac706..071d26c28 100644 --- a/share/symbols/Makefile.am +++ b/share/symbols/Makefile.am @@ -2,7 +2,16 @@ symbolsdir = $(datadir)/inkscape/symbols # Adding srcdir allows out-of-src builds to work -symbols_DATA = $(wildcard $(srcdir)/*.svg) +symbols_DATA = \ + README \ + $(wildcard $(srcdir)/*.svg) \ + symbols.h -EXTRA_DIST = $(symbols_DATA) +symbols_i18n = $(wildcard $(srcdir)/*.svg) + +symbols.h: i18n.py $(symbols_i18n) + $(srcdir)/i18n.py $(foreach i,$(symbols_i18n),$(srcdir)/$(i)) > $(srcdir)/symbols.h + +EXTRA_DIST = $(symbols_DATA) \ + i18n.py diff --git a/share/symbols/README b/share/symbols/README new file mode 100644 index 000000000..2d8ed144f --- /dev/null +++ b/share/symbols/README @@ -0,0 +1,6 @@ +Internationalization + +This file is internationalized the same way as share/filters/filters/svg +The i18n.py script called from the makefile will extract strings from the *.svg +into a *.svg.h file. Intltool is then able to extracts these strings just like +from normal .h files. diff --git a/share/symbols/i18n.py b/share/symbols/i18n.py new file mode 100755 index 000000000..db24059cd --- /dev/null +++ b/share/symbols/i18n.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +from xml.dom import minidom +import sys + +sys.stdout.write("char * stringlst = [") + +for filename in sys.argv[1:]: + doc = minidom.parse(filename) + symbols = doc.getElementsByTagName('title') + + if symbols: + for symbol in symbols: + sys.stdout.write("\n/* Symbols: " + filename + " */ NC_(\"Symbol\", \"" + symbol.firstChild.nodeValue + "\"),") + +sys.stdout.write("];") diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 2f2652bb1..9a154209e 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -538,7 +538,8 @@ void SymbolsDialog::get_symbols() { gchar *fullname = g_build_filename((*it).c_str(), filename, NULL); - if ( !Inkscape::IO::file_test( fullname, G_FILE_TEST_IS_DIR ) ) { + if ( !Inkscape::IO::file_test( fullname, G_FILE_TEST_IS_DIR ) + && ( Glib::str_has_suffix(fullname, ".svg") || Glib::str_has_suffix(fullname, ".vss") ) ) { Glib::ustring fn( filename ); Glib::ustring tag = fn.substr( fn.find_last_of(".") + 1 ); @@ -560,7 +561,7 @@ void SymbolsDialog::get_symbols() { symbol_doc = SPDocument::createNewDoc( fullname, FALSE ); if( symbol_doc ) { - gchar *title = symbol_doc->getRoot()->title(); + const gchar *title = g_dpgettext2(NULL, "Symbol", symbol_doc->getRoot()->title()); if( title == NULL ) { title = _("Unnamed Symbols"); } @@ -675,7 +676,7 @@ void SymbolsDialog::add_symbol( SPObject* symbol ) { if( pixbuf ) { Gtk::ListStore::iterator row = store->append(); (*row)[columns->symbol_id] = Glib::ustring( id ); - (*row)[columns->symbol_title] = Glib::ustring( title ); + (*row)[columns->symbol_title] = Glib::ustring( g_dpgettext2(NULL, "Symbol", title) ); (*row)[columns->symbol_image] = pixbuf; } -- cgit v1.2.3 From 9b82bd2230c4b909261ef446ebfb5af0515f7b4c Mon Sep 17 00:00:00 2001 From: suv-lp <> Date: Fri, 17 Jan 2014 17:31:15 +0100 Subject: Fix symbols Makefile.am for out-of-src tree build (thanks ~suv). (bzr r12947) --- share/symbols/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/symbols/Makefile.am b/share/symbols/Makefile.am index 071d26c28..e586096cc 100644 --- a/share/symbols/Makefile.am +++ b/share/symbols/Makefile.am @@ -10,7 +10,7 @@ symbols_DATA = \ symbols_i18n = $(wildcard $(srcdir)/*.svg) symbols.h: i18n.py $(symbols_i18n) - $(srcdir)/i18n.py $(foreach i,$(symbols_i18n),$(srcdir)/$(i)) > $(srcdir)/symbols.h + $(srcdir)/i18n.py $(foreach i,$(symbols_i18n),$(i)) > $(srcdir)/symbols.h EXTRA_DIST = $(symbols_DATA) \ i18n.py -- cgit v1.2.3 From 66990f03d33aa3935c45f53e696bce02d06dbefb Mon Sep 17 00:00:00 2001 From: suv-lp <> Date: Fri, 17 Jan 2014 17:42:07 +0100 Subject: Simplified patch for symbols i18n and typo in .bzrignore. (bzr r12948) --- .bzrignore | 2 +- share/symbols/Makefile.am | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.bzrignore b/.bzrignore index a1b385474..925be4fb7 100644 --- a/.bzrignore +++ b/.bzrignore @@ -136,7 +136,7 @@ share/markers/Makefile share/markers/Makefile.in share/palettes/Makefile share/palettes/Makefile.in -share/palettes/palettes.hs +share/palettes/palettes.h share/patterns/Makefile share/patterns/Makefile.in share/patterns/patterns.svg.h diff --git a/share/symbols/Makefile.am b/share/symbols/Makefile.am index e586096cc..a7d21d2a8 100644 --- a/share/symbols/Makefile.am +++ b/share/symbols/Makefile.am @@ -10,7 +10,7 @@ symbols_DATA = \ symbols_i18n = $(wildcard $(srcdir)/*.svg) symbols.h: i18n.py $(symbols_i18n) - $(srcdir)/i18n.py $(foreach i,$(symbols_i18n),$(i)) > $(srcdir)/symbols.h + $(srcdir)/i18n.py $(symbols_i18n) > $(srcdir)/symbols.h EXTRA_DIST = $(symbols_DATA) \ i18n.py -- cgit v1.2.3 From 34414ec8b460d990ba48b3ed6a8e94dccc260d1f Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Fri, 17 Jan 2014 19:02:54 +0100 Subject: GTK3 build error in symbols.cpp. (bzr r12949) --- src/ui/dialog/symbols.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 9a154209e..be22c1c5b 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -49,6 +49,7 @@ #include "symbols.h" +#include "filedialog.h" #include "selection.h" #include "desktop.h" #include "desktop-handles.h" @@ -539,7 +540,7 @@ void SymbolsDialog::get_symbols() { gchar *fullname = g_build_filename((*it).c_str(), filename, NULL); if ( !Inkscape::IO::file_test( fullname, G_FILE_TEST_IS_DIR ) - && ( Glib::str_has_suffix(fullname, ".svg") || Glib::str_has_suffix(fullname, ".vss") ) ) { + && ( hasSuffix(fullname, ".svg") || hasSuffix(fullname, ".vss") ) ) { Glib::ustring fn( filename ); Glib::ustring tag = fn.substr( fn.find_last_of(".") + 1 ); -- cgit v1.2.3 From ab4ca32239250dd70c615ec37dad2a552b66038c Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Fri, 17 Jan 2014 19:07:22 +0100 Subject: Better fix for GTK3 build error in symbols.cpp. (bzr r12950) --- src/ui/dialog/symbols.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index be22c1c5b..c33920117 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include #include "path-prefix.h" @@ -49,7 +50,6 @@ #include "symbols.h" -#include "filedialog.h" #include "selection.h" #include "desktop.h" #include "desktop-handles.h" @@ -540,7 +540,7 @@ void SymbolsDialog::get_symbols() { gchar *fullname = g_build_filename((*it).c_str(), filename, NULL); if ( !Inkscape::IO::file_test( fullname, G_FILE_TEST_IS_DIR ) - && ( hasSuffix(fullname, ".svg") || hasSuffix(fullname, ".vss") ) ) { + && ( Glib::str_has_suffix(fullname, ".svg") || Glib::str_has_suffix(fullname, ".vss") ) ) { Glib::ustring fn( filename ); Glib::ustring tag = fn.substr( fn.find_last_of(".") + 1 ); -- cgit v1.2.3 From 497bc9a5b7d4501902052ec5df39197f73082c38 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Fri, 17 Jan 2014 14:06:02 -0500 Subject: avoid singularity when scaling horizontal or vertical line. (Bug 1262146) Fixed bugs: - https://launchpad.net/bugs/1262146 (bzr r12951) --- src/sp-item-transform.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp index 250713beb..9dbe412d7 100644 --- a/src/sp-item-transform.cpp +++ b/src/sp-item-transform.cpp @@ -132,7 +132,7 @@ Geom::Affine get_scale_transform_for_uniform_stroke(Geom::Rect const &bbox_visua // We will now try to calculate the affine transformation required to transform the first visual bounding box into // the second one, while accounting for strokewidth - if ((fabs(w0 - r0) < 1e-6) && (fabs(h0 - r0) < 1e-6)) { + if ((fabs(w0 - stroke_x) < 1e-6) && (fabs(h0 - stroke_y) < 1e-6)) { return Geom::Affine(); } @@ -140,11 +140,11 @@ Geom::Affine get_scale_transform_for_uniform_stroke(Geom::Rect const &bbox_visua gdouble scale_y = 1; gdouble r1 = r0; - if ((fabs(w0 - r0) < 1e-6) || w1 == 0) { // We have a vertical line at hand + if ((fabs(w0 - stroke_x) < 1e-6) || w1 == 0) { // We have a vertical line at hand r1 = transform_stroke ? r0 * sqrt(h1/h0) : r0; scale_x = 1; scale_y = preserve ? h1/h0 : (h1 - r1)/(h0 - r0); - } else if ((fabs(h0 - r0) < 1e-6) || h1 == 0) { // We have a horizontal line at hand + } else if ((fabs(h0 - stroke_y) < 1e-6) || h1 == 0) { // We have a horizontal line at hand r1 = transform_stroke ? r0 * sqrt(w1/w0) : r0; scale_x = preserve ? w1/w0 : (w1 - r1)/(w0 - r0); scale_y = 1; -- cgit v1.2.3 From 0eb7cf56b9229a6bcc6c79574d2ac58413c46049 Mon Sep 17 00:00:00 2001 From: kris-degussem <> Date: Fri, 17 Jan 2014 20:27:53 +0100 Subject: i18n. Fix for Bug #1269943 (Context for message Offset:). Fixed bugs: - https://launchpad.net/bugs/1269943 (bzr r12952) --- po/inkscape.pot | 536 ++++++++++++++++++++------------------- src/widgets/gradient-toolbar.cpp | 2 +- src/widgets/gradient-vector.cpp | 2 +- 3 files changed, 272 insertions(+), 268 deletions(-) diff --git a/po/inkscape.pot b/po/inkscape.pot index 607bf4330..babc68422 100644 --- a/po/inkscape.pot +++ b/po/inkscape.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-17 13:35+0100\n" +"POT-Creation-Date: 2014-01-17 20:14+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3223,1497 +3223,1497 @@ msgstr "" msgid "Old paint (bitmap)" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:2 msgctxt "Symbol" msgid "AIGA Symbol Signs" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:3 ../share/symbols/symbols.h:4 msgctxt "Symbol" msgid "Telephone" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:5 ../share/symbols/symbols.h:6 msgctxt "Symbol" msgid "Mail" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:7 ../share/symbols/symbols.h:8 msgctxt "Symbol" msgid "Currency Exchange" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:9 ../share/symbols/symbols.h:10 msgctxt "Symbol" msgid "Currency Exchange - Euro" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:11 ../share/symbols/symbols.h:12 msgctxt "Symbol" msgid "Cashier" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:13 ../share/symbols/symbols.h:14 msgctxt "Symbol" msgid "First Aid" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:15 ../share/symbols/symbols.h:16 msgctxt "Symbol" msgid "Lost and Found" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:17 ../share/symbols/symbols.h:18 msgctxt "Symbol" msgid "Coat Check" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:19 ../share/symbols/symbols.h:20 msgctxt "Symbol" msgid "Bagage Lockers" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:21 ../share/symbols/symbols.h:22 msgctxt "Symbol" msgid "Escalator" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:23 ../share/symbols/symbols.h:24 msgctxt "Symbol" msgid "Escalator Down" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:25 ../share/symbols/symbols.h:26 msgctxt "Symbol" msgid "Escalator Up" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:27 ../share/symbols/symbols.h:28 msgctxt "Symbol" msgid "Stairs" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:29 ../share/symbols/symbols.h:30 msgctxt "Symbol" msgid "Stairs Down" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:31 ../share/symbols/symbols.h:32 msgctxt "Symbol" msgid "Stairs Up" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:33 ../share/symbols/symbols.h:34 msgctxt "Symbol" msgid "Elevator" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:35 ../share/symbols/symbols.h:36 msgctxt "Symbol" msgid "Toilets - Men" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:37 ../share/symbols/symbols.h:38 msgctxt "Symbol" msgid "Toilets - Women" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:39 ../share/symbols/symbols.h:40 msgctxt "Symbol" msgid "Toilets" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:41 ../share/symbols/symbols.h:42 #: ../share/symbols/symbols.h:217 msgctxt "Symbol" msgid "Nursery" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:43 ../share/symbols/symbols.h:44 msgctxt "Symbol" msgid "Drinking Fountain" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:45 ../share/symbols/symbols.h:46 msgctxt "Symbol" msgid "Waiting Room" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:47 ../share/symbols/symbols.h:48 msgctxt "Symbol" msgid "Information" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:49 ../share/symbols/symbols.h:50 msgctxt "Symbol" msgid "Hotel Information" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:51 ../share/symbols/symbols.h:52 msgctxt "Symbol" msgid "Air Transportation" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:53 ../share/symbols/symbols.h:54 #: ../share/symbols/symbols.h:308 msgctxt "Symbol" msgid "Heliport" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:55 ../share/symbols/symbols.h:56 #: ../share/symbols/symbols.h:304 msgctxt "Symbol" msgid "Taxi" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:57 ../share/symbols/symbols.h:58 msgctxt "Symbol" msgid "Bus" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:59 ../share/symbols/symbols.h:60 msgctxt "Symbol" msgid "Ground Transportation" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:61 ../share/symbols/symbols.h:62 msgctxt "Symbol" msgid "Rail Transportation" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:63 ../share/symbols/symbols.h:64 msgctxt "Symbol" msgid "Water Transportation" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:65 ../share/symbols/symbols.h:66 #: ../share/symbols/symbols.h:306 msgctxt "Symbol" msgid "Car Rental" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:67 ../share/symbols/symbols.h:68 #: ../share/symbols/symbols.h:218 msgctxt "Symbol" msgid "Restaurant" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:69 ../share/symbols/symbols.h:70 msgctxt "Symbol" msgid "Coffeeshop" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:71 ../share/symbols/symbols.h:72 msgctxt "Symbol" msgid "Bar" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:73 ../share/symbols/symbols.h:74 msgctxt "Symbol" msgid "Shops" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:75 ../share/symbols/symbols.h:76 msgctxt "Symbol" msgid "Barber Shop - Beauty Salon" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:77 ../share/symbols/symbols.h:78 msgctxt "Symbol" msgid "Barber Shop" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:79 ../share/symbols/symbols.h:80 msgctxt "Symbol" msgid "Beauty Salon" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:81 ../share/symbols/symbols.h:82 msgctxt "Symbol" msgid "Ticket Purchase" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:83 ../share/symbols/symbols.h:84 msgctxt "Symbol" msgid "Baggage Check In" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:85 ../share/symbols/symbols.h:86 msgctxt "Symbol" msgid "Baggage Claim" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:87 ../share/symbols/symbols.h:88 msgctxt "Symbol" msgid "Customs" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:89 ../share/symbols/symbols.h:90 msgctxt "Symbol" msgid "Immigration" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:91 ../share/symbols/symbols.h:92 msgctxt "Symbol" msgid "Departing Flights" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:93 ../share/symbols/symbols.h:94 msgctxt "Symbol" msgid "Arriving Flights" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:95 ../share/symbols/symbols.h:96 msgctxt "Symbol" msgid "Smoking" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:97 ../share/symbols/symbols.h:98 msgctxt "Symbol" msgid "No Smoking" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:99 ../share/symbols/symbols.h:100 #: ../share/symbols/symbols.h:315 msgctxt "Symbol" msgid "Parking" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:101 ../share/symbols/symbols.h:102 msgctxt "Symbol" msgid "No Parking" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:103 ../share/symbols/symbols.h:104 msgctxt "Symbol" msgid "No Dogs" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:105 ../share/symbols/symbols.h:106 msgctxt "Symbol" msgid "No Entry" msgstr "" -#. Symbols: ././AigaSymbols.svg -#. Symbols: ././MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:107 ../share/symbols/symbols.h:108 #: ../share/symbols/symbols.h:208 msgctxt "Symbol" msgid "Exit" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:109 ../share/symbols/symbols.h:110 msgctxt "Symbol" msgid "Fire Extinguisher" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:111 ../share/symbols/symbols.h:112 msgctxt "Symbol" msgid "Right Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:113 ../share/symbols/symbols.h:114 msgctxt "Symbol" msgid "Forward and Right Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:115 ../share/symbols/symbols.h:116 msgctxt "Symbol" msgid "Up Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:117 ../share/symbols/symbols.h:118 msgctxt "Symbol" msgid "Forward and Left Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:119 ../share/symbols/symbols.h:120 msgctxt "Symbol" msgid "Left Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:121 ../share/symbols/symbols.h:122 msgctxt "Symbol" msgid "Left and Down Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:123 ../share/symbols/symbols.h:124 msgctxt "Symbol" msgid "Down Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:125 ../share/symbols/symbols.h:126 msgctxt "Symbol" msgid "Right and Down Arrow" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:127 ../share/symbols/symbols.h:128 msgctxt "Symbol" msgid "NPS Wheelchair Accessable - 1996" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:129 ../share/symbols/symbols.h:130 msgctxt "Symbol" msgid "NPS Wheelchair Accessable" msgstr "" -#. Symbols: ././AigaSymbols.svg +#. Symbols: ./AigaSymbols.svg #: ../share/symbols/symbols.h:131 ../share/symbols/symbols.h:132 msgctxt "Symbol" msgid "New Wheelchair Accessable" msgstr "" -#. Symbols: ././BalloonSymbols.svg +#. Symbols: ./BalloonSymbols.svg #: ../share/symbols/symbols.h:133 msgctxt "Symbol" msgid "Word Balloons" msgstr "" -#. Symbols: ././BalloonSymbols.svg +#. Symbols: ./BalloonSymbols.svg #: ../share/symbols/symbols.h:134 msgctxt "Symbol" msgid "Thought Balloon" msgstr "" -#. Symbols: ././BalloonSymbols.svg +#. Symbols: ./BalloonSymbols.svg #: ../share/symbols/symbols.h:135 msgctxt "Symbol" msgid "Dream Speaking" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:136 msgctxt "Symbol" msgid "Flow Chart Shapes" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:137 msgctxt "Symbol" msgid "Process" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:138 msgctxt "Symbol" msgid "Predefined Process" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:139 msgctxt "Symbol" msgid "Alternate Process" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:140 msgctxt "Symbol" msgid "Extract" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:141 msgctxt "Symbol" msgid "Manual Input" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:142 msgctxt "Symbol" msgid "Merge" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:143 msgctxt "Symbol" msgid "Delay" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:144 msgctxt "Symbol" msgid "Data I/O" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:145 msgctxt "Symbol" msgid "Internal Storage" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:146 msgctxt "Symbol" msgid "Card" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:147 msgctxt "Symbol" msgid "Document" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:148 msgctxt "Symbol" msgid "Direct Access Storage" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:149 msgctxt "Symbol" msgid "Stored Data" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:150 msgctxt "Symbol" msgid "Magnetic Disk (Database)" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:151 msgctxt "Symbol" msgid "Punched Tape" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:152 msgctxt "Symbol" msgid "Terminator" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:153 msgctxt "Symbol" msgid "Thick Arrow" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:154 msgctxt "Symbol" msgid "Transfer" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:155 msgctxt "Symbol" msgid "Decision" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:156 msgctxt "Symbol" msgid "Flow Arrow" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:157 msgctxt "Symbol" msgid "Circle Arrow" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:158 msgctxt "Symbol" msgid "Off-Page Connector" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:159 msgctxt "Symbol" msgid "Connector" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:160 msgctxt "Symbol" msgid "Logical Or" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:161 msgctxt "Symbol" msgid "Logical And" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:162 msgctxt "Symbol" msgid "Manual Operation" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:163 msgctxt "Symbol" msgid "Preparation" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:164 msgctxt "Symbol" msgid "Display" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:165 msgctxt "Symbol" msgid "Sort" msgstr "" -#. Symbols: ././FlowSymbols.svg +#. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:166 msgctxt "Symbol" msgid "Collate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:167 msgctxt "Symbol" msgid "Logic Symbols" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:168 msgctxt "Symbol" msgid "Xnor Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:169 msgctxt "Symbol" msgid "Xor Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:170 msgctxt "Symbol" msgid "Nor Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:171 msgctxt "Symbol" msgid "Or Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:172 msgctxt "Symbol" msgid "Nand Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:173 msgctxt "Symbol" msgid "And Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:174 msgctxt "Symbol" msgid "Buffer" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:175 msgctxt "Symbol" msgid "Not Gate" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:176 msgctxt "Symbol" msgid "Buffer Small" msgstr "" -#. Symbols: ././LogicSymbols.svg +#. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:177 msgctxt "Symbol" msgid "Not Gate Small" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:178 msgctxt "Symbol" msgid "Map Symbols" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:179 msgctxt "Symbol" msgid "Bed and Breakfast" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:180 msgctxt "Symbol" msgid "Youth Hostel" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:181 msgctxt "Symbol" msgid "Shelter" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:182 msgctxt "Symbol" msgid "Motel" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:183 msgctxt "Symbol" msgid "Hotel" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:184 msgctxt "Symbol" msgid "Hostel" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:185 msgctxt "Symbol" msgid "Chalet" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:186 msgctxt "Symbol" msgid "Caravan Park" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:187 msgctxt "Symbol" msgid "Camping" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:188 msgctxt "Symbol" msgid "Alpine Hut" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:189 msgctxt "Symbol" msgid "Bench or Park" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:190 msgctxt "Symbol" msgid "Playground" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:191 msgctxt "Symbol" msgid "Fountain" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:192 msgctxt "Symbol" msgid "Library" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:193 msgctxt "Symbol" msgid "Town Hall" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:194 msgctxt "Symbol" msgid "Court" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:195 msgctxt "Symbol" msgid "Fire Station / House" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:196 msgctxt "Symbol" msgid "Police Station" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:197 msgctxt "Symbol" msgid "Prison" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:198 msgctxt "Symbol" msgid "Post Office" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:199 msgctxt "Symbol" msgid "Public Building" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:200 msgctxt "Symbol" msgid "Recycling" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:201 msgctxt "Symbol" msgid "Survey Point" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:202 msgctxt "Symbol" msgid "Toll Booth" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:203 msgctxt "Symbol" msgid "Lift Gate" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:204 msgctxt "Symbol" msgid "Steps" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:205 msgctxt "Symbol" msgid "Stile" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:206 msgctxt "Symbol" msgid "Kissing Gate" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:207 msgctxt "Symbol" msgid "Gate" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:209 msgctxt "Symbol" msgid "Entrance" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:210 msgctxt "Symbol" msgid "Cycle Barrier" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:211 msgctxt "Symbol" msgid "Cattle Grid" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:212 msgctxt "Symbol" msgid "Bollard" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:213 msgctxt "Symbol" msgid "University" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:214 msgctxt "Symbol" msgid "High/Secondary School" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:215 msgctxt "Symbol" msgid "School" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:216 msgctxt "Symbol" msgid "Kindergatten" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:219 msgctxt "Symbol" msgid "Pub" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:220 msgctxt "Symbol" msgid "Deserts/Cakes Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:221 msgctxt "Symbol" msgid "Fast Food" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:222 msgctxt "Symbol" msgid "Public Tap/Water" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:223 msgctxt "Symbol" msgid "Cafe" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:224 msgctxt "Symbol" msgid "Beer Garden" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:225 msgctxt "Symbol" msgid "Wine Bar" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:226 msgctxt "Symbol" msgid "Opticians/Eye Doctors" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:227 msgctxt "Symbol" msgid "Dentist" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:228 msgctxt "Symbol" msgid "Veterinarian" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:229 msgctxt "Symbol" msgid "Drugs Dispensary" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:230 msgctxt "Symbol" msgid "Pharmacy" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:231 msgctxt "Symbol" msgid "Accident & Emergency" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:232 msgctxt "Symbol" msgid "Hospital" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:233 msgctxt "Symbol" msgid "Doctors" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:234 msgctxt "Symbol" msgid "Scrub Land" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:235 msgctxt "Symbol" msgid "Swamp" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:236 msgctxt "Symbol" msgid "Hills" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:237 msgctxt "Symbol" msgid "Grass Land" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:238 msgctxt "Symbol" msgid "Deciduous Forest" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:239 msgctxt "Symbol" msgid "Mixed Forest" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:240 msgctxt "Symbol" msgid "Coniferous Forest" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:241 msgctxt "Symbol" msgid "Church or Place of Worship" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:242 msgctxt "Symbol" msgid "Bank" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:243 msgctxt "Symbol" msgid "Power Lines" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:244 msgctxt "Symbol" msgid "Watch Tower" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:245 msgctxt "Symbol" msgid "Transmitter" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:246 msgctxt "Symbol" msgid "Village" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:247 msgctxt "Symbol" msgid "Town" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:248 msgctxt "Symbol" msgid "Hamlet" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:249 msgctxt "Symbol" msgid "City" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:250 msgctxt "Symbol" msgid "Peak" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:251 msgctxt "Symbol" msgid "Mountain Pass" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:252 msgctxt "Symbol" msgid "Mine" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:253 msgctxt "Symbol" msgid "Military Complex" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:254 msgctxt "Symbol" msgid "Embassy" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:255 msgctxt "Symbol" msgid "Toy Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:256 msgctxt "Symbol" msgid "Supermarket" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:257 msgctxt "Symbol" msgid "Jewlers" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:258 msgctxt "Symbol" msgid "Hairdressers" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:259 msgctxt "Symbol" msgid "Greengrocer" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:260 msgctxt "Symbol" msgid "Gift Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:261 msgctxt "Symbol" msgid "Garden Center" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:262 msgctxt "Symbol" msgid "Florist" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:263 msgctxt "Symbol" msgid "Fish Monger" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:264 msgctxt "Symbol" msgid "Real Estate" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:265 msgctxt "Symbol" msgid "Hardware / DIY" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:266 msgctxt "Symbol" msgid "Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:267 msgctxt "Symbol" msgid "Confectioner" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:268 msgctxt "Symbol" msgid "Computer Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:269 msgctxt "Symbol" msgid "Clothing" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:270 msgctxt "Symbol" msgid "Mechanic" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:271 msgctxt "Symbol" msgid "Car Dealer" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:272 msgctxt "Symbol" msgid "Butcher" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:273 msgctxt "Symbol" msgid "Meat Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:274 msgctxt "Symbol" msgid "Bicycle Shop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:275 msgctxt "Symbol" msgid "Baker" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:276 msgctxt "Symbol" msgid "Off License / Liquor Store" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:277 msgctxt "Symbol" msgid "Wind Surfing" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:278 msgctxt "Symbol" msgid "Tennis" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:279 msgctxt "Symbol" msgid "Outdoor Pool" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:280 msgctxt "Symbol" msgid "Indoor Pool" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:281 msgctxt "Symbol" msgid "Skiing" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:282 msgctxt "Symbol" msgid "Sailing" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:283 msgctxt "Symbol" msgid "Leasure Center" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:284 msgctxt "Symbol" msgid "Ice Skating" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:285 msgctxt "Symbol" msgid "Equine Sports" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:286 msgctxt "Symbol" msgid "Rock Climbing" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:287 msgctxt "Symbol" msgid "Gym" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:288 msgctxt "Symbol" msgid "Golf" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:289 msgctxt "Symbol" msgid "Diving" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:290 msgctxt "Symbol" msgid "Archery" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:291 msgctxt "Symbol" msgid "Zoo" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:292 msgctxt "Symbol" msgid "Wreck" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:293 msgctxt "Symbol" msgid "Water Wheel" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:294 msgctxt "Symbol" msgid "Point of Interest" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:295 msgctxt "Symbol" msgid "Theater" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:296 msgctxt "Symbol" msgid "Park / Picnick Area" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:297 msgctxt "Symbol" msgid "Monument" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:298 msgctxt "Symbol" msgid "Intormation" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:299 msgctxt "Symbol" msgid "Beach" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:300 msgctxt "Symbol" msgid "Battle Location" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:301 msgctxt "Symbol" msgid "Archaeology / Ruins" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:302 msgctxt "Symbol" msgid "Walking" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:303 msgctxt "Symbol" msgid "Train" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:305 msgctxt "Symbol" msgid "Underground Rail" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:307 msgctxt "Symbol" msgid "Bike Rental" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:309 msgctxt "Symbol" msgid "Carpool" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:310 msgctxt "Symbol" msgid "Flood Gate" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:311 msgctxt "Symbol" msgid "Shipping" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:312 msgctxt "Symbol" msgid "Disabled Parking" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:313 msgctxt "Symbol" msgid "Paid Parking" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:314 msgctxt "Symbol" msgid "Bike Parking" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:316 msgctxt "Symbol" msgid "Marina" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:317 msgctxt "Symbol" msgid "Fuel Station" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:318 msgctxt "Symbol" msgid "Bus Stop" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:319 msgctxt "Symbol" msgid "Bus Station" msgstr "" -#. Symbols: ././MapSymbols.svg +#. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:320 msgctxt "Symbol" msgid "Airport" @@ -5713,10 +5713,7 @@ msgstr "" msgid "Height:" msgstr "" -#. Label #: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:43 -#: ../src/widgets/gradient-toolbar.cpp:1174 -#: ../src/widgets/gradient-vector.cpp:926 #: ../share/extensions/printing_marks.inx.h:12 msgid "Offset:" msgstr "" @@ -20949,36 +20946,36 @@ msgid "Palettes directory (%s) is unavailable." msgstr "" #. ******************* Symbol Sets ************************ -#: ../src/ui/dialog/symbols.cpp:126 +#: ../src/ui/dialog/symbols.cpp:127 msgid "Symbol set: " msgstr "" #. Fill in later -#: ../src/ui/dialog/symbols.cpp:135 ../src/ui/dialog/symbols.cpp:136 +#: ../src/ui/dialog/symbols.cpp:136 ../src/ui/dialog/symbols.cpp:137 msgid "Current Document" msgstr "" -#: ../src/ui/dialog/symbols.cpp:203 +#: ../src/ui/dialog/symbols.cpp:204 msgid "Add Symbol from the current document." msgstr "" -#: ../src/ui/dialog/symbols.cpp:212 +#: ../src/ui/dialog/symbols.cpp:213 msgid "Remove Symbol from the current document." msgstr "" -#: ../src/ui/dialog/symbols.cpp:225 +#: ../src/ui/dialog/symbols.cpp:226 msgid "Make Icons bigger by zooming in." msgstr "" -#: ../src/ui/dialog/symbols.cpp:234 +#: ../src/ui/dialog/symbols.cpp:235 msgid "Make Icons smaller by zooming out." msgstr "" -#: ../src/ui/dialog/symbols.cpp:243 +#: ../src/ui/dialog/symbols.cpp:244 msgid "Toggle 'fit' symbols in icon space." msgstr "" -#: ../src/ui/dialog/symbols.cpp:565 +#: ../src/ui/dialog/symbols.cpp:567 msgid "Unnamed Symbols" msgstr "" @@ -26774,6 +26771,13 @@ msgstr "" msgid "Stops:" msgstr "" +#. Label +#: ../src/widgets/gradient-toolbar.cpp:1174 +#: ../src/widgets/gradient-vector.cpp:926 +msgctxt "Gradient" +msgid "Offset:" +msgstr "" + #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset of selected stop" msgstr "" diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp index 8fa29e60a..4bed3101d 100644 --- a/src/widgets/gradient-toolbar.cpp +++ b/src/widgets/gradient-toolbar.cpp @@ -1171,7 +1171,7 @@ void sp_gradient_toolbox_prep(SPDesktop * desktop, GtkActionGroup* mainActions, { EgeAdjustmentAction* eact = 0; eact = create_adjustment_action( "GradientEditOffsetAction", - _("Offset"), _("Offset:"), _("Offset of selected stop"), + _("Offset"), C_("Gradient", "Offset:"), _("Offset of selected stop"), "/tools/gradient/stopoffset", 0, GTK_WIDGET(desktop->canvas), holder, FALSE, NULL, 0.0, 1.0, 0.01, 0.1, diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp index e9fc426f6..17ac887c4 100644 --- a/src/widgets/gradient-vector.cpp +++ b/src/widgets/gradient-vector.cpp @@ -923,7 +923,7 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s #endif /* Label */ - GtkWidget *l = gtk_label_new(_("Offset:")); + GtkWidget *l = gtk_label_new(C_("Gradient","Offset:")); gtk_misc_set_alignment(GTK_MISC(l), 1.0, 0.5); gtk_box_pack_start(GTK_BOX(hb),l, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS); gtk_widget_show(l); -- cgit v1.2.3 From 0564ac341f92d0d892d046a9096ac50fb0a9a27d Mon Sep 17 00:00:00 2001 From: David Mathog Date: Sat, 18 Jan 2014 00:24:11 +0100 Subject: libUEMF update; EMF linear gradient bug fixes (bug #1263242) Fixed bugs: - https://launchpad.net/bugs/1263242 (bzr r12953) --- src/extension/CMakeLists.txt | 1 + src/extension/internal/Makefile_insert | 2 + src/extension/internal/emf-inout.cpp | 618 ++- src/extension/internal/emf-inout.h | 43 +- src/extension/internal/emf-print.cpp | 417 +- src/extension/internal/emf-print.h | 5 + src/extension/internal/metafile-inout.cpp | 210 + src/extension/internal/metafile-inout.h | 93 + src/extension/internal/metafile-print.cpp | 4 +- src/extension/internal/wmf-inout.cpp | 150 +- src/extension/internal/wmf-inout.h | 39 +- src/extension/internal/wmf-print.cpp | 116 +- src/libuemf/CMakeLists.txt | 4 + src/libuemf/Makefile_insert | 4 + src/libuemf/README | 480 +- src/libuemf/uemf.c | 72 +- src/libuemf/uemf.h | 2940 ++++++----- src/libuemf/uemf_endian.c | 52 +- src/libuemf/uemf_endian.h | 31 +- src/libuemf/uemf_print.c | 239 +- src/libuemf/uemf_print.h | 217 +- src/libuemf/uemf_utf.c | 6 +- src/libuemf/uemf_utf.h | 4 +- src/libuemf/upmf.c | 8057 +++++++++++++++++++++++++++++ src/libuemf/upmf.h | 3177 ++++++++++++ src/libuemf/upmf_print.c | 3138 +++++++++++ src/libuemf/upmf_print.h | 180 + src/libuemf/uwmf.c | 429 +- src/libuemf/uwmf.h | 1338 ++--- src/libuemf/uwmf_endian.c | 13 +- src/libuemf/uwmf_endian.h | 19 +- src/libuemf/uwmf_print.c | 40 +- src/libuemf/uwmf_print.h | 8 +- 33 files changed, 19226 insertions(+), 2920 deletions(-) create mode 100644 src/extension/internal/metafile-inout.cpp create mode 100644 src/extension/internal/metafile-inout.h create mode 100644 src/libuemf/upmf.c create mode 100644 src/libuemf/upmf.h create mode 100644 src/libuemf/upmf_print.c create mode 100644 src/libuemf/upmf_print.h diff --git a/src/extension/CMakeLists.txt b/src/extension/CMakeLists.txt index 6310ceaea..9bc30a592 100644 --- a/src/extension/CMakeLists.txt +++ b/src/extension/CMakeLists.txt @@ -45,6 +45,7 @@ set(extension_SRC internal/image-resolution.cpp internal/latex-pstricks.cpp internal/latex-pstricks-out.cpp + internal/metafile-inout.cpp internal/metafile-print.cpp internal/odf.cpp internal/latex-text-renderer.cpp diff --git a/src/extension/internal/Makefile_insert b/src/extension/internal/Makefile_insert index 726bca28f..a31843114 100644 --- a/src/extension/internal/Makefile_insert +++ b/src/extension/internal/Makefile_insert @@ -162,6 +162,8 @@ ink_common_sources += \ extension/internal/emf-print.cpp \ extension/internal/emf-inout.h \ extension/internal/emf-inout.cpp \ + extension/internal/metafile-inout.h \ + extension/internal/metafile-inout.cpp \ extension/internal/metafile-print.h \ extension/internal/metafile-print.cpp \ extension/internal/wmf-print.h \ diff --git a/src/extension/internal/emf-inout.cpp b/src/extension/internal/emf-inout.cpp index c8c708051..cca541c5b 100644 --- a/src/extension/internal/emf-inout.cpp +++ b/src/extension/internal/emf-inout.cpp @@ -26,7 +26,7 @@ # include "config.h" #endif -#include //This must precede text_reassemble.h or it blows up in pngconf.h when compiling +//#include //This must precede text_reassemble.h or it blows up in pngconf.h when compiling #include #include #include @@ -69,154 +69,6 @@ static bool clipset = false; static uint32_t ICMmode = 0; // not used yet, but code to read it from EMF implemented static uint32_t BLTmode = 0; -/** Construct a PNG in memory from an RGB from the EMF file - -from: -http://www.lemoda.net/c/write-png/ - -which was based on: -http://stackoverflow.com/questions/1821806/how-to-encode-png-to-buffer-using-libpng - -gcc -Wall -o testpng testpng.c -lpng - -Originally here, but moved up - -#include -#include -#include -#include -*/ - - -/* Given "bitmap", this returns the pixel of bitmap at the point - ("x", "y"). */ - -pixel_t * Emf::pixel_at (bitmap_t * bitmap, int x, int y) -{ - return bitmap->pixels + bitmap->width * y + x; -} - - -/* Write "bitmap" to a PNG file specified by "path"; returns 0 on - success, non-zero on error. */ - -void -Emf::my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - PMEMPNG p=(PMEMPNG)png_get_io_ptr(png_ptr); - - size_t nsize = p->size + length; - - /* allocate or grow buffer */ - if(p->buffer){ p->buffer = (char *) realloc(p->buffer, nsize); } - else{ p->buffer = (char *) malloc(nsize); } - - if(!p->buffer){ png_error(png_ptr, "Write Error"); } - - /* copy new bytes to end of buffer */ - memcpy(p->buffer + p->size, data, length); - p->size += length; -} - -void Emf::toPNG(PMEMPNG accum, int width, int height, const char *px){ - bitmap_t bmStore; - bitmap_t *bitmap = &bmStore; - accum->buffer=NULL; // PNG constructed in memory will end up here, caller must free(). - accum->size=0; - bitmap->pixels=(pixel_t *)px; - bitmap->width = width; - bitmap->height = height; - - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; - size_t x, y; - png_byte ** row_pointers = NULL; - /* The following number is set by trial and error only. I cannot - see where it it is documented in the libpng manual. - */ - int pixel_size = 3; - int depth = 8; - - png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (png_ptr == NULL){ - accum->buffer=NULL; - return; - } - - info_ptr = png_create_info_struct (png_ptr); - if (info_ptr == NULL){ - png_destroy_write_struct (&png_ptr, &info_ptr); - accum->buffer=NULL; - return; - } - - /* Set up error handling. */ - - if (setjmp (png_jmpbuf (png_ptr))) { - png_destroy_write_struct (&png_ptr, &info_ptr); - accum->buffer=NULL; - return; - } - - /* Set image attributes. */ - - png_set_IHDR ( - png_ptr, - info_ptr, - bitmap->width, - bitmap->height, - depth, - PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT - ); - - /* Initialize rows of PNG. */ - - row_pointers = (png_byte **) png_malloc (png_ptr, bitmap->height * sizeof (png_byte *)); - for (y = 0; y < bitmap->height; ++y) { - png_byte *row = - (png_byte *) png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size); - row_pointers[bitmap->height - y - 1] = row; // Row order in EMF is reversed. - for (x = 0; x < bitmap->width; ++x) { - pixel_t * pixel = pixel_at (bitmap, x, y); - *row++ = pixel->red; // R & B channels were set correctly by DIB_to_RGB - *row++ = pixel->green; - *row++ = pixel->blue; - } - } - - /* Write the image data to memory */ - - png_set_rows (png_ptr, info_ptr, row_pointers); - - png_set_write_fn(png_ptr, accum, my_png_write_data, NULL); - - png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); - - for (y = 0; y < bitmap->height; y++) { - png_free (png_ptr, row_pointers[y]); - } - png_free (png_ptr, row_pointers); - png_destroy_write_struct(&png_ptr, &info_ptr); - -} - - -/* convert an EMF RGB(A) color to 0RGB -inverse of gethexcolor() in emf-print.cpp -*/ -uint32_t Emf::sethexcolor(U_COLORREF color){ - - uint32_t out; - out = (U_RGBAGetR(color) << 16) + - (U_RGBAGetG(color) << 8 ) + - (U_RGBAGetB(color) ); - return(out); -} - - Emf::Emf (void) // The null constructor { return; @@ -298,6 +150,7 @@ Emf::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *filena // reserve FixPPT2 for opacity bug. Currently EMF does not export opacity values bool new_FixPPTDashLine = mod->get_param_bool("FixPPTDashLine"); // dashed line bug bool new_FixPPTGrad2Polys = mod->get_param_bool("FixPPTGrad2Polys"); // gradient bug + bool new_FixPPTLinGrad = mod->get_param_bool("FixPPTLinGrad"); // allow native rectangular linear gradient bool new_FixPPTPatternAsHatch = mod->get_param_bool("FixPPTPatternAsHatch"); // force all patterns as standard EMF hatch bool new_FixImageRot = mod->get_param_bool("FixImageRot"); // remove rotations on images @@ -311,6 +164,7 @@ Emf::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *filena ext->set_param_bool("FixPPTCharPos",new_FixPPTCharPos); // Remember to add any new ones to PrintEmf::init or a mysterious failure will result! ext->set_param_bool("FixPPTDashLine",new_FixPPTDashLine); ext->set_param_bool("FixPPTGrad2Polys",new_FixPPTGrad2Polys); + ext->set_param_bool("FixPPTLinGrad",new_FixPPTLinGrad); ext->set_param_bool("FixPPTPatternAsHatch",new_FixPPTPatternAsHatch); ext->set_param_bool("FixImageRot",new_FixImageRot); ext->set_param_bool("textToPath", new_val); @@ -615,10 +469,10 @@ uint32_t Emf::add_image(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t cbBits, uint uint32_t iUsage, uint32_t offBits, uint32_t offBmi){ uint32_t idx; - char imagename[64]; // big enough - char imrotname[64]; // big enough - char xywh[64]; // big enough - int dibparams; + char imagename[64]; // big enough + char imrotname[64]; // big enough + char xywh[64]; // big enough + int dibparams = U_BI_UNKNOWN; // type of image not yet determined MEMPNG mempng; // PNG in memory comes back in this mempng.buffer = NULL; @@ -627,74 +481,60 @@ uint32_t Emf::add_image(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t cbBits, uint const char *px = NULL; // DIB pixels const U_RGBQUAD *ct = NULL; // DIB color table U_RGBQUAD ct2[2]; - uint32_t width, height, colortype, numCt, invert; - if( !cbBits || - !cbBmi || - (iUsage != U_DIB_RGB_COLORS) || - !(dibparams = get_DIB_params( // this returns pointers and values, but allocates no memory - pEmr, - offBits, - offBmi, - &px, - (const U_RGBQUAD **) &ct, - &numCt, - &width, - &height, - &colortype, - &invert - )) - ){ + 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, + &numCt, &width, &height, &colortype, &invert); + if(dibparams ==U_BI_RGB){ + // U_EMRCREATEMONOBRUSH uses text/bk colors instead of what is in the color map. + if(((PU_EMR)pEmr)->iType == U_EMR_CREATEMONOBRUSH){ + if(numCt==2){ + ct2[0] = U_RGB2BGR(d->dc[d->level].textColor); + ct2[1] = U_RGB2BGR(d->dc[d->level].bkColor); + ct = &ct2[0]; + } + else { // This record is invalid, nothing more to do here, let caller handle it + return(U_EMR_INVALID); + } + } - // U_EMRCREATEMONOBRUSH uses text/bk colors instead of what is in the color map. - if(((PU_EMR)pEmr)->iType == U_EMR_CREATEMONOBRUSH){ - if(numCt==2){ - ct2[0] = U_RGB2BGR(d->dc[d->level].textColor); - ct2[1] = U_RGB2BGR(d->dc[d->level].bkColor); - ct = &ct2[0]; - } - else { // createmonobrush renders on other platforms this way - return(0xFFFFFFFF); - } - } - - if(!DIB_to_RGBA( - px, // DIB pixel array - ct, // DIB color table - numCt, // DIB color table number of entries - &rgba_px, // U_RGBA pixel array (32 bits), created by this routine, caller must free. - width, // Width of pixel array in record - height, // Height of pixel array in record - colortype, // DIB BitCount Enumeration - numCt, // Color table used if not 0 - invert // If DIB rows are in opposite order from RGBA rows - ) && - rgba_px - ){ - toPNG( // Get the image from the RGBA px into mempng - &mempng, - width, height, // of the SRC bitmap - rgba_px - ); - free(rgba_px); + if(!DIB_to_RGBA( + px, // DIB pixel array + ct, // DIB color table + numCt, // DIB color table number of entries + &rgba_px, // U_RGBA pixel array (32 bits), created by this routine, caller must free. + width, // Width of pixel array in record + height, // Height of pixel array in record + colortype, // DIB BitCount Enumeration + numCt, // Color table used if not 0 + invert // If DIB rows are in opposite order from RGBA rows + )){ + toPNG( // Get the image from the RGBA px into mempng + &mempng, + width, height, // of the SRC bitmap + rgba_px + ); + free(rgba_px); + } } } - gchar *base64String; - if(dibparams == U_BI_JPEG || dibparams==U_BI_PNG){ + + gchar *base64String=NULL; + if(dibparams == U_BI_JPEG || dibparams==U_BI_PNG){ // image was binary png or jpg in source file base64String = g_base64_encode((guchar*) px, numCt ); - idx = in_images(d, (char *) base64String); } - else if(mempng.buffer){ + else if(mempng.buffer){ // image was DIB in source file, converted to png in this routine base64String = g_base64_encode((guchar*) mempng.buffer, mempng.size ); free(mempng.buffer); - idx = in_images(d, (char *) base64String); } - else { - // insert a random 3x4 blotch otherwise + else { // unknown or unsupported image type or failed conversion, insert the common bad image picture width = 3; height = 4; - base64String = g_strdup("iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAA3NCSVQICAjb4U/gAAAALElEQVQImQXBQQ2AMAAAsUJQMSWI2H8qME1yMshojwrvGB8XcHKvR1XtOTc/8HENumHCsOMAAAAASUVORK5CYII="); - idx = in_images(d, (char *) base64String); + base64String = bad_image_png(); } + + idx = in_images(d, (char *) base64String); if(!idx){ // add it if not already present - we looked at the actual data for comparison if(d->images.count == d->images.size){ enlarge_images(d); } idx = d->images.count; @@ -732,7 +572,7 @@ uint32_t Emf::add_image(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t cbBits, uint *(d->defs) += " "; *(d->defs) += " \n"; } - g_free(base64String); + g_free(base64String);//wait until this point to free because it might be a duplicate image /* image allows the inner image to be rotated nicely, load this one second only if needed imagename retained from above @@ -772,6 +612,115 @@ uint32_t Emf::add_image(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t cbBits, uint return(idx-1); } +/* Add another 100 blank slots to the gradients array. +*/ +void Emf::enlarge_gradients(PEMF_CALLBACK_DATA d){ + d->gradients.size += 100; + d->gradients.strings = (char **) realloc(d->gradients.strings,d->gradients.size * sizeof(char *)); +} + +/* See if the gradient name is already in the list. If it is return its position (1->n, not 1-n-1) +*/ +int Emf::in_gradients(PEMF_CALLBACK_DATA d, char *test){ + int i; + for(i=0; igradients.count; i++){ + if(strcmp(test,d->gradients.strings[i])==0)return(i+1); + } + return(0); +} + +U_COLORREF trivertex_to_colorref(U_TRIVERTEX tv){ + U_COLORREF uc; + uc.Red = tv.Red >> 8; + uc.Green = tv.Green >> 8; + uc.Blue = tv.Blue >> 8; + uc.Reserved = tv.Alpha >> 8; // Not used + return(uc); +} + +/* (Conditionally) add a gradient. If a matching gradient already exists nothing happens. If one + does not exist it is added to the gradients list and also entered into . + Only call this with H or V gradient, not a triangle. +*/ +uint32_t Emf::add_gradient(PEMF_CALLBACK_DATA d, uint32_t gradientType, U_TRIVERTEX tv1, U_TRIVERTEX tv2){ + char hgradname[64]; // big enough + char tmpcolor1[8]; + char tmpcolor2[8]; + char gradc; + uint32_t idx; + std::string x2,y2; + + U_COLORREF gradientColor1 = trivertex_to_colorref(tv1); + U_COLORREF gradientColor2 = trivertex_to_colorref(tv2); + + + sprintf(tmpcolor1,"%6.6X",sethexcolor(gradientColor1)); + sprintf(tmpcolor2,"%6.6X",sethexcolor(gradientColor2)); + switch(gradientType){ + case U_GRADIENT_FILL_RECT_H: + gradc='H'; + x2="100"; + y2="0"; + break; + case U_GRADIENT_FILL_RECT_V: + gradc='V'; + x2="0"; + y2="100"; + break; + default: // this should never happen, but fill these in to avoid compiler warnings + gradc='!'; + x2="0"; + y2="0"; + break; + } + + /* Even though the gradient was defined as Horizontal or Vertical if the rectangle is rotated it needs to + be at some other alignment, and that needs gradienttransform. Set the name using the same sort of hack + as for add_image. + */ + int tangle = round(current_rotation(d)*1000000.0); + sprintf(hgradname,"LinGrd%c_%s_%s_%d",gradc,tmpcolor1,tmpcolor2,tangle); + + idx = in_gradients(d,hgradname); + if(!idx){ // gradient does not yet exist + if(d->gradients.count == d->gradients.size){ enlarge_gradients(d); } + d->gradients.strings[d->gradients.count++]=strdup(hgradname); + idx = d->gradients.count; + SVGOStringStream stmp; + stmp << " \n"; + stmp << " \n"; + stmp << " \n"; + stmp << " \n"; + *(d->defs) += stmp.str().c_str(); + } + + return(idx-1); +} + + void Emf::output_style(PEMF_CALLBACK_DATA d, int iType) @@ -871,10 +820,11 @@ Emf::output_style(PEMF_CALLBACK_DATA d, int iType) snprintf(tmp, 1023, "fill:url(#%s); ",d->hatches.strings[d->dc[d->level].fill_idx]); tmp_style << tmp; break; - case DRAW_IMAGE: + case DRAW_IMAGE: snprintf(tmp, 1023, "fill:url(#EMFimage%d_ref); ",d->dc[d->level].fill_idx); tmp_style << tmp; break; + case DRAW_LINEAR_GRADIENT: case DRAW_PAINT: default: // <-- this should never happen, but just in case... snprintf( @@ -927,6 +877,7 @@ Emf::output_style(PEMF_CALLBACK_DATA d, int iType) snprintf(tmp, 1023, "stroke:url(#EMFimage%d_ref); ",d->dc[d->level].stroke_idx); tmp_style << tmp; break; + case DRAW_LINEAR_GRADIENT: case DRAW_PAINT: default: // <-- this should never happen, but just in case... snprintf( @@ -1343,7 +1294,7 @@ Emf::select_brush(PEMF_CALLBACK_DATA d, int index) else if(iType == U_EMR_CREATEDIBPATTERNBRUSHPT || iType == U_EMR_CREATEMONOBRUSH){ PU_EMRCREATEDIBPATTERNBRUSHPT pEmr = (PU_EMRCREATEDIBPATTERNBRUSHPT) d->emf_obj[index].lpEMFR; tidx = add_image(d, (void *) pEmr, pEmr->cbBits, pEmr->cbBmi, pEmr->iUsage, pEmr->offBits, pEmr->offBmi); - if(tidx == 0xFFFFFFFF){ // This happens if createmonobrush has a DIB that isn't monochrome + if(tidx == U_EMR_INVALID){ // This happens if createmonobrush has a DIB that isn't monochrome double r, g, b; r = SP_COLOR_U_TO_F( U_RGBAGetR(d->dc[d->level].textColor)); g = SP_COLOR_U_TO_F( U_RGBAGetG(d->dc[d->level].textColor)); @@ -1502,13 +1453,11 @@ void Emf::common_image_extraction(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t iUsage, uint32_t offBits, uint32_t cbBits, uint32_t offBmi, uint32_t cbBmi){ SVGOStringStream tmp_image; - int dibparams; + int dibparams = U_BI_UNKNOWN; // type of image not yet determined + tmp_image << "\n\t outsvg) += tmp_image.str().c_str(); + tmp_image << "/> \n"; - *(d->outsvg) += "/> \n"; + *(d->outsvg) += tmp_image.str().c_str(); *(d->path) = ""; } @@ -1664,7 +1596,7 @@ int Emf::myEnhMetaFileProc(char *contents, unsigned int length, PEMF_CALLBACK_DA // incompatible change to text drawing detected (color or background change) forces out existing text // OR // next record is valid type and forces pending text to be drawn immediately - if ((d->dc[d->level].dirty & DIRTY_TEXT) || ((emr_mask != 0xFFFFFFFF) && (emr_mask & U_DRAW_TEXT) && d->tri->dirty)){ + if ((d->dc[d->level].dirty & DIRTY_TEXT) || ((emr_mask != U_EMR_INVALID) && (emr_mask & U_DRAW_TEXT) && d->tri->dirty)){ TR_layout_analyze(d->tri); TR_layout_2_svg(d->tri); SVGOStringStream ts; @@ -1711,7 +1643,7 @@ std::cout << "BEFORE DRAW" */ if( - (emr_mask != 0xFFFFFFFF) && // next record is valid type + (emr_mask != U_EMR_INVALID) && // next record is valid type (d->mask & U_DRAW_VISIBLE) && // Current set of objects are drawable ( (d->mask & U_DRAW_FORCE) || // This draw is forced by STROKE/FILL/STROKEANDFILL PATH @@ -1726,7 +1658,7 @@ std::cout << "BEFORE DRAW" ) ){ // std::cout << "PATH DRAW at TOP" << std::endl; - *(d->outsvg) += " outsvg) += " drawtype){ // explicit draw type EMR record output_style(d, d->drawtype); } @@ -1737,7 +1669,7 @@ std::cout << "BEFORE DRAW" output_style(d, U_EMR_STROKEPATH); } *(d->outsvg) += "\n\t"; - *(d->outsvg) += "\n\td=\""; // this is the ONLY place d=" should be used!!!! + *(d->outsvg) += "\n\td=\""; // this is the ONLY place d=" should be used!!!! One exception, gradientfill. *(d->outsvg) += *(d->path); *(d->outsvg) += " \" /> \n"; *(d->path) = ""; @@ -2625,7 +2557,7 @@ std::cout << "BEFORE DRAW" int stat = emr_arc_points( lpEMFR, &f1, f2, ¢er, &start, &end, &size); if(!stat){ tmp_path << "\n\tM " << pix_to_xy(d, start.x, start.y); - tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0 ; + tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0; tmp_path << " "; tmp_path << 180.0 * current_rotation(d)/M_PI; tmp_path << " "; @@ -2646,7 +2578,7 @@ std::cout << "BEFORE DRAW" int f2 = (d->arcdir == U_AD_COUNTERCLOCKWISE ? 0 : 1); if(!emr_arc_points( lpEMFR, &f1, f2, ¢er, &start, &end, &size)){ tmp_path << "\n\tM " << pix_to_xy(d, start.x, start.y); - tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0 ; + tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0; tmp_path << " "; tmp_path << 180.0 * current_rotation(d)/M_PI; tmp_path << " "; @@ -2669,7 +2601,7 @@ std::cout << "BEFORE DRAW" if(!emr_arc_points( lpEMFR, &f1, f2, ¢er, &start, &end, &size)){ tmp_path << "\n\tM " << pix_to_xy(d, center.x, center.y); tmp_path << "\n\tL " << pix_to_xy(d, start.x, start.y); - tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0 ; + tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0; tmp_path << " "; tmp_path << 180.0 * current_rotation(d)/M_PI; tmp_path << " "; @@ -2710,7 +2642,7 @@ std::cout << "BEFORE DRAW" if(!emr_arc_points( lpEMFR, &f1, f2, ¢er, &start, &end, &size)){ // draw a line from current position to start, arc from there tmp_path << "\n\tL " << pix_to_xy(d, start.x, start.y); - tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0 ; + tmp_path << " A " << pix_to_abs_size(d, size.x)/2.0 << "," << pix_to_abs_size(d, size.y)/2.0; tmp_path << " "; tmp_path << 180.0 * current_rotation(d)/M_PI; tmp_path << " "; @@ -3332,13 +3264,64 @@ std::cout << "BEFORE DRAW" case U_EMR_SETLAYOUT: dbg_str << "\n"; break; case U_EMR_TRANSPARENTBLT: dbg_str << "\n"; break; case U_EMR_UNDEF117: dbg_str << "\n"; break; - case U_EMR_GRADIENTFILL: dbg_str << "\n"; break; - /* Gradient fill is doable for rectangles because those correspond to linear gradients. However, - the general case for the triangle fill, with a different color in each corner of the triangle, - has no SVG equivalent and cannot be easily emulated with SVG gradients. Except that so far - I (DM) have not been able to make an EMF with a rectangular gradientfill record which is not - completely toxic to other EMF readers. So far now, do nothing. - */ + case U_EMR_GRADIENTFILL: + { + /* Gradient fill is doable for rectangles because those correspond to linear gradients. However, + the general case for the triangle fill, with a different color in each corner of the triangle, + has no SVG equivalent and cannot be easily emulated with SVG gradients. So the linear gradient + is implemented, and the triangle fill just paints with the color of the first corner. + + This record can hold a series of gradients so we are forced to add path elements directly here, + it cannot wait for the top of the main loop. Any existing path is erased. + + */ + dbg_str << "\n"; + PU_EMRGRADIENTFILL pEmr = (PU_EMRGRADIENTFILL) lpEMFR; + int nV = pEmr->nTriVert; // Number of TriVertex objects + int nG = pEmr->nGradObj; // Number of gradient triangle/rectangle objects + U_TRIVERTEX *tv = (U_TRIVERTEX *)(((char *)lpEMFR) + sizeof(U_EMRGRADIENTFILL)); + if( pEmr->ulMode == U_GRADIENT_FILL_RECT_H || + pEmr->ulMode == U_GRADIENT_FILL_RECT_V + ){ + SVGOStringStream tmp_rectangle; + int i,fill_idx; + U_GRADIENT4 *rcs = (U_GRADIENT4 *)(((char *)lpEMFR) + sizeof(U_EMRGRADIENTFILL) + sizeof(U_TRIVERTEX)*nV); + for(i=0;iulMode, tv[rcs[i].UpperLeft], tv[rcs[i].LowerRight]); + tmp_rectangle << "\n\tM " << pix_to_xy( d, tv[rcs[i].UpperLeft ].x , tv[rcs[i].UpperLeft ].y ) << " "; + tmp_rectangle << "\n\tL " << pix_to_xy( d, tv[rcs[i].LowerRight].x , tv[rcs[i].UpperLeft ].y ) << " "; + tmp_rectangle << "\n\tL " << pix_to_xy( d, tv[rcs[i].LowerRight].x , tv[rcs[i].LowerRight].y ) << " "; + tmp_rectangle << "\n\tL " << pix_to_xy( d, tv[rcs[i].UpperLeft ].x , tv[rcs[i].LowerRight].y ) << " "; + tmp_rectangle << "\n\tz\""; + tmp_rectangle << "\n\tstyle=\"stroke:none;fill:url(#"; + tmp_rectangle << d->gradients.strings[fill_idx]; + tmp_rectangle << ");\"\n/>\n"; + } + *(d->outsvg) += tmp_rectangle.str().c_str(); + } + else if(pEmr->ulMode == U_GRADIENT_FILL_TRIANGLE){ + SVGOStringStream tmp_triangle; + char tmpcolor[8]; + int i; + U_GRADIENT3 *tris = (U_GRADIENT3 *)(((char *)lpEMFR) + sizeof(U_EMRGRADIENTFILL) + sizeof(U_TRIVERTEX)*nV); + for(i=0;i\n"; + } + *(d->outsvg) += tmp_triangle.str().c_str(); + } + *(d->path) = ""; + // if it is anything else the record is bogus, so ignore it + break; + } case U_EMR_SETLINKEDUFIS: dbg_str << "\n"; break; case U_EMR_SETTEXTJUSTIFICATION: dbg_str << "\n"; break; case U_EMR_COLORMATCHTOTARGETW: dbg_str << "\n"; break; @@ -3354,37 +3337,12 @@ std::cout << "BEFORE DRAW" } //end of while // When testing, uncomment the following to show the final SVG derived from the EMF -//std::cout << *(d->outsvg) << std::endl; +// 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; } - -// Aldus Placeable Header =================================================== -// Since we are a 32bit app, we have to be sure this structure compiles to -// be identical to a 16 bit app's version. To do this, we use the #pragma -// to adjust packing, we use a uint16_t for the hmf handle, and a SMALL_RECT -// for the bbox rectangle. -#pragma pack( push ) -#pragma pack( 2 ) -typedef struct _SMALL_RECT { - int16_t Left; - int16_t Top; - int16_t Right; - int16_t Bottom; -} SMALL_RECT, *PSMALL_RECT; -typedef struct -{ - uint32_t dwKey; - uint16_t hmf; - SMALL_RECT bbox; - uint16_t wInch; - uint32_t dwReserved; - uint16_t wCheckSum; -} APMHEADER, *PAPMHEADER; -#pragma pack( pop ) - void Emf::free_emf_strings(EMF_STRINGS name){ if(name.count){ for(int i=0; i< name.count; i++){ free(name.strings[i]); } @@ -3438,6 +3396,9 @@ Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri ) d.images.size = 0; d.images.count = 0; d.images.strings = NULL; + d.gradients.size = 0; + d.gradients.count = 0; + d.gradients.strings = NULL; // set up the size default for patterns in defs. This might not be referenced if there are no patterns defined in the drawing. @@ -3478,6 +3439,7 @@ Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri ) delete d.defs; free_emf_strings(d.hatches); free_emf_strings(d.images); + free_emf_strings(d.gradients); if (d.emf_obj) { int i; @@ -3516,7 +3478,14 @@ Emf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri ) // Scale and translate objects double scale = Inkscape::Util::Quantity::convert(1, "px", doc_unit); ShapeEditor::blockSetItem(true); - doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, doc->getHeight().value("px"))); + double dh; + if(SP_ACTIVE_DOCUMENT){ // for file menu open or import, or paste from clipboard + dh = SP_ACTIVE_DOCUMENT->getHeight().value("px"); + } + else { // for open via --file on command line + dh = doc->getHeight().value("px"); + } + doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, dh)); ShapeEditor::blockSetItem(false); Inkscape::DocumentUndo::setUndoSensitive(doc, saved); @@ -3556,6 +3525,7 @@ Emf::init (void) "false\n" "false\n" "false\n" + "false\n" "false\n" "false\n" "\n" diff --git a/src/extension/internal/emf-inout.h b/src/extension/internal/emf-inout.h index 787a2fdb3..97f93e71b 100644 --- a/src/extension/internal/emf-inout.h +++ b/src/extension/internal/emf-inout.h @@ -11,9 +11,8 @@ #ifndef SEEN_EXTENSION_INTERNAL_EMF_H #define SEEN_EXTENSION_INTERNAL_EMF_H -#define PNG_SKIP_SETJMP_CHECK // else any further png.h include blows up in the compiler -#include #include +#include "extension/internal/metafile-inout.h" // picks up PNG #include "extension/implementation/implementation.h" #include "style.h" #include "text_reassemble.h" @@ -67,34 +66,6 @@ typedef struct emf_device_context { #define EMF_MAX_DC 128 -/* - both emf-inout.h and wmf-inout.h are included by init.cpp, so whichever one goes in first defines these ommon types -*/ -#ifndef SEEN_EXTENSION_INTERNAL_METAFILECOMMON_ -#define SEEN_EXTENSION_INTERNAL_METAFILECOMMON_ -/* A coloured pixel. */ -typedef struct { - uint8_t red; - uint8_t green; - uint8_t blue; - uint8_t opacity; -} pixel_t; - -/* A picture. */ - -typedef struct { - pixel_t *pixels; - size_t width; - size_t height; -} bitmap_t; - -/* structure to store PNG image bytes */ -typedef struct { - char *buffer; - size_t size; -} MEMPNG, *PMEMPNG; -#endif - typedef struct { Glib::ustring *outsvg; Glib::ustring *path; @@ -126,6 +97,7 @@ typedef struct { // both of these end up in under the names shown here. These structures allow duplicates to be avoided. EMF_STRINGS hatches; // hold pattern names, all like EMFhatch#_$$$$$$ where # is the EMF hatch code and $$$$$$ is the color EMF_STRINGS images; // hold images, all like Image#, where # is the slot the image lives. + EMF_STRINGS gradients; // hold gradient names, all like EMF[HV]_$$$$$$_$$$$$$ where $$$$$$ are the colors TR_INFO *tri; // Text Reassembly data structure @@ -133,7 +105,8 @@ typedef struct { PEMF_OBJECT emf_obj; } EMF_CALLBACK_DATA, *PEMF_CALLBACK_DATA; -class Emf : Inkscape::Extension::Implementation::Implementation { //This is a derived class +class Emf : public Metafile +{ public: @@ -155,11 +128,6 @@ public: private: protected: - - static pixel_t *pixel_at (bitmap_t * bitmap, int x, int y); - static void my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length); - static void toPNG(PMEMPNG accum, int width, int height, const char *px); - static uint32_t sethexcolor(U_COLORREF color); static void print_document_to_file(SPDocument *doc, const gchar *filename); static double current_scale(PEMF_CALLBACK_DATA d); static std::string current_matrix(PEMF_CALLBACK_DATA d, double x, double y, int useoffset); @@ -171,6 +139,9 @@ protected: static int in_images(PEMF_CALLBACK_DATA d, char *test); static uint32_t add_image(PEMF_CALLBACK_DATA d, void *pEmr, uint32_t cbBits, uint32_t cbBmi, uint32_t iUsage, uint32_t offBits, uint32_t offBmi); + static void enlarge_gradients(PEMF_CALLBACK_DATA d); + static int in_gradients(PEMF_CALLBACK_DATA d, char *test); + static uint32_t add_gradient(PEMF_CALLBACK_DATA d, uint32_t gradientType, U_TRIVERTEX tv1, U_TRIVERTEX tv2); static void output_style(PEMF_CALLBACK_DATA d, int iType); static double _pix_x_to_point(PEMF_CALLBACK_DATA d, double px); static double _pix_y_to_point(PEMF_CALLBACK_DATA d, double py); diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp index 0df643130..3c27ac1b8 100644 --- a/src/extension/internal/emf-print.cpp +++ b/src/extension/internal/emf-print.cpp @@ -70,9 +70,8 @@ namespace Internal { /* globals */ -static double PX2WORLD = 20.0f; -static U_XFORM worldTransform; -static bool FixPPTCharPos, FixPPTDashLine, FixPPTGrad2Polys, FixPPTPatternAsHatch, FixImageRot; +static double PX2WORLD; +static bool FixPPTCharPos, FixPPTDashLine, FixPPTGrad2Polys, FixPPTLinGrad, FixPPTPatternAsHatch, FixImageRot; static EMFTRACK *et = NULL; static EMFHANDLES *eht = NULL; @@ -125,9 +124,12 @@ unsigned int PrintEmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) char *rec; gchar const *utf8_fn = mod->get_param_string("destination"); + // Typially PX2WORLD is 1200/90, using inkscape's default dpi + PX2WORLD = 1200.0 / Inkscape::Util::Quantity::convert(1.0, "in", "px"); FixPPTCharPos = mod->get_param_bool("FixPPTCharPos"); FixPPTDashLine = mod->get_param_bool("FixPPTDashLine"); FixPPTGrad2Polys = mod->get_param_bool("FixPPTGrad2Polys"); + FixPPTLinGrad = mod->get_param_bool("FixPPTLinGrad"); FixPPTPatternAsHatch = mod->get_param_bool("FixPPTPatternAsHatch"); FixImageRot = mod->get_param_bool("FixImageRot"); @@ -179,12 +181,12 @@ unsigned int PrintEmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) float dwInchesX = d.width(); float dwInchesY = d.height(); - // dwInchesX x dwInchesY in micrometer units, dpi=90 -> 3543.3 dpm - (void) drawing_size((int) ceil(dwInchesX * 25.4), (int) ceil(dwInchesY * 25.4), 3.543307, &rclBounds, &rclFrame); + // dwInchesX x dwInchesY in micrometer units, 1200 dpi/25.4 -> dpmm + (void) drawing_size((int) ceil(dwInchesX * 25.4), (int) ceil(dwInchesY * 25.4),1200.0/25.4, &rclBounds, &rclFrame); // set up the reference device as 100 X A4 horizontal, (1200 dpi/25.4 -> dpmm). Extra digits maintain dpi better in EMF - int MMX = 21600; - int MMY = 27900; + int MMX = 216; + int MMY = 279; (void) device_size(MMX, MMY, 1200.0 / 25.4, &szlDev, &szlMm); int PixelsX = szlDev.cx; int PixelsY = szlDev.cy; @@ -220,13 +222,16 @@ unsigned int PrintEmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) } - // Correct for dpi in EMF (1200) vs dpi in Inkscape (always 90). - // Also correct for the scaling in PX2WORLD, which is set to 20. + // In earlier versions this was used to scale from inkscape's dpi of 90 to + // the files 1200 dpi, taking into account PX2WORLD which was 20. Now PX2WORLD + // is set so that this matrix is unitary. The usual value of PX2WORLD is 1200/90, + // but might be different if the internal dpi is changed. - worldTransform.eM11 = 1200. / (90.0 * PX2WORLD); + U_XFORM worldTransform; + worldTransform.eM11 = 1.0; worldTransform.eM12 = 0.0; worldTransform.eM21 = 0.0; - worldTransform.eM22 = 1200. / (90.0 * PX2WORLD); + worldTransform.eM22 = 1.0; worldTransform.eDx = 0; worldTransform.eDy = 0; @@ -420,7 +425,7 @@ int PrintEmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) hatchColor = avg_stop_color(rg); } } else if (lg) { - if (FixPPTGrad2Polys) { + if (FixPPTGrad2Polys || FixPPTLinGrad) { return hold_gradient(lg, fill_mode); } else { hatchColor = avg_stop_color(lg); @@ -696,7 +701,7 @@ int PrintEmf::create_pen(SPStyle const *style, const Geom::Affine &transform) n_dash = style->stroke_dash.n_dash; dash = new uint32_t[n_dash]; for (i = 0; i < style->stroke_dash.n_dash; i++) { - dash[i] = (uint32_t)(style->stroke_dash.dash[i]); + dash[i] = (uint32_t)(Inkscape::Util::Quantity::convert(1, "mm", "px") * style->stroke_dash.dash[i]); } } } @@ -780,6 +785,182 @@ void PrintEmf::destroy_pen() } } +/* Return a Path consisting of just the corner points of the single path in a a PathVector. If the +PathVector has more than one path, or that one path is open, or any of its segments are curved, then the +returned PathVector is . If the input path is already just straight lines and vertices the output will be the +same as the sole path in the input. */ + +Geom::Path PrintEmf::pathv_to_simple_polygon(Geom::PathVector const &pathv, int *vertices) +{ + Geom::Point P1_trail; + Geom::Point P1; + Geom::Point P1_lead; + Geom::Point v1,v2; + Geom::Path output; + Geom::Path bad; + Geom::PathVector pv = pathv_to_linear_and_cubic_beziers(pathv); + Geom::PathVector::const_iterator pit = pv.begin(); + Geom::PathVector::const_iterator pit2 = pv.begin(); + ++pit2; + *vertices = 0; + if(pit->end_closed() != pit->end_default())return(bad); // path must be closed + if(pit2 != pv.end())return(bad); // there may only be one path + P1_trail = pit->finalPoint(); + Geom::Path::const_iterator cit = pit->begin(); + P1 = cit->initialPoint(); + for(;cit != pit->end_closed();++cit) { + if (!is_straight_curve(*cit)) { + *vertices = 0; + return(bad); + } + P1_lead = cit->finalPoint(); + if(Geom::are_near(P1_lead,P1))continue; // duplicate points at the same coordinate + v1 = unit_vector(P1 - P1_trail); + v2 = unit_vector(P1_lead - P1 ); + if(Geom::are_near(dot(v1,v2),1.0)){ // P1 is within a straight line + P1 = P1_lead; + continue; + } + // P1 is the center point of a turn of some angle + if(!*vertices){ + output.start( P1 ); + output.close( pit->closed() ); + } + *vertices += 1; + Geom::LineSegment ls(P1_trail, P1); + output.append(ls); + P1_trail = P1; + P1 = P1_lead; + } + return(output); +} + +/* Returns the simplified PathVector (no matter what). + Sets is_rect if it is a rectangle. + Sets angle that will rotate side closest to horizontal onto horizontal. +*/ +Geom::Path PrintEmf::pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, double *angle) +{ + Geom::Point P1_trail; + Geom::Point P1; + Geom::Point P1_lead; + Geom::Point v1,v2; + int vertices; + Geom::Path pR = pathv_to_simple_polygon(pathv, &vertices); + *is_rect = false; + if(vertices==4){ // or else it cannot be a rectangle rectangle + int vertex_count=0; + /* Get the ends of the LAST line segment. + Find minimum rotation to align rectangle with X,Y axes. (Very degenerate if it is rotated 45 degrees.) */ + *angle = 10.0; /* must be > than the actual angle in radians. */ + for(Geom::Path::const_iterator cit = pR.begin(); cit != pR.end_open(); ++cit){ + P1_trail = cit->initialPoint(); + P1 = cit->finalPoint(); + v1 = unit_vector(P1 - P1_trail); + if(v1[Geom::X] > 0){ // only check the 1 or 2 points on vectors aimed the same direction as unit X + double ang = asin(v1[Geom::Y]); // because component is rotation by ang of {1,0| vector + if(fabs(ang) < fabs(*angle))*angle = -ang; // y increases down, flips sign on angle + } + } + + for(Geom::Path::const_iterator cit = pR.begin(); cit != pR.end_open();++cit) { + P1_lead = cit->finalPoint(); + v1 = unit_vector(P1 - P1_trail); + v2 = unit_vector(P1_lead - P1 ); + if(!Geom::are_near(dot(v1,v2),0.0))break; // P1 is center of a turn that is not 90 degrees + P1_trail = P1; + P1 = P1_lead; + vertex_count++; + } + if(vertex_count == 4){ + *is_rect=true; + } + } + return(pR); +} + +/* Compare a vector with a rectangle's orientation (angle needed to rotate side(s) + closest to horizontal to exactly horizontal) and return: + 0 none of the following + 1 parallel to horizontal + 2 parallel to vertical + 3 antiparallel to horizontal + 4 antiparallel to vertical +*/ +int PrintEmf::vector_rect_alignment(double angle, Geom::Point vtest){ + int stat = 0; + Geom::Point v1 = Geom::unit_vector(vtest); // unit vector to test alignment + Geom::Point v2 = Geom::Point(1,0) * Geom::Rotate(-angle); // unit horizontal side (sign change because Y increases DOWN) + if( Geom::are_near(dot(v1,v2), 1.0)){ stat = 1; } + else if(Geom::are_near(dot(v1,v2),-1.0)){ stat = 2; } + if(!stat){ + v2 = Geom::Point(0,1) * Geom::Rotate(-angle); // unit vertical side + if( Geom::are_near(dot(v1,v2), 1.0)){ stat = 3; } + else if(Geom::are_near(dot(v1,v2),-1.0)){ stat = 4; } + } + return(stat); +} + +/* retrieve the point at the indicated corner: + 0 UL (and default) + 1 UR + 2 LR + 3 LL + Needed because the start can be any point, and the direction could run either + clockwise or counterclockwise. This should work even if the corners of the rectangle + are slightly displaced. +*/ +Geom::Point PrintEmf::get_pathrect_corner(Geom::Path pathRect, double angle, int corner){ + Geom::Point v1 = Geom::Point(1,0) * Geom::Rotate(-angle); // unit horizontal side (sign change because Y increases DOWN) + Geom::Point v2 = Geom::Point(0,1) * Geom::Rotate(-angle); // unit vertical side (sign change because Y increases DOWN) + Geom::Point center, P1; + int LR; // 1 if Left, 0 if Right + int UL; // 1 if Lower, 0 if Upper (as viewed on screen, y coordinates increase downwards) + center = Geom::Point(0,0); + Geom::Path::const_iterator cit = pathRect.begin(); + for(; cit != pathRect.end_open();++cit) { + center += cit->initialPoint()/4.0; + } + + switch(corner){ + case 1: //UR + LR = 0; + UL = 0; + break; + case 2: //LR + LR = 0; + UL = 1; + break; + case 3: //LL + LR = 1; + UL = 1; + break; + default: //UL + LR = 1; + UL = 0; + break; + } + cit = pathRect.begin(); + for(int i; cit != pathRect.end_open();++cit,i++) { + P1 = cit->initialPoint(); + if((LR == (dot(P1 - center,v1)> 0 ? 0 : 1)) && + (UL == (dot(P1 - center,v2)> 0 ? 1 : 0)))break; + } + return(P1); +} + +U_TRIVERTEX PrintEmf::make_trivertex(Geom::Point Pt, U_COLORREF uc){ + U_TRIVERTEX tv; + using Geom::X; + using Geom::Y; + tv.x = (int32_t) round(Pt[X]); + tv.y = (int32_t) round(Pt[Y]); + tv.Red = uc.Red << 8; + tv.Green = uc.Green << 8; + tv.Blue = uc.Blue << 8; + tv.Alpha = uc.Reserved << 8; // EMF will ignore this + return(tv); +} unsigned int PrintEmf::fill( Inkscape::Extension::Print * /*mod*/, @@ -795,8 +976,27 @@ unsigned int PrintEmf::fill( use_stroke = false; fill_transform = tf; + + int brush_stat = create_brush(style, NULL); + + /* native linear gradients are only used if the object is a rectangle AND the gradient is parallel to the sides of the object */ + bool is_Rect = false; + double angle; + int rectDir=0; + Geom::Path pathRect; + if(FixPPTLinGrad && brush_stat && gv.mode == DRAW_LINEAR_GRADIENT){ + pathRect = pathv_to_rect(pathv, &is_Rect, &angle); + if(is_Rect){ + /* Gradientfill records can only be used if the gradient is parallel to the sides of the rectangle. + That must be checked here so that we can fall back to another form of gradient fill if it is not + the case. */ + rectDir = vector_rect_alignment(angle, gv.p2 - gv.p1); + if(!rectDir)is_Rect = false; + } + if(!is_Rect && !FixPPTGrad2Polys)brush_stat=0; // fall all the way back to a solid fill + } - if (create_brush(style, NULL)) { // only happens if the style is a gradient + if (brush_stat) { // only happens if the style is a gradient /* Handle gradients. Uses modified livarot as 2geom boolops is currently broken. Can handle gradients with multiple stops. @@ -819,10 +1019,10 @@ unsigned int PrintEmf::fill( SPRadialGradient *tg = (SPRadialGradient *)(gv.grad); // linear/radial are the same here nstops = tg->vector.stops.size(); sp_color_get_rgb_floatv(&tg->vector.stops[0].color, rgb); - opa = tg->vector.stops[0].opacity; + opa = tg->vector.stops[0].opacity; // first stop c1 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); sp_color_get_rgb_floatv(&tg->vector.stops[nstops - 1].color, rgb); - opa = tg->vector.stops[nstops - 1].opacity; + opa = tg->vector.stops[nstops - 1].opacity; // last stop c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); doff = 0.0; @@ -868,9 +1068,10 @@ unsigned int PrintEmf::fill( pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); print_pathv(pathvr, fill_transform); // show the intersection - if (doff >= doff_range - doff_base) { + if (doff >= doff_range) { istop++; if (istop >= nstops) { + istop = nstops - 1; continue; // could happen on a rounding error } doff_base = doff_range; @@ -882,56 +1083,145 @@ unsigned int PrintEmf::fill( } } } else if (gv.mode == DRAW_LINEAR_GRADIENT) { - Geom::Point uv = Geom::unit_vector(gv.p2 - gv.p1); // unit vector - Geom::Point puv = uv.cw(); // perp. to unit vector - double range = Geom::distance(gv.p1, gv.p2); // length along the gradient - double step = range / divisions; // adequate approximation for gradient - double overlap = step / 4.0; // overlap slices slightly - double start; - double stop; - Geom::PathVector pathvc, pathvr; - - /* before lower end of gradient, overlap first slice position */ - wc = weight_opacity(c1); - (void) create_brush(style, &wc); - pathvc = rect_cutter(gv.p1, uv * (overlap), uv * (-50000.0), puv * 50000.0); - pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); - print_pathv(pathvr, fill_transform); - - /* after high end of gradient, overlap last slice poosition */ - wc = weight_opacity(c2); - (void) create_brush(style, &wc); - pathvc = rect_cutter(gv.p2, uv * (-overlap), uv * (50000.0), puv * 50000.0); - pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); - print_pathv(pathvr, fill_transform); + if(is_Rect){ + char *rec; + int gMode; + Geom::Point ul, ur, lr; + Geom::Point outUL, outLR; // UL,LR corners of a stop rectangle, in OUTPUT coordinates + U_TRIVERTEX ut[2]; + U_GRADIENT4 ug4; + U_RECTL rcb; + Geom::Affine tf2; + U_XFORM tmpTransform; + double wRect, hRect; + + /* coordinates, w,h and transform for the ENTIRE retangle */ + ul = get_pathrect_corner(pathRect, angle, 0) * fill_transform * PX2WORLD; + ur = get_pathrect_corner(pathRect, angle, 1) * fill_transform * PX2WORLD; + lr = get_pathrect_corner(pathRect, angle, 2) * fill_transform * PX2WORLD; + wRect = Geom::distance(ul,ur); + hRect = Geom::distance(ur,lr); + + /* The basic rectangle for all of these is placed with its UL corner at 0,0 with a size wRect,hRect. + Apply a world transform to place/scale it into the appropriate position on the drawing. + Actual gradientfill records are either this entire rectangle or slices of it as defined by the stops. + */ + + tf2 = Geom::Rotate(-angle); + tmpTransform.eM11 = tf2[0]; + tmpTransform.eM12 = tf2[1]; + tmpTransform.eM21 = tf2[2]; + tmpTransform.eM22 = tf2[3]; + tmpTransform.eDx = (ul)[Geom::X]; + tmpTransform.eDy = (ul)[Geom::Y]; + + rec = U_EMRSAVEDC_set(); + if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { + g_error("Fatal programming error in PrintEmf::image at U_EMRSAVEDC_set"); + } - sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); - opa = tg->vector.stops[istop].opacity; - c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); + rec = U_EMRMODIFYWORLDTRANSFORM_set(tmpTransform, U_MWT_LEFTMULTIPLY); + if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { + g_error("Fatal programming error in PrintEmf::image at EMRMODIFYWORLDTRANSFORM"); + } + + for(;istopvector.stops[istop].offset; // next or last stop + if(rectDir == 1 || rectDir == 2){ + outUL = Geom::Point(doff_base *wRect, 0 ); + outLR = Geom::Point(doff_range*wRect, hRect); + gMode = U_GRADIENT_FILL_RECT_H; + } + else { + outUL = Geom::Point(0, doff_base *hRect); + outLR = Geom::Point(wRect,doff_range*hRect); + gMode = U_GRADIENT_FILL_RECT_V; + } + doff_base = doff_range; + rcb.left = outUL[X]; + rcb.top = outUL[Y]; + rcb.right = outLR[X]; + rcb.bottom = outLR[Y]; + sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); + opa = tg->vector.stops[istop].opacity; + c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); + + if(rectDir == 2 || rectDir == 4){ // gradient is reversed, so swap colors + ut[0] = make_trivertex(outUL, c2); + ut[1] = make_trivertex(outLR, c1); + } + else { + ut[0] = make_trivertex(outUL, c1); + ut[1] = make_trivertex(outLR, c2); + } + c1 = c2; // for next stop + ug4.UpperLeft = 0; + ug4.LowerRight= 1; + /* NEED to push world transform here for rotations */ + rec = U_EMRGRADIENTFILL_set(rcb, 2, 1, gMode, ut, (uint32_t *) &ug4 ); + if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { + g_error("Fatal programming error in PrintEmf::fill at U_EMRGRADIENTFILL_set"); + } + } - for (start = 0.0; start < range; start += step, doff += 1. / divisions) { - stop = start + step + overlap; - if (stop > range) { - stop = range; + rec = U_EMRRESTOREDC_set(-1); + if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { + g_error("Fatal programming error in PrintEmf::fill at U_EMRRESTOREDC_set"); } - pathvc = rect_cutter(gv.p1, uv * start, uv * stop, puv * 50000.0); + } + else { + Geom::Point uv = Geom::unit_vector(gv.p2 - gv.p1); // unit vector + Geom::Point puv = uv.cw(); // perp. to unit vector + double range = Geom::distance(gv.p1, gv.p2); // length along the gradient + double step = range / divisions; // adequate approximation for gradient + double overlap = step / 4.0; // overlap slices slightly + double start; + double stop; + Geom::PathVector pathvc, pathvr; + + /* before lower end of gradient, overlap first slice position */ + wc = weight_opacity(c1); + (void) create_brush(style, &wc); + pathvc = rect_cutter(gv.p1, uv * (overlap), uv * (-50000.0), puv * 50000.0); + pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); + print_pathv(pathvr, fill_transform); - wc = weight_colors(c1, c2, (doff - doff_base) / (doff_range - doff_base)); + /* after high end of gradient, overlap last slice position */ + wc = weight_opacity(c2); (void) create_brush(style, &wc); - Geom::PathVector pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); - print_pathv(pathvr, fill_transform); // show the intersection + pathvc = rect_cutter(gv.p2, uv * (-overlap), uv * (50000.0), puv * 50000.0); + pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); + print_pathv(pathvr, fill_transform); - if (doff >= doff_range - doff_base) { - istop++; - if (istop >= nstops) { - continue; // could happen on a rounding error + sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); + opa = tg->vector.stops[istop].opacity; + c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); + + for (start = 0.0; start < range; start += step, doff += 1. / divisions) { + stop = start + step + overlap; + if (stop > range) { + stop = range; + } + pathvc = rect_cutter(gv.p1, uv * start, uv * stop, puv * 50000.0); + + wc = weight_colors(c1, c2, (doff - doff_base) / (doff_range - doff_base)); + (void) create_brush(style, &wc); + Geom::PathVector pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); + print_pathv(pathvr, fill_transform); // show the intersection + + if (doff >= doff_range) { + istop++; + if (istop >= nstops) { + istop = nstops - 1; + continue; // could happen on a rounding error + } + doff_base = doff_range; + doff_range = tg->vector.stops[istop].offset; // next or last stop + c1 = c2; + sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); + opa = tg->vector.stops[istop].opacity; + c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); } - doff_base = doff_range; - doff_range = tg->vector.stops[istop].offset; // next or last stop - c1 = c2; - sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); - opa = tg->vector.stops[istop].opacity; - c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); } } } else { @@ -1301,6 +1591,10 @@ unsigned int PrintEmf::image( U_POINTL cDest = pointl_set(round(dw * PX2WORLD), round(dh * PX2WORLD)); U_POINTL Src = pointl_set(0, 0); U_POINTL cSrc = pointl_set(w, h); + /* map the integer Dest coordinates back into pLL2, so that the rounded part does not destabilize the transform offset below */ + pLL2[Geom::X] = Dest.x; + pLL2[Geom::Y] = Dest.y; + pLL2 /= PX2WORLD; if (!FixImageRot) { /* Rotate images - some programs cannot read them in correctly if they are rotated */ tf[4] = tf[5] = 0.0; // get rid of the offset in the transform Geom::Point pLL2prime = pLL2 * tf; @@ -1309,7 +1603,7 @@ unsigned int PrintEmf::image( tmpTransform.eM12 = tf[1]; tmpTransform.eM21 = tf[2]; tmpTransform.eM22 = tf[3]; - tmpTransform.eDx = (pLL2[Geom::X] - pLL2prime[Geom::X]) * PX2WORLD; //map pLL2 (now in EMF coordinates) back onto itself after the rotation + tmpTransform.eDx = (pLL2[Geom::X] - pLL2prime[Geom::X]) * PX2WORLD; tmpTransform.eDy = (pLL2[Geom::Y] - pLL2prime[Geom::Y]) * PX2WORLD; rec = U_EMRSAVEDC_set(); @@ -1734,6 +2028,7 @@ void PrintEmf::init(void) "false\n" "false\n" "false\n" + "false\n" "false\n" "false\n" "\n" diff --git a/src/extension/internal/emf-print.h b/src/extension/internal/emf-print.h index 1546fcaea..8fc9908e3 100644 --- a/src/extension/internal/emf-print.h +++ b/src/extension/internal/emf-print.h @@ -68,6 +68,11 @@ public: protected: static void smuggle_adxkyrtl_out(const char *string, uint32_t **adx, double *ky, int *rtl, int *ndx, float scale); + Geom::Path pathv_to_simple_polygon(Geom::PathVector const &pathv, int *vertices); + Geom::Path pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, double *angle); + Geom::Point get_pathrect_corner(Geom::Path pathRect, double angle, int corner); + U_TRIVERTEX make_trivertex(Geom::Point Pt, U_COLORREF uc); + int vector_rect_alignment(double angle, Geom::Point vtest); int create_brush(SPStyle const *style, PU_COLORREF fcolor); void destroy_brush(); int create_pen(SPStyle const *style, const Geom::Affine &transform); diff --git a/src/extension/internal/metafile-inout.cpp b/src/extension/internal/metafile-inout.cpp new file mode 100644 index 000000000..c7ae53370 --- /dev/null +++ b/src/extension/internal/metafile-inout.cpp @@ -0,0 +1,210 @@ +/** @file + * @brief Metafile input - common routines + *//* + * Authors: + * David Mathog + * + * Copyright (C) 2013 Authors + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include +#include + +#include "extension/internal/metafile-inout.h" // picks up PNG +#include "extension/print.h" +#include "path-prefix.h" +#include "sp-gradient.h" +#include "sp-image.h" +#include "sp-linear-gradient.h" +#include "sp-pattern.h" +#include "sp-radial-gradient.h" +#include "style.h" + +namespace Inkscape { +namespace Extension { +namespace Internal { + +Metafile::~Metafile() +{ + return; +} + +/** Construct a PNG in memory from an RGB from the EMF file + +from: +http://www.lemoda.net/c/write-png/ + +which was based on: +http://stackoverflow.com/questions/1821806/how-to-encode-png-to-buffer-using-libpng + +gcc -Wall -o testpng testpng.c -lpng + +Originally here, but moved up + +#include +#include +#include +#include +*/ + + +/* Given "bitmap", this returns the pixel of bitmap at the point + ("x", "y"). */ + +pixel_t * Metafile::pixel_at (bitmap_t * bitmap, int x, int y) +{ + return bitmap->pixels + bitmap->width * y + x; +} + + +/* Write "bitmap" to a PNG file specified by "path"; returns 0 on + success, non-zero on error. */ + +void +Metafile::my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) +{ + PMEMPNG p=(PMEMPNG)png_get_io_ptr(png_ptr); + + size_t nsize = p->size + length; + + /* allocate or grow buffer */ + if(p->buffer){ p->buffer = (char *) realloc(p->buffer, nsize); } + else{ p->buffer = (char *) malloc(nsize); } + + if(!p->buffer){ png_error(png_ptr, "Write Error"); } + + /* copy new bytes to end of buffer */ + memcpy(p->buffer + p->size, data, length); + p->size += length; +} + +void Metafile::toPNG(PMEMPNG accum, int width, int height, const char *px){ + bitmap_t bmStore; + bitmap_t *bitmap = &bmStore; + accum->buffer=NULL; // PNG constructed in memory will end up here, caller must free(). + accum->size=0; + bitmap->pixels=(pixel_t *)px; + bitmap->width = width; + bitmap->height = height; + + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; + size_t x, y; + png_byte ** row_pointers = NULL; + /* The following number is set by trial and error only. I cannot + see where it it is documented in the libpng manual. + */ + int pixel_size = 3; + int depth = 8; + + png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (png_ptr == NULL){ + accum->buffer=NULL; + return; + } + + info_ptr = png_create_info_struct (png_ptr); + if (info_ptr == NULL){ + png_destroy_write_struct (&png_ptr, &info_ptr); + accum->buffer=NULL; + return; + } + + /* Set up error handling. */ + + if (setjmp (png_jmpbuf (png_ptr))) { + png_destroy_write_struct (&png_ptr, &info_ptr); + accum->buffer=NULL; + return; + } + + /* Set image attributes. */ + + png_set_IHDR ( + png_ptr, + info_ptr, + bitmap->width, + bitmap->height, + depth, + PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, + PNG_FILTER_TYPE_DEFAULT + ); + + /* Initialize rows of PNG. */ + + row_pointers = (png_byte **) png_malloc (png_ptr, bitmap->height * sizeof (png_byte *)); + for (y = 0; y < bitmap->height; ++y) { + png_byte *row = + (png_byte *) png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size); + row_pointers[bitmap->height - y - 1] = row; // Row order in EMF is reversed. + for (x = 0; x < bitmap->width; ++x) { + pixel_t * pixel = pixel_at (bitmap, x, y); + *row++ = pixel->red; // R & B channels were set correctly by DIB_to_RGB + *row++ = pixel->green; + *row++ = pixel->blue; + } + } + + /* Write the image data to memory */ + + png_set_rows (png_ptr, info_ptr, row_pointers); + + png_set_write_fn(png_ptr, accum, my_png_write_data, NULL); + + png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); + + for (y = 0; y < bitmap->height; y++) { + png_free (png_ptr, row_pointers[y]); + } + png_free (png_ptr, row_pointers); + png_destroy_write_struct(&png_ptr, &info_ptr); + +} + + +/* convert an EMF RGB(A) color to 0RGB +inverse of gethexcolor() in emf-print.cpp +*/ +uint32_t Metafile::sethexcolor(U_COLORREF color){ + + uint32_t out; + out = (U_RGBAGetR(color) << 16) + + (U_RGBAGetG(color) << 8 ) + + (U_RGBAGetB(color) ); + return(out); +} + +/* Return the base64 encoded png which is shown for all bad images. +Currently a random 3x4 blotch. +Caller must free. +*/ +gchar *Metafile::bad_image_png(void){ + gchar *gstring = g_strdup("iVBORw0KGgoAAAANSUhEUgAAAAQAAAADCAIAAAA7ljmRAAAAA3NCSVQICAjb4U/gAAAALElEQVQImQXBQQ2AMAAAsUJQMSWI2H8qME1yMshojwrvGB8XcHKvR1XtOTc/8HENumHCsOMAAAAASUVORK5CYII="); + return(gstring); +} + + + +} // namespace Internal +} // namespace Extension +} // namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/extension/internal/metafile-inout.h b/src/extension/internal/metafile-inout.h new file mode 100644 index 000000000..968773a3a --- /dev/null +++ b/src/extension/internal/metafile-inout.h @@ -0,0 +1,93 @@ +/** @file + * @brief Metafile input - common functions + *//* + * Authors: + * David Mathog + * + * Copyright (C) 2013 Authors + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#ifndef SEEN_INKSCAPE_EXTENSION_INTERNAL_METAFILE_INOUT_H +#define SEEN_INKSCAPE_EXTENSION_INTERNAL_METAFILE_INOUT_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define PNG_SKIP_SETJMP_CHECK // else any further png.h include blows up in the compiler +#include +#include +#include +#include +#include +#include +#include +#include +#include <2geom/affine.h> +#include <2geom/pathvector.h> + +#include "extension/implementation/implementation.h" + +class SPObject; + +namespace Inkscape { +class Pixbuf; + +namespace Extension { +namespace Internal { + +/* A coloured pixel. */ +typedef struct { + uint8_t red; + uint8_t green; + uint8_t blue; + uint8_t opacity; +} pixel_t; + +/* A picture. */ + typedef struct { + pixel_t *pixels; + size_t width; + size_t height; +} bitmap_t; + +/* structure to store PNG image bytes */ +typedef struct { + char *buffer; + size_t size; +} MEMPNG, *PMEMPNG; + +class Metafile + : public Inkscape::Extension::Implementation::Implementation +{ +public: + Metafile() {} + ~Metafile(); + +protected: + static uint32_t sethexcolor(U_COLORREF color); + static pixel_t *pixel_at (bitmap_t * bitmap, int x, int y); + static void my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length); + static void toPNG(PMEMPNG accum, int width, int height, const char *px); + static gchar *bad_image_png(void); + + +private: +}; + +} // namespace Internal +} // namespace Extension +} // namespace Inkscape + +#endif // SEEN_INKSCAPE_EXTENSION_INTERNAL_METAFILE_INOUT_H + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ diff --git a/src/extension/internal/metafile-print.cpp b/src/extension/internal/metafile-print.cpp index 1e7735410..73d63f27d 100644 --- a/src/extension/internal/metafile-print.cpp +++ b/src/extension/internal/metafile-print.cpp @@ -187,7 +187,6 @@ U_COLORREF PrintMetafile::avg_stop_color(SPGradient *gr) return cr; } -#define clrweight(a,b,t) ((1-t)*((double) a) + (t)*((double) b)) U_COLORREF PrintMetafile::weight_opacity(U_COLORREF c1) { float opa = c1.Reserved / 255.0; @@ -199,9 +198,12 @@ U_COLORREF PrintMetafile::weight_opacity(U_COLORREF c1) return result; } +/* t between 0 and 1, values outside that range use the nearest limit */ U_COLORREF PrintMetafile::weight_colors(U_COLORREF c1, U_COLORREF c2, double t) { +#define clrweight(a,b,t) ((1-t)*((double) a) + (t)*((double) b)) U_COLORREF result; + t = ( t > 1.0 ? 1.0 : ( t < 0.0 ? 0.0 : t)); result.Red = clrweight(c1.Red, c2.Red, t); result.Green = clrweight(c1.Green, c2.Green, t); result.Blue = clrweight(c1.Blue, c2.Blue, t); diff --git a/src/extension/internal/wmf-inout.cpp b/src/extension/internal/wmf-inout.cpp index 870e4061c..a72c16a88 100644 --- a/src/extension/internal/wmf-inout.cpp +++ b/src/extension/internal/wmf-inout.cpp @@ -26,7 +26,7 @@ # include "config.h" #endif -#include //This must precede text_reassemble.h or it blows up in pngconf.h when compiling +//#include //This must precede text_reassemble.h or it blows up in pngconf.h when compiling #include #include #include @@ -70,154 +70,6 @@ static U_RECT16 rc_old; static bool clipset = false; static uint32_t BLTmode=0; -/** Construct a PNG in memory from an RGB from the WMF file - -from: -http://www.lemoda.net/c/write-png/ - -which was based on: -http://stackoverflow.com/questions/1821806/how-to-encode-png-to-buffer-using-libpng - -gcc -Wall -o testpng testpng.c -lpng - -Originally here, but moved up - -#include -#include -#include -#include -*/ - - -/* Given "bitmap", this returns the pixel of bitmap at the point - ("x", "y"). */ - -pixel_t * Wmf::pixel_at (bitmap_t * bitmap, int x, int y) -{ - return bitmap->pixels + bitmap->width * y + x; -} - - -/* Write "bitmap" to a PNG file specified by "path"; returns 0 on - success, non-zero on error. */ - -void -Wmf::my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length) -{ - PMEMPNG p=(PMEMPNG)png_get_io_ptr(png_ptr); - - size_t nsize = p->size + length; - - /* allocate or grow buffer */ - if(p->buffer){ p->buffer = (char *) realloc(p->buffer, nsize); } - else{ p->buffer = (char *) malloc(nsize); } - - if(!p->buffer){ png_error(png_ptr, "Write Error"); } - - /* copy new bytes to end of buffer */ - memcpy(p->buffer + p->size, data, length); - p->size += length; -} - -void Wmf::toPNG(PMEMPNG accum, int width, int height, const char *px){ - bitmap_t bmStore; - bitmap_t *bitmap = &bmStore; - accum->buffer=NULL; // PNG constructed in memory will end up here, caller must free(). - accum->size=0; - bitmap->pixels=(pixel_t *)px; - bitmap->width = width; - bitmap->height = height; - - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; - size_t x, y; - png_byte ** row_pointers = NULL; - /* The following number is set by trial and error only. I cannot - see where it it is documented in the libpng manual. - */ - int pixel_size = 3; - int depth = 8; - - png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (png_ptr == NULL){ - accum->buffer=NULL; - return; - } - - info_ptr = png_create_info_struct (png_ptr); - if (info_ptr == NULL){ - png_destroy_write_struct (&png_ptr, &info_ptr); - accum->buffer=NULL; - return; - } - - /* Set up error handling. */ - - if (setjmp (png_jmpbuf (png_ptr))) { - png_destroy_write_struct (&png_ptr, &info_ptr); - accum->buffer=NULL; - return; - } - - /* Set image attributes. */ - - png_set_IHDR ( - png_ptr, - info_ptr, - bitmap->width, - bitmap->height, - depth, - PNG_COLOR_TYPE_RGB, - PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, - PNG_FILTER_TYPE_DEFAULT - ); - - /* Initialize rows of PNG. */ - - row_pointers = (png_byte **) png_malloc (png_ptr, bitmap->height * sizeof (png_byte *)); - for (y = 0; y < bitmap->height; ++y) { - png_byte *row = - (png_byte *) png_malloc (png_ptr, sizeof (uint8_t) * bitmap->width * pixel_size); - row_pointers[bitmap->height - y - 1] = row; // Row order in WMF is reversed. - for (x = 0; x < bitmap->width; ++x) { - pixel_t * pixel = pixel_at (bitmap, x, y); - *row++ = pixel->red; // R & B channels were set correctly by DIB_to_RGB - *row++ = pixel->green; - *row++ = pixel->blue; - } - } - - /* Write the image data to memory */ - - png_set_rows (png_ptr, info_ptr, row_pointers); - - png_set_write_fn(png_ptr, accum, my_png_write_data, NULL); - - png_write_png (png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); - - for (y = 0; y < bitmap->height; y++) { - png_free (png_ptr, row_pointers[y]); - } - png_free (png_ptr, row_pointers); - png_destroy_write_struct(&png_ptr, &info_ptr); - -} - - -/* convert an WMF RGB(A) color to 0RGB -inverse of gethexcolor() in emf-print.cpp -*/ -uint32_t Wmf::sethexcolor(U_COLORREF color){ - - uint32_t out; - out = (U_RGBAGetR(color) << 16) + - (U_RGBAGetG(color) << 8 ) + - (U_RGBAGetB(color) ); - return(out); -} - - Wmf::Wmf (void) // The null constructor { return; diff --git a/src/extension/internal/wmf-inout.h b/src/extension/internal/wmf-inout.h index 90f424c46..3d23ca749 100644 --- a/src/extension/internal/wmf-inout.h +++ b/src/extension/internal/wmf-inout.h @@ -11,9 +11,8 @@ #ifndef SEEN_EXTENSION_INTERNAL_WMF_H #define SEEN_EXTENSION_INTERNAL_WMF_H -#define PNG_SKIP_SETJMP_CHECK // else any further png.h include blows up in the compiler -#include #include +#include "extension/internal/metafile-inout.h" // picks up PNG #include "extension/implementation/implementation.h" #include "style.h" #include "text_reassemble.h" @@ -69,35 +68,6 @@ typedef struct wmf_device_context { #define WMF_MAX_DC 128 -/* - both emf-inout.h and wmf-inout.h are included by init.cpp, so whichever one goes in first defines these ommon types -*/ -#ifndef SEEN_EXTENSION_INTERNAL_METAFILECOMMON_ -#define SEEN_EXTENSION_INTERNAL_METAFILECOMMON_ -/* A coloured pixel. */ -typedef struct { - uint8_t red; - uint8_t green; - uint8_t blue; - uint8_t opacity; -} pixel_t; - -/* A picture. */ - -typedef struct { - pixel_t *pixels; - size_t width; - size_t height; -} bitmap_t; - -/* structure to store PNG image bytes */ -typedef struct { - char *buffer; - size_t size; -} MEMPNG, *PMEMPNG; -#endif - - // like this causes a mysterious crash on the return from Wmf::open //typedef struct emf_callback_data { @@ -138,7 +108,8 @@ typedef struct { PWMF_OBJECT wmf_obj; } WMF_CALLBACK_DATA, *PWMF_CALLBACK_DATA; -class Wmf : Inkscape::Extension::Implementation::Implementation { //This is a derived class +class Wmf : public Metafile +{ public: Wmf(); // Empty constructor @@ -158,10 +129,6 @@ public: private: protected: - static pixel_t *pixel_at (bitmap_t * bitmap, int x, int y); - static void my_png_write_data(png_structp png_ptr, png_bytep data, png_size_t length); - static void toPNG(PMEMPNG accum, int width, int height, const char *px); - static uint32_t sethexcolor(U_COLORREF color); static void print_document_to_file(SPDocument *doc, const gchar *filename); static double current_scale(PWMF_CALLBACK_DATA d); static std::string current_matrix(PWMF_CALLBACK_DATA d, double x, double y, int useoffset); diff --git a/src/extension/internal/wmf-print.cpp b/src/extension/internal/wmf-print.cpp index d60b2adf7..1c7b42c82 100644 --- a/src/extension/internal/wmf-print.cpp +++ b/src/extension/internal/wmf-print.cpp @@ -76,7 +76,7 @@ namespace Internal { /* globals */ -static double PX2WORLD = 1200.0 / 90.0; // inkscape is 90 dpi, WMF file is 1200 +static double PX2WORLD; // value set in begin() static bool FixPPTCharPos, FixPPTDashLine, FixPPTGrad2Polys, FixPPTPatternAsHatch; static WMFTRACK *wt = NULL; static WMFHANDLES *wht = NULL; @@ -128,6 +128,8 @@ unsigned int PrintWmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) char *rec; gchar const *utf8_fn = mod->get_param_string("destination"); + // Typically PX2WORLD is 1200/90, using inkscape's default dpi + PX2WORLD = 1200.0 / Inkscape::Util::Quantity::convert(1.0, "in", "px"); FixPPTCharPos = mod->get_param_bool("FixPPTCharPos"); FixPPTDashLine = mod->get_param_bool("FixPPTDashLine"); FixPPTGrad2Polys = mod->get_param_bool("FixPPTGrad2Polys"); @@ -188,39 +190,39 @@ unsigned int PrintWmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) int dwPxY = round(d.height() * 1200.0); #endif - PU_PAIRF ps = U_PAIRF_set(dwInchesX, dwInchesY); + U_PAIRF *ps = U_PAIRF_set(dwInchesX, dwInchesY); rec = U_WMRHEADER_set(ps, 1200); // Example: drawing is A4 horizontal, 1200 dpi if (!rec) { g_error("Fatal programming error in PrintWmf::begin at WMRSETMAPMODE"); } - (void) wmf_header_append((PU_METARECORD)rec, wt, 1); + (void) wmf_header_append((U_METARECORD *)rec, wt, 1); free(ps); rec = U_WMRSETWINDOWEXT_set(point16_set(dwPxX, dwPxY)); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at WMRSETWINDOWEXT"); } rec = U_WMRSETWINDOWORG_set(point16_set(0, 0)); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at WMRSETWINDOWORG"); } rec = U_WMRSETMAPMODE_set(U_MM_ANISOTROPIC); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at WMRSETMAPMODE"); } /* set some parameters, else the program that reads the WMF may default to other values */ rec = U_WMRSETBKMODE_set(U_TRANSPARENT); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at U_WMRSETBKMODE"); } hpolyfillmode = U_WINDING; rec = U_WMRSETPOLYFILLMODE_set(U_WINDING); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at U_WMRSETPOLYFILLMODE"); } @@ -229,24 +231,24 @@ unsigned int PrintWmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) // actually starts, and already takes into account the text object's alignment; // - for this reason, the WMF text alignment must always be TA_BASELINE|TA_LEFT. rec = U_WMRSETTEXTALIGN_set(U_TA_BASELINE | U_TA_LEFT); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at U_WMRSETTEXTALIGN_set"); } htextcolor_rgb[0] = htextcolor_rgb[1] = htextcolor_rgb[2] = 0.0; rec = U_WMRSETTEXTCOLOR_set(U_RGB(0, 0, 0)); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at U_WMRSETTEXTCOLOR_set"); } rec = U_WMRSETROP2_set(U_R2_COPYPEN); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at U_WMRSETROP2"); } hmiterlimit = 5; rec = wmiterlimit_set(5); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at wmiterlimit_set"); } @@ -255,14 +257,14 @@ unsigned int PrintWmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) U_PEN up = U_PEN_set(U_PS_SOLID, 1, colorref_set(0, 0, 0)); uint32_t Pen; rec = wcreatepenindirect_set(&Pen, wht, up); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at wcreatepenindirect_set"); } // create a null pen. If no specific pen is set, this is used up = U_PEN_set(U_PS_NULL, 1, colorref_set(0, 0, 0)); rec = wcreatepenindirect_set(&hpen_null, wht, up); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at wcreatepenindirect_set"); } destroy_pen(); // make this pen active @@ -270,7 +272,7 @@ unsigned int PrintWmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) // create a null brush. If no specific brush is set, this is used U_WLOGBRUSH lb = U_WLOGBRUSH_set(U_BS_NULL, U_RGB(0, 0, 0), U_HS_HORIZONTAL); rec = wcreatebrushindirect_set(&hbrush_null, wht, lb); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::begin at wcreatebrushindirect_set"); } destroy_brush(); // make this brush active @@ -288,25 +290,25 @@ unsigned int PrintWmf::finish(Inkscape::Extension::Print * /*mod*/) // get rid of null brush rec = wdeleteobject_set(&hbrush_null, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::finish at wdeleteobject_set null brush"); } // get rid of null pen rec = wdeleteobject_set(&hpen_null, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::finish at wdeleteobject_set null pen"); } // get rid of object 0, which was a pen that was used to shift the other object indices to >=1. hpen = 0; rec = wdeleteobject_set(&hpen, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::finish at wdeleteobject_set filler object"); } rec = U_WMREOF_set(); // generate the EOF record - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::finish"); } (void) wmf_finish(wt); // Finalize and write out the WMF @@ -330,7 +332,7 @@ unsigned int PrintWmf::comment(Inkscape::Extension::Print * /*module*/, const ch // fcolor is defined when gradients are being expanded, it is the color of one stripe or ring. -int PrintWmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) +int PrintWmf::create_brush(SPStyle const *style, U_COLORREF *fcolor) { float rgb[3]; char *rec; @@ -442,17 +444,17 @@ int PrintWmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) // SVG text has no background attribute, so OPAQUE mode ALWAYS cancels after the next draw, otherwise it would mess up future text output. if (usebk) { rec = U_WMRSETBKCOLOR_set(bkColor); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_brush at U_WMRSETBKCOLOR_set"); } rec = U_WMRSETBKMODE_set(U_OPAQUE); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_brush at U_WMRSETBKMODE_set"); } } lb = U_WLOGBRUSH_set(brushStyle, hatchColor, hatchType); rec = wcreatebrushindirect_set(&brush, wht, lb); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_brush at createbrushindirect_set"); } break; @@ -461,10 +463,10 @@ int PrintWmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) char *rgba_px; uint32_t cbPx; uint32_t colortype; - PU_RGBQUAD ct; + U_RGBQUAD *ct; int numCt; U_BITMAPINFOHEADER Bmih; - PU_BITMAPINFO Bmi; + U_BITMAPINFO *Bmi; 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); @@ -474,7 +476,7 @@ int PrintWmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) 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); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_brush at createdibpatternbrushpt_set"); } free(px); @@ -484,14 +486,14 @@ int PrintWmf::create_brush(SPStyle const *style, PU_COLORREF fcolor) hbrush = brush; // need this later for destroy_brush rec = wselectobject_set(brush, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_brush at wselectobject_set"); } if (fmode != hpolyfillmode) { hpolyfillmode = fmode; rec = U_WMRSETPOLYFILLMODE_set(fmode); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_brush at U_WMRSETPOLYFILLMODE_set"); } } @@ -506,7 +508,7 @@ void PrintWmf::destroy_brush() // WMF lets any object be deleted whenever, and the chips fall where they may... if (hbrush) { rec = wdeleteobject_set(&hbrush, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::destroy_brush"); } hbrush = 0; @@ -515,7 +517,7 @@ void PrintWmf::destroy_brush() // (re)select the null brush rec = wselectobject_set(hbrush_null, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::destroy_brush"); } } @@ -583,7 +585,7 @@ int PrintWmf::create_pen(SPStyle const *style, const Geom::Affine &transform) if ((uint32_t)miterlimit != hmiterlimit) { hmiterlimit = (uint32_t)miterlimit; rec = wmiterlimit_set((uint32_t) miterlimit); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_pen at wmiterlimit_set"); } } @@ -605,12 +607,12 @@ int PrintWmf::create_pen(SPStyle const *style, const Geom::Affine &transform) up = U_PEN_set(penstyle | modstyle, linewidth, penColor); rec = wcreatepenindirect_set(&pen, wht, up); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_pen at wcreatepenindirect_set"); } rec = wselectobject_set(pen, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::create_pen at wselectobject_set"); } hpen = pen; // need this later for destroy_pen @@ -625,7 +627,7 @@ void PrintWmf::destroy_pen() // WMF lets any object be deleted whenever, and the chips fall where they may... if (hpen) { rec = wdeleteobject_set(&hpen, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::destroy_pen"); } hpen = 0; @@ -634,7 +636,7 @@ void PrintWmf::destroy_pen() // (re)select the null pen rec = wselectobject_set(hpen_null, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::destroy_pen"); } } @@ -757,7 +759,7 @@ unsigned int PrintWmf::fill( pathvr = sp_pathvector_boolop(pathvc, pathv, bool_op_inters, (FillRule) fill_nonZero, frb); print_pathv(pathvr, fill_transform); - /* after high end of gradient, overlap last slice poosition */ + /* after high end of gradient, overlap last slice position */ wc = weight_opacity(c2); (void) create_brush(style, &wc); pathvc = rect_cutter(gv.p2, uv * (-overlap), uv * (50000.0), puv * 50000.0); @@ -898,7 +900,7 @@ unsigned int PrintWmf::stroke( if (usebk) { // OPAQUE was set, revert to TRANSPARENT usebk = false; rec = U_WMRSETBKMODE_set(U_TRANSPARENT); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::stroke at U_WMRSETBKMODE_set"); } } @@ -1066,7 +1068,7 @@ bool PrintWmf::print_simple_shape(Geom::PathVector const &pathv, const Geom::Aff }); rec = U_WMRELLIPSE_set(rcl); } - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::print_simple_shape at retangle/ellipse/polygon"); } @@ -1109,7 +1111,7 @@ unsigned int PrintWmf::image( Geom::Affine tf = m_tr_stack.top(); rec = U_WMRSETSTRETCHBLTMODE_set(U_COLORONCOLOR); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::image at EMRHEADER"); } @@ -1126,10 +1128,10 @@ unsigned int PrintWmf::image( char *px; uint32_t cbPx; uint32_t colortype; - PU_RGBQUAD ct; + U_RGBQUAD *ct; int numCt; U_BITMAPINFOHEADER Bmih; - PU_BITMAPINFO Bmi; + U_BITMAPINFO *Bmi; colortype = U_BCBM_COLOR32; (void) RGBA_to_DIB(&px, &cbPx, &ct, &numCt, (char *) rgba_px, w, h, w * 4, colortype, 0, 1); Bmih = bitmapinfoheader_set(w, h, 1, colortype, U_BI_RGB, 0, PXPERMETER, PXPERMETER, numCt, 0); @@ -1150,7 +1152,7 @@ unsigned int PrintWmf::image( h * rs, //! size in bytes of px px //! (Optional) bitmapbuffer (U_BITMAPINFO section) ); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::image at U_WMRSTRETCHDIB_set"); } free(px); @@ -1165,7 +1167,7 @@ unsigned int PrintWmf::image( unsigned int PrintWmf::print_pathv(Geom::PathVector const &pathv, const Geom::Affine &transform) { char *rec = NULL; - PU_POINT16 pt16hold, pt16ptr; + U_POINT16 *pt16hold, *pt16ptr; uint16_t *n16hold; uint16_t *n16ptr; @@ -1199,7 +1201,7 @@ unsigned int PrintWmf::print_pathv(Geom::PathVector const &pathv, const Geom::Af } if (nPolys > 1) { // a single polypolygon, a single polygon falls through to the else - pt16hold = pt16ptr = (PU_POINT16) malloc(totPoints * sizeof(U_POINT16)); + pt16hold = pt16ptr = (U_POINT16 *) malloc(totPoints * sizeof(U_POINT16)); if (!pt16ptr) { return(false); } @@ -1235,7 +1237,7 @@ unsigned int PrintWmf::print_pathv(Geom::PathVector const &pathv, const Geom::Af } rec = U_WMRPOLYPOLYGON_set(nPolys, n16hold, pt16hold); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::print_pathv at U_WMRPOLYPOLYGON_set"); } free(pt16hold); @@ -1256,7 +1258,7 @@ unsigned int PrintWmf::print_pathv(Geom::PathVector const &pathv, const Geom::Af */ int nPoints = 1 + pit->size_default(); - pt16hold = pt16ptr = (PU_POINT16) malloc(nPoints * sizeof(U_POINT16)); + pt16hold = pt16ptr = (U_POINT16 *) malloc(nPoints * sizeof(U_POINT16)); if (!pt16ptr) { break; } @@ -1280,21 +1282,21 @@ unsigned int PrintWmf::print_pathv(Geom::PathVector const &pathv, const Geom::Af if (pit->end_default() == pit->end_closed()) { rec = U_WMRPOLYGON_set(nPoints, pt16hold); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::print_pathv at U_WMRPOLYGON_set"); } } else if (nPoints > 2) { rec = U_WMRPOLYLINE_set(nPoints, pt16hold); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::print_pathv at U_POLYLINE_set"); } } else if (nPoints == 2) { rec = U_WMRMOVETO_set(pt16hold[0]); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::print_pathv at U_WMRMOVETO_set"); } rec = U_WMRLINETO_set(pt16hold[1]); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::print_pathv at U_WMRLINETO_set"); } } @@ -1348,7 +1350,7 @@ unsigned int PrintWmf::text(Inkscape::Extension::Print * /*mod*/, char const *te if (textalignment != htextalignment) { htextalignment = textalignment; rec = U_WMRSETTEXTALIGN_set(textalignment); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::text at U_WMRSETTEXTALIGN_set"); } } @@ -1420,7 +1422,7 @@ unsigned int PrintWmf::text(Inkscape::Extension::Print * /*mod*/, char const *te // it was streteched asymmetrically.) Few applications support text from WMF which is scaled // differently by height/width, so leave lfWidth alone. - PU_FONT puf = U_FONT_set( + U_FONT *puf = U_FONT_set( textheight, 0, round(rot), @@ -1438,14 +1440,14 @@ unsigned int PrintWmf::text(Inkscape::Extension::Print * /*mod*/, char const *te free(facename); rec = wcreatefontindirect_set(&hfont, wht, puf); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::text at wcreatefontindirect_set"); } free(puf); } rec = wselectobject_set(hfont, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::text at wselectobject_set"); } @@ -1455,7 +1457,7 @@ unsigned int PrintWmf::text(Inkscape::Extension::Print * /*mod*/, char const *te if (memcmp(htextcolor_rgb, rgb, 3 * sizeof(float))) { memcpy(htextcolor_rgb, rgb, 3 * sizeof(float)); rec = U_WMRSETTEXTCOLOR_set(U_RGB(255 * rgb[0], 255 * rgb[1], 255 * rgb[2])); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::text at U_WMRSETTEXTCOLOR_set"); } } @@ -1522,12 +1524,12 @@ unsigned int PrintWmf::text(Inkscape::Extension::Print * /*mod*/, char const *te } free(latin1_text); free(adx); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::text at U_WMREXTTEXTOUTW_set"); } rec = wdeleteobject_set(&hfont, wht); - if (!rec || wmf_append((PU_METARECORD)rec, wt, U_REC_FREE)) { + if (!rec || wmf_append((U_METARECORD *)rec, wt, U_REC_FREE)) { g_error("Fatal programming error in PrintWmf::text at wdeleteobject_set"); } diff --git a/src/libuemf/CMakeLists.txt b/src/libuemf/CMakeLists.txt index dbf9fb36c..f5a97f212 100644 --- a/src/libuemf/CMakeLists.txt +++ b/src/libuemf/CMakeLists.txt @@ -8,6 +8,8 @@ set(libuemf_SRC uwmf.c uwmf_endian.c uwmf_print.c + upmf.c + upmf_print.c # ------- # Headers @@ -19,6 +21,8 @@ set(libuemf_SRC uwmf.h uwmf_endian.h uwmf_print.h + upmf.h + upmf_print.h ) add_inkscape_lib(uemf_LIB "${libuemf_SRC}") diff --git a/src/libuemf/Makefile_insert b/src/libuemf/Makefile_insert index ca14ed19f..004c56dfc 100644 --- a/src/libuemf/Makefile_insert +++ b/src/libuemf/Makefile_insert @@ -20,5 +20,9 @@ libuemf_libuemf_a_SOURCES = \ libuemf/uwmf_endian.h \ libuemf/uwmf_print.c \ libuemf/uwmf_print.h \ + libuemf/upmf.c \ + libuemf/upmf.h \ + libuemf/upmf_print.c \ + libuemf/upmf_print.h \ libuemf/symbol_convert.c \ libuemf/symbol_convert.h diff --git a/src/libuemf/README b/src/libuemf/README index 53e2469e3..4c23cdd52 100644 --- a/src/libuemf/README +++ b/src/libuemf/README @@ -1,5 +1,477 @@ -Theis directory contains the libUEMF library, -a cross-platform library for Windows Metafile and Enhanced Metafile -handling, created by David Mathog. +Overview: -http://sourceforge.net/projects/libuemf/ +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 released under the GPL 2 license, read the file 'COPYING' for more information + +Version 0.1.10, released January 15, 2014. + +To report bugs or provide feedback send email to David Mathog, mathog@caltech.edu. + +-------------------------------------------------------------------------------------------- +Sources: + +EMF file Record structure information has been derived from Mingw, Wine, and libEMF +header files, and from Microsoft's EMF Information pdf, release date March 28,2012, +link from here: + + http://msdn2.microsoft.com/en-us/library/cc230514.aspx + +If the direct link fails the document may be found +by searching the web for: "[MS-EMF]: Enhanced Metafile Format". + +WMF file Record structure information is from some of the same sources, as well as: + http://msdn2.microsoft.com/en-us/library/250370.aspx + +If the direct link fails the document may be found +by searching the web for: "[MS-WMF]: Windows Metafile Format" + +EMF+ file Record structure is from many helpful responses from Microsoft documentation support +and from: + http://msdn.microsoft.com/en-us/library/cc230724.aspx + +If the direct link fails the document may be found +by searching the web for: "[MS-EMFPLUS]: Enhanced Metafile Format Plus Extensions" + + +Files: + +README This file. + +COPYING GPL V2 license file. + +DOXYFILE Doxygen configuration file, for generating documentation from the source files. + +testbuild.sh Small bash script to build all programs. Modify as needed for target platform. + +testit.sh Small bash script that generates all test files and compares + them with referencess supplied. This script should be edited + to match your test system before it is run! + +uemf.c Contains the *_set functions needed to construct an EMF file. + Also contains auxilliary functions for debugging and constructing + EMF files in memory. + +uemf.h Definitions and structures for EMF records and objects. + Prototypes for *_set and construction functions. + +uemf_print.c Contains the *_print functions needed to print the contents of EMF records and objects. + +uemf_print.h Prototypes for *_print functions. + +uemf_endian.c Contains the *_swap functions needed to rearrange bytes between Big and Little Endian. + U_emf_endian() is the only function here that user could should call. + +uemf_endian.h Prototype for U_emf_endian() and definitions for Endian type of the local machine. + + +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. + +upmf.h Definitions and structures for EMF+ records and objects. + Prototypes for *_set, *_get and construction functions. + +upmf_print.c Contains the *_print functions needed to print the contents of EMF+ records and objects. + +upmf_print.h Prototypes for *_print functions. + + +uwmf.c Contains the *_set and *_get functions needed to construct or read a WMF file. + Also contains auxilliary functions for debugging and constructing + WMF files in memory. + +uwmf.h Definitions and structures for WMF records and objects. + Prototypes for *_set, *_get and construction functions. + +uwmf_print.c Contains the *_print functions needed to print the contents of WMF records and objects. + +uwmf_print.h Prototypes for *_print functions. + +uwmf_endian.c Contains the *_swap functions needed to rearrange bytes between Big and Little Endian. + U_wmf_endian() is the only function here that user could should call. + +uwmf_endian.h Prototype for U_wmf_endian() and definitions for Endian type of the local machine. + + +testbed_emf.c Program used for testing emf functions in libUEMF. Run it like: testbed_emf flags. + Run with no argument to see what the bit flag values are. + It creates a test file "test_libuemf.emf" which should be identical to + test_libuemf_ref.emf. (This file cannot be imported from EMF into PowerPoint + because it contains dotted lines. Use "testbed_emf 1" to generate a file without + any dotted lines. ) + +testbed_pmf.c Program used for testing EMF+ functions in libUEMF. Similar to testbed_emf. + +testbed_wmf.c Program used for testing wmf functions in libUEMF. Similar to testbed_emf. + +test_mapmodes_emf.c + Program used for testing emf functions in libUEMF. Generates one test file + in each MAPMODE, MM_TEXT through MM_ANISOTROPIC, optionally with offsets to the + bounds and with particular Viewport origin. (Bounds offset + Viewport Origin + sets the Window origin.) + +test_mapmodes_wmf.c + Program used for testing wmf functions in libUEMF. Similar to test_mapmodes_emf. + +reademf.c Utility that that reads an EMF file and emits its contents in text form. + Also processes EMF+ files. + Run it like: reademf target_file.emf + +readwmf.c Utility that that reads an WMF file and emits its contents in text form. + Run it like: reademf target_file.wmf + +cutemf.c Utility for removing specific records from an EMF file. + Run it like: cutemf '2,10,12...13' src_file.emf dst_file.emf + +pmfdual2single.c Utility for reducing dual-mode EMF+ file to single mode. Removes all + nonessential EMF records. + Run it like: pmfdual2single dual_mode.emf single_mode.emf + + +test_libuemf_ref.emf + Example output from: testbed_emf 0 +test_libuemf_p_ref.emf + Example output from: testbed_pmf 0 +test_libuemf_ref30.emf + Example output from: testbed_emf 4 +test_libuemf_ref.wmf + Example output from: testbed_wmf 0 + +test_libuemf_ref_emf.txt + Example output from: reademf test_libuemf_ref.emf +test_libuemf_ref_wmf.txt + Example output from: readwmf test_libuemf_ref.wmf + +test_mm__ref.emf + Example output from: test_mapmodes_emf -vX 2000 -vY 1000 + +emf-inout.cpp,example +emf-inout.h.example +emf-print.cpp.example +emf-print.h.example + Example code from Inkscape demonstrate how to integrate libUEMF with another program. + +-------------------------------------------------------------------------------------------- +How to Build: + +In Linux/Unix like environments (omit -g flag for production versions): + + Build and install a shared library (example, details may vary) and then build and link + the example programs to the shared library: + gcc -std=c99 -pedantic -Wall -fPIC -g -c uemf.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c uemf_print.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c uemf_endian.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c uemf_utf.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c uwmf.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c uwmf_print.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c uwmf_endian.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c upmf.c + gcc -std=c99 -pedantic -Wall -fPIC -g -c upmf_print.c + gcc -shared -Wl,-soname,libuemf.so.0 \ + -o libuemf.so.0.0.3 uemf.o uemf_utf.o uemf_print.o uemf_endian.o uwmf.o uwmf_print.o uwmf_endian.o upmf.o upmf_print.o -lc + ln -s libuemf.so.0.0.3 libuemf.so.0 + ln -s libuemf.so.0 libuemf.so + /bin/cp -f libuemf.so* /usr/local/lib + ldconfig + gcc -std=c99 -pedantic -Wall -g -o cutemf cutemf.c -luemf -lm + gcc -std=c99 -pedantic -Wall -g -o pmfdual2single pmfdual2single.c -luemf -lm + gcc -std=c99 -pedantic -Wall -g -o reademf reademf.c -luemf -lm + gcc -std=c99 -pedantic -Wall -g -o readwmf readwmf.c -luemf -lm + gcc -std=c99 -pedantic -Wall -g -o testbed_emf testbed_emf.c -luemf -lm + gcc -std=c99 -pedantic -Wall -g -o testbed_emf testbed_wmf.c -luemf -lm + gcc -std=c99 -pedantic -Wall -g -o test_mapmodes_emf test_mapmodes_emf.c -luemf -lm + + For simple development work just build the example programs statically linked: + gcc -std=c99 -pedantic -Wall -g -o cutemf cutemf.c uemf.c uemf_endian.c uemf_utf.c -lm + gcc -std=c99 -pedantic -Wall -g -o pmfdual2single pmfdual2single.c uemf.c uemf_endian.c uemf_utf.c upmf.c -lm + gcc -std=c99 -pedantic -Wall -g -o reademf reademf.c uemf.c uemf_endian.c uemf_utf.c uemf_print.c upmf.c upmf_print.c -lm + gcc -std=c99 -pedantic -Wall -g -o readwmf readwmf.c uemf.c uemf_endian.c uemf_utf.c uemf_print.c uwmf.c uwmf_endian.c uwmf_print.c upmf.c upmf_print.c -lm + gcc -std=c99 -pedantic -Wall -g -o testbed_emf testbed_emf.c uemf.c uemf_endian.c uemf_utf.c -lm + gcc -std=c99 -pedantic -Wall -g -o testbed_pmf testbed_pmf.c uemf.c uemf_endian.c uemf_utf.c upmf.c upmf.h -lm + gcc -std=c99 -pedantic -Wall -g -o testbed_wmf testbed_wmf.c uemf.c uemf_endian.c uemf_utf.c uwmf.c uwmf_endian.c -lm + gcc -std=c99 -pedantic -Wall -g -o test_mapmodes_emf test_mapmodes_emf.c uemf.c uemf_endian.c uemf_utf.c -lm + +Extra debugging on linux may be enabled in testbed for use under Valgrind. To build that way do instead: + + gcc -std=c99 -pedantic -Wall -g -DU_VALGRIND -o testbed_emf testbed_emf.c uemf.c uemf_endian.c uemf_print.c uemf_utf.c -lm + +Sparc Solaris 8 and 9 are Big Endian, and to work around some minor incompatibilities with more recent systems, +assuming gcc is installed in /opt/csw and PATH is set correctly to use it: + + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o cutemf cutemf.c uemf.c uemf_endian.c uemf_utf.c -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o pmfdual2single pmfdual2single.c uemf.c uemf_endian.c uemf_utf.c upmf.c -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o reademf reademf.c uemf.c uemf_endian.c uemf_utf.c uemf_print.c upmf.c upmf_print.c -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o readwmf readwmf.c uemf.c uemf_endian.c uemf_utf.c uemf_print.c uwmf.c uwmf_endian.c uwmf_print.c upmf.c upmf_print.c -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o testbed_emf testbed_emf.c uemf.c uemf_endian.c uemf_utf.c -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o testbed_pmf testbed_pmf.c uemf.c uemf_endian.c uemf_utf.c upmf.c upmf.h -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o testbed_wmf testbed_wmf.c uemf.c uemf_endian.c uemf_utf.c uwmf.c uwmf_endian.c -lm -L/opt/csw/lib -liconv + gcc -DSOL8 -DWORDS_BIGENDIAN -std=c99 -pedantic -Wall -g -o test_mapmodes_emf test_mapmodes_emf.c uemf.c uemf_endian.c uemf_utf.c -lm -L/opt/csw/lib -liconv + +(Note: WORDS_BIGENDIAN would also be produced by autconf's configure, if that was used.) + +Define WIN32 when compiling for Windows. This uses _wfopen() instead of fopen(), with +filename translation from UTF-8 to UTF-16LE. This will allow file opens to utilize unicode +names. If WIN32 is omitted on Windows file names must be all ASCII. To build on mingw use: + + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o cutemf cutemf.c uemf.c uemf_endian.c uemf_utf.c -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o pmfdual2single pmfdual2single.c uemf.c uemf_endian.c uemf_utf.c upmf.c -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o reademf reademf.c uemf.c uemf_endian.c uemf_utf.c uemf_print.c upmf.c upmf_print.c -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o readwmf readwmf.c uemf.c uemf_endian.c uemf_utf.c uemf_print.c uwmf.c uwmf_endian.c uwmf_print.c upmf.c upmf_print.c -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o testbed_emf testbed_emf.c uemf.c uemf_endian.c uemf_utf.c -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o testbed_pmf testbed_pmf.c uemf.c uemf_endian.c uemf_utf.c upmf.c upmf.h -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o testbed_wmf testbed_wmf.c uemf.c uemf_endian.c uemf_utf.c uwmf.c uwmf_endian.c -lm -liconv + gcc -DWIN32 -std=c99 -pedantic -Wall -g -o test_mapmodes_emf test_mapmodes_emf.c uemf.c uemf_endian.c uemf_utf.c -lm -liconv + +Dependencies: + libiconv (if not built into your compiler) + libpng (in the Inkscape examples) + +-------------------------------------------------------------------------------------------- +Testing + +All modules must also compile without warning under the more restrictive: + + ls -1 *.c \ + | extract -fmt 'gcc -Werror=format-security -Wall -Wformat -Wformat-security -W -Wno-pointer-sign -O2 -c -o deleteme.o [1,]' \ + | execinput + +-------------------------------------------------------------------------------------------- +Using libUEMF: + +To write an EMF file the code first runs two initialization functions: emf_start() and htable_create(). +Then a U_EMRHEADER record is created. This and all subsequent records are appended to the EMF file in +memory with emf_append(). Whichever other EMR records are desired are also added. The last EMR record +added must be the single instance of U_EMREOF. Then the code calls emf_finish(), emf_free(), and +htable_free(). Conversion of byte order on Big Endian machines to Little Endian is carried out +automatically in emf_finish(), if it is required. + +To input an EMF file it is is opened and the data read into a buffer in memory with emf_readdata(). On a +Big Endian machine this will also swap machine dependent byte orders as needed. At that point end user code +generally has to do something with the data in each record. The simplest case is to just print it, as shown +in reademf.c. More typically it must map the operations into its own graphics model, as shown in the +emf32*.*.example files from Inkscape. Basically the processing program needs to enter a loop, processing +one record at a time, pulling the record size and type from the first two uint32_t values present in each +record. It then enters a switch statement with one case for each EMR record type. Each case: statement +will generally define a pointer to that type of data object. Accessing the data from that pointer is +illustrated in the code for the corresponding *_print function. + +While libUEMF implements _print and _swap functions for all supported EMR records, end user code would +never call any of these directly. Instead it should either pass a single EMR record +to U_emf_onerec_print() (see reademf.c) or the entire completed EMF file in memory buffer to U_emf_endian() +(see testbed.c). + +WMF support is similar, except the functions are wmf_start(), wmf_readdata(), and so forth. It is a good +idea to separate end user WMF and EMF generating code into different modules, in order to avoid accidentally +writing EMR records to a WMF file and vice versa. WHile EMF objects are aligned in memory and so may be +accessed using the supplied structs, the ones for WMF files are not usually aligned and so must be accessed +using the supplied *_get functions. (The difference may not be evident on an x86 platform, but on RISC directly +trying to access objects in memory will result in access violations.) + +Things to be aware of in EMF files: + +The usual idea when employing a graphics file type like EMF is to copy a description of the objects in a +drawing from one program to another. Many of the record types in an EMF file can be thought of as objects, +they are lines or shapes or bitmaps or text. However, Microsoft's GDI implements binary and ternary raster +operations (see the descriptions in uemf.h) and most of these operations are not object like, instead they +combine things on the drawing surface. (There is in each case a copy operation which is object like.) +Consequently, EMF files which use these other raster operations are not particularly easy to import as +graphic objects. For instance, when PowerPoint rotates an image and saves it in an EMF the result is not +a single rotated image object. Instead there is an image containing the rotated image, which is followed by +masking operations to make the regions outside of the image transparent. There appears to be no standard +for when and where these subsequent operations will be applied. That is, there is no equivalent of +"begin path" and "end path" to delineate the start and end of such a compound operation. So a program +reading such a file has no easy way of figuring out which previous object is being modified by a subsequent +raster operation. The testbed program provided in this package generates a region which applies all +binary raster operations in vertical slices to two images. The expected result appears in Windows "Preview", +but if that region is imported into PowerPoint and converted to objects within that program the result looks +nothing like what Preview shows. + +Support for U_EMREXTTEXTOUTW is much more common than for U_EMRSMALLTEXT. The latter is easier to use, +since it does not require a Dx array for each text string, but the objects will not import into PowerPoint, +for instance. + +There are two types of dotted/dashed lines. The first uses a set of predefined flags to set the pattern +and the latter is end user user defined. Both are restricted to lines of width 1. These built in types are +problematic as key applications cannot handle them properly. PowerPoint cannot convert either type to its +internal object format. The first form loses the pattern and comes through as solid lines. The second type +is toxic - even a single dotted line of the second type will prevent the entire EMF from being converted. +The safest choice is to avoid these patterned line styles entirely. Convert all dots and dashes to separate +line draws before writing those into the EMF file. libUEMF has no problem reading these records, so code +should accept them for input. + +As with most graphics file formats there is no single object representation of a complex text string (varying +font size, super/sub script, bold, italic,.etc.). Such text must be decomposed into multiple text strings, +each with its own formatting. It is unlikely that a subsequent program reading these records from the EMF +will be able to reassemble them back into a single complex text string. + +If a font used in an EMF file is not present on both the sending and receiving systems text will not look the +same on both. Font substitution is usually silent in most programs, so it may not be evident why the text looks +a little odd. However, if text is simple, that is, consists of just one line of text without size, color, +or other changes, then it will look approximately correct after font substitution. + +Things to be aware of in WMF files: + +WMF graphics are quite limited when compared to EMF graphics. When reading a WMF file it is essential that +end user code always create a specified object, even if that object is just a placeholder with no real +function. If any "create" operation presented by the WMF file is not handled then the object indices used +further along in the WMF file will be off, with very bad results! WMF "regions" are not supported by libUEMF, +however, if an operation creates regions, this type of placeholder must still be created. + +In theory WMF supports mapmodes other than Anisotropic. However, since many programs do not handle +these other modes it is strongly suggested that any WMF files generated use Anisotropic. For this +reason there is no test_mapmodes_wmf program - windows XP preview did not show anything when WMF +files in the other modes were produced. With no positive control there was no way to verify that they +were valid. + +Things to be aware of in EMF+ files: + +EMF+ files are usually stored in files with an ".emf" file extension. In this package EMF+ programs, +functions, and definitions use PMF or PMR to distinguish them from the EMF and WMF material. ("EMF+" +is not an allowed variable or function name in C.) Dual mode EMF+ files contain both EMF and +EMF+ records. HOWEVER, those generated by PowerPoint are defective in that they drop all text +information from the drawing in the EMF+ representation. There is no simple way to line up the +EMF and EMF+ records in their representations to determine which ones correspond to which drawing +object. So it is generally not possible to see which elements are represented in both +representations, or which are missing in one representation. The example file generated by this library +has only EMF+ records plus the few EMF records needed to wrap them. + +Text in EMF+ is placed not from the baseline, as in EMF, but from the upper left corner of the Em square. +Use the utility function U_PMR_drawstring() to draw text onto a baseline. Font +substitutions result in badly placed text because even fonts that look similar on the screen may have +different font metrics. Specifically, font substitutions look worse in EMF+ files than they do +in EMF files. There is no way to embed fonts, or their font information in the EMF+ file. +Consequently the text representation within an EMF+ file is not very portable between systems - it will +only render correctly if the second system has all of the fonts used in the document. The testbed_pmf.c +program contains some metrics for common fonts which may be used with U_PMR_drawstring() +to accurately place text. + + + +-------------------------------------------------------------------------------------------- +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.1.10 2014-01-14 + Slight changes in documentation for uemf.h. + Fixed typo in uemf_endian.c. + Fixed a tiny bug in uemf.c (if memory allocation failed a struct would have + been deleted before the struct itself. + +0.1.9 2013-12-02 + Added U_PMF_DASHEDLINEDATA_set3 (dot/dash pattern from bits in a uint32_t). + Finally was able to make linear gradient gradientfill records work. Updated + testbed_emf.c to include that. + +0.1.8 2013-11-28 + Fixed a bug in U_PMF_REGIONNODEPATH_print(), returned size was 4 too small. + Changed formatting of U_PMF_REGIONNODECHILDNODES_print() output to improve readability + of nested region structures in reademf. + +0.1.7 2013-11-20 + Added EMF+ support. + Converted U_RGA and similar from defines to functions, because the method being used + in the define (from C99) was not exactly compatible with C++ compilation. + Fixed error in test_mapmodes_emf.c where truncation float to integer was used where round + have been, resulting in an off by 1 error on some platforms. + Eliminated PU_W* pointers. + Cleaned up Doxygen comments. + +0.1.6. 2013-04-18 + Added tests which vary background mode, background color, and text color. + Slight modification to testit.sh. + Updated example files. + +0.1.5. 2013-02-13 + Added missing parameter for WMF RESTOREDC_set/get. + Replaced all sizeof() in uwmf.c that referred to UWMF structures with their + U_SIZE_* equivalents. + Added DIB related WMF _get functions. (Which were missing). These are U_BITMAPCOREHEADER_get, + U_BITMAPINFOHEADER_get, wget_dib_params + Added const where appropriate to wmf _get functions. + Added comprehensive cap,join,miter tests to testbeds. + Fixed bug in gradient4_swap(). + Fixed bug in emr_arc_points_common(), used vector where unit vectors were + needed, sometimes flipped direction for arcs/chords. + Fixed bug in U_WMFTEXTOUT_get(). + Changed all dst->Dst and src->Src as call variables in WMF code. + Denigrated htable_*() for emf, these become emf_htable_*(), to match naming convention + used for wmf_table_*(). +0.1.4 2013-02-04 + Added code to handle DIB formats that use clrUsed=0 to mean "maximum number of color entries", + this showed up in several places, including uemf.c and uemf_print.c. + Added some labels to test drawings, slightly rearranged image section, added + PNG and JPG image tests and clrUsed=0 images. + Modified uemf_endian.c to suppress some compiler warnings. + Changed get_DIB_params to return the Compression enumeration. + Fixed a typo in uwmf_print.c. +0.1.3 2013-01-29 Add modes to EMF test programs that changes worldtransform, so + that the resulting test files will exercise rotation transforms. + Added flags indication for testbed programs. + Added test for ROUNDRECT records. Swapped argument orders for those _get/_set operations. +0.1.2 2013-01-25 Fixed bug revealed by newer gcc on Solaris, assignment of aligned 32 bit to unaligned + 16 bit segfaulted. +0.1.1 2013-01-24 Fixed a few compiler warnings under g++, mostly having to do + with signed unsigned comparisons. Eliminated + an unused variable from wmf_finish and two stray lines from U_WMRHEADER_set. + Cleaned up doxygen comments. +0.1.0 2013-01-09 Added WMF functions. + Simplified print functions. Changed output format of reademf slightly, + from U_EMRXXX to U_EMR_XXX - easier to read the new way. +0.0.11 2012-12-04 Moved UTF and related functions out of uemf.c uemf.h and into uemf_utf.c uemf_utf.h. +0.0.10 2012-11-28 Discovered that not enough space was being allocated for some UTF conversions. To be + safe need 4 bytes per glyph + 1 for UTF-8. +0.0.9 2012-09-26 Some "uninitialized variable warnings" for certain versions of + gcc. These were, as far as I could tell, all spurious, but to quiet them + the variables in question were all initialized to 0. + Fixed header related print/swap functions - depending on what type of header there + could be an access violation. + Fixed U_Utf16leToUtf8, could leak memory if the conversion failed. + Fixed sections which were not testing for all types of EMF headers. + Added RGBA_to_RGBA() so that extractions of subsets of bitmaps (offset, different size) + can be handled. + Added cutemf. Utility to remove records from an EMF file. + Added test_mapmodes. Program to generate test files in each MAPMODE. + Added test_mm_(mode)_ref.emf files. These are reference for: + test_mapmodes -vX 2000 -vY 1000 + +0.0.8 2012-09-10 Fixed bug in htable_insert, failed to celear newly added table + slots. Fixed test for EMR_GRADIENTFILL triangle mode (rectangle still produces toxic EMF files.) + Fixed bug in gradientfill_swap on Solaris. + +0.0.7 2012-08-30 Added/fixed tests for hatched, DIB, and mono strokes. + Corrected error in U_EMREXTCREATEPEN_set. + +0.0.6 2012-08-21 Added/fixed tests for hatched, DIB, and mono fills. + +0.0.5 2012-08-08 Minor changes to uemf.c to suppress compiler warnings. Fixed + one bug in SET_CB_FROM_PXBMI macro (which was not triggered in testbed + because all images were the same size). + +0.0.4 2012-07-25 More tests in testbed.c. Found and fixed bugs in + U_POLYPOLYLINE and U_POLYPOLYGON related code. + +0.0.3 2012-07-24 Warnings related to printing size_t on 64 bit Linux. Correct + fix is to use "zd", but gcc -std=c99 does not support that on Solaris 9, + the only available big endian system. So use cast or the size_t to (int) + and stick with %d format specifier. This should be OK as the sizes involved + should not be all that large. + + Bug in core9 affecting U_EMRARC_swap(), and related, on Big Endian. + +0.0.2 2012-07-12 first release + diff --git a/src/libuemf/uemf.c b/src/libuemf/uemf.c index 3079c5095..55388cf53 100644 --- a/src/libuemf/uemf.c +++ b/src/libuemf/uemf.c @@ -1,7 +1,9 @@ /** - @file uemf.c Functions for manipulating EMF files and structures. + @file uemf.c + + @brief Functions for manipulating EMF files and structures. - [U_EMR*]_set all take data and return a pointer to memory holding the constructed record. + [U_EMR]_set all take data and return a pointer to memory holding the constructed record. The size of that record is also returned in recsize. It is also in the second int32 in the record, but may have been byte swapped and so not usable. If something goes wrong a NULL pointer is returned and recsize is set to 0. @@ -14,11 +16,11 @@ /* File: uemf.c -Version: 0.0.21 -Date: 20-FEB-2013 +Version: 0.0.25 +Date: 15-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -41,9 +43,12 @@ extern "C" { #include //Not actually used, looking for collisions #endif #include "uemf.h" -/* one prototype from uemf_endian. Put it here because end user should never need to see it, sno + +//! \cond +/* one prototype from uemf_endian. Put it here because end user should never need to see it, so not in uemf.h or uemf_endian.h */ void U_swap2(void *ul, unsigned int count); +//! \endcond /** \brief Look up the name of the EMR record by type. Returns U_EMR_INVALID if out of range. @@ -54,7 +59,7 @@ void U_swap2(void *ul, unsigned int count); */ char *U_emr_names(unsigned int idx){ if(idx U_EMR_MAX){ idx = 0; } - static char *U_WMR_NAMES[U_EMR_MAX+1]={ + static char *U_EMR_NAMES[U_EMR_MAX+1]={ "U_EMR_INVALID", "U_EMR_HEADER", "U_EMR_POLYBEZIER", @@ -179,7 +184,7 @@ char *U_emr_names(unsigned int idx){ "U_EMR_COLORMATCHTOTARGETW", "U_EMR_CREATECOLORSPACEW" }; - return(U_WMR_NAMES[idx]); + return(U_EMR_NAMES[idx]); } @@ -463,7 +468,7 @@ uint32_t emr_properties(uint32_t type){ table[115] = 0xA0; // U_EMRSETLAYOUT 1 0 1 0 0 0 0 0 table[116] = 0x82; // U_EMRTRANSPARENTBLT 1 0 0 0 0 0 1 0 table[117] = 0xA0; // U_EMRUNDEF117 1 0 1 0 0 0 0 0 - table[118] = 0x82; // U_EMRGRADIENTFILL 1 0 0 0 0 0 1 0 + table[118] = 0x82; // U_EMRGRADIENTFILL 1 0 1 0 0 0 1 0 table[119] = 0xA0; // U_EMRSETLINKEDUFIS 1 0 1 0 0 0 0 0 table[120] = 0x20; // U_EMRSETTEXTJUSTIFICATION 0 0 1 0 0 0 0 0 table[121] = 0xA0; // U_EMRCOLORMATCHTOTARGETW 1 0 1 0 0 0 0 0 @@ -615,7 +620,7 @@ int emr_arc_points( \param h Height of pixel array \param stride Row stride of input pixel array in bytes \param colortype DIB BitCount Enumeration - \param use_ct If true use color table (only for 1-16 bit DIBs) + \param use_ct If true use color table (only for 1-16 bit DIBs). \param invert If DIB rows are in opposite order from RGBA rows */ int RGBA_to_DIB( @@ -695,7 +700,7 @@ int RGBA_to_DIB( b = *rptr++; a = *rptr++; if(use_ct){ - color = U_BGRA(r,g,b,a); // color has order in memory: b,g,r,a + color = U_BGRA(r,g,b,a); // color has order in memory: b,g,r,a, same as EMF+ ARGB index = -1; for(lct = *ct, k=0; kbiSizeImage; *ct = NULL; @@ -1535,7 +1543,6 @@ int drawing_size( return(0); } - /** \brief Set a U_COLORREF value from separate R,G,B values. \param red Red component @@ -1554,10 +1561,10 @@ U_COLORREF colorref3_set( /** \brief Set a U_COLORREF value from separate R,G,B, and Reserved values. - \param red Red component - \param green Green component - \param blue Blue component - \param blue Reserved component + \param red Red component + \param green Green component + \param blue Blue component + \param Reserved Reserved component */ U_COLORREF colorref4_set( @@ -5470,6 +5477,12 @@ char *U_EMRTRANSPARENTBLT_set( \param ulMode Gradientfill Enumeration (determines Triangle/Rectangle) \param TriVert Array of TriVertex objects \param GradObj Array of gradient objects (each has 2 [rect] or 3 [triangle] indices into TriVert array) + +There is an MS documentation or library problem for this record, as the size of the GradObj must always be set +as if it was an array of U_GRADIENT3 objects for both rect and triangle. For horizontal and vertical gradients +this means that there will be unused bytes at the end of the record. This is not what the documentation says, +but it is how MS's libraries work. + */ char *U_EMRGRADIENTFILL_set( const U_RECTL rclBounds, @@ -5481,6 +5494,7 @@ char *U_EMRGRADIENTFILL_set( ){ char *record; unsigned int cbTriVert,cbGradObj,off; + unsigned int cbGradObjAlloc; /* larger than cbGradObj, because of problem described above */ int irecsize; cbTriVert = sizeof(U_TRIVERTEX) * nTriVert; // all of the cb's will be a multiple of 4 bytes @@ -5488,8 +5502,9 @@ char *U_EMRGRADIENTFILL_set( else if(ulMode == U_GRADIENT_FILL_RECT_H || ulMode == U_GRADIENT_FILL_RECT_V){ cbGradObj = sizeof(U_GRADIENT4) * nGradObj; } else { return(NULL); } + cbGradObjAlloc = sizeof(U_GRADIENT3) * nGradObj; - irecsize = sizeof(U_EMRGRADIENTFILL) + cbTriVert + cbGradObj; + irecsize = sizeof(U_EMRGRADIENTFILL) + cbTriVert + cbGradObjAlloc; record = malloc(irecsize); if(record){ ((PU_EMR) record)->iType = U_EMR_GRADIENTFILL; @@ -5502,6 +5517,10 @@ char *U_EMRGRADIENTFILL_set( memcpy(record + off, TriVert, cbTriVert); off += cbTriVert; memcpy(record + off, GradObj, cbGradObj); + off += cbGradObj; + if(cbGradObjAlloc > cbGradObj){ + memset(record+off,0,cbGradObjAlloc - cbGradObj); + } } return(record); } @@ -5553,7 +5572,6 @@ char *U_EMRCREATECOLORSPACEW_set( } - #ifdef __cplusplus } #endif diff --git a/src/libuemf/uemf.h b/src/libuemf/uemf.h index 00c605d02..a75ba801b 100644 --- a/src/libuemf/uemf.h +++ b/src/libuemf/uemf.h @@ -1,5 +1,7 @@ /** - @file uemf.h Structures and functions prototypes for EMF files. + @file uemf.h + + @brief Structures, definitions, and function prototypes for EMF files. EMF file Record structure information has been derived from Mingw, Wine, and libEMF header files, and from Microsoft's EMF Information pdf, release date March 28,2012, link from here: @@ -11,13 +13,93 @@ */ +/** \mainpage libUEMF overview +\section ov Overview +Microsoft's WMF, EMF, and EMF+ metafile types are supported. In each case functions are provided for reading, constructing, writing, and printing +metafile records. The methods used to do that differ somewhat between metafiles, and the simplest +way to get started is to have a look at the example programs provided. The WMF, EMF, and EMF+ structs and functions are +marked with U_WMF, U_EMF, U_PMF and U_WMR, U_EMR, and U_PMR prefixes. (PMF because "+" is a reserved character +in many contexts, so U_EMF+NAME would be a problem.) Please be aware that normally both EMF and EMF+ files have the ".emf" +file extension, and that it is very common for such files to contain both an EMF and an EMF+ representation of the +drawing. + +\section example_sec Example Programs +testbed_emf.c Creates an EMF file test_libuemf.emf.\n +testbed_wmf.c Creates a WMF file test_libuemf.wmf.\n +testbed_pmf.c Creates an EMF+ file test_libuemf_p.emf.\n +reademf.c Reads an EMF or EMF+ file and emits a text summary of its records.\n +readwmf.c Reads a WMF file and emits a text summary of its records.\n +emf-inout.cpp.example Example code from Inkscape to convert graphics from EMF to SVG.\n +emf-print.cpp.example Example code from Inkscape to print a drawing to EMF.\n +wmf-inout.cpp.example Example code from Inkscape to convert graphics from WMF to SVG.\n +wmf-print.cpp.example Example code from Inkscape to print a drawing to WMF. + +\section doxy_limits Documentation issues +There are currently some unresolved issues with Doxygen that result in some structs +not being "defined". This comes up when several different types of structs have the same +layout. When this occurs the first one listed on the "typedef struct" is defined but all the +others will only be shown under "typedef struct" referring to the first one. This is why +clicking on U_RECTL in a function parameter jumps to a typedef struct page, why U_RECTL is shown +as plain text here, but U_RECT is shown as a link here, and clicking on it jumps directly +to its structure definition. + +An additional issue is that the Enumeration names used in WMF are different from those +used in EMF, even when the values are either identical or differ only slightly, and no method +has been found yet to link one to the other in Doxygen. At present the only way to look up +these WMF enumerations is by referencing the following table: + + EMF WMF WMF Manual + EMF Binary Raster Operation Enumeration BinaryRasterOperation Enumeration 2.1.1.2 + EMF Bitcount Enumeration BitCount Enumeration 2.1.1.3 + EMF LB_Style Enumeration BrushStyle Enumeration 2.1.1.4 + EMF LF_CharSet Enumeration CharacterSet Enumeration 2.1.1.5 + EMF DIBColors Enumeration ColorUsage Enumeration [has 1 extra value] 2.1.1.6 + EMF BI_Compression Enumeration Compression Enumeration [has 3 extra values] 2.1.1.7 + - FamilyFont Enumeration 2.1.1.8 + EMF FloodFill Enumeration FloodFill Enumeration 2.1.1.9 + EMF LF_Quality Enumeration FontQuality Enumeration 2.1.1.10 + EMF LCS_Intent Enumeration GamutMappingIntent Enumeration 2.1.1.11 + EMF HatchStyle Enumeration HatchStyle Enumeration 2.1.1.12 + EMF Mirroring Enumeration LayoutEnumeration 2.1.1.13 + - LogicalColorSpace Enumeration 2.1.1.14 + EMF Profile Enumeration LogicalColorSpaceV5 Enumeration 2.1.1.15 + EMF MapMode Enumeration MapModeEnumeration 2.1.1.16 + - MetaFilesEscape Enumeration 2.1.1.17 + - MetafileType Enumeration 2.1.1.18 + - MetafileVersion Enumeration 2.1.1.19 + EMF BackgroundMode Enumeration MixModeEnumeration 2.1.1.20 + EMF LF_OutPrecision Enumeration OutPrecision Enumeration 2.1.1.21 + - PaletteEntryFlag Enumeration 2.1.1.22 + EMF PenStyle Enumeration PenStyle Enumeration [not values >0xFFFF] 2.1.1.23 + - PitchFont Enumeration 2.1.1.24 + EMF PolygonFillMode Enumeration PolyFillMode Enumeration [first 2 only] 2.1.1.25 + - PostScriptCap Enumeration 2.1.1.26 + - PostScriptClipping Enumeration 2.1.1.27 + - PostFeatureSetting Enumeration 2.1.1.28 + - PostScrioptJoin Enumeration 2.1.1.29 + EMF StretchMode Enumeration StretchMode Enumeration 2.1.1.30 + EMF Ternary Raster Operation Enumeration TernaryRasterOperation Enumeration 2.1.1.31 + EMF LF_ClipPrecision Enumeration ClipPrecision Flags 2.1.2.1 + EMF ExtTextOutOptions Enumeration ExtTextOutOptions Flags [subset] 2.1.2.2 + EMF TextAlignment Enumeration TextAlignment Enumeration 2.1.2.3 + EMF TextAlignment Enumeration VertialTextAlignment Enumeration 2.1.2.4 + EMF LF_PitchAndFamily Enumeration PitchAndFamily Enumerations 2.2.2.14 + +\section refs Reference documentation + + Manual Date Link + EMF 3/28/2012 http://msdn2.microsoft.com/en-us/library/cc230514.aspx + EMF+ 7/5/2012 http://msdn.microsoft.com/en-us/library/cc230724.aspx + WMF 7/5/2012 http://msdn2.microsoft.com/en-us/library/cc250370.aspx +*/ + /* File: uemf.h -Version: 0.0.19 -Date: 20-FEB-2013 +Version: 0.0.25 +Date: 15-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifndef _UEMF_ @@ -27,13 +109,16 @@ Copyright: 2013 David Mathog and California Institute of Technology (Caltech) extern "C" { #endif +#include +#include #include +#include #include #include "uemf_utf.h" #include "uemf_endian.h" - +/** \cond */ // *********************************************************************************** // defines not placed yet @@ -44,13 +129,477 @@ extern "C" { #define U_SYSPAL_NOSTATIC 2 #define U_ELF_VENDOR_SIZE 4 +/** \endcond */ + +// *************************************************************************** +/** \defgroup U_EMF_Miscellaneous_values EMF Miscellaneous Values + @{ +*/ +#define U_NONE 0 //!< Generic for nothing selected for all flag fields +#define U_PI 3.14159265358979323846 //!< pi +#define U_READ 1 //!< open file as "rb" +#define U_WRITE 0 //!< open file as "wb" +#define U_DV_SGNTR 0x08007664 //!< For U_DESIGNVECTOR Signature field +#define U_LP_VERSION 0x0300 //!< For U_LOGPALETTE palVersion field +#define U_RDH_RECTANGLES 1 //!< For U_RGNDATAHEADER iType field +#define U_RDH_OBJSIZE 0x20 //!< For U_RGNDATAHEADER dwSIze field +#define U_RGB_GAMMA_MIN (uint16_t)02500 //!< For U_COLORADJUSTMENT ca[Red|Green|Blue]Gamma fields +#define U_RGB_GAMMA_MAX (uint16_t)65000 //!< For U_COLORADJUSTMENT ca[Red|Green|Blue]Gamma fields +#define U_REFERENCE_WHITE_MIN (uint16_t)6000 //!< For U_COLORADJUSTMENT caReferenceWhite field +#define U_REFERENCE_WHITE_MAX (uint16_t)10000 //!< For U_COLORADJUSTMENT caReferenceWhite field +#define U_REFERENCE_BLACK_MIN (uint16_t)0 //!< For U_COLORADJUSTMENT caReferenceBlack field +#define U_REFERENCE_BLACK_MAX (uint16_t)4000 //!< For U_COLORADJUSTMENT caReferenceBlack field +#define U_COLOR_ADJ_MIN ((int16_t)-100) //!< For U_COLORADJUSTMENT ca[Contrast|Brightness|Colorfulness|RedGreenTint] fields +#define U_COLOR_ADJ_MAX (int16_t) 100 //!< For U_COLORADJUSTMENT ca[Contrast|Brightness|Colorfulness|RedGreenTint] fields +#define U_MAX_PATH 1024 //!< longest path name for a file +#define U_LCS_SIGNATURE 0x50534F43 //!< logColorSpace Signature +#define U_LCS_VERSION 0x400 //!< logColorSpace Version +#define U_REC_FREE 1 //!< use with emf_append +#define U_REC_KEEP 0 //!< use with emf_append +#define U_ROW_ORDER_INVERT 1 //!< For RGBA_to_DIB, invert row order in DIB relative to pixel array +#define U_ROW_ORDER_SAME 0 //!< For RGBA_to_DIB, same row order in DIB as in pixel array +#define U_CT_NO 0 //!< For RGBA_to_DIB, do not use color table +#define U_CT_BGRA 1 //!< For RGBA_to_DIB, use color table (16 bits or less only) BGRA colors, compatible with EMF+ ARGB +#define U_CT_ARGB 1 //!< For RGBA_to_DIB, use color table (16 bits or less only) BGRA colors, compatible with EMF+ ARGB +#define U_EMR_COMMENT_SPOOLFONTDEF 0x544F4E46 //!< For U_EMRCOMMENT record that is U_EMR_COMMENT_SPOOL, comment holds font definition informtion. +/** 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) ) ) + +/** @} */ + + +typedef float U_FLOAT; //!< 32 bit float + +typedef uint32_t U_CBBITS; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBBITSMSK; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBBITSSRC; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBBMI; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBBMIMSK; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBBMISRC; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBDATA; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBNAME; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBPLENTRIES; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBPXLFMT; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBRGNDATA; //!< Count of Bytes in object at corresponding U_OFF* +typedef uint32_t U_CBSTR; //!< Count of Bytes in an 8 or 16 bit string + +typedef uint32_t U_OFFBITS; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFBITSMSK; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFBITSSRC; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFBMI; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFBMIMSK; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFBMISRC; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFDATA; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFDESC; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFDX; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFPLENTRIES; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFPXLFMT; //!< Byte offset to TYPE, always measured from the start of the RECORD (not the struct) +typedef uint32_t U_OFFSTR; //!< Byte offset to string of either 8 or 16 bit characters +typedef uint8_t U_DATA; //!< any binary sort of data, not otherwise classified. + +// "Types" For array components in structures, where not otherwise defined as a structure +typedef uint32_t U_FNTAXES; //!< Font Axes For U_DESIGNVECTOR +typedef uint32_t U_STYLEENTRY; //!< StyleEntry For U_EXTLOGPEN +typedef uint32_t U_POLYCOUNTS; //!< aPolyCounts For U_EMRPOLYPOLYLINE etc. + +// "Counts" for array components in structures +typedef uint32_t U_NUM_FNTAXES; //!< Number of U_FNTAXES +typedef uint32_t U_NUM_LOGPLTNTRY; //!< Number of U_LOGPLTENTRY +typedef uint32_t U_NUM_RECTL; //!< Number of U_RECTL +typedef uint32_t U_NUM_POINTL; //!< Number of U_POINTL +typedef uint32_t U_NUM_POINT16; //!< Number of U_POINT16 +typedef uint32_t U_NUM_STYLEENTRY; //!< Number of U_STYLEENTRY +typedef uint32_t U_NUM_POLYCOUNTS; //!< Number of U_POLYCOUNTS +typedef uint32_t U_NUM_EMRTEXT; //!< Number of U_EMRTEXT +typedef uint32_t U_NUM_STR; //!< Number of 8 or 16 bit characters in string +typedef uint32_t U_NUM_TRIVERTEX; //!< Number of U_TRIVERTEX +typedef uint32_t U_NUM_GRADOBJ; //!< Number of U_GRADIENT4 OR U_GRADIENT3 (determined at run time) +typedef uint32_t U_NUM_RGBQUAD; //!< Number of U_RGBQUAD (in bmciColors in U_BITMAPCOREINFO) + + + +/* ************************ WMF pieces used in EMF or EMF+ ****************************** */ + +/** \defgroup U_EMF_EMRSETROP2_iMode_Qualifiers EMF Binary Raster Operation Enumeration + + For U_EMRSETROP2 iMode field + Microsoft name: Binary Raster Operation Enumeration + WMF manual 2.1.1.2 + + These codes specify: + 1. an order of operands (composed of various orders and combinations of: Dest, Pen) + (There are 2, hence "Binary Raster Operation") + 2. an order of operators to apply to the operands (composed of Not, Xor, Or, And) + Only a few of the more common operations are provided here. + + The default is U_R2_COPYPEN. If this value is changed to something else all subsequenty + draw operations will use the altered logic. For instance, if it is set to U_R2_BLACK and + a red rectangle is drawn it will appear as a black rectangle. + + @{ +*/ +#define U_R2_BLACK 1 //!< BLACK +#define U_R2_NOTMERGEPEN 2 //!< NOTMERGEPEN +#define U_R2_MASKNOTPEN 3 //!< MASKNOTPEN +#define U_R2_NOTCOPYPEN 4 //!< NOTCOPYPEN +#define U_R2_MASKPENNOT 5 //!< MASKPENNOT +#define U_R2_NOT 6 //!< NOT +#define U_R2_XORPEN 7 //!< XORPEN +#define U_R2_NOTMASKPEN 8 //!< NOTMASKPEN +#define U_R2_MASKPEN 9 //!< MASKPEN +#define U_R2_NOTXORPEN 10 //!< NOTXORPEN +#define U_R2_NOP 11 //!< NOP +#define U_R2_MERGENOTPEN 12 //!< MERGENOTPEN +#define U_R2_COPYPEN 13 //!< COPYPEN +#define U_R2_MERGEPENNOT 14 //!< MERGEPENNOT +#define U_R2_MERGEPEN 15 //!< MERGEPEN +#define U_R2_WHITE 16 //!< WHITE +#define U_R2_LAST 16 //!< LAST +/** @} */ + +/** \defgroup U_EMF_BITMAPINFOHEADER_biBitCount_Qualifiers EMF BitCount Enumeration + For U_BITMAPINFOHEADER biBitCount field. + Microsoft name: Bitcount Enumeration + WMF manual 2.1.1.3 + @{ +*/ +#define U_BCBM_EXPLICIT 0 //!< Derived from JPG or PNG compressed image or ? +#define U_BCBM_MONOCHROME 1 //!< 2 colors. bmiColors array has two entries +#define U_BCBM_COLOR4 4 //!< 2^4 colors. bmiColors array has 16 entries +#define U_BCBM_COLOR8 8 //!< 2^8 colors. bmiColors array has 256 entries +#define U_BCBM_COLOR16 16 //!< 2^16 colors. bmiColors is not used. Pixels are 5 bits B,G,R with 1 unused bit +#define U_BCBM_COLOR24 24 //!< 2^24 colors. bmiColors is not used. Pixels are U_RGBTRIPLE. +#define U_BCBM_COLOR32 32 //!< 2^32 colors. bmiColors is not used. Pixels are U_RGBQUAD. Also use for EMF+ ARGB +/** @} */ + +/** \defgroup U_EMF_BITMAPINFOHEADER_biCompression_Qualifiers EMF BI_Compression Enumeration + For U_BITMAPINFOHEADER biCompression field + Microsoft name: Compression Enumeration + WMF manual 2.1.1.7 + @{ +*/ +#define U_BI_UNKNOWN -1 //!< not defined in EMF standard, not to be used in EMF files +#define U_BI_RGB 0 //!< Supported by libUEMF +#define U_BI_RLE8 1 //!< NOT supported by libUEMF +#define U_BI_RLE4 2 //!< NOT supported by libUEMF +#define U_BI_BITFIELDS 3 //!< Supported by libUEMF +#define U_BI_JPEG 4 //!< Supported by libUEMF +#define U_BI_PNG 5 //!< Supported by libUEMF +/** @} */ + +/** \defgroup U_EMF_LOGCOLORSPACE_lcsIntent_Qualifiers EMF LCS_Intent Enumeration + For U_LOGCOLORSPACEA/U_LOGCOLORSPACEW lcsIntent field + Microsoft name: LCS_Intent Enumeration + WMF manual 2.1.1.11 + @{ +*/ +#define U_LCS_GM_BUSINESS 0x00000001L //!< BUSINESS +#define U_LCS_GM_GRAPHICS 0x00000002L //!< GRAPHICS +#define U_LCS_GM_IMAGES 0x00000004L //!< IMAGES +#define U_LCS_GM_ABS_COLORIMETRIC 0x00000008L //!< ABS_COLORIMETRIC +/** @} */ + +/** \defgroup U_EMF_LOGCOLORSPACE_lcsCSType_Qualifiers EMF LCS_CSType Enumeration + For U_LOGCOLORSPACEA/U_LOGCOLORSPACEW lcsCSType field + Microsoft name: LCS_CSType Enumeration + WMF manual 2.1.1.14 + @{ +*/ +#define U_LCS_CALIBRATED_RGB 0x00000000L //!< CALIBRATED_RGB +#define U_LCS_DEVICE_RGB 0x00000001L //!< DEVICE_RGB +#define U_LCS_DEVICE_CMYK 0x00000002L //!< DEVICE_CMYK +/** @} */ + +/** \defgroup U_EMF_EMR_dwROP_Qualifiers EMF Ternary Raster Operation enumeration + + For U_EMR* dwROP fields. + Microsoft name: Ternary Raster Operation enumeration + WMF manual 2.1.1.31 + + These codes specify: + 1. an order of operands (composed of various orders and combinations of: Dest, Src, Pen) + (There are 3, hence "Ternary Raster Operation") + 2. an order of operators to apply to the operands (composed of Not, Xor, Or, And) + Only a few of the more common operations are provided here. + When the Operation does not use a Src operand the corresponding source bitmap may be + omitted from the record. + + For more details see: + http://wiki.winehq.org/TernaryRasterOps + + + @{ +*/ +#define U_SRCCOPY 0x00cc0020 //!< SRCCOPY +#define U_SRCPAINT 0x00ee0086 //!< SRCPAINT +#define U_SRCAND 0x008800c6 //!< SRCAND +#define U_SRCINVERT 0x00660046 //!< SRCINVERT +#define U_SRCERASE 0x00440328 //!< SRCERASE +#define U_NOTSRCCOPY 0x00330008 //!< NOTSRCCOPY +#define U_NOTSRCERASE 0x001100a6 //!< NOTSRCERASE +#define U_MERGECOPY 0x00c000ca //!< MERGECOPY +#define U_MERGEPAINT 0x00bb0226 //!< MERGEPAINT +#define U_PATCOPY 0x00f00021 //!< PATCOPY +#define U_PATPAINT 0x00fb0a09 //!< PATPAINT +#define U_PATINVERT 0x005a0049 //!< PATINVERT +#define U_DSTINVERT 0x00550009 //!< DSTINVERT +#define U_BLACKNESS 0x00000042 //!< BLACKNESS +#define U_WHITENESS 0x00ff0062 //!< WHITENESS +#define U_NOOP 0x00aa0029 //!< Many GDI programs end with a bitblt with this ROP == "D". Seems to work like flush() +#define U_NOMIRRORBITMAP 0x80000000 //!< If bit set, disable horizontal reflection of bitmap. +/** @} */ + +/** \defgroup U_EMF_EMRSETTEXTALIGN_iMode_Qualifiers EMF TextAlignment Enumeration + For U_EMRSETTEXTALIGN iMode field + Microsoft name: TextAlignment Enumeration + WMF Manual 2.1.2.3 + WMF Manual 2.1.2.4 + + Recall that EMF coordinates have UL closest to {0,0}, LR is below and to the right of UL and so has LARGER + {x,y} coordinates. In the following "TOP" is on the horizontal line defined by LR, as it has larger y coordinates, + which when viewing the EMF file, would actually be on the BOTTOM of the bounding rectangle. Similarly, left and right + are reversed. + + Microsoft documentation (WMF manual, section 2.1.2.3) says that the text starts on certain edges of the bounding rectangle. + That is apparently not true, whether the bounding rectangle is {0,0,-1,-1}, which is effectively no bounding rectangle, + or if a valid bounding rectangle is specified. In all cases the text (in Windows XP Preview) starts, has center at, or ends + at the center point. Vertical offsets seem to be defined analogously, but with respect to the height of the font. The bounding + rectangle defined for the U_EMRTEXT record appears to be ignored. + + Microsoft documentation (EMF manual,section 2.2.5) says that the same rectangle is used for "clipping or opaquing" by ExtTextOutA/W. + That does not seem to occur either. + + @{ +*/ +// Horizontal text flags +#define U_TA_DEFAULT 0x00 //!< default alignment +#define U_TA_NOUPDATECP 0x00 //!< Reference point does not move +#define U_TA_UPDATECP 0x01 //!< Reference point moves to end of next text drawn. +#define U_TA_LEFT 0x00 //!< Reference point is on left edge of bounding rectangle +#define U_TA_RIGHT 0x02 //!< Reference point is on right edge of bounding rectangle +#define U_TA_CENTER 0x06 //!< Reference point is on center vertical line of bounding rectangle +#define U_TA_TOP 0x00 //!< Reference point is on top edge of bounding rectangle +#define U_TA_BOTTOM 0x08 //!< Reference point is on bottom edge of bounding rectangle +#define U_TA_BASEBIT 0x10 //!< Reference point is on baseline of text if this bit is set, for 0x10 <-> 0x18 +#define U_TA_BASELINE 0x18 //!< Reference point is on baseline of text +#define U_TA_RTLREADING 0x100 //!< Set for Right to Left languages like Hebrew and Arabic +#define U_TA_MASK U_TA_BASELINE+U_TA_CENTER+U_TA_UPDATECP+U_TA_RTLREADING //!< Mask for these bits +// Vertical text flags +#define U_VTA_BASELINE U_TA_BASELINE //!< same meaning, but for vertical text +#define U_VTA_LEFT U_TA_BOTTOM //!< same meaning, but for vertical text +#define U_VTA_RIGHT U_TA_TOP //!< same meaning, but for vertical text +#define U_VTA_CENTER U_TA_CENTER //!< same meaning, but for vertical text +#define U_VTA_BOTTOM U_TA_RIGHT //!< same meaning, but for vertical text +#define U_VTA_TOP U_TA_LEFT //!< same meaning, but for vertical text +/** @} */ + +/** WMF manual 2.2.2.3 + \brief For U_BITMAPINFO bmiHeader field + + Microsoft name: BITMAPINFOHEADER Object +*/ +typedef struct { + uint32_t biSize; //!< Structure size in bytes + int32_t biWidth; //!< Bitmap width in pixels + int32_t biHeight; //!< Bitmap height in pixels, may be negative. + //!< abs(biHeight) is bitmap height + //!< bitmap may appear in two orientations: + //!< biHeight > 0 origin is LL corner, may be compressed, this is height after decompression. + //!< biHeight < 0 origin is UL corner, may not be compressed + uint16_t biPlanes; //!< Planes (must be 1) + uint16_t biBitCount; //!< BitCount Enumeration (determines number of RBG colors) + uint32_t biCompression; //!< BI_Compression Enumeration + uint32_t biSizeImage; //!< Image size in bytes or 0 = "default size (calculated from geometry?)" + int32_t biXPelsPerMeter; //!< X Resolution in pixels/meter + int32_t biYPelsPerMeter; //!< Y Resolution in pixels/meter + U_NUM_RGBQUAD biClrUsed; //!< Number of bmciColors in U_BITMAPINFO/U_BITMAPCOREINFO that are used by the bitmap + uint32_t biClrImportant; //!< Number of bmciColors needed (0 means all). +} U_BITMAPINFOHEADER, + *PU_BITMAPINFOHEADER; //!< WMF manual 2.2.2.3 + +/** WMF manual 2.2.2.6 + \brief For U_CIEXYZTRIPLE (all) fields + + Microsoft name: CIEXYZ Object +*/ +typedef struct { + int32_t ciexyzX; //!< CIE color space X component + int32_t ciexyzY; //!< CIE color space Y component + int32_t ciexyzZ; //!< CIE color space Z component +} U_CIEXYZ, + *PU_CIEXYZ; //!< WMF manual 2.2.2.6 + +/** WMF manual 2.2.2.7 + \brief For U_LOGCOLORSPACEA and U_LOGCOLORSPACEW lcsEndpints field + + defines a CIE colorspace. + Microsoft name: CIEXYZTRIPLE Object + +*/ +typedef struct { + U_CIEXYZ ciexyzRed; //!< CIE XYZ coord of red endpoint of colorspace + U_CIEXYZ ciexyzGreen; //!< CIE XYZ coord of green endpoint of colorspace + U_CIEXYZ ciexyzBlue; //!< CIE XYZ coord of blue endpoint of colorspace +} U_CIEXYZTRIPLE, + *PU_CIEXYZTRIPLE; //!< WMF manual 2.2.2.7 + +/** WMF manual 2.2.2.8 + \brief For U_BITMAPINFO crColor field + + NOTE that the color order is RGB reserved, flipped around from the preceding. + Microsoft name: COLORREF Object +*/ +typedef struct { + uint8_t Red; //!< Red color (0-255) + uint8_t Green; //!< Green color (0-255) + uint8_t Blue; //!< Blue color (0-255) + uint8_t Reserved; //!< Not used +} U_COLORREF, + *PU_COLORREF; //!< WMF manual 2.2.2.8 + +/** WMF manual 2.2.2.11 + \brief For U_LCS_GAMMARGB lcsGamma* fields + + Microsoft name:(unknown) +*/ +typedef struct { + unsigned ignoreHi :8; //!< not used + unsigned intPart :8; //!< integer part + unsigned fracPart :8; //!< fraction part + unsigned ignoreLo :8; //!< not used +} U_LCS_GAMMA, + *PU_LCS_GAMMA; //!< WMF manual 2.2.2.11 + +/** WMF manual 2.2.2.11 + \brief For U_LOGCOLORSPACEA and U_LOGCOLORSPACEW lcsGammaRGB field + + Microsoft name:(unknown) +*/ +typedef struct { + U_LCS_GAMMA lcsGammaRed; //!< Red Gamma + U_LCS_GAMMA lcsGammaGreen; //!< Green Gamma + U_LCS_GAMMA lcsGammaBlue; //!< Blue Gamma +} U_LCS_GAMMARGB, + *PU_LCS_GAMMARGB; //!< WMF manual 2.2.2.11 + +/** WMF manual 2.2.2.11 + \brief For U_EMRCREATECOLORSPACE lcs field + + Microsoft name: LOGCOLORSPACEA Object +*/ +typedef struct { + uint32_t lcsSignature; //!< must be U_LCS_SIGNATURE + uint32_t lcsVersion; //!< must be U_LCS_VERSION + uint32_t lcsSize; //!< Size in bytes of this structure + int32_t lcsCSType; //!< LCS_CSType Enumeration + int32_t lcsIntent; //!< LCS_Intent Enumeration + U_CIEXYZTRIPLE lcsEndpoints; //!< CIE XYZ color space endpoints + U_LCS_GAMMARGB lcsGammaRGB; //!< Gamma For RGB + char lcsFilename[U_MAX_PATH]; //!< Names an external color profile file, otherwise empty string +} U_LOGCOLORSPACEA, + *PU_LOGCOLORSPACEA; //!< WMF manual 2.2.2.11 + +/** WMF manual 2.2.2.12 + \brief For U_EMRCREATECOLORSPACEW lcs field + + Microsoft name: LOGCOLORSPACEW Object +*/ +typedef struct { + uint32_t lcsSignature; //!< must be U_LCS_SIGNATURE + uint32_t lcsVersion; //!< must be U_LCS_VERSION + uint32_t lcsSize; //!< Size in bytes of this structure + int32_t lcsCSType; //!< lcsCSType Enumeration + int32_t lcsIntent; //!< lcsIntent Enumeration + U_CIEXYZTRIPLE lcsEndpoints; //!< CIE XYZ color space endpoints + U_LCS_GAMMARGB lcsGammaRGB; //!< Gamma For RGB + uint16_t lcsFilename[U_MAX_PATH]; //!< Could name an external color profile file, otherwise empty string +} U_LOGCOLORSPACEW, + *PU_LOGCOLORSPACEW; //!< WMF manual 2.2.2.12 + +/** WMF manual 2.2.2.15 + \brief Used for any generic pair of uint32_t + + Microsoft name: POINTL Object +*/ +typedef struct { + int32_t x; //!< X value + int32_t y; //!< Y value +} U_PAIR, + U_POINT, //!< WMF manual 2.2.2.15 + U_POINTL, //!< WMF manual 2.2.2.15 + *PU_PAIR, //!< WMF manual 2.2.2.15 + *PU_POINT, //!< WMF manual 2.2.2.15 + *PU_POINTL; //!< WMF manual 2.2.2.15 + + +/** WMF manual 2.2.2.16 + \brief Point type for 16 bit EMR drawing functions. + + Microsoft name: POINTS Object. + Microsoft name: POINTS16 Object. +*/ +typedef struct { + int16_t x; //!< X size (16 bit) + int16_t y; //!< Y size (16 bit) +} U_POINT16, + *PU_POINT16; //!< WMF manual 2.2.2.16 + +/** WMF manual 2.2.2.19 + \brief Coordinates of the upper left, lower right corner. + + Note that the coordinate system is 0,0 in the upper left corner + of the screen an N,M in the lower right corner. + Microsoft name: RECTL Object +*/ +typedef struct { + int32_t left; //!< left coordinate + int32_t top; //!< top coordinate + int32_t right; //!< right coordinate + int32_t bottom; //!< bottom coordinate +} U_RECT, + U_RECTL, //!< WMF manual 2.2.2.19 + *PU_RECT, //!< WMF manual 2.2.2.19 + *PU_RECTL; //!< WMF manual 2.2.2.19 + +/** WMF manual 2.2.2.20 + \brief For U_BITMAPINFO bmiColors field + + NOTE that the color order is BGR, even though the name is RGB! + Microsoft name: RGBQUAD Object +*/ +typedef struct { + uint8_t Blue; //!< Blue color (0-255) + uint8_t Green; //!< Green color (0-255) + uint8_t Red; //!< Red color (0-255) + uint8_t Reserved; //!< Not used +} U_RGBQUAD, + *PU_RGBQUAD; //!< WMF manual 2.2.2.20 + +#define U_RCL_DEF (U_RECTL){0,0,-1,-1} //!< Use this when no bounds are needed. + +/** WMF manual 2.2.2.22 + \brief Pair of values indicating x and y sizes. + + Microsoft name: SIZE Object + Microsoft name: SIZEL Object +*/ +typedef struct { + int32_t cx; //!< X size + int32_t cy; //!< Y size +} U_SIZE, + U_SIZEL, //!< WMF manual 2.2.2.22 + *PU_SIZE, //!< WMF manual 2.2.2.22 + *PU_SIZEL; //!< WMF manual 2.2.2.22 + + +/* ************************ EMF or common to EMF and EMF+ ****************************** */ // *********************************************************************************** // Value enumerations and other predefined constants, alphabetical order by group -/** \defgroup Font_struct_widths Font name and style widths in characters +/** \defgroup U_EMF_FONT_STRUCT_WIDTHS EMF Font name and style widths in characters For U_LOGFONT and U_LOGFONT_PANOSE, @{ */ @@ -58,9 +607,10 @@ extern "C" { #define U_LF_FULLFACESIZE 64 //!< U_LOGFONT_PANOSE elfFullName field maximum width /** @} */ -/** \defgroup U_EMR_Qualifiers RecordType Enumeration - (RecordType Enumeration) +/** \defgroup U_EMF_EMR_Qualifiers EMF RecordType Enumeration + (RecordType Enumeration, EMF manual 2.1.1 ) For U_EMR iType field + EMF manual 2.1.1 @{ */ #define U_EMR_HEADER 1 //!< U_EMRHEADER record @@ -192,7 +742,8 @@ extern "C" { #define U_EMR_INVALID 0xFFFFFFFF //!< Not any valid U_EMF_ value /** @} */ -/** \defgroup U_DRAW_PROPERTIES draw properties + +/** \defgroup U_EMF_DRAW_PROPERTIES EMF draw properties Used in emr_properties() and wmr_properties. These are the bit definitions. @{ */ @@ -208,892 +759,791 @@ extern "C" { #define U_DRAW_NOFILL 0x200 //!< Object is not fillable (lines and arc, only used in WMF) /** @} */ -/** \defgroup U_EMRSETARCDIRECTION_Qualifiers ArcDirection Enumeration +/** \defgroup U_EMF_EMRSETARCDIRECTION_Qualifiers EMF ArcDirection Enumeration For U_EMRSETARCDIRECTION iArcDirection field + Microsoft name: ArcDirection Enumeration + EMF manual 2.1.2 @{ */ -#define U_AD_COUNTERCLOCKWISE 1 -#define U_AD_CLOCKWISE 2 +#define U_AD_COUNTERCLOCKWISE 1 //!< Draw arc counterclockwise. +#define U_AD_CLOCKWISE 2 //!< Draw arc clockwise. /** @} */ -/** \defgroup U_PANOSE_bArmStyle_Qualifiers ArmStyle Enumeration +/** \defgroup U_EMF_PANOSE_bArmStyle_Qualifiers EMF ArmStyle Enumeration For U_PANOSE bArmStyle field + Microsoft name: ArmStyle Enumeration + EMF manual 2.1.3 @{ */ -#define U_PAN_STRAIGHT_ARMS_HORZ 2 -#define U_PAN_STRAIGHT_ARMS_WEDGE 3 -#define U_PAN_STRAIGHT_ARMS_VERT 4 -#define U_PAN_STRAIGHT_ARMS_SINGLE_SERIF 5 -#define U_PAN_STRAIGHT_ARMS_DOUBLE_SERIF 6 -#define U_PAN_BENT_ARMS_HORZ 7 -#define U_PAN_BENT_ARMS_WEDGE 8 -#define U_PAN_BENT_ARMS_VERT 9 -#define U_PAN_BENT_ARMS_SINGLE_SERIF 10 -#define U_PAN_BENT_ARMS_DOUBLE_SERIF 11 +#define U_PAN_STRAIGHT_ARMS_HORZ 2 //!< straight arms horizontal +#define U_PAN_STRAIGHT_ARMS_WEDGE 3 //!< straight arms wedge +#define U_PAN_STRAIGHT_ARMS_VERT 4 //!< straight arms vertical +#define U_PAN_STRAIGHT_ARMS_SINGLE_SERIF 5 //!< straight arms singleserif +#define U_PAN_STRAIGHT_ARMS_DOUBLE_SERIF 6 //!< straight arms doubleserif +#define U_PAN_BENT_ARMS_HORZ 7 //!< bent arms horizontal +#define U_PAN_BENT_ARMS_WEDGE 8 //!< bent arms wedge +#define U_PAN_BENT_ARMS_VERT 9 //!< bent arms vertical +#define U_PAN_BENT_ARMS_SINGLE_SERIF 10 //!< bent arms singleserif +#define U_PAN_BENT_ARMS_DOUBLE_SERIF 11 //!< bent arms doubleserif /** @} */ -/** \defgroup U_EMRSETBKMODE_iMode_Qualifiers BackgroundMode enumeration +/** \defgroup U_EMF_EMRSETBKMODE_iMode_Qualifiers EMF BackgroundMode enumeration For U_EMRSETBKMODE iMode field + Microsoft name: BackgroundMode enumeration + EMF manual 2.1.4 @{ */ -#define U_TRANSPARENT 1 -#define U_OPAQUE 2 -/** @} */ - -/** \defgroup U_BITMAPINFOHEADER_biBitCount_Qualifiers BitCount Enumeration - For U_BITMAPINFOHEADER biBitCount field. - @{ -*/ -#define U_BCBM_EXPLICIT 0 //!< Derived from JPG or PNG compressed image or ? -#define U_BCBM_MONOCHROME 1 //!< 2 colors. bmiColors array has two entries -#define U_BCBM_COLOR4 4 //!< 2^4 colors. bmiColors array has 16 entries -#define U_BCBM_COLOR8 8 //!< 2^8 colors. bmiColors array has 256 entries -#define U_BCBM_COLOR16 16 //!< 2^16 colors. bmiColors is not used. Pixels are 5 bits B,G,R with 1 unused bit -#define U_BCBM_COLOR24 24 //!< 2^24 colors. bmiColors is not used. Pixels are U_RGBTRIPLE. -#define U_BCBM_COLOR32 32 //!< 2^32 colors. bmiColors is not used. Pixels are U_RGBQUAD. -/** @} */ - -/** \defgroup U_BITMAPINFOHEADER_biCompression_Qualifiers BI_Compression Enumeration - For U_BITMAPINFOHEADER biCompression field - @{ -*/ -#define U_BI_RGB 0 //!< This is the only one supported by UEMF at present -#define U_BI_RLE8 1 -#define U_BI_RLE4 2 -#define U_BI_BITFIELDS 3 -#define U_BI_JPEG 4 -#define U_BI_PNG 5 +#define U_TRANSPARENT 1 //!< Transparent background mode +#define U_OPAQUE 2 //!< Opaque background mode /** @} */ -/** \defgroup U_COLORADJUSTMENT_caFlags_Qualifiers ColorAdjustment Enumeration +/** \defgroup U_EMF_COLORADJUSTMENT_caFlags_Qualifiers EMF ColorAdjustment Enumeration For U_COLORADJUSTMENT caFlags field + Microsoft name: ColorAdjustment Enumeration + EMF manual 2.1.5 @{ */ -#define U_CA_NEGATIVE 0x0001 -#define U_CA_LOG_FILTER 0x0002 +#define U_CA_NEGATIVE 0x0001 //!< display Negative of image +#define U_CA_LOG_FILTER 0x0002 //!< display Logarithmi filter of image /** @} */ -/** \defgroup U_EMRCOLORMATCHTOTARGETW_dwFlags_Qualifiers ColorMatchToTarget Enumeration +/** \defgroup U_EMF_EMRCOLORMATCHTOTARGETW_dwFlags_Qualifiers EMF ColorMatchToTarget Enumeration For U_EMRCOLORMATCHTOTARGETW dwFlags field + Microsoft name: ColorMatchToTarget Enumeration + EMF manual 2.1.6 @{ */ -#define U_COLORMATCHTOTARGET_NOTEMBEDDED 0 -#define U_COLORMATCHTOTARGET_EMBEDDED 1 +#define U_COLORMATCHTOTARGET_NOTEMBEDDED 0 //!< Color match profile is not embedded in metafile +#define U_COLORMATCHTOTARGET_EMBEDDED 1 //!< Color match profile is embedded in metafile /** @} */ -/** \defgroup U_EMRCOLORMATCHTOTARGETW_dwAction_Qualifiers ColorSpace Enumeration +/** \defgroup U_EMF_EMRCOLORMATCHTOTARGETW_dwAction_Qualifiers EMF ColorSpace Enumeration For U_EMRCOLORMATCHTOTARGETW dwAction field + Microsoft name: ColorSpace Enumeration + EMF manual 2.1.7 @{ */ -#define U_CS_ENABLE 1 -#define U_CS_DISABLE 2 -#define U_CS_DELETE_TRANSFORM 3 +#define U_CS_ENABLE 1 //!< Enable color proofing. +#define U_CS_DISABLE 2 //!< Disable color proofing. +#define U_CS_DELETE_TRANSFORM 3 //!< Disable proofing and delete color transform. /** @} */ -/** \defgroup U_PANOSE_bContrast_Qualifiers Contrast Enumeration - For U_PANOSE bContrast field +/** \defgroup U_EMF_PANOSE_common_Qualifiers EMF PanoseCommon Enumeration + Used by all PAN_* enumerations, but only defined once here. + See also U_PAN_ALL1 after the U_PANOSE structure @{ */ -#define U_PAN_CONTRAST_NONE 2 -#define U_PAN_CONTRAST_VERY_LOW 3 -#define U_PAN_CONTRAST_LOW 4 -#define U_PAN_CONTRAST_MEDIUM_LOW 5 -#define U_PAN_CONTRAST_MEDIUM 6 -#define U_PAN_CONTRAST_MEDIUM_HIGH 7 -#define U_PAN_CONTRAST_HIGH 8 -#define U_PAN_CONTRAST_VERY_HIGH 9 +#define U_PAN_ANY 0 //!< Any (for any type of Panose enumeration) +#define U_PAN_NO_FIT 1 //!< No fit (for any type of Panose enumeration) /** @} */ -/** \defgroup U_DIBITS_iUsageSrc_Qualifiers DIBColors Enumeration - For U_EMRSETDIBITSTODEIVCE and U_EMRSTRETCHDIBITS iUsageSrc fields. +/** \defgroup U_EMF_PANOSE_bContrast_Qualifiers EMF Contrast Enumeration + For U_PANOSE bContrast field + Microsoft name: Contrast Enumeration + EMF manual 2.1.8 @{ */ -#define U_DIB_RGB_COLORS 0 -#define U_DIB_PAL_COLORS 1 +#define U_PAN_CONTRAST_NONE 2 //!< None +#define U_PAN_CONTRAST_VERY_LOW 3 //!< Very low +#define U_PAN_CONTRAST_LOW 4 //!< Low +#define U_PAN_CONTRAST_MEDIUM_LOW 5 //!< Medium low +#define U_PAN_CONTRAST_MEDIUM 6 //!< Medium +#define U_PAN_CONTRAST_MEDIUM_HIGH 7 //!< Medium high +#define U_PAN_CONTRAST_HIGH 8 //!< High +#define U_PAN_CONTRAST_VERY_HIGH 9 //!< Very high /** @} */ -/** \defgroup U_EMRCOMMENT_TYPES Comment record types - For U_EMRCOMMENT_* cIdent fields +/** \defgroup U_EMF_DIBITS_iUsageSrc_Qualifiers EMF DIBColors Enumeration + For U_EMRSETDIBITSTODEIVCE and U_EMRSTRETCHDIBITS iUsageSrc fields. + Microsoft name: DIBColors Enumeration + EMF manual 2.1.9 @{ */ -#define U_EMR_COMMENT_PUBLIC 0x43494447 -#define U_EMR_COMMENT_SPOOL 0x00000000 -#define U_EMR_COMMENT_SPOOLFONTDEF 0x544F4E46 -#define U_EMR_COMMENT_EMFPLUSRECORD 0x2B464D45 +#define U_DIB_RGB_COLORS 0 //!< color table contains colors +#define U_DIB_PAL_COLORS 1 //!< color table contains 16 bit indices into logical palette +#define U_DIB_PAL_INDICES 2 //!< no color table, pixel values are indices into logical palette /** @} */ -/** \defgroup U_EMR_COMMENT_PUBLIC EMRComment Enumeration +/** \defgroup U_EMF_EMR_COMMENT_PUBLIC EMF EMRComment Enumeration For U_EMRCOMMENT_PUBLIC pcIdent fields + Microsoft name: EMRComment Enumeration + EMF manual 2.1.10 @{ */ -#define U_EMR_COMMENT_WINDOWS_METAFILE 0x80000001 -#define U_EMR_COMMENT_BEGINGROUP 0x00000002 -#define U_EMR_COMMENT_ENDGROUP 0x00000003 -#define U_EMR_COMMENT_MULTIFORMATS 0x40000004 -#define U_EMR_COMMENT_UNICODE_STRING 0x00000040 -#define U_EMR_COMMENT_UNICODE_END 0x00000080 +#define U_EMR_COMMENT_WINDOWS_METAFILE 0x80000001 //!< Comment contains WMF +#define U_EMR_COMMENT_BEGINGROUP 0x00000002 //!< Comment begins group of EMF records +#define U_EMR_COMMENT_ENDGROUP 0x00000003 //!< Comment ends group of EMF records +#define U_EMR_COMMENT_MULTIFORMATS 0x40000004 //!< Comment contains some other representation of drawing +#define U_EMR_COMMENT_UNICODE_STRING 0x00000040 //!< Reserved +#define U_EMR_COMMENT_UNICODE_END 0x00000080 //!< Reserved /** @} */ -/** \defgroup U_EMRTEXT_foptions_Qualifiers ExtTextOutOptions Enumeration +/** \defgroup U_EMF_EMRTEXT_foptions_Qualifiers EMF ExtTextOutOptions Enumeration For U_EMRTEXT foptions field + Microsoft name: ExtTextOutOptions Enumeration + EMF manual 2.1.11 @{ */ -#define U_ETO_NONE 0x00000000 -#define U_ETO_GRAYED 0x00000001 -#define U_ETO_OPAQUE 0x00000002 -#define U_ETO_CLIPPED 0x00000004 -#define U_ETO_GLYPH_INDEX 0x00000010 -#define U_ETO_RTLREADING 0x00000080 -#define U_ETO_NO_RECT 0x00000100 -#define U_ETO_SMALL_CHARS 0x00000200 // For EMRSMALLTEXTOUT ONLY, does not affect EMRTEXTOUTA or EMRTEXTOUTW -#define U_ETO_NUMERICSLOCAL 0x00000400 -#define U_ETO_NUMERICSLATIN 0x00000800 -#define U_ETO_IGNORELANGUAGE 0x00001000 -#define U_ETO_PDY 0x00002000 -#define U_ETO_REVERSE_INDEX_MAP 0x00010000 -/** @} */ - -/** \defgroup U_PANOSE_bFamilyType_Qualifiers FamilyType Enumeration +#define U_ETO_NONE 0x00000000 //!< None +#define U_ETO_GRAYED 0x00000001 //!< Grayed +#define U_ETO_OPAQUE 0x00000002 //!< Fill rectangle with background color. +#define U_ETO_CLIPPED 0x00000004 //!< Clip text to rectangle. +#define U_ETO_GLYPH_INDEX 0x00000010 //!< Characters are glyph indices for the font. +#define U_ETO_RTLREADING 0x00000080 //!< Right to left text. +#define U_ETO_NO_RECT 0x00000100 //!< No bounding rectangle is specified. +#define U_ETO_SMALL_CHARS 0x00000200 //!< 8 bit characters instead of 16 bit. For EMRSMALLTEXTOUT ONLY, does not affect EMRTEXTOUTA or EMRTEXTOUTW +#define U_ETO_NUMERICSLOCAL 0x00000400 //!< Show numbers for the current locale. +#define U_ETO_NUMERICSLATIN 0x00000800 //!< Show numbers using European digits. +#define U_ETO_IGNORELANGUAGE 0x00001000 //!< Process Right to Left languages exactly as specified in the metafile. +#define U_ETO_PDY 0x00002000 //!< Both horizontal and vertical displacements are provided. +#define U_ETO_REVERSE_INDEX_MAP 0x00010000 //!< Reverse_index_map +/** @} */ + +/** \defgroup U_EMF_PANOSE_bFamilyType_Qualifiers EMF FamilyType Enumeration For U_PANOSE bFamilyType field + Microsoft name: FamilyType Enumeration + EMF manual 2.1.12 @{ */ -#define U_PAN_FAMILY_TEXT_DISPLAY 2 -#define U_PAN_FAMILY_SCRIPT 3 -#define U_PAN_FAMILY_DECORATIVE 4 -#define U_PAN_FAMILY_PICTORIAL 5 +#define U_PAN_FAMILY_TEXT_DISPLAY 2 //!< Text display +#define U_PAN_FAMILY_SCRIPT 3 //!< Script +#define U_PAN_FAMILY_DECORATIVE 4 //!< Decorative +#define U_PAN_FAMILY_PICTORIAL 5 //!< Pictorial /** @} */ -/** \defgroup U_EMREXTFLOODFILL_iMode_Qualifiers FloodFill Enumeration +/** \defgroup U_EMF_EMREXTFLOODFILL_iMode_Qualifiers EMF FloodFill Enumeration For U_EMREXTFLOODFILL iMode field + Microsoft name: FloodFill Enumeration + EMF manual 2.1.13 @{ */ -#define U_FLOODFILLBORDER 0x00000000 /* Color specified must be the same as the border - brush fill stops at this color */ -#define U_FLOODFILLSURFACE 0x00000001 /* Color specified must be different from the border - brush fills only this color */ +#define U_FLOODFILLBORDER 0x00000000 //!< Color specified must be the same as the border - brush fill stops at this color +#define U_FLOODFILLSURFACE 0x00000001 //!< Color specified must be different from the border - brush fills only this color /** @} */ -/** \defgroup U_DESIGNVECTOR_Signature_Qualifiers Signature Enumeration +/** \defgroup U_EMF_DESIGNVECTOR_Signature_Qualifiers EMF Signature Enumeration For U_DESIGNVECTOR Signature field + Microsoft name: Signature Enumeration + EMF manual 2.1.14 @{ */ -#define U_ENHMETA_SIGNATURE 0x464D4520 //!< also for U_EMRHEADER dSignature field -#define U_EPS_SIGNATURE 0x46535045 +#define U_ENHMETA_SIGNATURE 0x464D4520 //!< "EMF" signature also for U_EMRHEADER dSignature field. +#define U_EPS_SIGNATURE 0x46535045 //!< "FSPE" signature, indicates encapsulated postscript. /** @} */ -/** \defgroup U_EMRGRADIENTFILL_ulMode_Qualifiers GradientFill Enumeration +/** \defgroup U_EMF_EMRGRADIENTFILL_ulMode_Qualifiers EMF GradientFill Enumeration For U_EMRGRADIENTFILL ulMode field + Microsoft name: GradientFill Enumeration + EMF manual 2.1.15 @{ */ -#define U_GRADIENT_FILL_RECT_H 0x00000000 -#define U_GRADIENT_FILL_RECT_V 0x00000001 -#define U_GRADIENT_FILL_TRIANGLE 0x00000002 +#define U_GRADIENT_FILL_RECT_H 0x00000000 //!< Gradient is left to right. +#define U_GRADIENT_FILL_RECT_V 0x00000001 //!< Grident is top to bottom. +#define U_GRADIENT_FILL_TRIANGLE 0x00000002 //!< Gradient is between 3 vertices of a triangle. /** @} */ -/** \defgroup U_EMREXTTEXTOUT_iGraphicsMode_Qualifiers GraphicsMode Enumeration +/** \defgroup U_EMF_EMREXTTEXTOUT_iGraphicsMode_Qualifiers EMF GraphicsMode Enumeration For U_EMREXTTEXTOUTA/U_EMREXTTEXTOUTW and all other iGraphicsMode fields + Microsoft name: GraphicsMode Enumeration + EMF manual 2.1.16 @{ */ -#define U_GM_COMPATIBLE 1 -#define U_GM_ADVANCED 2 -#define U_GM_LAST 2 +#define U_GM_COMPATIBLE 1 //!< TrueType text ignores world to device transform except for Scale. Arcs ignore transform +#define U_GM_ADVANCED 2 //!< TrueType text and Arcs must conform to all of world to device transform. +#define U_GM_LAST 2 //!< Number of GraphicsMode Enumeration entries. /** @} */ -/** \defgroup U_LOGBRUSH_lbHatch_Qualifiers HatchStyle Enumeration +/** \defgroup U_EMF_LOGBRUSH_lbHatch_Qualifiers EMF HatchStyle Enumeration For U_LOGBRUSH lbHatch field + Microsoft name: HatchStyle Enumeration + EMF manual 2.1.17 @{ */ -#define U_HS_HORIZONTAL 0 -#define U_HS_VERTICAL 1 -#define U_HS_FDIAGONAL 2 -#define U_HS_BDIAGONAL 3 -#define U_HS_CROSS 4 -#define U_HS_DIAGCROSS 5 -#define U_HS_SOLIDCLR 6 -#define U_HS_DITHEREDCLR 7 -#define U_HS_SOLIDTEXTCLR 8 -#define U_HS_DITHEREDTEXTCLR 9 -#define U_HS_SOLIDBKCLR 10 -#define U_HS_DITHEREDBKCLR 11 -/** @} */ - -/** \defgroup U_EMRSETICMMODE_iMode_Qualifiers ICMMode Enumeration +#define U_HS_HORIZONTAL 0 //!< Horizontal. +#define U_HS_VERTICAL 1 //!< Vertical. +#define U_HS_FDIAGONAL 2 //!< Forward diagonal. +#define U_HS_BDIAGONAL 3 //!< Back diagonal. +#define U_HS_CROSS 4 //!< Cross. +#define U_HS_DIAGCROSS 5 //!< Diagonal cross. +#define U_HS_SOLIDCLR 6 //!< Solid color. +#define U_HS_DITHEREDCLR 7 //!< Dithered color. +#define U_HS_SOLIDTEXTCLR 8 //!< Solid text color. +#define U_HS_DITHEREDTEXTCLR 9 //!< Dithered text color. +#define U_HS_SOLIDBKCLR 10 //!< Solid background color. +#define U_HS_DITHEREDBKCLR 11 //!< Dithered background color. +/** @} */ + +/** \defgroup U_EMF_EMRSETICMMODE_iMode_Qualifiers EMF ICMMode Enumeration For EMF U_EMR_SETICMMODE iMode field + Microsoft name: ICMMode Enumeration + EMF manual 2.1.18 @{ */ -#define U_ICM_OFF 1 -#define U_ICM_ON 2 -#define U_ICM_QUERY 3 +#define U_ICM_OFF 1 //!< Off +#define U_ICM_ON 2 //!< On +#define U_ICM_QUERY 3 //!< Query /** @} */ -/** \defgroup U_COLORADJUSTMENT_caIlluminantIndex_Qualifiers Illuminant Enumeration +/** \defgroup U_EMF_COLORADJUSTMENT_caIlluminantIndex_Qualifiers EMF Illuminant Enumeration For U_COLORADJUSTMENT caIlluminantIndex field + Microsoft name: Illuminant Enumeration + EMF manual 2.1.19 @{ */ -#define U_ILLUMINANT_DEVICE_DEFAULT 0 -#define U_ILLUMINANT_A 1 -#define U_ILLUMINANT_B 2 -#define U_ILLUMINANT_C 3 -#define U_ILLUMINANT_D50 4 -#define U_ILLUMINANT_D55 5 -#define U_ILLUMINANT_D65 6 -#define U_ILLUMINANT_D75 7 -#define U_ILLUMINANT_F2 8 -#define U_ILLUMINANT_MAX_INDEX ILLUMINANT_F2 -#define U_ILLUMINANT_TUNGSTEN ILLUMINANT_A -#define U_ILLUMINANT_DAYLIGHT ILLUMINANT_C -#define U_ILLUMINANT_FLUORESCENT ILLUMINANT_F2 -#define U_ILLUMINANT_NTSC ILLUMINANT_C -/** @} */ - -/** \defgroup U_LOGBRUSH_lbStyle_Qualifiers LB_Style Enumeration - For U_LOGBRUSH lbStyle field - @{ -*/ -#define U_BS_SOLID 0 -#define U_BS_NULL 1 -#define U_BS_HOLLOW 1 -#define U_BS_HATCHED 2 -#define U_BS_PATTERN 3 -#define U_BS_INDEXED 4 -#define U_BS_DIBPATTERN 5 -#define U_BS_DIBPATTERNPT 6 -#define U_BS_PATTERN8X8 7 -#define U_BS_DIBPATTERN8X8 8 -#define U_BS_MONOPATTERN 9 -/** @} */ - -/** \defgroup _LOGCOLORSPACE_lcsCSType_Qualifiers LCS_CSType Enumeration - For U_LOGCOLORSPACEA/U_LOGCOLORSPACEW lcsCSType field - @{ -*/ -#define U_LCS_CALIBRATED_RGB 0x00000000L -#define U_LCS_DEVICE_RGB 0x00000001L -#define U_LCS_DEVICE_CMYK 0x00000002L -/** @} */ - -/** \defgroup U_LOGCOLORSPACE_lcsIntent_Qualifiers LCS_Intent Enumeration - For U_LOGCOLORSPACEA/U_LOGCOLORSPACEW lcsIntent field - @{ -*/ -#define U_LCS_GM_BUSINESS 0x00000001L -#define U_LCS_GM_GRAPHICS 0x00000002L -#define U_LCS_GM_IMAGES 0x00000004L -#define U_LCS_GM_ABS_COLORIMETRIC 0x00000008L -/** @} */ - -/** \defgroup U_PANOSE_bLetterForm_Qualifiers Letterform Enumeration +#define U_ILLUMINANT_DEVICE_DEFAULT 0 //!< Device default +#define U_ILLUMINANT_A 1 //!< A +#define U_ILLUMINANT_B 2 //!< B +#define U_ILLUMINANT_C 3 //!< C +#define U_ILLUMINANT_D50 4 //!< D50 +#define U_ILLUMINANT_D55 5 //!< D55 +#define U_ILLUMINANT_D65 6 //!< D65 +#define U_ILLUMINANT_D75 7 //!< D75 +#define U_ILLUMINANT_F2 8 //!< F2 +#define U_ILLUMINANT_MAX_INDEX ILLUMINANT_F2 //!< Max index +#define U_ILLUMINANT_TUNGSTEN ILLUMINANT_A //!< Tungsten +#define U_ILLUMINANT_DAYLIGHT ILLUMINANT_C //!< Daylight +#define U_ILLUMINANT_FLUORESCENT ILLUMINANT_F2 //!< Fluorescent +#define U_ILLUMINANT_NTSC ILLUMINANT_C //!< NTSC +/** @} */ + +/** \defgroup U_EMF_PANOSE_bLetterForm_Qualifiers EMF Letterform Enumeration For U_PANOSE bLetterForm field + Microsoft name: Letterform Enumeration + EMF manual 2.1.20 @{ */ -#define U_PAN_LETT_NORMAL_COMPACT 2 -#define U_PAN_LETT_NORMAL_WEIGHTED 3 -#define U_PAN_LETT_NORMAL_BOXED 4 -#define U_PAN_LETT_NORMAL_FLATTENED 5 -#define U_PAN_LETT_NORMAL_ROUNDED 6 -#define U_PAN_LETT_NORMAL_OFF_CENTER 7 -#define U_PAN_LETT_NORMAL_SQUARE 8 -#define U_PAN_LETT_OBLIQUE_COMPACT 9 -#define U_PAN_LETT_OBLIQUE_WEIGHTED 10 -#define U_PAN_LETT_OBLIQUE_BOXED 11 -#define U_PAN_LETT_OBLIQUE_FLATTENED 12 -#define U_PAN_LETT_OBLIQUE_ROUNDED 13 -#define U_PAN_LETT_OBLIQUE_OFF_CENTER 14 -#define U_PAN_LETT_OBLIQUE_SQUARE 15 -/** @} */ - -/** \defgroup U_LOGFONT_lfWeight_Qualifiers LF_Weight Enumeration - For U_LOGFONT lfWeight field +#define U_PAN_LETT_NORMAL_COMPACT 2 //!< Normal compact +#define U_PAN_LETT_NORMAL_WEIGHTED 3 //!< Normal weighted +#define U_PAN_LETT_NORMAL_BOXED 4 //!< Normal boxed +#define U_PAN_LETT_NORMAL_FLATTENED 5 //!< Normal flattened +#define U_PAN_LETT_NORMAL_ROUNDED 6 //!< Normal rounded +#define U_PAN_LETT_NORMAL_OFF_CENTER 7 //!< Normal off center +#define U_PAN_LETT_NORMAL_SQUARE 8 //!< Normal square +#define U_PAN_LETT_OBLIQUE_COMPACT 9 //!< Oblique compact +#define U_PAN_LETT_OBLIQUE_WEIGHTED 10 //!< Oblique weighted +#define U_PAN_LETT_OBLIQUE_BOXED 11 //!< Oblique boxed +#define U_PAN_LETT_OBLIQUE_FLATTENED 12 //!< Oblique flattened +#define U_PAN_LETT_OBLIQUE_ROUNDED 13 //!< Oblique rounded +#define U_PAN_LETT_OBLIQUE_OFF_CENTER 14 //!< Oblique off center +#define U_PAN_LETT_OBLIQUE_SQUARE 15 //!< Oblique square +/** @} */ + +/** \defgroup U_EMF_EMRSETMAPMODE_iMode_Qualifiers EMF MapMode Enumeration + For U_EMRSETMAPMODE iMode field + Microsoft name: MapMode Enumeration + EMF manual 2.1.21 @{ */ -#define U_FW_DONTCARE 0 -#define U_FW_THIN 100 -#define U_FW_EXTRALIGHT 200 -#define U_FW_ULTRALIGHT 200 -#define U_FW_LIGHT 300 -#define U_FW_NORMAL 400 -#define U_FW_REGULAR 400 -#define U_FW_MEDIUM 500 -#define U_FW_SEMIBOLD 600 -#define U_FW_DEMIBOLD 600 -#define U_FW_BOLD 700 -#define U_FW_EXTRABOLD 800 -#define U_FW_ULTRABOLD 800 -#define U_FW_HEAVY 900 -#define U_FW_BLACK 900 -/** @} */ - -/** \defgroup U_LOGFONT_lfItalic_Qualifiers LF_Italic Enumeration - For U_LOGFONT lfItalic field +#define U_MM_TEXT 1 //!< Text +#define U_MM_LOMETRIC 2 //!< Low metric +#define U_MM_HIMETRIC 3 //!< Hig hmetric +#define U_MM_LOENGLISH 4 //!< Low English +#define U_MM_HIENGLISH 5 //!< High English +#define U_MM_TWIPS 6 //!< Twips +#define U_MM_ISOTROPIC 7 //!< Isotropic +#define U_MM_ANISOTROPIC 8 //!< Anisotropic +#define U_MM_MIN U_MM_TEXT //!< smallest enumeration +#define U_MM_MAX U_MM_ANISOTROPIC //!< largest enumeration +#define U_MM_MAX_FIXEDSCALE U_MM_TWIPS //!< alternate definition +/** @} */ + +/** \defgroup U_EMF_MF_version EMF MetafileVersion Enumeration + For U_EMR_COMMENTS_METAFILE version field + Microsoft name: MetafileVersion Enumeration + EMF manual 2.1.22 @{ */ -#define U_FW_NOITALIC 0 -#define U_FW_ITALIC 1 +#define U_ENHMETA_VERSION 0x00010000 //!< U_EMRHEADER nVersion field /** @} */ -/** \defgroup U_LOGFONT_lfunderline_Qualifiers LF_Underline Enumeration - For U_LOGFONT lfunderline field +/** \defgroup U_EMF_PANOSE_bMidline_Qualifiers EMF MidLine Enumeration + For U_PANOSE bMidline field + Microsoft name: MidLine Enumeration + EMF manual 2.1.23 @{ */ -#define U_FW_NOUNDERLINE 0 -#define U_FW_UNDERLINE 1 -/** @} */ - -/** \defgroup U_LOGFONT_lfStrikeOut_Qualifiers LF_StrikeOut Enumeration - For U_LOGFONT lfStrikeOut field +#define U_PAN_MIDLINE_STANDARD_TRIMMED 2 //!< Midline standard trimmed +#define U_PAN_MIDLINE_STANDARD_POINTED 3 //!< Midline standard pointed +#define U_PAN_MIDLINE_STANDARD_SERIFED 4 //!< Midline standard serifed +#define U_PAN_MIDLINE_HIGH_TRIMMED 5 //!< Midline high trimmed +#define U_PAN_MIDLINE_HIGH_POINTED 6 //!< Midline high pointed +#define U_PAN_MIDLINE_HIGH_SERIFED 7 //!< Midline high serifed +#define U_PAN_MIDLINE_CONSTANT_TRIMMED 8 //!< Midline constant trimmed +#define U_PAN_MIDLINE_CONSTANT_POINTED 9 //!< Midline constant pointed +#define U_PAN_MIDLINE_CONSTANT_SERIFED 10 //!< Midline constant serifed +#define U_PAN_MIDLINE_LOW_TRIMMED 11 //!< Midline low trimmed +#define U_PAN_MIDLINE_LOW_POINTED 12 //!< Midline low pointed +#define U_PAN_MIDLINE_LOW_SERIFED 13 //!< Midline low serifed +/** @} */ + +/** \defgroup U_EMF_EMRMODIFYWORLDTRANSFORM_iMode_Qualifiers EMF ModifyWorldTransformMode Enumeration + For U_EMRMODIFYWORLDTRANSFORM iMode + Microsoft name: ModifyWorldTransformMode Enumeration + EMF manual 2.1.24 @{ */ -#define U_FW_NOSTRIKEOUT 0 -#define U_FW_STRIKEOUT 1 +#define U_MWT_IDENTITY 1 //!< Transform is identity. +#define U_MWT_LEFTMULTIPLY 2 //!< Left multiply transform. +#define U_MWT_RIGHTMULTIPLY 3 //!< Right multiply transform. +#define U_MWT_MIN U_MWT_IDENTITY //!< smallest enumeration. +#define U_MWT_MAX U_MWT_RIGHTMULTIPLY //!< largest enumeration. /** @} */ -/** \defgroup U_LOGFONT_lfCharSet_Qualifiers LF_CharSet Enumeration - For U_LOGFONT lfCharSet field - @{ -*/ -#define U_ANSI_CHARSET (uint8_t)0 /* CP1252, ansi-0, iso8859-{1,15} */ -#define U_DEFAULT_CHARSET (uint8_t)1 -#define U_SYMBOL_CHARSET (uint8_t)2 -#define U_SHIFTJIS_CHARSET (uint8_t)128 /* CP932 */ -#define U_HANGEUL_CHARSET (uint8_t)129 /* CP949, ksc5601.1987-0 */ -#define U_HANGUL_CHARSET U_HANGEUL_CHARSET -#define U_GB2312_CHARSET (uint8_t)134 /* CP936, gb2312.1980-0 */ -#define U_CHINESEBIG5_CHARSET (uint8_t)136 /* CP950, big5.et-0 */ -#define U_GREEK_CHARSET (uint8_t)161 /* CP1253 */ -#define U_TURKISH_CHARSET (uint8_t)162 /* CP1254, -iso8859-9 */ -#define U_HEBREW_CHARSET (uint8_t)177 /* CP1255, -iso8859-8 */ -#define U_ARABIC_CHARSET (uint8_t)178 /* CP1256, -iso8859-6 */ -#define U_BALTIC_CHARSET (uint8_t)186 /* CP1257, -iso8859-13 */ -#define U_RUSSIAN_CHARSET (uint8_t)204 /* CP1251, -iso8859-5 */ -#define U_EE_CHARSET (uint8_t)238 /* CP1250, -iso8859-2 */ -#define U_EASTEUROPE_CHARSET U_EE_CHARSET -#define U_THAI_CHARSET (uint8_t)222 /* CP874, iso8859-11, tis620 */ -#define U_JOHAB_CHARSET (uint8_t)130 /* korean (johab) CP1361 */ -#define U_MAC_CHARSET (uint8_t)77 -#define U_OEM_CHARSET (uint8_t)255 -/* I don't know if the values of *_CHARSET macros are defined in Windows - * or if we can choose them as we want. -- srtxg - */ -#define U_VISCII_CHARSET (uint8_t)240 /* viscii1.1-1 */ -#define U_TCVN_CHARSET (uint8_t)241 /* tcvn-0 */ -#define U_KOI8_CHARSET (uint8_t)242 /* koi8-{r,u,ru} */ -#define U_ISO3_CHARSET (uint8_t)243 /* iso8859-3 */ -#define U_ISO4_CHARSET (uint8_t)244 /* iso8859-4 */ -#define U_ISO10_CHARSET (uint8_t)245 /* iso8859-10 */ -#define U_CELTIC_CHARSET (uint8_t)246 /* iso8859-14 */ -/** @} */ - -/** \defgroup U_LOGFONT_lfOutPrecision_Qualifiers LF_OutPrecision Enumeration - For U_LOGFONT lfOutPrecision field +/** \defgroup U_EMF_LOGPEN_elpPenStyle_Qualifiers EMF PenStyle Enumeration + For U_LOGPEN lopnStyle and U_EXTLOGPEN elpPenStyle fields + Microsoft name: PenStyle Enumeration + EMF manual 2.1.25 @{ */ -#define U_OUT_DEFAULT_PRECIS 0 -#define U_OUT_STRING_PRECIS 1 -#define U_OUT_CHARACTER_PRECIS 2 -#define U_OUT_STROKE_PRECIS 3 -#define U_OUT_TT_PRECIS 4 -#define U_OUT_DEVICE_PRECIS 5 -#define U_OUT_RASTER_PRECIS 6 -#define U_OUT_TT_ONLY_PRECIS 7 -#define U_OUT_OUTLINE_PRECIS 8 -/** @} */ +#define U_PS_SOLID 0x00000000 //!< Solid line. +#define U_PS_DASH 0x00000001 //!< Dashed line. This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. +#define U_PS_DOT 0x00000002 //!< Dotted line. This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. +#define U_PS_DASHDOT 0x00000003 //!< Dash-Dot line. This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. +#define U_PS_DASHDOTDOT 0x00000004 //!< Dash-Dot-Dot line. This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. +#define U_PS_NULL 0x00000005 //!< Invisible line. +#define U_PS_INSIDEFRAME 0x00000006 //!< Draw line around drawing, then shrink drawing to fit within line taking its width into account. +#define U_PS_USERSTYLE 0x00000007 //!< User defined. +#define U_PS_ALTERNATE 0x00000008 //!< Every other pixel is drawn. +#define U_PS_STYLE_MASK 0x0000000f //!< Mask to select just the preceding line type fields. + +#define U_PS_ENDCAP_ROUND 0x00000000 //!< Round end cap. Only with U_PS_GEOMETRIC +#define U_PS_ENDCAP_SQUARE 0x00000100 //!< Square end cap. Only with U_PS_GEOMETRIC +#define U_PS_ENDCAP_FLAT 0x00000200 //!< Flat end cap. Only with U_PS_GEOMETRIC +#define U_PS_ENDCAP_MASK 0x00000f00 //!< Mask to select just the preceding ENDCAP fields. + +#define U_PS_JOIN_ROUND 0x00000000 //!< Rounded join. Only with U_PS_GEOMETRIC +#define U_PS_JOIN_BEVEL 0x00001000 //!< Beveled join. Only with U_PS_GEOMETRIC +#define U_PS_JOIN_MITER 0x00002000 //!< Mitered join. Only with U_PS_GEOMETRIC +#define U_PS_JOIN_MASK 0x0000f000 //!< Mask to select just the preceding JOIN fields. -/** \defgroup U_LOGFONT_lfClipPrecision_Qualifiers LF_ClipPrecision Enumeration - For U_LOGFONT lfClipPrecision field - @{ +#define U_PS_COSMETIC 0x00000000 //!< width may only be 1 pixel. (If set higher it is still drawn as 1). +#define U_PS_GEOMETRIC 0x00010000 //!< width may be >1 pixel, but style may only be U_PS_SOLID or U_PS_NULL. +#define U_PS_TYPE_MASK 0x000f0000 //!< Mask to select just the preceding TYPE fields. +/** @} */ +/** \defgroup U_EMF_EMRPOLY_iMode_Qualifiers EMF Point Enumeration + For U_EMRPOLYDRAW and U_EMRPOLAYDRAW16 abTypes fields. + Microsoft name: Point Enumeration + EMF manual 2.1.26 + @{ */ -#define U_CLIP_DEFAULT_PRECIS 0x00 -#define U_CLIP_CHARACTER_PRECIS 0x01 -#define U_CLIP_STROKE_PRECIS 0x02 -#define U_CLIP_MASK 0x0F -#define U_CLIP_LH_ANGLES 0x10 -#define U_CLIP_TT_ALWAYS 0x20 -#define U_CLIP_EMBEDDED 0x80 +#define U_PT_CLOSEFIGURE 0x0001 //!< Close figure +#define U_PT_LINETO 0x0002 //!< Line to +#define U_PT_BEZIERTO 0x0004 //!< Bezier to +#define U_PT_MOVETO 0x0006 //!< Move to /** @} */ -/** \defgroup U_LOGFONT_lfQuality_Qualifiers LF_Quality Enumeration - For For U_LOGFONT lfQuality field +/** \defgroup U_EMF_EMRSETPOLYFILLMODE_iMode_Qualifiers EMF PolygonFillMode Enumeration + For U_EMRSETPOLYFILLMODE iMode field + Microsoft name: PolygonFillMode Enumeration + EMF manual 2.1.27 @{ */ -#define U_DEFAULT_QUALITY 0 -#define U_DRAFT_QUALITY 1 -#define U_PROOF_QUALITY 2 -#define U_NONANTIALIASED_QUALITY 3 -#define U_ANTIALIASED_QUALITY 4 +#define U_ALTERNATE 1 //!< Alternate +#define U_WINDING 2 //!< Winding +#define U_POLYFILL_LAST 2 //!< Polyfill last /** @} */ -/** \defgroup U_LOGFONT_lfPitchAndFamily_Qualifiers LF_PitchAndFamily Enumeration - For U_LOGFONT lfPitchAndFamily field +/** \defgroup U_EMF_PANOSE_bProportion_Qualifiers EMF Proportion Enumeration + For U_PANOSE bProportion field + Microsoft name: Proportion Enumeration + EMF manual 2.1.28 @{ */ -#define U_DEFAULT_PITCH 0x00 -#define U_FIXED_PITCH 0x01 -#define U_VARIABLE_PITCH 0x02 -#define U_MONO_FONT 0x08 -#define U_FF_DONTCARE 0x00 -#define U_FF_ROMAN 0x10 -#define U_FF_SWISS 0x20 -#define U_FF_MODERN 0x30 -#define U_FF_SCRIPT 0x40 -#define U_FF_DECORATIVE 0x50 +#define U_PAN_PROP_OLD_STYLE 2 //!< Old style +#define U_PAN_PROP_MODERN 3 //!< Modern +#define U_PAN_PROP_EVEN_WIDTH 4 //!< Even width +#define U_PAN_PROP_EXPANDED 5 //!< Expanded +#define U_PAN_PROP_CONDENSED 6 //!< Condensed +#define U_PAN_PROP_VERY_EXPANDED 7 //!< Very expanded +#define U_PAN_PROP_VERY_CONDENSED 8 //!< Very condensed +#define U_PAN_PROP_MONOSPACED 9 //!< Monospaced /** @} */ -/** \defgroup U_EMRSETMAPMODE_iMode_Qualifiers MapMode Enumeration - For U_EMRSETMAPMODE iMode field +/** \defgroup U_EMF_EMRSELECTCLIP_iMode_Qualifiers EMF RegionMode Enumeration + For U_EMRSELECTCLIPPATH and U_EMREXTSELECTCLIPRGN iMode field + Microsoft name: RegionMode Enumeration + EMF manual 2.1.29 @{ */ -#define U_MM_TEXT 1 -#define U_MM_LOMETRIC 2 -#define U_MM_HIMETRIC 3 -#define U_MM_LOENGLISH 4 -#define U_MM_HIENGLISH 5 -#define U_MM_TWIPS 6 -#define U_MM_ISOTROPIC 7 -#define U_MM_ANISOTROPIC 8 -#define U_MM_MIN U_MM_TEXT -#define U_MM_MAX U_MM_ANISOTROPIC -#define U_MM_MAX_FIXEDSCALE U_MM_TWIPS +#define U_RGN_AND 1 //!< Region becomes intersection of existing region and new region. +#define U_RGN_OR 2 //!< Region becomes union of existing region and new region. +#define U_RGN_XOR 3 //!< Region becomes XOR of existing and new regions. +#define U_RGN_DIFF 4 //!< Region becomes part of existing region not in new region. +#define U_RGN_COPY 5 //!< Region becomes new region. +#define U_RGN_MIN U_RGN_AND //!< smallest enumeration. +#define U_RGN_MAX U_RGN_COPY //!< largest enumeration. /** @} */ - -/** \defgroup U_PANOSE_bMidline_Qualifiers MidLine Enumeration - For U_PANOSE bMidline field +/** \defgroup U_EMF_PANOSE_bSerifStyle_Qualifiers EMF SerifType Enumeration + For U_PANOSE bSerifStyle field + Microsoft name: SerifType Enumeration + EMF manual 2.1.30 @{ */ -#define U_PAN_MIDLINE_STANDARD_TRIMMED 2 -#define U_PAN_MIDLINE_STANDARD_POINTED 3 -#define U_PAN_MIDLINE_STANDARD_SERIFED 4 -#define U_PAN_MIDLINE_HIGH_TRIMMED 5 -#define U_PAN_MIDLINE_HIGH_POINTED 6 -#define U_PAN_MIDLINE_HIGH_SERIFED 7 -#define U_PAN_MIDLINE_CONSTANT_TRIMMED 8 -#define U_PAN_MIDLINE_CONSTANT_POINTED 9 -#define U_PAN_MIDLINE_CONSTANT_SERIFED 10 -#define U_PAN_MIDLINE_LOW_TRIMMED 11 -#define U_PAN_MIDLINE_LOW_POINTED 12 -#define U_PAN_MIDLINE_LOW_SERIFED 13 -/** @} */ - -/** \defgroup U_EMRSETLAYOUT_iMode_Qualifiers Mirroring Enumeration - For U_EMRSETLAYOUT iMode field +#define U_PAN_SERIF_COVE 2 //!< Serif cove +#define U_PAN_SERIF_OBTUSE_COVE 3 //!< Serif obtuse cove +#define U_PAN_SERIF_SQUARE_COVE 4 //!< Serif square cove +#define U_PAN_SERIF_OBTUSE_SQUARE_COVE 5 //!< Serif obtuse square cove +#define U_PAN_SERIF_SQUARE 6 //!< Serif square +#define U_PAN_SERIF_THIN 7 //!< Serif thin +#define U_PAN_SERIF_BONE 8 //!< Serif bone +#define U_PAN_SERIF_EXAGGERATED 9 //!< Serif exaggerated +#define U_PAN_SERIF_TRIANGLE 10 //!< Serif triangle +#define U_PAN_SERIF_NORMAL_SANS 11 //!< Serif normal sans +#define U_PAN_SERIF_OBTUSE_SANS 12 //!< Serif obtuse sans +#define U_PAN_SERIF_PERP_SANS 13 //!< Serif perp sans +#define U_PAN_SERIF_FLARED 14 //!< Serif flared +#define U_PAN_SERIF_ROUNDED 15 //!< Serif rounded +/** @} */ + +/** \defgroup U_EMF_EMRSELECTOBJECT_ihObject_Qualifiers EMF StockObject Enumeration + For U_EMRSELECTOBJECT ihObject field. + Microsoft name: StockObject Enumeration + EMF manual 2.1.31 @{ */ -#define U_LAYOUT_LTR 0x00000000 -#define U_LAYOUT_RTL 0x00000001 -#define U_LAYOUT_BITMAPORIENTATIONPRESERVED 0x00000008 -#define U_NOMIRRORBITMAP 0x80000000 -/** @} */ - -/** \defgroup U_EMRMODIFYWORLDTRANSFORM_iMode_Qualifiers ModifyWorldTransformMode Enumeration - For U_EMRMODIFYWORLDTRANSFORM iMode +#define U_STOCK_OBJECT 0x80000000 //!< Stock object +#define U_WHITE_BRUSH 0x80000000 //!< White brush +#define U_LTGRAY_BRUSH 0x80000001 //!< Ltgray brush +#define U_GRAY_BRUSH 0x80000002 //!< Gray brush +#define U_DKGRAY_BRUSH 0x80000003 //!< Dkgray brush +#define U_BLACK_BRUSH 0x80000004 //!< Black brush +#define U_NULL_BRUSH 0x80000005 //!< Null brush +#define U_HOLLOW_BRUSH 0x80000005 //!< Hollow brush +#define U_WHITE_PEN 0x80000006 //!< White pen +#define U_BLACK_PEN 0x80000007 //!< Black pen +#define U_NULL_PEN 0x80000008 //!< Null pen +#define U_OEM_FIXED_FONT 0x8000000A //!< Oem fixed font +#define U_ANSI_FIXED_FONT 0x8000000B //!< Ansi fixed font +#define U_ANSI_VAR_FONT 0x8000000C //!< Ansi var font +#define U_SYSTEM_FONT 0x8000000D //!< System font +#define U_DEVICE_DEFAULT_FONT 0x8000000E //!< Device default font +#define U_DEFAULT_PALETTE 0x8000000F //!< Default palette +#define U_SYSTEM_FIXED_FONT 0x80000010 //!< System fixed font +#define U_DEFAULT_GUI_FONT 0x80000011 //!< Default GUI font +#define U_STOCK_LAST 0x80000011 //!< Stock last +/** @} */ + +/** \defgroup U_EMF_EMRSETSTRETCHBLTMODE_iMode_Qualifiers EMF StretchMode Enumeration + For EMF U_EMRSETSTRETCHBLTMODE iMode field + Microsoft name: StretchMode Enumeration + EMF manual 2.1.32 and footnote 52 on page 297 @{ */ -#define U_MWT_IDENTITY 1 -#define U_MWT_LEFTMULTIPLY 2 -#define U_MWT_RIGHTMULTIPLY 3 -#define U_MWT_MIN U_MWT_IDENTITY -#define U_MWT_MAX U_MWT_RIGHTMULTIPLY +#define U_BLACKONWHITE 1 //!< AND the destination and source pixels. +#define U_WHITEONBLACK 2 //!< OR the destination and source pixels. +#define U_COLORONCOLOR 3 //!< Replace the destination pixels with the source pixels. +#define U_HALFTONE 4 //!< Replace a block of destination pixels with a half-tone representation of the source pixel. +#define U_MAXSTRETCHBLTMODE 4 //!< largest enumeration. +#define U_STRETCH_ANDSCANS 1 //!< AND the destination and source pixels. +#define U_STRETCH_ORSCANS 2 //!< OR the destination and source pixels. +#define U_STRETCH_DELETESCANS 3 //!< Replace the destination pixels with the source pixels. +#define U_STRETCH_HALFTONE 4 //!< Replace a block of destination pixels with a half-tone representation of the source pixel. /** @} */ -/** \defgroup U_PANOSE_common_Qualifiers PanoseCommon Enumeration - Used by all PAN_* enumerations, but only defined once here. - See also U_PAN_ALL1 after the U_PANOSE structure +/** \defgroup U_EMF_PANOSE_bStrokeVariation_Qualifiers EMF StrokeVariation Enumeration + For U_PANOSE bStrokeVariation field + Microsoft name: StrokeVariation Enumeration + EMF manual 2.1.33 @{ */ -#define U_PAN_ANY 0 -#define U_PAN_NO_FIT 1 +#define U_PAN_STROKE_GRADUAL_DIAG 2 //!< Gradual diagonal. +#define U_PAN_STROKE_GRADUAL_TRAN 3 //!< Gradual transitional. +#define U_PAN_STROKE_GRADUAL_VERT 4 //!< Gradual vertical. +#define U_PAN_STROKE_GRADUAL_HORZ 5 //!< Gradual horizontal. +#define U_PAN_STROKE_RAPID_VERT 6 //!< Rapid vertical. +#define U_PAN_STROKE_RAPID_HORZ 7 //!< Rapid horizontal. +#define U_PAN_STROKE_INSTANT_VERT 8 //!< Instant vertical. /** @} */ -/** \defgroup U_PANOSE_index PanoseIndex Enumeration - Fositions of each field in U_PANOSE structure. +/** \defgroup U_EMF_PANOSE_bWeight_Qualifiers EMF Weight Enumeration + For U_PANOSE bWeight field + EMF manual 2.1.34 @{ */ -#define U_PANOSE_COUNT 10 -#define U_PANOSE_FAMILYTYPE_INDEX 0 -#define U_PAN_SERIFSTYLE_INDEX 1 -#define U_PAN_WEIGHT_INDEX 2 -#define U_PAN_PROPORTION_INDEX 3 -#define U_PAN_CONTRAST_INDEX 4 -#define U_PAN_STROKEVARIATION_INDEX 5 -#define U_PAN_ARMSTYLE_INDEX 6 -#define U_PAN_LETTERFORM_INDEX 7 -#define U_PAN_MIDLINE_INDEX 8 -#define U_PAN_XHEIGHT_INDEX 9 +#define U_PAN_WEIGHT_VERY_LIGHT 2 //!< Very light +#define U_PAN_WEIGHT_LIGHT 3 //!< Light +#define U_PAN_WEIGHT_THIN 4 //!< Thin +#define U_PAN_WEIGHT_BOOK 5 //!< Book +#define U_PAN_WEIGHT_MEDIUM 6 //!< Medium +#define U_PAN_WEIGHT_DEMI 7 //!< Demi +#define U_PAN_WEIGHT_BOLD 8 //!< Bold +#define U_PAN_WEIGHT_HEAVY 9 //!< Heavy +#define U_PAN_WEIGHT_BLACK 10 //!< Black +#define U_PAN_WEIGHT_NORD 11 //!< Nord /** @} */ -/** \defgroup U_*LOGPEN_elpPenStyle_Qualifiers PenStyle Enumeration - For U_LOGPEN lopnStyle and U_EXTLOGPEN elpPenStyle fields +/** \defgroup U_EMF_PANOSE_bXHeight_Qualifiers EMF XHeight Enumeration + For U_PANOSE bXHeight field + EMF manual 2.1.35 @{ */ -#define U_PS_SOLID 0x00000000 -#define U_PS_DASH 0x00000001 //!< This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. -#define U_PS_DOT 0x00000002 //!< This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. -#define U_PS_DASHDOT 0x00000003 //!< This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. -#define U_PS_DASHDOTDOT 0x00000004 //!< This only works when NO other U_PS is set. Line width is minimum no matter what pen is set to. -#define U_PS_NULL 0x00000005 -#define U_PS_INSIDEFRAME 0x00000006 -#define U_PS_USERSTYLE 0x00000007 -#define U_PS_ALTERNATE 0x00000008 -#define U_PS_STYLE_MASK 0x0000000f - -#define U_PS_ENDCAP_ROUND 0x00000000 //!< These are only with U_PS_GEOMETRIC -#define U_PS_ENDCAP_SQUARE 0x00000100 -#define U_PS_ENDCAP_FLAT 0x00000200 -#define U_PS_ENDCAP_MASK 0x00000f00 - -#define U_PS_JOIN_ROUND 0x00000000 //!< These are only with U_PS_GEOMETRIC -#define U_PS_JOIN_BEVEL 0x00001000 -#define U_PS_JOIN_MITER 0x00002000 -#define U_PS_JOIN_MASK 0x0000f000 - -#define U_PS_COSMETIC 0x00000000 //!< width may only be 1 pixel. (If set higher it is still drawn as 1). -#define U_PS_GEOMETRIC 0x00010000 //!< width may be >1 pixel, but style may only be U_PS_SOLID or U_PS_NULL. -#define U_PS_TYPE_MASK 0x000f0000 +#define U_PAN_XHEIGHT_CONSTANT_SMALL 2 //!< Constant small +#define U_PAN_XHEIGHT_CONSTANT_STANDARD 3 //!< Constant standard +#define U_PAN_XHEIGHT_CONSTANT_LARGE 4 //!< Constant large +#define U_PAN_XHEIGHT_DUCKING_SMALL 5 //!< Ducking small +#define U_PAN_XHEIGHT_DUCKING_STANDARD 6 //!< Ducking standard +#define U_PAN_XHEIGHT_DUCKING_LARGE 7 //!< Ducking large /** @} */ -/** \defgroup U_PIXELFORMATDESCRIPTOR_dwFlags_Qualifiers PFD_dwFlags Enumeration - For U_PIXELFORMATDESCRIPTOR dwFlags field +/** \defgroup U_EMF_LOGFONT_lfWeight_Qualifiers EMF LF_Weight Enumeration + For U_LOGFONT lfWeight field + EMF manual 2.2.13, footnote 61 (on page 297) @{ */ -#define U_PFD_DOUBLEBUFFER 0x00000001 -#define U_PFD_STEREO 0x00000002 -#define U_PFD_DRAW_TO_WINDOW 0x00000004 -#define U_PFD_DRAW_TO_BITMAP 0x00000008 -#define U_PFD_SUPPORT_GDI 0x00000010 -#define U_PFD_SUPPORT_OPENGL 0x00000020 -#define U_PFD_GENERIC_FORMAT 0x00000040 -#define U_PFD_NEED_PALETTE 0x00000080 -#define U_PFD_NEED_SYSTEM_PALETTE 0x00000100 -#define U_PFD_SWAP_EXCHANGE 0x00000200 -#define U_PFD_SWAP_COPY 0x00000400 -#define U_PFD_SWAP_LAYER_BUFFERS 0x00000800 -#define U_PFD_GENERIC_ACCELERATED 0x00001000 -/** @} */ - -/** \defgroup U_PIXELFORMATDESCRIPTOR_iLayerType_Qualifiers PFD_iLayerType Enumeration - For U_PIXELFORMATDESCRIPTOR iLayerType field +#define U_FW_DONTCARE 0 //!< Don't care +#define U_FW_THIN 100 //!< Thin +#define U_FW_EXTRALIGHT 200 //!< Extra light +#define U_FW_ULTRALIGHT 200 //!< Ultra light +#define U_FW_LIGHT 300 //!< Light +#define U_FW_NORMAL 400 //!< Normal +#define U_FW_REGULAR 400 //!< Regular +#define U_FW_MEDIUM 500 //!< Medium +#define U_FW_SEMIBOLD 600 //!< Semibold +#define U_FW_DEMIBOLD 600 //!< Demibold +#define U_FW_BOLD 700 //!< Bold +#define U_FW_EXTRABOLD 800 //!< Extrabold +#define U_FW_ULTRABOLD 800 //!< Ultrabold +#define U_FW_HEAVY 900 //!< Heavy +#define U_FW_BLACK 900 //!< Black +/** @} */ + +/** \defgroup U_EMF_LOGFONT_lfItalic_Qualifiers EMF LF_Italic Enumeration + For U_LOGFONT lfItalic field + Microsoft name: LF_Italic Enumeration + EMF manual 2.2.13 @{ */ -#define U_PFD_MAIN_PLANE 0 -#define U_PFD_OVERLAY_PLANE 1 -#define U_PFD_UNDERLAY_PLANE (-1) +#define U_FW_NOITALIC 0 //!< Do not use italics. +#define U_FW_ITALIC 1 //!< Use italics. /** @} */ -/** \defgroup U_PIXELFORMATDESCRIPTOR_iPixelType_Qualifiers PFD_iPixelType Enumeration - For U_PIXELFORMATDESCRIPTOR iPixelType field +/** \defgroup U_EMF_LOGFONT_lfunderline_Qualifiers EMF LF_Underline Enumeration + For U_LOGFONT lfunderline field + Microsoft name: LF_Underline Enumeration + EMF manual 2.2.13 @{ */ -#define U_PFD_TYPE_RGBA 0 -#define U_PFD_TYPE_COLORINDEX 1 +#define U_FW_NOUNDERLINE 0 //!< Do not use underline. +#define U_FW_UNDERLINE 1 //!< Use underline. /** @} */ -/** \defgroup U_EMRPOLY_iMode_Qualifiers Point Enumeration - For U_EMRPOLYDRAW and U_EMRPOLAYDRAW16 abTypes fields. - @{ +/** \defgroup U_EMF_LOGFONT_lfStrikeOut_Qualifiers EMF LF_StrikeOut Enumeration + For U_LOGFONT lfStrikeOut field + EMF manual 2.2.13 + @{ */ -#define U_PT_CLOSEFIGURE 0x0001 -#define U_PT_LINETO 0x0002 -#define U_PT_BEZIERTO 0x0004 -#define U_PT_MOVETO 0x0006 +#define U_FW_NOSTRIKEOUT 0 //!< Do not use strikeout. +#define U_FW_STRIKEOUT 1 //!< Use strikeout. /** @} */ -/** \defgroup U_EMRSETPOLYFILLMODE_iMode_Qualifiers PolygonFillMode Enumeration - For U_EMRSETPOLYFILLMODE iMode field +/** \defgroup U_EMF_LOGFONT_lfCharSet_Qualifiers EMF LF_CharSet Enumeration + For U_LOGFONT lfCharSet field + EMF manual 2.2.13 & WMF manual 2.1.15 @{ */ -#define U_ALTERNATE 1 -#define U_WINDING 2 -#define U_POLYFILL_LAST 2 -/** @} */ - -/** \defgroup U_BITMAPV5HEADER_bV5CSType_Qualifiers Profile Enumeration - For U_BITMAPV5HEADER bV5CSType field +#define U_ANSI_CHARSET (uint8_t)0 //!< CP1252, ansi-0, iso8859-{1,15} +#define U_DEFAULT_CHARSET (uint8_t)1 //!< Default character set. +#define U_SYMBOL_CHARSET (uint8_t)2 //!< Symbol character set. +#define U_SHIFTJIS_CHARSET (uint8_t)128 //!< CP932 +#define U_HANGEUL_CHARSET (uint8_t)129 //!< CP949, ksc5601.1987-0 +#define U_HANGUL_CHARSET U_HANGEUL_CHARSET //!< CP949, ksc5601.1987-0 +#define U_GB2312_CHARSET (uint8_t)134 //!< CP936, gb2312.1980-0 +#define U_CHINESEBIG5_CHARSET (uint8_t)136 //!< CP950, big5.et-0 +#define U_GREEK_CHARSET (uint8_t)161 //!< CP1253 +#define U_TURKISH_CHARSET (uint8_t)162 //!< CP1254, -iso8859-9 +#define U_HEBREW_CHARSET (uint8_t)177 //!< CP1255, -iso8859-8 +#define U_ARABIC_CHARSET (uint8_t)178 //!< CP1256, -iso8859-6 +#define U_BALTIC_CHARSET (uint8_t)186 //!< CP1257, -iso8859-13 +#define U_RUSSIAN_CHARSET (uint8_t)204 //!< CP1251, -iso8859-5 +#define U_EE_CHARSET (uint8_t)238 //!< CP1250, -iso8859-2 +#define U_EASTEUROPE_CHARSET U_EE_CHARSET //!< CP1250, -iso8859-2 +#define U_THAI_CHARSET (uint8_t)222 //!< CP874, iso8859-11, tis620 +#define U_JOHAB_CHARSET (uint8_t)130 //!< korean (johab) CP1361 +#define U_MAC_CHARSET (uint8_t)77 //!< Macintosh character set. +#define U_OEM_CHARSET (uint8_t)255 //!< OEM character set. +#define U_VISCII_CHARSET (uint8_t)240 //!< viscii1.1-1 +#define U_TCVN_CHARSET (uint8_t)241 //!< tcvn-0 +#define U_KOI8_CHARSET (uint8_t)242 //!< koi8-{r,u,ru} +#define U_ISO3_CHARSET (uint8_t)243 //!< iso8859-3 +#define U_ISO4_CHARSET (uint8_t)244 //!< iso8859-4 +#define U_ISO10_CHARSET (uint8_t)245 //!< iso8859-10 +#define U_CELTIC_CHARSET (uint8_t)246 //!< iso8859-14 +/** @} */ + +/** \defgroup U_EMF_LOGFONT_lfOutPrecision_Qualifiers EMF LF_OutPrecision Enumeration + For U_LOGFONT lfOutPrecision field + EMF manual 2.2.13 & WMF manual 2.1.1.21 @{ */ -#define U_PROFILE_LINKED 'LINK' -#define U_PROFILE_EMBEDDED 'MBED' +#define U_OUT_DEFAULT_PRECIS 0 //!< Default precision +#define U_OUT_STRING_PRECIS 1 //!< String precision +#define U_OUT_CHARACTER_PRECIS 2 //!< Character precision +#define U_OUT_STROKE_PRECIS 3 //!< Stroke precision +#define U_OUT_TT_PRECIS 4 //!< Tt precision +#define U_OUT_DEVICE_PRECIS 5 //!< Device precision +#define U_OUT_RASTER_PRECIS 6 //!< Raster precision +#define U_OUT_TT_ONLY_PRECIS 7 //!< Tt_only precision +#define U_OUT_OUTLINE_PRECIS 8 //!< Outline precision /** @} */ -/** \defgroup U_PANOSE_bProportion_Qualifiers Proportion Enumeration - For U_PANOSE bProportion field +/** \defgroup U_EMF_LOGFONT_lfClipPrecision_Qualifiers EMF LF_ClipPrecision Enumeration + For U_LOGFONT lfClipPrecision field + EMF manual 2.2.13 & WMF manual 2.1.2.1 @{ */ -#define U_PAN_PROP_OLD_STYLE 2 -#define U_PAN_PROP_MODERN 3 -#define U_PAN_PROP_EVEN_WIDTH 4 -#define U_PAN_PROP_EXPANDED 5 -#define U_PAN_PROP_CONDENSED 6 -#define U_PAN_PROP_VERY_EXPANDED 7 -#define U_PAN_PROP_VERY_CONDENSED 8 -#define U_PAN_PROP_MONOSPACED 9 +#define U_CLIP_DEFAULT_PRECIS 0x00 //!< Use default clipping precision. +#define U_CLIP_CHARACTER_PRECIS 0x01 //!< Use character clipping precision +#define U_CLIP_STROKE_PRECIS 0x02 //!< (Source documentation is vague about what this means.) +#define U_CLIP_MASK 0x0F //!< MASK for bits in preceding. +#define U_CLIP_LH_ANGLES 0x10 //!< Set: font rotation by coordinate system, Clear: device fonts (only) rotate counterclockwise. +#define U_CLIP_TT_ALWAYS 0x20 //!< Reserved. +#define U_CLIP_EMBEDDED 0x80 //!< Font embedding is required. (Method for doing so is not documented in EMF or WMF.) /** @} */ -/** \defgroup U_EMR_dwROP_Qualifiers Ternary Raster Operation enumeration - For U_EMR* dwROP fields. - - These codes specify: - 1. an order of operands (composed of various orders and combinations of: Dest, Src, Pen) - (There are 3, hence "Ternary Raster Operation") - 2. an order of operators to apply to the operands (composed of Not, Xor, Or, And) - Only a few of the more common operations are provided here. - When the Operation does not use a Src operand the corresponding source bitmap may be - omitted from the record. - - For more details see: - http://wiki.winehq.org/TernaryRasterOps +/** \defgroup U_EMF_LOGFONT_lfQuality_Qualifiers EMF LF_Quality Enumeration + For For U_LOGFONT lfQuality field + EMF manual 2.2.13 & WMF manual 2.1.1.10 @{ */ -#define U_SRCCOPY 0xcc0020 -#define U_SRCPAINT 0xee0086 -#define U_SRCAND 0x8800c6 -#define U_SRCINVERT 0x660046 -#define U_SRCERASE 0x440328 -#define U_NOTSRCCOPY 0x330008 -#define U_NOTSRCERASE 0x1100a6 -#define U_MERGECOPY 0xc000ca -#define U_MERGEPAINT 0xbb0226 -#define U_PATCOPY 0xf00021 -#define U_PATPAINT 0xfb0a09 -#define U_PATINVERT 0x5a0049 -#define U_DSTINVERT 0x550009 -#define U_BLACKNESS 0x000042 -#define U_WHITENESS 0xff0062 -#define U_NOOP 0xaa0029 /* Many GDI programs end with a bitblt with this ROP == "D". Seems to work like flush() */ -/** @} */ - -/** \defgroup U_EMRSETROP2_iMode_Qualifiers Binary Raster Operation Enumeration - For U_EMRSETROP2 iMode field - - These codes specify: - 1. an order of operands (composed of various orders and combinations of: Dest, Pen) - (There are 2, hence "Binary Raster Operation") - 2. an order of operators to apply to the operands (composed of Not, Xor, Or, And) - Only a few of the more common operations are provided here. +#define U_DEFAULT_QUALITY 0 //!< Default quality +#define U_DRAFT_QUALITY 1 //!< Draft quality +#define U_PROOF_QUALITY 2 //!< Proof quality +#define U_NONANTIALIASED_QUALITY 3 //!< Nonantialiased quality +#define U_ANTIALIASED_QUALITY 4 //!< Antialiased quality +/** @} */ - The default is U_R2_COPYPEN. If this value is changed to something else all subsequenty - draw operations will use the altered logic. For instance, if it is set to U_R2_BLACK and - a red rectangle is drawn it will appear as a black rectangle. - - @{ -*/ -#define U_R2_BLACK 1 -#define U_R2_NOTMERGEPEN 2 -#define U_R2_MASKNOTPEN 3 -#define U_R2_NOTCOPYPEN 4 -#define U_R2_MASKPENNOT 5 -#define U_R2_NOT 6 -#define U_R2_XORPEN 7 -#define U_R2_NOTMASKPEN 8 -#define U_R2_MASKPEN 9 -#define U_R2_NOTXORPEN 10 -#define U_R2_NOP 11 -#define U_R2_MERGENOTPEN 12 -#define U_R2_COPYPEN 13 -#define U_R2_MERGEPENNOT 14 -#define U_R2_MERGEPEN 15 -#define U_R2_WHITE 16 -#define U_R2_LAST 16 -/** @} */ - -/** \defgroup U_EMRSELECTCLIP_iMode_Qualifiers RegionMode Enumeration - For U_EMRSELECTCLIPPATH and U_EMREXTSELECTCLIPRGN iMode field +/** \defgroup U_EMF_LOGFONT_lfPitchAndFamily_Qualifiers EMF LF_PitchAndFamily Enumeration + For U_LOGFONT lfPitchAndFamily field + EMF manual 2.2.13 & WMF manual 2.2.2.14 @{ */ -#define U_RGN_AND 1 -#define U_RGN_OR 2 -#define U_RGN_XOR 3 -#define U_RGN_DIFF 4 -#define U_RGN_COPY 5 -#define U_RGN_MIN U_RGN_AND -#define U_RGN_MAX U_RGN_COPY +#define U_DEFAULT_PITCH 0x00 //!< Default pitch +#define U_FIXED_PITCH 0x01 //!< Fixed pitch +#define U_VARIABLE_PITCH 0x02 //!< Variable pitch +#define U_MONO_FONT 0x08 //!< Mono font +#define U_FF_DONTCARE 0x00 //!< Font family don't care +#define U_FF_ROMAN 0x10 //!< Font family Roman +#define U_FF_SWISS 0x20 //!< Font family Swiss +#define U_FF_MODERN 0x30 //!< Font family Modern +#define U_FF_SCRIPT 0x40 //!< Font family Script +#define U_FF_DECORATIVE 0x50 //!< Font family Decorative /** @} */ -/** \defgroup U_PANOSE_bSerifStyle_Qualifiers SerifType Enumeration - For U_PANOSE bSerifStyle field - @{ -*/ -#define U_PAN_SERIF_COVE 2 -#define U_PAN_SERIF_OBTUSE_COVE 3 -#define U_PAN_SERIF_SQUARE_COVE 4 -#define U_PAN_SERIF_OBTUSE_SQUARE_COVE 5 -#define U_PAN_SERIF_SQUARE 6 -#define U_PAN_SERIF_THIN 7 -#define U_PAN_SERIF_BONE 8 -#define U_PAN_SERIF_EXAGGERATED 9 -#define U_PAN_SERIF_TRIANGLE 10 -#define U_PAN_SERIF_NORMAL_SANS 11 -#define U_PAN_SERIF_OBTUSE_SANS 12 -#define U_PAN_SERIF_PERP_SANS 13 -#define U_PAN_SERIF_FLARED 14 -#define U_PAN_SERIF_ROUNDED 15 -/** @} */ - -/** \defgroup U_EMRSELECTOBJECT_ihObject_Qualifiers StockObject Enumeration - For U_EMRSELECTOBJECT ihObject field. - @{ -*/ -#define U_STOCK_OBJECT 0x80000000 -#define U_WHITE_BRUSH 0x80000000 -#define U_LTGRAY_BRUSH 0x80000001 -#define U_GRAY_BRUSH 0x80000002 -#define U_DKGRAY_BRUSH 0x80000003 -#define U_BLACK_BRUSH 0x80000004 -#define U_NULL_BRUSH 0x80000005 -#define U_HOLLOW_BRUSH 0x80000005 -#define U_WHITE_PEN 0x80000006 -#define U_BLACK_PEN 0x80000007 -#define U_NULL_PEN 0x80000008 -#define U_OEM_FIXED_FONT 0x8000000A -#define U_ANSI_FIXED_FONT 0x8000000B -#define U_ANSI_VAR_FONT 0x8000000C -#define U_SYSTEM_FONT 0x8000000D -#define U_DEVICE_DEFAULT_FONT 0x8000000E -#define U_DEFAULT_PALETTE 0x8000000F -#define U_SYSTEM_FIXED_FONT 0x80000010 -#define U_DEFAULT_GUI_FONT 0x80000011 -#define U_STOCK_LAST 0x80000011 -/** @} */ - -/** \defgroup U_EMRSETSTRETCHBLTMODE_iMode_Qualifiers StretchMode Enumeration - For EMF U_EMRSETSTRETCHBLTMODE iMode field +/** \defgroup U_EMF_LOGBRUSH_lbStyle_Qualifiers EMF LB_Style Enumeration + For U_LOGBRUSH lbStyle field + EMF manual 2.2.20 @{ */ -#define U_BLACKONWHITE 1 -#define U_WHITEONBLACK 2 -#define U_COLORONCOLOR 3 -#define U_HALFTONE 4 -#define U_MAXSTRETCHBLTMODE 4 -#define U_STRETCH_ANDSCANS 1 -#define U_STRETCH_ORSCANS 2 -#define U_STRETCH_DELETESCANS 3 -#define U_STRETCH_HALFTONE 4 +#define U_BS_SOLID 0 //!< Solid brush. +#define U_BS_NULL 1 //!< Null brush. +#define U_BS_HOLLOW 1 //!< Hollow brush. +#define U_BS_HATCHED 2 //!< Hatched brush. +#define U_BS_PATTERN 3 //!< Pattern brush. +#define U_BS_INDEXED 4 //!< Indexed brush. +#define U_BS_DIBPATTERN 5 //!< Dibpattern brush. +#define U_BS_DIBPATTERNPT 6 //!< Dibpatternpt brush. +#define U_BS_PATTERN8X8 7 //!< Pattern 8x8 brush. +#define U_BS_DIBPATTERN8X8 8 //!< Dibpattern 8x8 brush. +#define U_BS_MONOPATTERN 9 //!< Monopattern brush. /** @} */ -/** \defgroup U_PANOSE_bStrokeVariation_Qualifiers StrokeVariation Enumeration - For U_PANOSE bStrokeVariation field +/** \defgroup U_EMF_PANOSE_index EMF PanoseIndex Enumeration + Fositions of each field in U_PANOSE structure. + Microsoft name: (none) + EMF manual 2.2.21 @{ */ -#define U_PAN_STROKE_GRADUAL_DIAG 2 -#define U_PAN_STROKE_GRADUAL_TRAN 3 -#define U_PAN_STROKE_GRADUAL_VERT 4 -#define U_PAN_STROKE_GRADUAL_HORZ 5 -#define U_PAN_STROKE_RAPID_VERT 6 -#define U_PAN_STROKE_RAPID_HORZ 7 -#define U_PAN_STROKE_INSTANT_VERT 8 +#define U_PAN_FAMILYTYPE_INDEX 0 //!< Familytype index +#define U_PAN_SERIFSTYLE_INDEX 1 //!< Serifstyle index +#define U_PAN_WEIGHT_INDEX 2 //!< Weight index +#define U_PAN_PROPORTION_INDEX 3 //!< Proportion index +#define U_PAN_CONTRAST_INDEX 4 //!< Contrast index +#define U_PAN_STROKEVARIATION_INDEX 5 //!< Strokevariation index +#define U_PAN_ARMSTYLE_INDEX 6 //!< Armstyle index +#define U_PAN_LETTERFORM_INDEX 7 //!< Letterform index +#define U_PAN_MIDLINE_INDEX 8 //!< Midline index +#define U_PAN_XHEIGHT_INDEX 9 //!< Xheight index +#define U_PAN_COUNT 10 //!< Count /** @} */ -/** \defgroup U_EMRSETTEXTALIGN_iMode_Qualifiers TextAlignment Enumeration - For U_EMRSETTEXTALIGN iMode field - - Recall that EMF coordinates have UL closest to {0,0}, LR is below and to the right of UL and so has LARGER - {x,y} coordinates. In the following "TOP" is on the horizontal line defined by LR, as it has larger y coordinates, - which when viewing the EMF file, would actually be on the BOTTOM of the bounding rectangle. Similarly, left and right - are reversed. - - Microsoft documentation (WMF manual, section 2.1.2.3) says that the text starts on certain edges of the bounding rectangle. - That is apparently not true, whether the bounding rectangle is {0,0,-1,-1}, which is effectively no bounding rectangle, - or if a valid bounding rectangle is specified. In all cases the text (in Windows XP Preview) starts, has center at, or ends - at the center point. Vertical offsets seem to be defined analogously, but with respect to the height of the font. The bounding - rectangle defined for the U_EMRTEXT record appears to be ignored. - - Microsoft documentation (EMF manual,section 2.2.5) says that the same rectangle is used for "clipping or opaquing" by ExtTextOutA/W. - That does not seem to occur either. +/** \defgroup U_EMF_PIXELFORMATDESCRIPTOR_iLayerType_Qualifiers EMF PFD_iLayerType Enumeration + For U_PIXELFORMATDESCRIPTOR iLayerType field + Microsoft name: (none) + EMF manual 2.2.22 @{ */ -// Horizontal text flags -#define U_TA_DEFAULT 0x00 // default alignment -#define U_TA_NOUPDATECP 0x00 // Reference point does not move -#define U_TA_UPDATECP 0x01 // Reference point moves to end of next text drawn. -#define U_TA_LEFT 0x00 // Reference point is on left edge of bounding rectangle -#define U_TA_RIGHT 0x02 // Reference point is on right edge of bounding rectangle -#define U_TA_CENTER 0x06 // Reference point is on center vertical line of bounding rectangle -#define U_TA_TOP 0x00 // Reference point is on top edge of bounding rectangle -#define U_TA_BOTTOM 0x08 // Reference point is on bottom edge of bounding rectangle -#define U_TA_BASEBIT 0x10 // Reference point is on baseline of text if this bit is set, for 0x10 <-> 0x18 -#define U_TA_BASELINE 0x18 // Reference point is on baseline of text -#define U_TA_RTLREADING 0x100 // Set for Right to Left languages like Hebrew and Arabic -#define U_TA_MASK U_TA_BASELINE+U_TA_CENTER+U_TA_UPDATECP+U_TA_RTLREADING -// Vertical text flags -#define U_VTA_BASELINE U_TA_BASELINE // for vertical text -#define U_VTA_LEFT U_TA_BOTTOM -#define U_VTA_RIGHT U_TA_TOP -#define U_VTA_CENTER U_TA_CENTER -#define U_VTA_BOTTOM U_TA_RIGHT -#define U_VTA_TOP U_TA_LEFT +#define U_PFD_MAIN_PLANE 0 //!< Main plane +#define U_PFD_OVERLAY_PLANE 1 //!< Overlay plane +#define U_PFD_UNDERLAY_PLANE (-1) //!< Underlay plane /** @} */ -/** \defgroup U_PANOSE_bWeight_Qualifiers Weight Enumeration - For U_PANOSE bWeight field +/** \defgroup U_EMF_PIXELFORMATDESCRIPTOR_iPixelType_Qualifiers EMF PFD_iPixelType Enumeration + For U_PIXELFORMATDESCRIPTOR iPixelType field + Microsoft name: (none) + EMF manual 2.2.22 @{ */ -#define U_PAN_WEIGHT_VERY_LIGHT 2 -#define U_PAN_WEIGHT_LIGHT 3 -#define U_PAN_WEIGHT_THIN 4 -#define U_PAN_WEIGHT_BOOK 5 -#define U_PAN_WEIGHT_MEDIUM 6 -#define U_PAN_WEIGHT_DEMI 7 -#define U_PAN_WEIGHT_BOLD 8 -#define U_PAN_WEIGHT_HEAVY 9 -#define U_PAN_WEIGHT_BLACK 10 -#define U_PAN_WEIGHT_NORD 11 +#define U_PFD_TYPE_RGBA 0 //!< Pixel contains an RGBA value. +#define U_PFD_TYPE_COLORINDEX 1 //!< Pixel contains an index into the color table. /** @} */ -/** \defgroup U_PANOSE_bXHeight_Qualifiers XHeight Enumeration - For U_PANOSE bXHeight field +/** \defgroup U_EMF_PIXELFORMATDESCRIPTOR_dwFlags_Qualifiers EMF PFD_dwFlags Enumeration + For U_PIXELFORMATDESCRIPTOR dwFlags field + EMF manual 2.2.22 + @{ +*/ +#define U_PFD_DOUBLEBUFFER 0x00000001 //!< Doublebuffer +#define U_PFD_STEREO 0x00000002 //!< Stereo +#define U_PFD_DRAW_TO_WINDOW 0x00000004 //!< Draw to window +#define U_PFD_DRAW_TO_BITMAP 0x00000008 //!< Draw to bitmap +#define U_PFD_SUPPORT_GDI 0x00000010 //!< Support gdi +#define U_PFD_SUPPORT_OPENGL 0x00000020 //!< Support opengl +#define U_PFD_GENERIC_FORMAT 0x00000040 //!< Generic format +#define U_PFD_NEED_PALETTE 0x00000080 //!< Need palette +#define U_PFD_NEED_SYSTEM_PALETTE 0x00000100 //!< Need system palette +#define U_PFD_SWAP_EXCHANGE 0x00000200 //!< Swap exchange +#define U_PFD_SWAP_COPY 0x00000400 //!< Swap copy +#define U_PFD_SWAP_LAYER_BUFFERS 0x00000800 //!< Swap layer buffers +#define U_PFD_GENERIC_ACCELERATED 0x00001000 //!< Generic accelerated +/** @} */ + +/** \defgroup U_EMF_EMRCOMMENT_TYPES EMF Comment record types + For U_EMRCOMMENT_* cIdent fields + EMF manual 2.3.3 @{ */ -#define U_PAN_XHEIGHT_CONSTANT_SMALL 2 -#define U_PAN_XHEIGHT_CONSTANT_STANDARD 3 -#define U_PAN_XHEIGHT_CONSTANT_LARGE 4 -#define U_PAN_XHEIGHT_DUCKING_SMALL 5 -#define U_PAN_XHEIGHT_DUCKING_STANDARD 6 -#define U_PAN_XHEIGHT_DUCKING_LARGE 7 +#define U_EMR_COMMENT_PUBLIC 0x43494447 //!< Public comment. +#define U_EMR_COMMENT_SPOOL 0x00000000 //!< Spool comment. +#define U_EMR_COMMENT_EMFPLUSRECORD 0x2B464D45 //!< EMF+ record comment. /** @} */ -/** \defgroup U_BLEND_Op_Qualifiers Blend Enumeration - For U_BLEND Op field +/** \defgroup U_EMF_EMRSETLAYOUT_iMode_Qualifiers EMF Mirroring Enumeration + For U_EMRSETLAYOUT iMode field + EMF manual 2.3.11.17 @{ */ -#define U_AC_SRC_GLOBAL 0 -#define U_AC_SRC_CONST 0 -#define U_AC_SRC_ALPHA 1 +#define U_LAYOUT_LTR 0x00000000 //!< Left to right lsyout. +#define U_LAYOUT_RTL 0x00000001 //!< Right to left layout. +#define U_LAYOUT_BITMAPORIENTATIONPRESERVED 0x00000008 //!< Do not flip bitmaps if layout is right to left. /** @} */ -// *************************************************************************** -/** \defgroup Miscellaneous_values Miscellaneous Values +/** \defgroup U_EMF_BLEND_Op_Qualifiers EMF Blend Enumeration + For U_BLEND Op field @{ */ -#define U_NONE 0 //!< Generic for nothing selected for all flag fields -#define U_PI 3.14159265358979323846 //!< pi -#define U_READ 1 -#define U_WRITE 0 -#define U_ENHMETA_VERSION 0x00010000 //!< U_EMRHEADER nVersion field -#define U_DV_SGNTR 0x08007664 //!< For U_DESIGNVECTOR Signature field -#define U_LP_VERSION 0x0300 //!< For U_LOGPALETTE palVersion field -#define U_RDH_RECTANGLES 1 //!< For U_RGNDATAHEADER iType field -#define U_RDH_OBJSIZE 0x20 //!< For U_RGNDATAHEADER dwSIze field -#define U_RGB_GAMMA_MIN (uint16_t)02500 //!< For U_COLORADJUSTMENT ca[Red|Green|Blue]Gamma fields -#define U_RGB_GAMMA_MAX (uint16_t)65000 //!< For U_COLORADJUSTMENT ca[Red|Green|Blue]Gamma fields -#define U_REFERENCE_WHITE_MIN (uint16_t)6000 //!< For U_COLORADJUSTMENT caReferenceWhite field -#define U_REFERENCE_WHITE_MAX (uint16_t)10000 //!< For U_COLORADJUSTMENT caReferenceWhite field -#define U_REFERENCE_BLACK_MIN (uint16_t)0 //!< For U_COLORADJUSTMENT caReferenceBlack field -#define U_REFERENCE_BLACK_MAX (uint16_t)4000 //!< For U_COLORADJUSTMENT caReferenceBlack field -#define U_COLOR_ADJ_MIN ((int16_t)-100) //!< For U_COLORADJUSTMENT ca[Contrast|Brightness|Colorfulness|RedGreenTint] fields -#define U_COLOR_ADJ_MAX (int16_t) 100 //!< For U_COLORADJUSTMENT ca[Contrast|Brightness|Colorfulness|RedGreenTint] fields -#define U_MAX_PATH 1024 //!< longest path name for a file -#define U_LCS_SIGNATURE 0x50534F43 //!< logColorSpace Signature -#define U_LCS_VERSION 0x400 //!< logColorSpace Version -#define U_REC_FREE 1 //!< used with emf_append -#define U_REC_KEEP 0 //!< used with emf_append -/** 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 U_AC_SRC_GLOBAL 0 //!< Global +#define U_AC_SRC_CONST 0 //!< Const +#define U_AC_SRC_ALPHA 1 //!< Alpha /** @} */ + // *************************************************************************** // Macros -/** \defgroup Common_macros Common Macros +/** \defgroup U_EMF_Common_macros EMF Common Macros @{ */ // Note, many of these were originally defined using C99 (type){val,val,val} format, but that turned out to @@ -1125,12 +1575,11 @@ extern "C" { #define U_RGBAGetB(rgb) (rgb.Blue ) //!< Color RGB Blue #define U_RGBAGetA(rgb) (rgb.Reserved) //!< Color RGBA A/reserved - // color type conversions -#define U_RGB2BGR(rgb) (U_RGBQUAD){ U_RGBAGetB(rgb),U_RGBAGetG(rgb),U_RGBAGetR(rgb),0} //!< Set any BGR color from an RGB color -#define U_BGR2RGB(rgb) (U_COLORREF){U_BGRAGetR(rgb),U_BGRAGetG(rgb),U_BGRAGetB(rgb),0} //!< Set any RGB color from an BGR color -#define U_RGBA2BGRA(rgb) (U_RGBQUAD){ U_RGBAGetB(rgb),U_RGBAGetG(rgb),U_RGBAGetR(rgb),U_RGBAGetA(rgb)} //!< Set any BGRA color from an RGBA color -#define U_BGRA2RGBA(rgb) (U_COLORREF){U_BGRAGetR(rgb),U_BGRAGetG(rgb),U_BGRAGetB(rgb),U_BGRAGetA(rgb)} //!< Set any RGBA color from an BGRA color +#define U_RGB2BGR(rgb) U_BGR(U_RGBAGetR(rgb),U_RGBAGetG(rgb),U_RGBAGetB(rgb)) //!< Set any BGR color from an RGB color +#define U_BGR2RGB(rgb) U_RGB(U_BGRAGetR(rgb),U_BGRAGetG(rgb),U_BGRAGetB(rgb)) //!< Set any RGB color from an BGR color +#define U_RGBA2BGRA(rgb) U_BGRA(U_RGBAGetR(rgb),U_RGBAGetG(rgb),U_RGBAGetB(rgb),U_RGBAGetA(rgb)} //!< Set any BGRA color from an RGBA color +#define U_BGRA2RGBA(rgb) U_RGBA(U_BGRAGetR(rgb),U_BGRAGetG(rgb),U_BGRAGetB(rgb),U_BGRAGetA(rgb)} //!< Set any RGBA color from an BGRA color // Color CMYK Get/Set Macros #define U_CMYK(c,m,y,k)\ @@ -1156,173 +1605,40 @@ extern "C" { // Utility macros #define UP4(A) (4 * ((A + 3 ) / 4)) //!< Round up to nearest multiple of 4 -/** @} */ - -typedef float U_FLOAT; - -typedef uint32_t U_CBBITS; // Describes byte count of TYPE -typedef uint32_t U_CBBITSMSK; -typedef uint32_t U_CBBITSSRC; -typedef uint32_t U_CBBMI; -typedef uint32_t U_CBBMIMSK; -typedef uint32_t U_CBBMISRC; -typedef uint32_t U_CBDATA; -typedef uint32_t U_CBNAME; -typedef uint32_t U_CBPLENTRIES; -typedef uint32_t U_CBPXLFMT; -typedef uint32_t U_CBRGNDATA; -typedef uint32_t U_CBSTR; // bytes in an 8 or 16 bit string - -typedef uint32_t U_OFFBITS; // Describes byte offset to TYPE, always measured from the start of the RECORD (not the struct) -typedef uint32_t U_OFFBITSMSK; -typedef uint32_t U_OFFBITSSRC; -typedef uint32_t U_OFFBMI; -typedef uint32_t U_OFFBMIMSK; -typedef uint32_t U_OFFBMISRC; -typedef uint32_t U_OFFDATA; -typedef uint32_t U_OFFDESC; -typedef uint32_t U_OFFDX; -typedef uint32_t U_OFFPLENTRIES; -typedef uint32_t U_OFFPXLFMT; -typedef uint32_t U_OFFSTR; // String of either 8 or 16 bit characters -typedef uint8_t U_DATA; // any binary sort of data, not otherwise classified. - -// "Types" For array components in structures, where not otherwise defined as a structure -typedef uint32_t U_FNTAXES; // Font Axes For U_DESIGNVECTOR -typedef uint32_t U_STYLEENTRY; // StyleEntry For U_EXTLOGPEN -typedef uint32_t U_POLYCOUNTS; // aPolyCounts For U_EMRPOLYPOLYLINE etc. - -// "Counts" for array components in structures -typedef uint32_t U_NUM_FNTAXES; // Number of U_FNTAXES -typedef uint32_t U_NUM_LOGPLTNTRY; // Number of U_LOGPLTENTRY -typedef uint32_t U_NUM_RECTL; // Number of U_RECTL -typedef uint32_t U_NUM_POINTL; // Number of U_POINTL -typedef uint32_t U_NUM_POINT16; // Number of U_POINT16 -typedef uint32_t U_NUM_STYLEENTRY; // Number of U_STYLEENTRY -typedef uint32_t U_NUM_POLYCOUNTS; // Number of U_POLYCOUNTS -typedef uint32_t U_NUM_EMRTEXT; // Number of U_EMRTEXT -typedef uint32_t U_NUM_STR; // Number of 8 or 16 bit characters in string -typedef uint32_t U_NUM_TRIVERTEX; // Number of U_TRIVERTEX -typedef uint32_t U_NUM_GRADOBJ; // Number of U_GRADIENT4 OR U_GRADIENT3 (determined at run time) -typedef uint32_t U_NUM_RGBQUAD; // Number of U_RGBQUAD (in bmciColors in U_BITMAPCOREINFO) - - -/** - \brief Pair of values indicating x and y sizes. - Microsoft name: SIZE Object - Microsoft name: SIZEL Object -*/ -typedef struct { - int32_t cx; //!< X size - int32_t cy; //!< Y size -} U_SIZE, U_SIZEL, *PU_SIZE, *PU_SIZEL; - -/** - \brief Used for any generic pair of floats - Microsoft name: (none) -*/ -typedef struct { - float x; //!< X value - float y; //!< Y value -} U_PAIRF, *PU_PAIRF; - -/** - \brief Used for any generic pair of uint32_t - Microsoft name: POINT Object -*/ -typedef struct { - int32_t x; //!< X value - int32_t y; //!< Y value -} U_PAIR, *PU_PAIR, U_POINT, *PU_POINT, U_POINTL, *PU_POINTL; - -/** - \brief Point type for 16 bit EMR drawing functions. - Microsoft name: POINTS Object - Microsoft name: POINTS16 Object -*/ -typedef struct { - int16_t x; //!< X size (16 bit) - int16_t y; //!< Y size (16 bit) -} U_POINT16, *PU_POINT16; - -/** - \brief Coordinates of the upper left, lower right corner. - Note that the coordinate system is 0,0 in the upper left corner - of the screen an N,M in the lower right corner. - Microsoft name: RECT Object -*/ -typedef struct { - int32_t left; //!< left coordinate - int32_t top; //!< top coordinate - int32_t right; //!< right coordinate - int32_t bottom; //!< bottom coordinate -} U_RECT, *PU_RECT, - U_RECTL, *PU_RECTL; - -#define U_RCL_DEF (U_RECTL){0,0,-1,-1} //!< Use this when no bounds are needed. - -/* ************************************************************ - EMF structures OTHER than those corresponding to complete U_EMR_* records - ************************************************************ */ - -/** - \brief For U_BITMAPINFO bmiColors field - NOTE that the color order is BGR, even though the name is RGB! - Microsoft name: RGBQUAD Object -*/ -typedef struct { - uint8_t Blue; //!< Blue color (0-255) - uint8_t Green; //!< Green color (0-255) - uint8_t Red; //!< Red color (0-255) - uint8_t Reserved; //!< Not used -} U_RGBQUAD, *PU_RGBQUAD; +/** @} */ -/** - \brief For U_BITMAPINFO crColor field - NOTE that the color order is RGB reserved, flipped around from the preceding. - Microsoft name: COLORREF Object -*/ -typedef struct { - uint8_t Red; //!< Red color (0-255) - uint8_t Green; //!< Green color (0-255) - uint8_t Blue; //!< Blue color (0-255) - uint8_t Reserved; //!< Not used -} U_COLORREF, *PU_COLORREF; +/** Any generic pair of floats. -/** - \brief For U_POINT28_4 x and y fields. - Microsoft name: BitFIX28_4 Object. + Microsoft name: (none) */ typedef struct { - signed IntValue :28; //!< Signed integral bit field - unsigned FracValue :4; //!< Unsigned integral bit field -} U_BITFIX28_4, *PU_BITFIX28_4; + float x; //!< X value + float y; //!< Y value +} U_PAIRF, + *PU_PAIRF; //!< Any generic pair of floats. Microsoft name: (none) -/** - \brief For U_LCS_GAMMARGB lcsGamma* fields - Microsoft name:(unknown) Object -*/ -typedef struct { - unsigned ignoreHi :8; //!< not used - unsigned intPart :8; //!< integer part - unsigned fracPart :8; //!< fraction part - unsigned ignoreLo :8; //!< not used -} U_LCS_GAMMA, *PU_LCS_GAMMA; -/** - \brief For U_LOGCOLORSPACEA and U_LOGCOLORSPACEW lcsGammaRGB field - Microsoft name:(unknown) Object +/* ************************************************************ + EMF structures OTHER than those corresponding to complete U_EMR_* records + ************************************************************ */ + +/** + \brief For U_POINT28_4 x and y fields. + + EMF manual 2.2.1, Microsoft name: BitFIX28_4 Object. */ typedef struct { - U_LCS_GAMMA lcsGammaRed; //!< Red Gamma - U_LCS_GAMMA lcsGammaGreen; //!< Green Gamma - U_LCS_GAMMA lcsGammaBlue; //!< Blue Gamma -} U_LCS_GAMMARGB, *PU_LCS_GAMMARGB; + signed IntValue :28; //!< Signed integral bit field + unsigned FracValue :4; //!< Unsigned integral bit field +} U_BITFIX28_4, + *PU_BITFIX28_4; //!< EMF manual 2.2.1 /** \brief For U_EMRSETOLORADJUSTMENT ColorAdjustment field + + EMF manual 2.2.2, Microsoft name: ColorAdjustment Object + Note, range constants are: RGB_GAMMA_[MIN|MAX],REFERENCE_[WHITE|BLACK]_[MIN|MAX],COLOR_ADJ_[MIN|MAX] - Microsoft name: ColorAdjustment Object */ typedef struct { uint16_t caSize; //!< Size of this structure in bytes @@ -1337,35 +1653,44 @@ typedef struct { int16_t caBrightness; //!< Brightness adjustment (range:-100:100, 0 is no correction) int16_t caColorfulness; //!< Colorfulness adjustment (range:-100:100, 0 is no correction) int16_t caRedGreenTint; //!< Tine adjustment (range:-100:100, 0 is no correction) -} U_COLORADJUSTMENT, *PU_COLORADJUSTMENT; +} U_COLORADJUSTMENT, + *PU_COLORADJUSTMENT; //!< EMF manual 2.2.2 -/** +/** EMF manual 2.2.3 \brief For ? (not implemented yet) + Microsoft name: DesignVector Object */ typedef struct { uint32_t Signature; //!< Must be 0x08007664 (AKA: DV_SGNTR) U_NUM_FNTAXES NumAxes; //!< Number of elements in Values, 0-16 U_FNTAXES Values[1]; //!< Optional. Array of font axes for opentype font -} U_DESIGNVECTOR,*PU_DESIGNVECTOR; +} U_DESIGNVECTOR, + *PU_DESIGNVECTOR; //!< EMF manual 2.2.3 -/** +/** \brief For U_EMR_COMMENT_MULTIFORMATS record, where an array of these is used - Microsoft name: EmrFormat Object + + EMF manual 2.2.4, Microsoft name: EmrFormat Object */ typedef struct { uint32_t signature; //!< FormatSignature Enumeration uint32_t nVersion; //!< Must be 1 if signature is EPS, else ignored U_CBDATA cbData; //!< Data size in bytes U_OFFDATA offData; //!< Offset in bytes to the Data from the start of the RECORD -} U_EMRFORMAT, *PU_EMRFORMAT; +} U_EMRFORMAT, + *PU_EMRFORMAT; //!< EMF manual 2.2.4 + +/** -/** \brief For U_EMR[POLY]EXTTEXTOUT[A|W] emrtext field + + EMF manual 2.2.5, Microsoft name: EmrText Object + Differs from implementation in Mingw and Wine in that the core struct has a fixed size. Optional and movable components must be handled with offsets. - Microsoft name: EmrText Object Following invariant core there may/must be: + U_RECTL rcl; (Optional, absent when fOptions & U_ETO_NO_RECT) grayed/clipping/opaque rectangle U_OFFDX offDx; (required) but position isn't static. Offset in bytes to the character spacing array measured @@ -1376,38 +1701,43 @@ typedef struct { char string (required) String buffer holding nChars (padded to a multiple of 4 bytes in length). uint32_t Dx[1] (required) character spacing, array with one entry per glyph. - */ typedef struct { U_POINTL ptlReference; //!< String start coordinates U_NUM_STR nChars; //!< Number of characters in the string U_OFFSTR offString; //!< Offset in bytes to the string from the start of the RECORD uint32_t fOptions; //!< ExtTextOutOptions Enumeration -} U_EMRTEXT, *PU_EMRTEXT; +} U_EMRTEXT, + *PU_EMRTEXT; //!< EMF manual 2.2.5 -/** +/** \brief For U_EPS_DATA Points field - Microsoft name: Point28_4 Object + + EMF manual 2.2.23, Microsoft name: Point28_4 Object, out of order, needed for 2.2.6 */ typedef struct { U_BITFIX28_4 x; //!< X coordinate U_BITFIX28_4 y; //!< Y coordinate -} U_POINT28_4, *PU_POINT28_4; +} U_POINT28_4, + *PU_POINT28_4; //!< EMF manual 2.2.23 -/** +/** \brief For embedding EPS in EMF via U_EMRFORMAT offData array in U_EMR_COMMENT_MULTIFORMATS - Microsoft name: EpsData Object + + EMF manual 2.2.6, Microsoft name: EpsData Object */ typedef struct { uint32_t sizeData; //!< Size in bytes of this object uint32_t version; //!< Must be 1 U_POINT28_4 Points[3]; //!< Defines parallelogram, UL, UR, LL corners, LR is derived. U_RECTL PostScriptData; //!< Record may include optional clipping/opaque rectangle -} U_EPS_DATA, *PU_EPS_DATA; +} U_EPS_DATA, + *PU_EPS_DATA; //!< EMF manual 2.2.6 -/** +/** \brief For GRADIENT_[TRIANGLE|U_RECT] - Microsoft name: TriVertex Object + + EMF manual 2.2.26, Microsoft name: TriVertex Object, out of order, needed for 2.2.7 */ typedef struct { int32_t x; //!< X coord @@ -1416,48 +1746,59 @@ typedef struct { uint16_t Green; //!< Green component uint16_t Blue; //!< Bule component uint16_t Alpha; //!< Alpha Transparency -} U_TRIVERTEX, *PU_TRIVERTEX; +} U_TRIVERTEX, + *PU_TRIVERTEX; //!< EMF manual 2.2.26 +/** + \brief For U_EMRGRADIENTFILL GradObj field + + EMF manual 2.2.7, Microsoft name: GradientRectangle Object +*/ +typedef struct { + uint32_t UpperLeft; //!< Index of UL corner in an array of U_TRIVERTEX objects + uint32_t LowerRight; //!< Index of LR corner in an array of U_TRIVERTEX objects +} U_GRADIENT4, + *PU_GRADIENT4; //!< EMF manual 2.2.7 /** \brief For U_EMRGRADIENTFILL GradObj field + EMF manual 2.2.8, Microsoft name: GradientTriangle Object + Gradient object notes. The next two structures are used to define the shape with reference to an existing array of points stored in an array of TriVertex objects in the U_EMRGRADIENTFILL record. The tricky part is that these two structures are different sizes. In some implementations (MingW) the array is cast to uint32_t and basically the cast is then ignored. For libUEMF we leave this out of the structure entirely and get to it with offsets. - - Microsoft name: GradientTriangle Object */ typedef struct { uint32_t Vertex1; //!< Index of Vertex1 in an array of U_TRIVERTEX objects uint32_t Vertex2; //!< Index of Vertex2 in an array of U_TRIVERTEX objects uint32_t Vertex3; //!< Index of Vertex3 in an array of U_TRIVERTEX objects -} U_GRADIENT3, *PU_GRADIENT3; +} U_GRADIENT3, + *PU_GRADIENT3; //!< EMF manual 2.2.8 -/** - \brief For U_EMRGRADIENTFILL GradObj field - Microsoft name: GradientRectangle Object -*/ -typedef struct { - uint32_t UpperLeft; //!< Index of UL corner in an array of U_TRIVERTEX objects - uint32_t LowerRight; //!< Index of LR corner in an array of U_TRIVERTEX objects -} U_GRADIENT4, *PU_GRADIENT4; +//Microsoft name: Header object, EMF manual 2.2.9 defined below with record structs +//Microsoft name: HeaderExtension1 object, EMF manual 2.2.10 defined below with record structs +//Microsoft name: HeaderExtension1 object, EMF manual 2.2.11 defined below with record structs /** \brief For U_EMRCREATEBRUSHINDIRECT lb field - Microsoft name: LogBrushEx Object + + EMF manual 2.2.12, Microsoft name: LogBrushEx Object */ typedef struct { //!< In MS documentation this is LogBrushEx Object uint32_t lbStyle; //!< LB_Style Enumeration U_COLORREF lbColor; //!< Brush color uint32_t lbHatch; //!< HatchStyle Enumeration -} U_LOGBRUSH, *PU_LOGBRUSH; -typedef U_LOGBRUSH U_PATTERN, *PU_PATTERN; +} U_LOGBRUSH, + U_PATTERN, //!< EMF manual 2.2.12 + *PU_LOGBRUSH, //!< EMF manual 2.2.12 + *PU_PATTERN; //!< EMF manual 2.2.12 /** \brief For U_LOGFONT_PANOSE elfLogFont field - Microsoft name: LogFont Object + + EMF manual 2.2.13, Microsoft name: LogFont Object */ typedef struct { int32_t lfHeight; //!< Height in Logical units @@ -1474,12 +1815,18 @@ typedef struct { uint8_t lfQuality; //!< LF_Quality Enumeration uint8_t lfPitchAndFamily; //!< LF_PitchAndFamily Enumeration uint16_t lfFaceName[U_LF_FACESIZE]; //!< Name of font. If 0 origin is LL corner, may be compressed, this is height after decompression. - //!< biHeight < 0 origin is UL corner, may not be compressed - uint16_t biPlanes; //!< Planes (must be 1) - uint16_t biBitCount; //!< BitCount Enumeration (determines number of RBG colors) - uint32_t biCompression; //!< BI_Compression Enumeration - uint32_t biSizeImage; //!< Image size in bytes or 0 = "default size (calculated from geometry?)" - int32_t biXPelsPerMeter; //!< X Resolution in pixels/meter - int32_t biYPelsPerMeter; //!< Y Resolution in pixels/meter - U_NUM_RGBQUAD biClrUsed; //!< Number of bmciColors in U_BITMAPINFO/U_BITMAPCOREINFO that are used by the bitmap - uint32_t biClrImportant; //!< Number of bmciColors needed (0 means all). -} U_BITMAPINFOHEADER, *PU_BITMAPINFOHEADER; +} U_EXTLOGPEN, + *PU_EXTLOGPEN; //!< EMF manual 2.2.20 /** \brief For U_EMR_* OffBmi* fields + + WMF Manual 2.2.2.9, Microsoft name: (none). + Description of a Bitmap which in some cases is a Device Independent Bitmap (DIB) - Microsoft name: BITMAPINFO Object */ typedef struct { U_BITMAPINFOHEADER bmiHeader; //!< Geometry and pixel properties U_RGBQUAD bmiColors[1]; //!< Color table. 24 bit images do not use color table values. -} U_BITMAPINFO, *PU_BITMAPINFO; +} U_BITMAPINFO, + *PU_BITMAPINFO; //!< WMF Manual 2.2.2.9 /** \brief U_EMRALPHABLEND Blend field + + EMF Manual 2.3.1.1, Microsoft name: BLENDFUNCTION field of EMR_ALPHABLEND record. */ typedef struct { uint8_t Operation; //!< Must be 0 uint8_t Flags; //!< Must be 0 uint8_t Global; //!< Alpha for whole thing if Op is U_AC_SRC_GLOBAL (AKA U_AC_SRC_GLOBAL) uint8_t Op; //!< Blend Enumeration -} U_BLEND, *PU_BLEND; +} U_BLEND, + *PU_BLEND; //!< EMF Manual 2.3.1.1 # /** @@ -1736,43 +2043,53 @@ typedef struct { uint32_t iType; //!< Type of EMR record uint32_t nSize; //!< Size of entire record in bytes (multiple of 4). uint32_t dParm[1]; //!< Data in record -} U_ENHMETARECORD, *PU_ENHMETARECORD; +} U_ENHMETARECORD, + *PU_ENHMETARECORD; //!< General form of an EMF record. -/** First two fields of all EMF records +/** First two fields of all EMF records, + First two fields of all EMF+ records (1 or more within an EMF comment) For accessing iType and nSize files in all U_EMR* records Microsoft name: EMR Object */ typedef struct { uint32_t iType; //!< Type of EMR record uint32_t nSize; //!< Size of entire record in bytes (multiple of 4). -} U_EMR, *PU_EMR; +} U_EMR, + *PU_EMR; //!< First two fields of all EMF records, +/** Generic EMR record with two 32 bit values. + Microsoft name: (none) +*/ typedef struct { U_EMR emr; //!< U_EMR U_PAIR pair; //!< pair of 32 bit values -} U_EMRGENERICPAIR, *PU_EMRGENERICPAIR; +} U_EMRGENERICPAIR, + *PU_EMRGENERICPAIR; //!< Generic EMR record with two 32 bit values. Microsoft name: (none) // *********************************************************************************** -// The following have U_EMR_# records +// The following have U_EMR_# records. They are ordered by their record index, not by EMF manual position. /* Index 1 */ /** - \brief The firstU_ENHMETARECORD record in the metafile. - - Microsoft names instead: Header, HeaderExtension1, and HeaderExtension2 objects. These are - used nowhere else, so they are combined here, along with the first two fields which were not listed in the Header. - - Note also that three fields in this file (nBytes, nRecords, nHandles) must be (re)set after the entire EMF - is constructed, since typically they are not known until then. bOpenGL may or may not be knowable when this - header is written. - - Note also that rclBounds and rclFrame are supposed to be the region bounding the drawn content within the - EMF. This is generally smaller than the size from szlDevice. However, since libUEMF does not actually draw - anything it has no way of knowing what these values are. Instead when it creates a header it sets these to - match the szl* fields. + \brief The first U_ENHMETARECORD record in the metafile. + + EMF manual 2.2.9, Microsoft name: Header object, HeaderExtension1 object, HeaderExtension2 object + + Microsoft names instead: Header, HeaderExtension1, and HeaderExtension2 objects. These are + used nowhere else, so they are combined here, along with the first two fields which were not listed in the Header. + + Note also that three fields in this file (nBytes, nRecords, nHandles) must be (re)set after the entire EMF + is constructed, since typically they are not known until then. bOpenGL may or may not be knowable when this + header is written. + + Note also that rclBounds and rclFrame are supposed to be the region bounding the drawn content within the + EMF. This is generally smaller than the size from szlDevice. However, since libUEMF does not actually draw + anything it has no way of knowing what these values are. Instead when it creates a header it sets these to + match the szl* fields. + */ typedef struct { U_EMR emr; //!< U_EMR @@ -1785,360 +2102,519 @@ typedef struct { uint16_t nHandles; //!< Number of graphics objects used in the Metafile uint16_t sReserved; //!< Must be 0 uint32_t nDescription; //!< Characters in the Description field, 0 if no description - uint32_t offDescription; //!< Offset in bytes to Description field + uint32_t offDescription; //!< Offset in bytes to optional UTF-16BE string Description field uint32_t nPalEntries; //!< Number of Palette entries (in U_EMR_EOF record). U_SIZEL szlDevice; //!< Reference device size in pixels U_SIZEL szlMillimeters; //!< Reference device size in 0.01 mm /** Fields for winver >= win95 */ U_CBPXLFMT cbPixelFormat; //!< Size in bytes of PixelFormatDescriptor, 0 if no PFD - U_OFFPXLFMT offPixelFormat; //!< Offset in bytes to PixelFormatDescriptor from the start of the RECORD, 0 if no PFD + U_OFFPXLFMT offPixelFormat; //!< Offset in bytes to optional PixelFormatDescriptor from the start of the RECORD, 0 if no PFD uint32_t bOpenGL; //!< nonZero if OpenGL commands are included /** Fields for winver >= win98 */ U_SIZEL szlMicrometers; //!< Size of the display device in micrometer - //!< Record may include optional Description, UTF-16BE string - //!< Record may include optional PxlFmtDescriptor, U_PIXELFORMATDESCRIPTOR -} U_EMRHEADER, *PU_EMRHEADER; +} U_EMRHEADER, + *PU_EMRHEADER; //!< EMF manual 2.2.9 -/* Index 2,3,4,5,6*/ +/* Index 2,3,4,5,6 */ +/** EMF manual 2.3.5.16 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< bounding rectangle in device units U_NUM_POINTL cptl; //!< Number of points to draw U_POINTL aptl[1]; //!< array of points -} U_EMRPOLYBEZIER, *PU_EMRPOLYBEZIER, - U_EMRPOLYGON, *PU_EMRPOLYGON, - U_EMRPOLYLINE, *PU_EMRPOLYLINE, - U_EMRPOLYBEZIERTO, *PU_EMRPOLYBEZIERTO, - U_EMRPOLYLINETO, *PU_EMRPOLYLINETO; +} U_EMRPOLYBEZIER, + U_EMRPOLYGON, //!< EMF manual 2.3.5.22 + U_EMRPOLYLINE, //!< EMF manual 2.3.5.24 + U_EMRPOLYBEZIERTO, //!< EMF manual 2.3.5.18 + U_EMRPOLYLINETO, //!< EMF manual 2.3.5.26 + *PU_EMRPOLYBEZIER, //!< EMF manual 2.3.5.16 + *PU_EMRPOLYGON, //!< EMF manual 2.3.5.22 + *PU_EMRPOLYLINE, //!< EMF manual 2.3.5.24 + *PU_EMRPOLYBEZIERTO, //!< EMF manual 2.3.5.18 + *PU_EMRPOLYLINETO; //!< EMF manual 2.3.5.26 /* Index 7,8 */ +/** EMF manual 2.3.5.30 + + After this struct the record also contains an array of points:\n + U_POINTL aptl[1]; +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< bounding rectangle in device units U_NUM_POLYCOUNTS nPolys; //!< Number of elements in aPolyCounts U_NUM_POINTL cptl; //!< 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_POINTL aptl[1]; //!< array of points -} U_EMRPOLYPOLYLINE, *PU_EMRPOLYPOLYLINE, - U_EMRPOLYPOLYGON, *PU_EMRPOLYPOLYGON; +} U_EMRPOLYPOLYLINE, + U_EMRPOLYPOLYGON, //!< EMF manual 2.3.5.28 + *PU_EMRPOLYPOLYLINE, //!< EMF manual 2.3.5.30 + *PU_EMRPOLYPOLYGON; //!< EMF manual 2.3.5.28 /* Index 9,11 (numbers interleave with next one) */ +/** EMF manual 2.3.11.30 +*/ typedef struct { U_EMR emr; //!< U_EMR U_SIZEL szlExtent; //!< H & V extent in logical units -} U_EMRSETWINDOWEXTEX, *PU_EMRSETWINDOWEXTEX, - U_EMRSETVIEWPORTEXTEX, *PU_EMRSETVIEWPORTEXTEX; +} U_EMRSETWINDOWEXTEX, + 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 /* Index 10,12,13 */ +/** EMF manual 2.3.11.31 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL ptlOrigin; //!< H & V origin in logical units -} U_EMRSETWINDOWORGEX, *PU_EMRSETWINDOWORGEX, - U_EMRSETVIEWPORTORGEX, *PU_EMRSETVIEWPORTORGEX, - U_EMRSETBRUSHORGEX, *PU_EMRSETBRUSHORGEX; +} U_EMRSETWINDOWORGEX, + U_EMRSETVIEWPORTORGEX, //!< EMF manual 2.3.11.29 + U_EMRSETBRUSHORGEX, //!< EMF manual 2.3.11.12 + *PU_EMRSETWINDOWORGEX, //!< EMF manual 2.3.11.31 + *PU_EMRSETVIEWPORTORGEX, //!< EMF manual 2.3.11.29 + *PU_EMRSETBRUSHORGEX; //!< EMF manual 2.3.11.12 + + +/* Index 14 */ +/** EMF manual 3.2.4.1 -/* Index 14 -*/ -/** This is a very odd structure because the nSizeLast follows an optional variable size field. Consequently -even though nSizeLast has a name it cannot actually be accessed by it! Following the core appear these fields: +even though nSizeLast has a name it cannot actually be accessed by it! Following the core structure +appear these fields:\n U_LOGPLTNTRY PalEntries[1]; Record may include optional array of PalEntries uint32_t nSizeLast; Mandatory, but position isn't fixed. Must have same value as emr.nSize in header record + */ typedef struct { U_EMR emr; //!< U_EMR U_CBPLENTRIES cbPalEntries; //!< Number of palette entries U_OFFPLENTRIES offPalEntries; //!< Offset in bytes to array of palette entries -} U_EMREOF, *PU_EMREOF; +} U_EMREOF, + *PU_EMREOF; //!< EMF manual 3.2.4.1 /* Index 15 */ +/** EMF manual 2.3.5.36 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL ptlPixel; //!< Pixel coordinates (logical) U_COLORREF crColor; //!< Pixel color -} U_EMRSETPIXELV, *PU_EMRSETPIXELV; +} U_EMRSETPIXELV, + *PU_EMRSETPIXELV; //!< EMF manual 2.3.5.36 /* Index 16 */ +/** EMF manual 2.3.11.20 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t dwFlags; //!< must be 1 -} U_EMRSETMAPPERFLAGS, *PU_EMRSETMAPPERFLAGS; +} U_EMRSETMAPPERFLAGS, + *PU_EMRSETMAPPERFLAGS; //!< EMF manual 2.3.11.20 -/* Index 17,18,19,20,21,22,67,98,115 */ +/* Index 17,18,19,20,21,22,67,98,115 +*/ +/** EMF manual 2.3.11.19 MapMode enumeration +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t iMode; //!< enumeration varies with type -} U_EMRSETMAPMODE, *PU_EMRSETMAPMODE, //!< MapMode enumeration - U_EMRSETBKMODE, *PU_EMRSETBKMODE, //!< BackgroundMode Enumeration - U_EMRSETPOLYFILLMODE, *PU_EMRSETPOLYFILLMODE, //!< PolygonFillMode Enumeration - U_EMRSETROP2, *PU_EMRSETROP2, //!< Binary Raster Operation Enumeration - U_EMRSETSTRETCHBLTMODE, *PU_EMRSETSTRETCHBLTMODE, //!< StretchMode Enumeration - U_EMRSETTEXTALIGN, *PU_EMRSETTEXTALIGN, //!< TextAlignment enumeration - U_EMRSELECTCLIPPATH, *PU_EMRSELECTCLIPPATH, //!< RegionMode Enumeration - U_EMRSETICMMODE, *PU_EMRSETICMMODE, //!< ICMMode Enumeration - U_EMRSETLAYOUT, *PU_EMRSETLAYOUT; //!< Mirroring Enumeration +} U_EMRSETMAPMODE, + U_EMRSETBKMODE, //!< EMF manual 2.3.11.11 BackgroundMode Enumeration + U_EMRSETPOLYFILLMODE, //!< EMF manual 2.3.11.22 PolygonFillMode Enumeration + U_EMRSETROP2, //!< EMF manual 2.3.11.23 Binary Raster Operation Enumeration + U_EMRSETSTRETCHBLTMODE, //!< EMF manual 2.3.11.24 StretchMode Enumeration + U_EMRSETTEXTALIGN, //!< EMF manual 2.3.11.25 TextAlignment enumeration + U_EMRSELECTCLIPPATH, //!< EMF manual 2.3.2.5 RegionMode Enumeration + U_EMRSETICMMODE, //!< EMF manual 2.3.11.14 ICMMode Enumeration + U_EMRSETLAYOUT, //!< EMF manual 2.3.11.17 Mirroring Enumeration + *PU_EMRSETMAPMODE, //!< EMF manual 2.3.11.19 MapMode enumeration + *PU_EMRSETBKMODE, //!< EMF manual 2.3.11.11 BackgroundMode Enumeration + *PU_EMRSETPOLYFILLMODE, //!< EMF manual 2.3.11.22 PolygonFillMode Enumeration + *PU_EMRSETROP2, //!< EMF manual 2.3.11.23 Binary Raster Operation Enumeration + *PU_EMRSETSTRETCHBLTMODE, //!< EMF manual 2.3.11.24 StretchMode Enumeration + *PU_EMRSETTEXTALIGN, //!< EMF manual 2.3.11.25 TextAlignment enumeration + *PU_EMRSELECTCLIPPATH, //!< EMF manual 2.3.2.5 RegionMode Enumeration + *PU_EMRSETICMMODE, //!< EMF manual 2.3.11.14 ICMMode Enumeration + *PU_EMRSETLAYOUT; //!< EMF manual 2.3.11.17 Mirroring Enumeration /* Index 23 */ +/** EMF manual 2.3.11.13 +*/ typedef struct { U_EMR emr; //!< U_EMR U_COLORADJUSTMENT ColorAdjustment; //!< Color Adjustment -} U_EMRSETCOLORADJUSTMENT, *PU_EMRSETCOLORADJUSTMENT; +} U_EMRSETCOLORADJUSTMENT, + *PU_EMRSETCOLORADJUSTMENT; //!< EMF manual 2.3.11.13 /* Index 24, 25 */ +/** EMF manual 2.3.11.26 +*/ typedef struct { U_EMR emr; //!< U_EMR U_COLORREF crColor; //!< Color -} U_EMRSETTEXTCOLOR, *PU_EMRSETTEXTCOLOR, - U_EMRSETBKCOLOR, *PU_EMRSETBKCOLOR; +} U_EMRSETTEXTCOLOR, + U_EMRSETBKCOLOR, //!< EMF manual 2.3.11.10 + *PU_EMRSETTEXTCOLOR, //!< EMF manual 2.3.11.26 + *PU_EMRSETBKCOLOR; //!< EMF manual 2.3.11.10 /* Index 26 */ +/** EMF manual 2.3.2.4 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL ptlOffset; //!< Clipping region -} U_EMROFFSETCLIPRGN, *PU_EMROFFSETCLIPRGN; +} U_EMROFFSETCLIPRGN, + *PU_EMROFFSETCLIPRGN; //!< EMF manual 2.3.2.4 /* Index 27, 54 */ +/** +EMF manual 2.3.11.4 +EMF manual 2.3.5.13 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL ptl; //!< Point coordinates -} U_EMRMOVETOEX, *PU_EMRMOVETOEX, - U_EMRLINETO, *PU_EMRLINETO; +} U_EMRMOVETOEX, + U_EMRLINETO, //!< EMF manual 2.3.5.13 + *PU_EMRMOVETOEX, //!< EMF manual 2.3.11.4 + *PU_EMRLINETO; //!< EMF manual 2.3.5.13 /* Index 28,33,52,59,60,61,65,66,68 */ +/** EMF manual 2.3.2 +*/ typedef struct { U_EMR emr; //!< U_EMR } - U_EMRSETMETARGN, *PU_EMRSETMETARGN, - U_EMRSAVEDC, *PU_EMRSAVEDC, - U_EMRREALIZEPALETTE, *PU_EMRREALIZEPALETTE, - U_EMRBEGINPATH, *PU_EMRBEGINPATH, - U_EMRENDPATH, *PU_EMRENDPATH, - U_EMRCLOSEFIGURE, *PU_EMRCLOSEFIGURE, - U_EMRFLATTENPATH, *PU_EMRFLATTENPATH, - U_EMRWIDENPATH, *PU_EMRWIDENPATH, - U_EMRABORTPATH, *PU_EMRABORTPATH; - -/* Index 29,30 */ + U_EMRSETMETARGN, + U_EMRSAVEDC, //!< EMF manual 2.3.11 + U_EMRREALIZEPALETTE, //!< EMF manual 2.3.10 + U_EMRBEGINPATH, //!< EMF manual 2.3.10 + U_EMRENDPATH, //!< EMF manual 2.3.10 + U_EMRCLOSEFIGURE, //!< EMF manual 2.3.10 + U_EMRFLATTENPATH, //!< EMF manual 2.3.10 + U_EMRWIDENPATH, //!< EMF manual 2.3.10 + U_EMRABORTPATH, //!< EMF manual 2.3.10 + *PU_EMRSETMETARGN, //!< EMF manual 2.3.2 + *PU_EMRSAVEDC, //!< EMF manual 2.3.11 + *PU_EMRREALIZEPALETTE, //!< EMF manual 2.3.10 + *PU_EMRBEGINPATH, //!< EMF manual 2.3.10 + *PU_EMRENDPATH, //!< EMF manual 2.3.10 + *PU_EMRCLOSEFIGURE, //!< EMF manual 2.3.10 + *PU_EMRFLATTENPATH, //!< EMF manual 2.3.10 + *PU_EMRWIDENPATH, //!< EMF manual 2.3.10 + *PU_EMRABORTPATH; //!< EMF manual 2.3.10 + +/* Index 29,30 */ +/** EMF manual 2.3.2.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclClip; //!< Clipping Region -} U_EMREXCLUDECLIPRECT, *PU_EMREXCLUDECLIPRECT, - U_EMRINTERSECTCLIPRECT, *PU_EMRINTERSECTCLIPRECT; +} U_EMREXCLUDECLIPRECT, + U_EMRINTERSECTCLIPRECT, //!< EMF manual 2.3.2.3 + *PU_EMREXCLUDECLIPRECT, //!< EMF manual 2.3.2.1 + *PU_EMRINTERSECTCLIPRECT; //!< EMF manual 2.3.2.3 /* Index 31,32 */ +/** EMF manual 2.3.11.7 +*/ typedef struct { U_EMR emr; //!< U_EMR int32_t xNum; //!< Horizontal multiplier (!=0) int32_t xDenom; //!< Horizontal divisor (!=0) int32_t yNum; //!< Vertical multiplier (!=0) int32_t yDenom; //!< Vertical divisor (!=0) -} U_EMRSCALEVIEWPORTEXTEX, *PU_EMRSCALEVIEWPORTEXTEX, - U_EMRSCALEWINDOWEXTEX, *PU_EMRSCALEWINDOWEXTEX; +} U_EMRSCALEVIEWPORTEXTEX, + U_EMRSCALEWINDOWEXTEX, //!< EMF manual 2.3.11.8 + *PU_EMRSCALEVIEWPORTEXTEX, //!< EMF manual 2.3.11.7 + *PU_EMRSCALEWINDOWEXTEX; //!< EMF manual 2.3.11.8 /* Index 33 (see 28) */ -/* Index 34 */ +/* Index 34 */ +/** EMF manual 2.3.11.6 +*/ typedef struct { U_EMR emr; //!< U_EMR int32_t iRelative; //!< DC to restore. -1 is preceding -} U_EMRRESTOREDC, *PU_EMRRESTOREDC; +} U_EMRRESTOREDC, + *PU_EMRRESTOREDC; //!< EMF manual 2.3.11.6 /* Index 35 */ +/** EMF manual 2.3.12.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_XFORM xform; //!< Transform -} U_EMRSETWORLDTRANSFORM, *PU_EMRSETWORLDTRANSFORM; +} U_EMRSETWORLDTRANSFORM, + *PU_EMRSETWORLDTRANSFORM; //!< EMF manual 2.3.12.2 /* Index 36 */ +/** EMF manual 2.3.12.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_XFORM xform; //!< Transform uint32_t iMode; //!< ModifyWorldTransformMode Enumeration -} U_EMRMODIFYWORLDTRANSFORM, *PU_EMRMODIFYWORLDTRANSFORM; +} U_EMRMODIFYWORLDTRANSFORM, + *PU_EMRMODIFYWORLDTRANSFORM; //!< EMF manual 2.3.12.1 /* Index 37,40 */ +/** EMF manual 2.3.8.3 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihObject; //!< Number of a stock or created object -} U_EMRDELETEOBJECT, *PU_EMRDELETEOBJECT, - U_EMRSELECTOBJECT, *PU_EMRSELECTOBJECT; +} U_EMRDELETEOBJECT, + U_EMRSELECTOBJECT, //!< EMF manual 2.3.8.5 + *PU_EMRDELETEOBJECT, //!< EMF manual 2.3.8.3 + *PU_EMRSELECTOBJECT; //!< EMF manual 2.3.8.5 /* Index 38 */ +/** EMF manual 2.3.7.7 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihPen; //!< Index to place object in EMF object table (this entry must not yet exist) U_LOGPEN lopn; //!< Pen properties -} U_EMRCREATEPEN, *PU_EMRCREATEPEN; +} U_EMRCREATEPEN, + *PU_EMRCREATEPEN; //!< EMF manual 2.3.7.7 -/* Index 39 */ +/* Index 39 */ +/** EMF manual 2.3.7.1 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihBrush; //!< Index to place object in EMF object table (this entry must not yet exist) U_LOGBRUSH lb; //!< Brush properties -} U_EMRCREATEBRUSHINDIRECT, *PU_EMRCREATEBRUSHINDIRECT; +} U_EMRCREATEBRUSHINDIRECT, + *PU_EMRCREATEBRUSHINDIRECT; //!< EMF manual 2.3.7.1 /* Index 40 see 37 */ -/* Index 41 */ +/* Index 41 */ +/** EMF manual 2.3.5.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL ptlCenter; //!< Center in logical units uint32_t nRadius; //!< Radius in logical units U_FLOAT eStartAngle; //!< Starting angle in degrees (counter clockwise from x axis) U_FLOAT eSweepAngle; //!< Sweep angle in degrees -} U_EMRANGLEARC, *PU_EMRANGLEARC; +} U_EMRANGLEARC, + *PU_EMRANGLEARC; //!< EMF manual 2.3.5.1 -/* Index 42,43 */ +/* Index 42,43 */ +/** EMF manual 2.3.5.5 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBox; //!< bounding rectangle in logical units -} U_EMRELLIPSE, *PU_EMRELLIPSE, - U_EMRRECTANGLE, *PU_EMRRECTANGLE; +} U_EMRELLIPSE, + U_EMRRECTANGLE, //!< EMF manual 2.3.5.5 + *PU_EMRELLIPSE, //!< EMF manual 2.3.5.5 + *PU_EMRRECTANGLE; //!< EMF manual 2.3.5.34 -/* Index 44 */ +/* Index 44 */ +/** EMF manual 2.3.5.35 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBox; //!< bounding rectangle in logical units U_SIZEL szlCorner; //!< W & H in logical units of ellipse used to round corner -} U_EMRROUNDRECT, *PU_EMRROUNDRECT; +} U_EMRROUNDRECT, + *PU_EMRROUNDRECT; //!< EMF manual 2.3.5.35 -/* Index 45, 46 ,47, 55 */ +/* Index 45, 46 ,47, 55 */ +/** EMF manual 2.3.5.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBox; //!< bounding rectangle in logical units U_POINTL ptlStart; //!< Start point in logical units U_POINTL ptlEnd; //!< End point in logical units -} U_EMRARC, *PU_EMRARC, - U_EMRCHORD, *PU_EMRCHORD, - U_EMRPIE, *PU_EMRPIE, - U_EMRARCTO, *PU_EMRARCTO; +} U_EMRARC, + U_EMRCHORD, //!< EMF manual 2.3.5.4 + U_EMRPIE, //!< EMF manual 2.3.5.15 + U_EMRARCTO, //!< EMF manual 2.3.5.3 + *PU_EMRARC, //!< EMF manual 2.3.5.2 + *PU_EMRCHORD, //!< EMF manual 2.3.5.4 + *PU_EMRPIE, //!< EMF manual 2.3.5.15 + *PU_EMRARCTO; //!< EMF manual 2.3.5.3 -/* Index 48 */ +/* Index 48 */ +/** EMF manual 2.3.8.6 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihPal; //!< Index of a Palette object in the EMF object table -} U_EMRSELECTPALETTE, *PU_EMRSELECTPALETTE; +} U_EMRSELECTPALETTE, + *PU_EMRSELECTPALETTE; //!< EMF manual 2.3.8.6 -/* Index 49 */ +/* Index 49 */ +/** EMF manual 2.3.7.6 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihPal; //!< Index to place object in EMF object table (this entry must not yet exist) U_LOGPALETTE lgpl; //!< Palette properties -} U_EMRCREATEPALETTE, *PU_EMRCREATEPALETTE; +} U_EMRCREATEPALETTE, + *PU_EMRCREATEPALETTE; //!< EMF manual 2.3.7.6 /* Index 50 */ +/** EMF manual 2.3.8.8 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihPal; //!< Index of a Palette object in the EMF object table uint32_t iStart; //!< First Palette entry in selected object to set U_NUM_LOGPLTNTRY cEntries; //!< Number of Palette entries in selected object to set U_LOGPLTNTRY aPalEntries[1]; //!< Values to set with -} U_EMRSETPALETTEENTRIES, *PU_EMRSETPALETTEENTRIES; +} U_EMRSETPALETTEENTRIES, + *PU_EMRSETPALETTEENTRIES; //!< EMF manual 2.3.8.8 /* Index 51 */ +/** EMF manual 2.3.8.4 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihPal; //!< Index of a Palette object in the EMF object table uint32_t cEntries; //!< Number to expand or truncate the Palette entry list to. -} U_EMRRESIZEPALETTE, *PU_EMRRESIZEPALETTE; +} U_EMRRESIZEPALETTE, + *PU_EMRRESIZEPALETTE; //!< EMF manual 2.3.8.4 /* Index 52 (see 28) */ /* Index 53 */ +/** EMF manual 2.3.5.6 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL ptlStart; //!< Start point in logical units U_COLORREF crColor; //!< Color to fill with uint32_t iMode; //!< FloodFill Enumeration -} U_EMREXTFLOODFILL, *PU_EMREXTFLOODFILL; +} U_EMREXTFLOODFILL, + *PU_EMREXTFLOODFILL; //!< EMF manual 2.3.5.6 /* Index 54 (see 27) */ /* Index 55 (see 45) */ -/* Index 56 */ +/* Index 56 */ +/** EMF manual 2.3.5.20 +*/ 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; +} U_EMRPOLYDRAW, + *PU_EMRPOLYDRAW; //!< EMF manual 2.3.5.20 -/* Index 57 */ +/* Index 57 */ +/** EMF manual 2.3.11.9 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t iArcDirection; //!< ArcDirection Enumeration -} U_EMRSETARCDIRECTION, *PU_EMRSETARCDIRECTION; +} U_EMRSETARCDIRECTION, + *PU_EMRSETARCDIRECTION; //!< EMF manual 2.3.11.9 + +/* Index 58 */ +/** EMF manual 2.3.11.21 -/* Index 58 IMPORTANT!!!! The Microsoft structure uses a float for the miterlimit but the EMF file record uses an unsigned int. The latter form is used in this structure. */ typedef struct { U_EMR emr; //!< U_EMR uint32_t eMiterLimit; //!< Miter limit (max value of mitered length / line width) -} U_EMRSETMITERLIMIT, *PU_EMRSETMITERLIMIT; +} U_EMRSETMITERLIMIT, + *PU_EMRSETMITERLIMIT; //!< EMF manual 2.3.11.21 /* Index 59,60,61 (see 28) */ -/* Index 62,63,64 */ +/* Index 62,63,64 */ +/** EMF manual 2.3.5.9 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units -} U_EMRFILLPATH, *PU_EMRFILLPATH, - U_EMRSTROKEANDFILLPATH, *PU_EMRSTROKEANDFILLPATH, - U_EMRSTROKEPATH, *PU_EMRSTROKEPATH; +} U_EMRFILLPATH, + U_EMRSTROKEANDFILLPATH, //!< EMF manual 2.3.5.38 + U_EMRSTROKEPATH, //!< EMF manual 2.3.5.39 + *PU_EMRFILLPATH, //!< EMF manual 2.3.5.9 + *PU_EMRSTROKEANDFILLPATH, //!< EMF manual 2.3.5.38 + *PU_EMRSTROKEPATH; //!< EMF manual 2.3.5.39 /* Index 65,66 (see 28) */ /* Index 67 (see 17) */ /* Index 68 (see 28) */ /* Index 69 (not a defined U_EMR record type ) */ -/* Index 70 */ + +/* Index 70 */ +/** EMF manual 2.3.3.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cbData; //!< Number of bytes in comment uint8_t Data[1]; //!< Comment (any binary data, interpretation is program specific) -} U_EMRCOMMENT, *PU_EMRCOMMENT; //!< AKA GDICOMMENT +} U_EMRCOMMENT, + *PU_EMRCOMMENT; //!< EMF manual 2.3.3.1, AKA GDICOMMENT /* variant comment types */ +/** EMF manual 2.3.3.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cbData; //!< Number of bytes in comment uint32_t cIdent; //!< Comment identifier, must be U_EMR_COMMENT_EMFPLUSRECORD uint8_t Data[1]; //!< EMF Plus record -} U_EMRCOMMENT_EMFPLUS, *PU_EMRCOMMENT_EMFPLUS; //!< EMF Plus comment +} U_EMRCOMMENT_EMFPLUS, + *PU_EMRCOMMENT_EMFPLUS; //!< EMF manual 2.3.3.2, EMF Plus comment +/** EMF manual 2.3.3.3 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cbData; //!< Number of bytes in comment uint32_t cIdent; //!< Comment identifier, must be U_EMR_COMMENT_SPOOL uint32_t esrIdent; //!< EMFSpoolRecordIdentifier, may be U_EMR_COMMENT_SPOOLFONTDEF uint8_t Data[1]; //!< EMF Spool records -} U_EMRCOMMENT_SPOOL, *PU_EMRCOMMENT_SPOOL; //!< EMF Spool comment +} U_EMRCOMMENT_SPOOL, + *PU_EMRCOMMENT_SPOOL; //!< EMF manual 2.3.3.3, EMF Spool comment +/** EMF manual 2.3.3.4 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cbData; //!< Number of bytes in comment uint32_t cIdent; //!< Comment identifier, must be U_EMR_COMMENT_PUBLIC uint32_t pcIdent; //!< Public Comment Identifier, from EMRComment Enumeration uint8_t Data[1]; //!< Public comment data -} U_EMRCOMMENT_PUBLIC, *PU_EMRCOMMENT_PUBLIC; //!< EMF Public comment +} U_EMRCOMMENT_PUBLIC, + *PU_EMRCOMMENT_PUBLIC; //!< EMF manual 2.3.3.4, EMF Public comment -/* Index 71 */ +/* Index 71 */ +/** EMF manual 2.3.5.10 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units U_CBRGNDATA cbRgnData; //!< Size in bytes of Region data uint32_t ihBrush; //!< Index of a Brush object in the EMF object table U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure -} U_EMRFILLRGN, *PU_EMRFILLRGN; +} U_EMRFILLRGN, + *PU_EMRFILLRGN; //!< EMF manual 2.3.5.10 /* Index 72 */ +/** EMF manual 2.3.5.11 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2146,26 +2622,36 @@ typedef struct { uint32_t ihBrush; //!< Index of a Brush object in the EMF object table U_SIZEL szlStroke; //!< W & H of Brush stroke U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure -} U_EMRFRAMERGN, *PU_EMRFRAMERGN; +} U_EMRFRAMERGN, + *PU_EMRFRAMERGN; //!< EMF manual 2.3.5.11 /* Index 73,74 */ +/** EMF manual 2.3.11.3 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units U_CBRGNDATA cbRgnData; //!< Size in bytes of Region data U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure -} U_EMRINVERTRGN, *PU_EMRINVERTRGN, - U_EMRPAINTRGN, *PU_EMRPAINTRGN; +} U_EMRINVERTRGN, + U_EMRPAINTRGN, //!< EMF manual 2.3.5.14 + *PU_EMRINVERTRGN, //!< EMF manual 2.3.11.3 + *PU_EMRPAINTRGN; //!< EMF manual 2.3.5.14 /* Index 75 */ +/** EMF manual 2.3.2.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBRGNDATA cbRgnData; //!< Size in bytes of Region data uint32_t iMode; //!< RegionMode Enumeration U_RGNDATA RgnData[1]; //!< Variable size U_RGNDATA structure -} U_EMREXTSELECTCLIPRGN, *PU_EMREXTSELECTCLIPRGN; +} U_EMREXTSELECTCLIPRGN, + *PU_EMREXTSELECTCLIPRGN; //!< EMF manual 2.3.2.2 /* Index 76 */ +/** EMF manual 2.3.1.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2181,9 +2667,12 @@ typedef struct { U_OFFBITSSRC offBitsSrc; //!< Offset in bytes to the bitmap (within bitmapbuffer) U_CBBITS cbBitsSrc; //!< Size in bytes of bitmap //!< Record may include optional bitmapbuffer -} U_EMRBITBLT, *PU_EMRBITBLT; +} U_EMRBITBLT, + *PU_EMRBITBLT; //!< EMF manual 2.3.1.2 /* Index 77 */ +/** EMF manual 2.3.1.6 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2200,9 +2689,12 @@ typedef struct { U_CBBITS cbBitsSrc; //!< Size in bytes of bitmap U_POINTL cSrc; //!< Src W & H in logical units //!< Record may include optional bitmapbuffer -} U_EMRSTRETCHBLT, *PU_EMRSTRETCHBLT; +} U_EMRSTRETCHBLT, + *PU_EMRSTRETCHBLT; //!< EMF manual 2.3.1.6 -/* Index 78 */ +/* Index 78 */ +/** EMF manual 2.3.1.3 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2224,9 +2716,12 @@ typedef struct { U_OFFBITSMSK offBitsMask; //!< Offset in bytes to the mask bitmap (within maskbitmapbuffer) U_CBBITSMSK cbBitsMask; //!< Size in bytes of bitmap //!< Record may include optional Source and mask bitmapbuffers -} U_EMRMASKBLT, *PU_EMRMASKBLT; +} U_EMRMASKBLT, + *PU_EMRMASKBLT; //!< EMF manual 2.3.1.3 /* Index 79 */ +/** EMF manual 2.3.1.4 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2247,9 +2742,12 @@ typedef struct { U_OFFBITSMSK offBitsMask; //!< Offset in bytes to the mask bitmap (within maskbitmapbuffer) U_CBBITSMSK cbBitsMask; //!< Size in bytes of bitmap //!< Record may include optional Source and mask bitmapbuffers -} U_EMRPLGBLT, *PU_EMRPLGBLT; +} U_EMRPLGBLT, + *PU_EMRPLGBLT; //!< EMF manual 2.3.1.4 /* Index 80 */ +/** EMF manual 2.3.1.5 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2264,9 +2762,12 @@ typedef struct { uint32_t iStartScan; //!< First scan line uint32_t cScans; //!< Number of scan lines //!< Record may includes optional bitmapbuffer -} U_EMRSETDIBITSTODEVICE, *PU_EMRSETDIBITSTODEVICE; +} U_EMRSETDIBITSTODEVICE, + *PU_EMRSETDIBITSTODEVICE; //!< EMF manual 2.3.1.5 /* Index 81 */ +/** EMF manual 2.3.1.7 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2281,18 +2782,23 @@ typedef struct { uint32_t dwRop; //!< Ternary Raster Operation enumeration U_POINTL cDest; //!< Destination W & H in logical units //!< Record may includes optional bitmapbuffer -} U_EMRSTRETCHDIBITS, *PU_EMRSTRETCHDIBITS; +} U_EMRSTRETCHDIBITS, + *PU_EMRSTRETCHDIBITS; //!< EMF manual 2.3.1.7 /* Index 82 */ +/** EMF manual 2.3.7.8 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihFont; //!< Index of the font in the EMF object table 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; +} U_EMREXTCREATEFONTINDIRECTW, + *PU_EMREXTCREATEFONTINDIRECTW; //!< EMF manual 2.3.7.8 -/* Index 83,84 */ -/** -Variable and optional fields may follow core structure in record: +/* Index 83,84 */ +/** EMF manual 2.3.5.7 + +Variable and optional fields may follow core structure in record:\n U_RECTL rcl; absent when fOptions & U_ETO_NO_RECT) grayed/clipping/opaque rectangle @@ -2307,25 +2813,33 @@ typedef struct { U_FLOAT exScale; //!< scale to 0.01 mm units ( only if iGraphicsMode & U_GM_COMPATIBLE) U_FLOAT eyScale; //!< scale to 0.01 mm units ( only if iGraphicsMode & U_GM_COMPATIBLE) U_EMRTEXT emrtext; //!< Text parameters -// U_RECTL rcl; absent when fOptions & U_ETO_NO_RECT) grayed/clipping/opaque rectangle -// U_OFFDX offDx; (required) but position isn't static. Offset in bytes to the character spacing array from the start of the RECORD -// Record may include optional Dx, character spacing, array of uint32_t -} U_EMREXTTEXTOUTA, *PU_EMREXTTEXTOUTA, - U_EMREXTTEXTOUTW, *PU_EMREXTTEXTOUTW; +} U_EMREXTTEXTOUTA, + U_EMREXTTEXTOUTW, //!< EMF manual 2.3.5.8 + *PU_EMREXTTEXTOUTA, //!< EMF manual 2.3.5.7 + *PU_EMREXTTEXTOUTW; //!< EMF manual 2.3.5.8 /* Index 85,86,87,88,89 */ +/** EMF manual 2.3.5.17 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units U_NUM_POINT16 cpts; //!< Number of POINT16 in array U_POINT16 apts[1]; //!< Array of POINT16 -} U_EMRPOLYBEZIER16,*PU_EMRPOLYBEZIER16, - U_EMRPOLYGON16,*PU_EMRPOLYGON16, - U_EMRPOLYLINE16,*PU_EMRPOLYLINE16, - U_EMRPOLYBEZIERTO16,*PU_EMRPOLYBEZIERTO16, - U_EMRPOLYLINETO16,*PU_EMRPOLYLINETO16; - +} U_EMRPOLYBEZIER16, + U_EMRPOLYGON16, //!< EMF manual 2.3.5.23 + U_EMRPOLYLINE16, //!< EMF manual 2.3.5.25 + U_EMRPOLYBEZIERTO16, //!< EMF manual 2.3.5.19 + U_EMRPOLYLINETO16, //!< EMF manual 2.3.5.27 + *PU_EMRPOLYBEZIER16, //!< EMF manual 2.3.5.17 + *PU_EMRPOLYGON16, //!< EMF manual 2.3.5.23 + *PU_EMRPOLYLINE16, //!< EMF manual 2.3.5.25 + *PU_EMRPOLYBEZIERTO16, //!< EMF manual 2.3.5.19 + *PU_EMRPOLYLINETO16; //!< EMF manual 2.3.5.27 + /* Index 90,91 */ +/** EMF manual 2.3.5.31 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2333,20 +2847,27 @@ typedef struct { 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,*PU_EMRPOLYPOLYLINE16, - U_EMRPOLYPOLYGON16,*PU_EMRPOLYPOLYGON16; +// 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 /* Index 92 */ +/** EMF manual 2.3.5.21 +*/ 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; +} U_EMRPOLYDRAW16, + *PU_EMRPOLYDRAW16; //!< EMF manual 2.3.5.21 -/* Index 93 */ +/* Index 93 */ +/** EMF manual 2.3.7.5 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihBrush; //!< Index to place object in EMF object table (this entry must not yet exist) @@ -2356,9 +2877,12 @@ typedef struct { U_OFFBITS offBits; //!< Offset in bytes to the DIB bitmap data (within DIBbitmapbuffer U_CBBITS cbBits; //!< Size in bytes of DIB bitmap //!< Record may include optional DIB bitmapbuffer -} U_EMRCREATEMONOBRUSH, *PU_EMRCREATEMONOBRUSH; +} U_EMRCREATEMONOBRUSH, + *PU_EMRCREATEMONOBRUSH; //!< EMF manual 2.3.7.5 -/* Index 94 */ +/* Index 94 */ +/** EMF manual 2.3.7.4 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihBrush; //!< Index to place object in EMF object table (this entry must not yet exist) @@ -2368,9 +2892,12 @@ typedef struct { U_OFFBITS offBits; //!< Offset in bytes to the DIB bitmap data (within DIB bitmapbuffer U_CBBITS cbBits; //!< Size in bytes of DIB bitmap //!< Record may include optional DIB bitmapbuffer -} U_EMRCREATEDIBPATTERNBRUSHPT, *PU_EMRCREATEDIBPATTERNBRUSHPT; +} U_EMRCREATEDIBPATTERNBRUSHPT, + *PU_EMRCREATEDIBPATTERNBRUSHPT; //!< EMF manual 2.3.7.4 /* Index 95 */ +/** EMF manual 2.3.7.9 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihPen; //!< Index to place object in EMF object table (this entry must not yet exist) @@ -2380,9 +2907,12 @@ typedef struct { U_CBBITS cbBits; //!< Size in bytes of DIB bitmap U_EXTLOGPEN elp; //!< Pen parameters (Size is Variable!!!!) //!< Record may include optional DIB bitmap -} U_EMREXTCREATEPEN, *PU_EMREXTCREATEPEN; +} U_EMREXTCREATEPEN, + *PU_EMREXTCREATEPEN; //!< EMF manual 2.3.7.9 -/* Index 96.97 */ +/* Index 96.97 */ +/** EMF manual 2.3.5.32 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2391,63 +2921,89 @@ typedef struct { U_FLOAT eyScale; //!< scale to 0.01 mm units ( only if iGraphicsMode & U_GM_COMPATIBLE) U_NUM_EMRTEXT cStrings; //!< Number of U_EMRTEXT in array U_EMRTEXT emrtext[1]; //!< Text parameters -} U_EMRPOLYTEXTOUTA, *PU_EMRPOLYTEXTOUTA, - U_EMRPOLYTEXTOUTW, *PU_EMRPOLYTEXTOUTW; +} U_EMRPOLYTEXTOUTA, + U_EMRPOLYTEXTOUTW, //!< EMF manual 2.3.5.33 + *PU_EMRPOLYTEXTOUTA, //!< EMF manual 2.3.5.32 + *PU_EMRPOLYTEXTOUTW; //!< EMF manual 2.3.5.33 /* Index 98 (see 17) */ /* Index 99 */ +/** EMF manual 2.3.7.2 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihCS; //!< Index to place object in EMF object table (this entry must not yet exist) U_LOGCOLORSPACEA lcs; //!< ColorSpace parameters -} U_EMRCREATECOLORSPACE, *PU_EMRCREATECOLORSPACE; +} U_EMRCREATECOLORSPACE, + *PU_EMRCREATECOLORSPACE; //!< EMF manual 2.3.7.2 /* Index 100,101 */ +/** EMF manual 2.3.8.2 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihCS; //!< Index of object in EMF object table -} U_EMRDELETECOLORSPACE, *PU_EMRDELETECOLORSPACE, - U_EMRSETCOLORSPACE, *PU_EMRSETCOLORSPACE; +} U_EMRDELETECOLORSPACE, + U_EMRSETCOLORSPACE, //!< EMF manual 2.3.8.7 + *PU_EMRDELETECOLORSPACE, //!< EMF manual 2.3.8.2 + *PU_EMRSETCOLORSPACE; //!< EMF manual 2.3.8.7 /* Index 102 */ +/** EMF manual 2.3.9.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cbData; //!< Size of OpenGL data in bytes U_DATA Data[1]; //!< OpenGL data -} U_EMRGLSRECORD, *PU_EMRGLSRECORD; +} U_EMRGLSRECORD, + *PU_EMRGLSRECORD; //!< EMF manual 2.3.9.2 /* Index 103 */ +/** EMF manual 2.3.9.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units U_CBDATA cbData; //!< Size of OpenGL data in bytes U_DATA Data[1]; //!< OpenGL data -} U_EMRGLSBOUNDEDRECORD, *PU_EMRGLSBOUNDEDRECORD; +} U_EMRGLSBOUNDEDRECORD, + *PU_EMRGLSBOUNDEDRECORD; //!< EMF manual 2.3.9.1 /* Index 104 */ +/** EMF manual 2.3.11.5 +*/ typedef struct { U_EMR emr; //!< U_EMR U_PIXELFORMATDESCRIPTOR pfd; //!< PixelFormatDescriptor -} U_EMRPIXELFORMAT, *PU_EMRPIXELFORMAT; +} U_EMRPIXELFORMAT, + *PU_EMRPIXELFORMAT; //!< EMF manual 2.3.11.5 /* Index 105 */ +/** EMF manual 2.3.6.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cjIn; //!< Number of bytes to send to printer driver U_DATA Data[1]; //!< Data to send -} U_EMRDRAWESCAPE, *PU_EMRDRAWESCAPE; +} U_EMRDRAWESCAPE, + *PU_EMRDRAWESCAPE; //!< EMF manual 2.3.6.1 /* Index 106 */ +/** EMF manual 2.3.6.2 +*/ typedef struct { U_EMR emr; //!< U_EMR U_CBDATA cjIn; //!< Number of bytes to send to printer driver U_DATA Data[1]; //!< Data to send -} U_EMREXTESCAPE, *PU_EMREXTESCAPE; +} U_EMREXTESCAPE, + *PU_EMREXTESCAPE; //!< EMF manual 2.3.6.2 /* Index 107 (not implemented ) */ /* Index 108 */ +/** EMF manual 2.3.5.37 +*/ typedef struct { U_EMR emr; //!< U_EMR U_POINTL Dest; //!< Where to draw the text @@ -2459,22 +3015,34 @@ typedef struct { //!< the tail end of this record is variable. //!< U_RECTL rclBounds; Record may include optional Bounding rectangle (absent when: fuOPtions & ETO_NO_U_RECT) //!< uint32_t TextString; text to output (fuOptions & ETO_SMALL_CHARS ? 8 bit : 16 bit) -} U_EMRSMALLTEXTOUT, *PU_EMRSMALLTEXTOUT; +} U_EMRSMALLTEXTOUT, + *PU_EMRSMALLTEXTOUT; //!< EMF manual 2.3.5.37 -/* Index 109 (not implemented ) */ +/* Index 109 (not implemented ) +EMF manual 2.3.11.2 +*/ /* Index 110 */ +/** EMF manual 2.3.6.3 +*/ 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; +} U_EMRNAMEDESCAPE, + *PU_EMRNAMEDESCAPE; //!< EMF manual 2.3.6.3 -/* Index 111-113 (not implemented ) */ +/* Index 111-113 (not implemented ) + EMF manual 2.3.8.1 + EMF manual 2.3.11.15 + EMF manual 2.3.11.16 +*/ /* Index 114 */ +/** EMF manual 2.3.1.1 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2491,11 +3059,14 @@ typedef struct { U_CBBITS cbBitsSrc; //!< Size in bytes of bitmap U_POINTL cSrc; //!< Source W & H in logical units //!< Record may include optional DIB bitmap -} U_EMRALPHABLEND, *PU_EMRALPHABLEND; +} U_EMRALPHABLEND, + *PU_EMRALPHABLEND; //!< EMF manual 2.3.1.1 /* Index 115 (see 17) */ -/* Index 116 */ +/* Index 116 */ +/** EMF manual 2.3.1.8 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2512,11 +3083,14 @@ typedef struct { U_CBBITS cbBitsSrc; //!< Size in bytes of bitmap U_POINTL cSrc; //!< Source W & H in logical units //!< Record may includes optional bitmapbuffer -} U_EMRTRANSPARENTBLT, *PU_EMRTRANSPARENTBLT; +} U_EMRTRANSPARENTBLT, + *PU_EMRTRANSPARENTBLT; //!< EMF manual 2.3.1.8 /* Index 117 (not a defined U_EMR record type ) */ /* Index 118 */ +/** EMF manual 2.3.5.12 +*/ typedef struct { U_EMR emr; //!< U_EMR U_RECTL rclBounds; //!< Bounding rectangle in device units @@ -2526,21 +3100,30 @@ typedef struct { //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; +} U_EMRGRADIENTFILL, + *PU_EMRGRADIENTFILL; //!< EMF manual 2.3.5.12 -/* Index 119,120 (not implemented ) */ +/* Index 119,120 (not implemented ) +EMF manual 2.3.11.18 +EMF manual 2.3.11.27 +*/ /* Index 121 */ +/** EMF manual 2.3.11.1 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t dwAction; //!< ColorSpace Enumeration uint32_t dwFlags; //!< ColorMatchToTarget Enumeration - U_CBNAME cbName; //!< Number of bytes in in UTF16 name of the color profile + U_CBNAME cbName; //!< Number of bytes in UTF16 name of the color profile U_CBDATA cbData; //!< Number of bytes of the target profile uint8_t Data[1]; //!< Data of size cbName+cbData: Name in UTF16 then color profile data -} U_EMRCOLORMATCHTOTARGETW, *PU_EMRCOLORMATCHTOTARGETW; +} U_EMRCOLORMATCHTOTARGETW, + *PU_EMRCOLORMATCHTOTARGETW; //!< EMF manual 2.3.11.1 /* Index 122 */ +/** EMF manual 2.3.7.3 +*/ typedef struct { U_EMR emr; //!< U_EMR uint32_t ihCS; //!< Index of the logical color space object in the EMF object table @@ -2548,11 +3131,15 @@ typedef struct { uint32_t dwFlags; //!< If low bit set Data is present U_CBDATA cbData; //!< Number of bytes of theData field. uint8_t Data[1]; //!< (Optional, dwFlags & 1) color profile data -} U_EMRCREATECOLORSPACEW, *PU_EMRCREATECOLORSPACEW; +} U_EMRCREATECOLORSPACEW, + *PU_EMRCREATECOLORSPACEW; //!< EMF manual 2.3.7.3 // ************************************************************************************************ // Utility function structures +/** + Storage for keeping track of properties of the growing EMF file as records are added. +*/ typedef struct { FILE *fp; //!< Open file size_t allocated; //!< Size of the buffer @@ -2592,11 +3179,13 @@ typedef struct { double M12; //!< Matrix element 1,2 double M21; //!< Matrix element 2,1 double M22; //!< Matrix element 2,2 -} U_MAT2X2, *PU_MAT2X2; +} U_MAT2X2, + *PU_MAT2X2; //!< 2 x 2 matrix, used by xform_alt_set() function. // ************************************************************************************************ // Prototypes +//! \cond int memprobe(const void *buf, size_t size); void wchar8show(const char *src); void wchar16show(const uint16_t *src); @@ -2868,8 +3457,9 @@ char *U_EMRSMALLTEXTOUT_set(const U_POINTL Dest, const U_NUM_STR cChars, const u // U_EMRFORCEUFIMAPPING_set 109 Not implemented // U_EMRNAMEDESCAPE_set 110 Not implemented // U_EMRCOLORCORRECTPALETTE_set 111 Not implemented -// U_EMRSETICMPROFILEA_set 112 Not implemented -// U_EMRSETICMPROFILEW_set 113 Not implemented +// 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, @@ -2889,6 +3479,8 @@ char *U_EMRGRADIENTFILL_set(const U_RECTL rclBounds, const U_NUM_TRIVERTEX nTriV char *U_EMRCREATECOLORSPACEW_set(const uint32_t ihCS, const U_LOGCOLORSPACEW lcs, const uint32_t dwFlags, const U_CBDATA cbData, const uint8_t *Data); +//! \endcond + #ifdef __cplusplus } #endif diff --git a/src/libuemf/uemf_endian.c b/src/libuemf/uemf_endian.c index cdae07a3d..f025416c3 100644 --- a/src/libuemf/uemf_endian.c +++ b/src/libuemf/uemf_endian.c @@ -1,5 +1,7 @@ /** - @file uemf_endian.c Functions for converting EMF records between Big Endian and Little Endian + @file uemf_endian.c + + @brief Functions for converting EMF records between Big Endian and Little Endian byte orders. EMF files use Little Endian order. On a Big Endian machine the data must be converted to/from Little Endian when it is writen to/read from a file. @@ -16,12 +18,12 @@ */ /* -File: uemf_endian.h -Version: 0.0.12 -Date: 14-FEB-2013 +File: uemf_endian.c +Version: 0.0.14 +Date: 15-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -35,7 +37,7 @@ extern "C" { #include "uemf_endian.h" // hide almost everuything in here from Doxygen -//! @cond +//! \cond /* ********************************************************************************************** These functions convert standard objects used in the EMR records. @@ -1095,7 +1097,7 @@ void U_EMRABORTPATH_swap(char *record, int torev){ } // U_EMRUNDEF69 69 -#define U_EMRUNDEF69_swap U_EMRNOTIMPLEMENTED_swap +#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){ @@ -1458,9 +1460,9 @@ void U_EMREXTCREATEPEN_swap(char *record, int torev){ } // U_EMRPOLYTEXTOUTA 96 NOT IMPLEMENTED, denigrated after Windows NT -#define U_EMRPOLYTEXTOUTA_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRPOLYTEXTOUTA_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRPOLYTEXTOUTW 97 NOT IMPLEMENTED, denigrated after Windows NT -#define U_EMRPOLYTEXTOUTW_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRPOLYTEXTOUTW_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRSETICMMODE 98 void U_EMRSETICMMODE_swap(char *record, int torev){ @@ -1486,9 +1488,9 @@ void U_EMRDELETECOLORSPACE_swap(char *record, int torev){ } // U_EMRGLSRECORD 102 Not implemented -#define U_EMRGLSRECORD_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRGLSRECORD_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRGLSBOUNDEDRECORD 103 Not implemented -#define U_EMRGLSBOUNDEDRECORD_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRGLSBOUNDEDRECORD_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRPIXELFORMAT 104 void U_EMRPIXELFORMAT_swap(char *record, int torev){ @@ -1498,11 +1500,11 @@ void U_EMRPIXELFORMAT_swap(char *record, int torev){ } // U_EMRDRAWESCAPE 105 Not implemented -#define U_EMRDRAWESCAPE_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRDRAWESCAPE_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMREXTESCAPE 106 Not implemented -#define U_EMREXTESCAPE_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMREXTESCAPE_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRUNDEF107 107 Not implemented -#define U_EMRUNDEF107_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRUNDEF107_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRSMALLTEXTOUT 108 void U_EMRSMALLTEXTOUT_swap(char *record, int torev){ @@ -1526,15 +1528,15 @@ void U_EMRSMALLTEXTOUT_swap(char *record, int torev){ } // U_EMRFORCEUFIMAPPING 109 Not implemented -#define U_EMRFORCEUFIMAPPING_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRFORCEUFIMAPPING_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRNAMEDESCAPE 110 Not implemented -#define U_EMRNAMEDESCAPE_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRNAMEDESCAPE_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRCOLORCORRECTPALETTE 111 Not implemented -#define U_EMRCOLORCORRECTPALETTE_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRCOLORCORRECTPALETTE_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRSETICMPROFILEA 112 Not implemented -#define U_EMRSETICMPROFILEA_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRSETICMPROFILEA_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRSETICMPROFILEW 113 Not implemented -#define U_EMRSETICMPROFILEW_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRSETICMPROFILEW_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRALPHABLEND 114 void U_EMRALPHABLEND_swap(char *record, int torev){ @@ -1553,7 +1555,7 @@ void U_EMRTRANSPARENTBLT_swap(char *record, int torev){ // U_EMRUNDEF117 117 Not implemented -#define U_EMRUNDEF117_swap U_EMRNOTIMPLEMENTED_swap +#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 nTriVert=0; @@ -1589,11 +1591,11 @@ void U_EMRGRADIENTFILL_swap(char *record, int torev){ } // U_EMRSETLINKEDUFIS 119 Not implemented -#define U_EMRSETLINKEDUFIS_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRSETLINKEDUFIS_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRSETTEXTJUSTIFICATION120 Not implemented (denigrated) -#define U_EMRSETTEXTJUSTIFICATION_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRSETTEXTJUSTIFICATION_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRCOLORMATCHTOTARGETW 121 Not implemented -#define U_EMRCOLORMATCHTOTARGETW_swap U_EMRNOTIMPLEMENTED_swap +#define U_EMRCOLORMATCHTOTARGETW_swap(A,B) U_EMRNOTIMPLEMENTED_swap(A,B) //!< Not implemented. // U_EMRCREATECOLORSPACEW 122 void U_EMRCREATECOLORSPACEW_swap(char *record, int torev){ @@ -1605,7 +1607,7 @@ void U_EMRCREATECOLORSPACEW_swap(char *record, int torev){ // ordered bytes: Data } -//! @endcond +//! \endcond /** @@ -1619,7 +1621,7 @@ void U_EMRCREATECOLORSPACEW_swap(char *record, int torev){ or immediately after reading the data from a file. */ int U_emf_endian(char *contents, size_t length, int torev){ - size_t off; + uint32_t off; uint32_t OK, recnum, iType; char *record; PU_ENHMETARECORD pEmr; diff --git a/src/libuemf/uemf_endian.h b/src/libuemf/uemf_endian.h index 9866aacaf..317968c34 100644 --- a/src/libuemf/uemf_endian.h +++ b/src/libuemf/uemf_endian.h @@ -1,5 +1,7 @@ /** - @file uemf_endian.h Prototype for function for converting EMF records between Big Endian and Little Endian + @file uemf_endian.h + + @brief Defintions and prototype for function for converting EMF records between Big Endian and Little Endian byte orders. */ /* @@ -18,17 +20,36 @@ Copyright: 2012 David Mathog and California Institute of Technology (Caltech) extern "C" { #endif -/* There is no way for the preprocessor, in general, to figure out endianness. So the command line must define +/** \defgroup U_Endian Byte order identification + + There is no way for the preprocessor, in general, to figure out endianness. So the command line must define WORDS_BIGENDIAN for a big endian machine. Otherwise we assume is is little endian. If it is something - else this code won't work in any case. */ + else this code won't work in any case. + + @{ +*/ + #ifdef WORDS_BIGENDIAN -#define U_BYTE_SWAP 1 +#define U_BYTE_SWAP 1 //!< byte swapping into metafile is required +#define U_IS_BE 1 //!< this machine is big endian +#define U_IS_LE 0 //!< this machine is not little endian #else -#define U_BYTE_SWAP 0 +#define U_BYTE_SWAP 0 //!< byte swapping into metafile is not required +#define U_IS_BE 0 //!< this machine is not big endian +#define U_IS_LE 1 //!< this machine is little endian #endif +#define U_XE 0 //!< do not rearrange endian for target +#define U_LE 1 //!< target is Little Endian +#define U_BE 2 //!< target is Big Endian +#define U_RP 4 //!< replicate first instance +#define U_XX 0xFF //!< may be used to terminate a list of these target entries +/** @} */ + +//! \cond // prototypes int U_emf_endian(char *contents, size_t length, int torev); +//! \endcond #ifdef __cplusplus } diff --git a/src/libuemf/uemf_print.c b/src/libuemf/uemf_print.c index b7cbf9a14..aa574bd73 100644 --- a/src/libuemf/uemf_print.c +++ b/src/libuemf/uemf_print.c @@ -1,11 +1,13 @@ /** - @file uemf_print.c Functions for printing EMF records + @file uemf_print.c + + @brief Functions for printing EMF records */ /* File: uemf_print.c -Version: 0.0.12 -Date: 04-FEB-2013 +Version: 0.0.15 +Date: 17-OCT-2013 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu Copyright: 2013 David Mathog and California Institute of Technology (Caltech) @@ -20,6 +22,14 @@ extern "C" { #include /* for offsetof() macro */ #include #include "uemf.h" +#include "upmf_print.h" + +//! \cond +#define UNUSED(x) (void)(x) + +/* one needed prototype */ +void U_swap4(void *ul, unsigned int count); +//! \endcond /** \brief Print some number of hex bytes @@ -395,7 +405,7 @@ void blend_print( void extlogpen_print( PU_EXTLOGPEN elp ){ - unsigned i; + unsigned int i; U_STYLEENTRY *elpStyleEntry; printf("elpPenStyle:0x%8.8X " ,elp->elpPenStyle ); printf("elpWidth:%u " ,elp->elpWidth ); @@ -407,7 +417,7 @@ void extlogpen_print( printf("elpStyleEntry:"); elpStyleEntry = (uint32_t *) elp->elpStyleEntry; for(i=0;ielpNumEntries;i++){ - printf("%u:%u ",i,elpStyleEntry[i]); + printf("%d:%u ",i,elpStyleEntry[i]); } } } @@ -420,7 +430,7 @@ void extlogpen_print( void logpen_print( U_LOGPEN lp ){ - printf("lopnStyle:%u " ,lp.lopnStyle ); + printf("lopnStyle:0x%8.8X " ,lp.lopnStyle ); printf("lopnWidth:"); pointl_print( lp.lopnWidth ); printf("lopnColor:"); colorref_print(lp.lopnColor ); } @@ -478,13 +488,13 @@ void rgndataheader_print( void rgndata_print( PU_RGNDATA rd ){ - unsigned i; + unsigned int i; PU_RECTL rects; printf("rdh:"); rgndataheader_print(rd->rdh ); if(rd->rdh.nCount){ rects = (PU_RECTL) &(rd->Buffer); for(i=0;irdh.nCount;i++){ - printf("%u:",i); rectl_print(rects[i]); + printf("%d:",i); rectl_print(rects[i]); } } } @@ -497,7 +507,7 @@ void coloradjustment_print( U_COLORADJUSTMENT ca ){ printf("caSize:%u " ,ca.caSize ); - printf("caFlags:%u " ,ca.caFlags ); + printf("caFlags:0x%4.4X " ,ca.caFlags ); printf("caIlluminantIndex:%u " ,ca.caIlluminantIndex); printf("caRedGamma:%u " ,ca.caRedGamma ); printf("caGreenGamma:%u " ,ca.caGreenGamma ); @@ -519,7 +529,7 @@ void pixelformatdescriptor_print( ){ printf("nSize:%u " ,pfd.nSize ); printf("nVersion:%u " ,pfd.nVersion ); - printf("dwFlags:%u " ,pfd.dwFlags ); + printf("dwFlags:0x%8.8X " ,pfd.dwFlags ); printf("iPixelType:%u " ,pfd.iPixelType ); printf("cColorBits:%u " ,pfd.cColorBits ); printf("cRedBits:%u " ,pfd.cRedBits ); @@ -556,7 +566,7 @@ void emrtext_print( const char *record, int type ){ - unsigned i, off; + unsigned int i,off; char *string; PU_EMRTEXT pemt = (PU_EMRTEXT) emt; // constant part @@ -573,7 +583,7 @@ void emrtext_print( free(string); } } - printf("fOptions:%u " ,pemt->fOptions ); + printf("fOptions:0x%8.8X " ,pemt->fOptions ); off = sizeof(U_EMRTEXT); if(!(pemt->fOptions & U_ETO_NO_RECT)){ printf("rcl"); rectl_print( *((U_RECTL *)(emt+off)) ); @@ -609,35 +619,35 @@ 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_print void core1_print(const char *name, const char *contents){ - unsigned i; - (void) name; + unsigned int i; + UNUSED(name); PU_EMRPOLYLINETO pEmr = (PU_EMRPOLYLINETO) (contents); printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" cptl: %d\n",pEmr->cptl ); printf(" Points: "); for(i=0;icptl; i++){ - printf("[%u]:",i); pointl_print(pEmr->aptl[i]); + printf("[%d]:",i); pointl_print(pEmr->aptl[i]); } printf("\n"); } // Functions with the same form starting with U_EMRPOLYPOLYLINE_print void core2_print(const char *name, const char *contents){ - unsigned i; - (void) name; + unsigned int i; + UNUSED(name); PU_EMRPOLYPOLYGON pEmr = (PU_EMRPOLYPOLYGON) (contents); printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" nPolys: %d\n",pEmr->nPolys ); printf(" cptl: %d\n",pEmr->cptl ); printf(" Counts: "); for(i=0;inPolys; i++){ - printf(" [%u]:%d ",i,pEmr->aPolyCounts[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: "); for(i=0;icptl; i++){ - printf(" [%u]:",i); pointl_print(paptl[i]); + printf(" [%d]:",i); pointl_print(paptl[i]); } printf("\n"); } @@ -645,8 +655,8 @@ 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); PU_EMRSETMAPMODE pEmr = (PU_EMRSETMAPMODE)(contents); - (void) name; if(!strcmp(label,"crColor:")){ printf(" %-15s ",label); colorref_print(*(U_COLORREF *)&(pEmr->iMode)); printf("\n"); } @@ -660,22 +670,22 @@ void core3_print(const char *name, const char *label, const char *contents){ // Functions taking a single U_RECT or U_RECTL, starting with U_EMRELLIPSE_print, also U_EMRFILLPATH_print, void core4_print(const char *name, const char *contents){ + UNUSED(name); PU_EMRELLIPSE pEmr = (PU_EMRELLIPSE)( contents); - (void) name; printf(" rclBox: "); rectl_print(pEmr->rclBox); printf("\n"); } // Functions with the same form starting with U_EMRPOLYBEZIER16_print void core6_print(const char *name, const char *contents){ - unsigned i; - (void) name; + UNUSED(name); + unsigned int i; PU_EMRPOLYBEZIER16 pEmr = (PU_EMRPOLYBEZIER16) (contents); printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" cpts: %d\n",pEmr->cpts ); printf(" Points: "); PU_POINT16 papts = (PU_POINT16)(&(pEmr->apts)); for(i=0; icpts; i++){ - printf(" [%u]:",i); point16_print(papts[i]); + printf(" [%d]:",i); point16_print(papts[i]); } printf("\n"); } @@ -686,8 +696,8 @@ void core6_print(const char *name, const char *contents){ // print routines must supply the names of the two arguments. These cannot be null. If the second one is // empty the values are printed as a pair {x,y}, otherwise each is printed with its own label on a separate line. void core7_print(const char *name, const char *field1, const char *field2, const char *contents){ + UNUSED(name); PU_EMRGENERICPAIR pEmr = (PU_EMRGENERICPAIR) (contents); - (void) name; if(*field2){ printf(" %-15s %d\n",field1,pEmr->pair.x); printf(" %-15s %d\n",field2,pEmr->pair.y); @@ -699,8 +709,8 @@ void core7_print(const char *name, const char *field1, const char *field2, const // For U_EMREXTTEXTOUTA and U_EMREXTTEXTOUTW, type=0 for the first one void core8_print(const char *name, const char *contents, int type){ + UNUSED(name); PU_EMREXTTEXTOUTA pEmr = (PU_EMREXTTEXTOUTA) (contents); - (void) name; printf(" iGraphicsMode: %u\n",pEmr->iGraphicsMode ); printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" exScale: %f\n",pEmr->exScale ); @@ -712,8 +722,8 @@ void core8_print(const char *name, const char *contents, int type){ // Functions that take a rect and a pair of points, starting with U_EMRARC_print void core9_print(const char *name, const char *contents){ + UNUSED(name); PU_EMRARC pEmr = (PU_EMRARC) (contents); - (void) name; printf(" rclBox: "); rectl_print(pEmr->rclBox); printf("\n"); printf(" ptlStart: "); pointl_print(pEmr->ptlStart); printf("\n"); printf(" ptlEnd: "); pointl_print(pEmr->ptlEnd); printf("\n"); @@ -721,21 +731,21 @@ void core9_print(const char *name, const char *contents){ // Functions with the same form starting with U_EMRPOLYPOLYLINE16_print void core10_print(const char *name, const char *contents){ - unsigned i; + UNUSED(name); + unsigned int i; PU_EMRPOLYPOLYLINE16 pEmr = (PU_EMRPOLYPOLYLINE16) (contents); - (void) name; printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" nPolys: %d\n",pEmr->nPolys ); printf(" cpts: %d\n",pEmr->cpts ); printf(" Counts: "); for(i=0;inPolys; i++){ - printf(" [%u]:%d ",i,pEmr->aPolyCounts[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); for(i=0; icpts; i++){ - printf(" [%u]:",i); point16_print(papts[i]); + printf(" [%d]:",i); point16_print(papts[i]); } printf("\n"); @@ -743,17 +753,17 @@ 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){ - unsigned i,roff; + UNUSED(name); + unsigned int i,roff; PU_EMRINVERTRGN pEmr = (PU_EMRINVERTRGN) (contents); - (void) name; 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 + 28 < pEmr->emr.nSize){ // up to the end of the record - printf(" RegionData:%u",i); + 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"); @@ -763,8 +773,8 @@ void core11_print(const char *name, const char *contents){ // common code for U_EMRCREATEMONOBRUSH_print and U_EMRCREATEDIBPATTERNBRUSHPT_print, void core12_print(const char *name, const char *contents){ + UNUSED(name); PU_EMRCREATEMONOBRUSH pEmr = (PU_EMRCREATEMONOBRUSH) (contents); - (void) name; printf(" ihBrush: %u\n",pEmr->ihBrush ); printf(" iUsage : %u\n",pEmr->iUsage ); printf(" offBmi : %u\n",pEmr->offBmi ); @@ -780,8 +790,8 @@ void core12_print(const char *name, const char *contents){ // common code for U_EMRALPHABLEND_print and U_EMRTRANSPARENTBLT_print, void core13_print(const char *name, const char *contents){ + UNUSED(name); PU_EMRALPHABLEND pEmr = (PU_EMRALPHABLEND) (contents); - (void) name; printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n"); printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n"); @@ -814,8 +824,8 @@ They are listed in order by the corresponding U_EMR_* index number. \param contents pointer to a buffer holding all EMR records */ void U_EMRNOTIMPLEMENTED_print(const char *name, const char *contents){ - (void) name; - (void) contents; + UNUSED(name); + UNUSED(contents); printf(" Not Implemented!\n"); } @@ -1016,7 +1026,7 @@ void U_EMRSETPIXELV_print(const char *contents){ */ void U_EMRSETMAPPERFLAGS_print(const char *contents){ PU_EMRSETMAPPERFLAGS pEmr = (PU_EMRSETMAPPERFLAGS)(contents); - printf(" dwFlags: %u\n",pEmr->dwFlags); + printf(" dwFlags: 0x%8.8X\n",pEmr->dwFlags); } @@ -1128,7 +1138,7 @@ void U_EMRMOVETOEX_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRSETMETARGN_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMREXCLUDECLIPRECT 29 @@ -1174,7 +1184,7 @@ void U_EMRSCALEWINDOWEXTEX_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRSAVEDC_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRRESTOREDC 34 @@ -1353,7 +1363,7 @@ void U_EMRCREATEPALETTE_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRSETPALETTEENTRIES_print(const char *contents){ - unsigned i; + unsigned int i; PU_EMRSETPALETTEENTRIES pEmr = (PU_EMRSETPALETTEENTRIES)(contents); printf(" ihPal: %u\n",pEmr->ihPal); printf(" iStart: %u\n",pEmr->iStart); @@ -1362,7 +1372,7 @@ void U_EMRSETPALETTEENTRIES_print(const char *contents){ printf(" PLTEntries:"); PU_LOGPLTNTRY aPalEntries = (PU_LOGPLTNTRY) &(pEmr->aPalEntries); for(i=0; icEntries; i++){ - printf("%u:",i); logpltntry_print(aPalEntries[i]); + printf("%d:",i); logpltntry_print(aPalEntries[i]); } printf("\n"); } @@ -1383,7 +1393,7 @@ void U_EMRRESIZEPALETTE_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRREALIZEPALETTE_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMREXTFLOODFILL 53 @@ -1422,19 +1432,19 @@ void U_EMRARCTO_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRPOLYDRAW_print(const char *contents){ - unsigned i; + unsigned int i; PU_EMRPOLYDRAW pEmr = (PU_EMRPOLYDRAW)(contents); printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" cptl: %d\n",pEmr->cptl ); printf(" Points: "); for(i=0;icptl; i++){ - printf(" [%u]:",i); + printf(" [%d]:",i); pointl_print(pEmr->aptl[i]); } printf("\n"); printf(" Types: "); for(i=0;icptl; i++){ - printf(" [%u]:%u ",i,pEmr->abTypes[i]); + printf(" [%d]:%u ",i,pEmr->abTypes[i]); } printf("\n"); } @@ -1464,7 +1474,7 @@ void U_EMRSETMITERLIMIT_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRBEGINPATH_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRENDPATH 60 @@ -1473,7 +1483,7 @@ void U_EMRBEGINPATH_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRENDPATH_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRCLOSEFIGURE 61 @@ -1482,7 +1492,7 @@ void U_EMRENDPATH_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRCLOSEFIGURE_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRFILLPATH 62 @@ -1518,7 +1528,7 @@ void U_EMRSTROKEPATH_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRFLATTENPATH_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRWIDENPATH 66 @@ -1527,7 +1537,7 @@ void U_EMRFLATTENPATH_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRWIDENPATH_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRSELECTCLIPPATH 67 @@ -1545,41 +1555,57 @@ void U_EMRSELECTCLIPPATH_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRABORTPATH_print(const char *contents){ - (void) contents; + UNUSED(contents); } // U_EMRUNDEF69 69 -#define U_EMRUNDEF69_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRUNDEF69",A) +#define U_EMRUNDEF69_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRUNDEF69",A) //!< Not implemented. // U_EMRCOMMENT 70 Comment (any binary data, interpretation is program specific) /** \brief Print a pointer to a U_EMR_COMMENT record. - \param contents pointer to a buffer holding all EMR records + \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 + + EMF+ records, if any, are stored in EMF comment records. */ -void U_EMRCOMMENT_print(const char *contents){ +void U_EMRCOMMENT_print(const char *contents, const char *blimit, size_t off){ char *string; char *src; - uint32_t cIdent,cbData; - PU_EMRCOMMENT pEmr = (PU_EMRCOMMENT)(contents); + uint32_t cIdent,cIdent2,cbData; + size_t loff; + int recsize; + static int recnum=0; + + PU_EMRCOMMENT pEmr = (PU_EMRCOMMENT)(contents); /* There are several different types of comments */ cbData = pEmr->cbData; printf(" cbData: %d\n",cbData ); - src = (char *)(&pEmr->Data); // default + 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 + 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; - printf(" pcIdent: %8.8x\n",pEmrp->pcIdent); + cIdent2 = pEmrp->pcIdent; + if(U_BYTE_SWAP){ U_swap4(&(cIdent2),1); } + printf(" pcIdent: 0x%8.8x\n",cIdent2); src = (char *)&(pEmrp->Data); cbData -= 8; } else if(cIdent == U_EMR_COMMENT_SPOOL ){ printf(" cIdent: Spool\n"); PU_EMRCOMMENT_SPOOL pEmrs = (PU_EMRCOMMENT_SPOOL) pEmr; - printf(" esrIdent: %8.8x\n",pEmrs->esrIdent); + cIdent2 = pEmrs->esrIdent; + if(U_BYTE_SWAP){ U_swap4(&(cIdent2),1); } + printf(" esrIdent: 0x%8.8x\n",cIdent2); src = (char *)&(pEmrs->Data); cbData -= 8; } @@ -1587,7 +1613,15 @@ void U_EMRCOMMENT_print(const char *contents){ printf(" cIdent: EMF+\n"); PU_EMRCOMMENT_EMFPLUS pEmrpl = (PU_EMRCOMMENT_EMFPLUS) pEmr; src = (char *)&(pEmrpl->Data); - cbData -= 4; + 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; + loff += recsize; + src += recsize; + recnum++; + } + return; } else { printf(" cIdent: not (Public or Spool or EMF+)\n"); @@ -1600,7 +1634,6 @@ void U_EMRCOMMENT_print(const char *contents){ printf(" Data: <%s>\n",string); free(string); } - } // U_EMRFILLRGN 71 @@ -1609,7 +1642,7 @@ void U_EMRCOMMENT_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRFILLRGN_print(const char *contents){ - unsigned i,roff; + int i,roff; PU_EMRFILLRGN pEmr = (PU_EMRFILLRGN)(contents); printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" cbRgnData: %u\n",pEmr->cbRgnData); @@ -1618,8 +1651,8 @@ void U_EMRFILLRGN_print(const char *contents){ roff=0; i=1; char *prd = (char *) &(pEmr->RgnData); - while(roff + 28 < pEmr->emr.nSize){ // up to the end of the record - printf(" RegionData[%u]: ",i); rgndata_print((PU_RGNDATA) (prd + roff)); printf("\n"); + 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); } } @@ -1630,7 +1663,7 @@ void U_EMRFILLRGN_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRFRAMERGN_print(const char *contents){ - unsigned i,roff; + int i,roff; PU_EMRFRAMERGN pEmr = (PU_EMRFRAMERGN)(contents); printf(" rclBounds: "); rectl_print(pEmr->rclBounds); printf("\n"); printf(" cbRgnData: %u\n",pEmr->cbRgnData); @@ -1640,8 +1673,8 @@ void U_EMRFRAMERGN_print(const char *contents){ roff=0; i=1; char *prd = (char *) &(pEmr->RgnData); - while(roff + 28 < pEmr->emr.nSize){ // up to the end of the record - printf(" RegionData[%u]: ",i); rgndata_print((PU_RGNDATA) (prd + roff)); printf("\n"); + 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); } } @@ -1670,14 +1703,14 @@ void U_EMRPAINTRGN_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMREXTSELECTCLIPRGN_print(const char *contents){ - unsigned i,roff; + int i,roff; PU_EMREXTSELECTCLIPRGN pEmr = (PU_EMREXTSELECTCLIPRGN) (contents); 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 + 16 < pEmr->emr.nSize){ // stop at end of the record + 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); } @@ -1693,7 +1726,7 @@ void U_EMRBITBLT_print(const char *contents){ printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n"); printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n"); - printf(" dwRop : %u\n", pEmr->dwRop ); + printf(" dwRop : 0x%8.8X\n", pEmr->dwRop ); printf(" Src: "); pointl_print(pEmr->Src); printf("\n"); printf(" xformSrc: "); xform_print( pEmr->xformSrc); printf("\n"); printf(" crBkColorSrc: "); colorref_print( pEmr->crBkColorSrc); printf("\n"); @@ -1719,7 +1752,7 @@ void U_EMRSTRETCHBLT_print(const char *contents){ printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n"); printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n"); - printf(" dwRop : %u\n", pEmr->dwRop ); + printf(" dwRop : 0x%8.8X\n", pEmr->dwRop ); printf(" Src: "); pointl_print(pEmr->Src); printf("\n"); printf(" xformSrc: "); xform_print( pEmr->xformSrc); printf("\n"); printf(" crBkColorSrc: "); colorref_print( pEmr->crBkColorSrc); printf("\n"); @@ -1746,7 +1779,7 @@ void U_EMRMASKBLT_print(const char *contents){ printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" Dest: "); pointl_print(pEmr->Dest); printf("\n"); printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n"); - printf(" dwRop : %u\n", pEmr->dwRop ); + printf(" dwRop : 0x%8.8X\n", pEmr->dwRop ); printf(" Src: "); pointl_print(pEmr->Src); printf("\n"); printf(" xformSrc: "); xform_print( pEmr->xformSrc); printf("\n"); printf(" crBkColorSrc: "); colorref_print( pEmr->crBkColorSrc); printf("\n"); @@ -1857,7 +1890,7 @@ void U_EMRSTRETCHDIBITS_print(const char *contents){ printf(" offBitsSrc: %u\n", pEmr->offBitsSrc ); printf(" cbBitsSrc: %u\n", pEmr->cbBitsSrc ); printf(" iUsageSrc: %u\n", pEmr->iUsageSrc ); - printf(" dwRop : %u\n", pEmr->dwRop ); + printf(" dwRop : 0x%8.8X\n", pEmr->dwRop ); printf(" cDest: "); pointl_print(pEmr->cDest); printf("\n"); } @@ -1967,19 +2000,19 @@ void U_EMRPOLYPOLYGON16_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRPOLYDRAW16_print(const char *contents){ - unsigned i; + unsigned int i; PU_EMRPOLYDRAW16 pEmr = (PU_EMRPOLYDRAW16)(contents); printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" cpts: %d\n",pEmr->cpts ); printf(" Points: "); for(i=0;icpts; i++){ - printf(" [%u]:",i); + printf(" [%d]:",i); point16_print(pEmr->apts[i]); } printf("\n"); printf(" Types: "); for(i=0;icpts; i++){ - printf(" [%u]:%u ",i,pEmr->abTypes[i]); + printf(" [%d]:%u ",i,pEmr->abTypes[i]); } printf("\n"); } @@ -2024,9 +2057,9 @@ void U_EMREXTCREATEPEN_print(const char *contents){ } // U_EMRPOLYTEXTOUTA 96 NOT IMPLEMENTED, denigrated after Windows NT -#define U_EMRPOLYTEXTOUTA_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRPOLYTEXTOUTA",A) +#define U_EMRPOLYTEXTOUTA_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRPOLYTEXTOUTA",A) //!< Not implemented. // U_EMRPOLYTEXTOUTW 97 NOT IMPLEMENTED, denigrated after Windows NT -#define U_EMRPOLYTEXTOUTW_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRPOLYTEXTOUTW",A) +#define U_EMRPOLYTEXTOUTW_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRPOLYTEXTOUTW",A) //!< Not implemented. // U_EMRSETICMMODE 98 /** @@ -2067,9 +2100,9 @@ void U_EMRDELETECOLORSPACE_print(const char *contents){ } // U_EMRGLSRECORD 102 Not implemented -#define U_EMRGLSRECORD_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRGLSRECORD",A) +#define U_EMRGLSRECORD_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRGLSRECORD",A) //!< Not implemented. // U_EMRGLSBOUNDEDRECORD 103 Not implemented -#define U_EMRGLSBOUNDEDRECORD_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRGLSBOUNDEDRECORD",A) +#define U_EMRGLSBOUNDEDRECORD_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRGLSBOUNDEDRECORD",A) //!< Not implemented. // U_EMRPIXELFORMAT 104 /** @@ -2082,11 +2115,11 @@ void U_EMRPIXELFORMAT_print(const char *contents){ } // U_EMRDRAWESCAPE 105 Not implemented -#define U_EMRDRAWESCAPE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRDRAWESCAPE",A) +#define U_EMRDRAWESCAPE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRDRAWESCAPE",A) //!< Not implemented. // U_EMREXTESCAPE 106 Not implemented -#define U_EMREXTESCAPE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMREXTESCAPE",A) +#define U_EMREXTESCAPE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMREXTESCAPE",A) //!< Not implemented. // U_EMRUNDEF107 107 Not implemented -#define U_EMRUNDEF107_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRUNDEF107",A) +#define U_EMRUNDEF107_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRUNDEF107",A) //!< Not implemented. // U_EMRSMALLTEXTOUT 108 /** @@ -2119,15 +2152,15 @@ void U_EMRSMALLTEXTOUT_print(const char *contents){ } // U_EMRFORCEUFIMAPPING 109 Not implemented -#define U_EMRFORCEUFIMAPPING_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRFORCEUFIMAPPING",A) +#define U_EMRFORCEUFIMAPPING_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRFORCEUFIMAPPING",A) //!< Not implemented. // U_EMRNAMEDESCAPE 110 Not implemented -#define U_EMRNAMEDESCAPE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRNAMEDESCAPE",A) +#define U_EMRNAMEDESCAPE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRNAMEDESCAPE",A) //!< Not implemented. // U_EMRCOLORCORRECTPALETTE 111 Not implemented -#define U_EMRCOLORCORRECTPALETTE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRCOLORCORRECTPALETTE",A) +#define U_EMRCOLORCORRECTPALETTE_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRCOLORCORRECTPALETTE",A) //!< Not implemented. // U_EMRSETICMPROFILEA 112 Not implemented -#define U_EMRSETICMPROFILEA_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRSETICMPROFILEA",A) +#define U_EMRSETICMPROFILEA_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRSETICMPROFILEA",A) //!< Not implemented. // U_EMRSETICMPROFILEW 113 Not implemented -#define U_EMRSETICMPROFILEW_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRSETICMPROFILEW",A) +#define U_EMRSETICMPROFILEW_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRSETICMPROFILEW",A) //!< Not implemented. // U_EMRALPHABLEND 114 /** @@ -2157,14 +2190,14 @@ void U_EMRTRANSPARENTBLT_print(const char *contents){ } // U_EMRUNDEF117 117 Not implemented -#define U_EMRUNDEF117_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRUNDEF117",A) +#define U_EMRUNDEF117_print(A) U_EMRNOTIMPLEMENTED_print("U_EMRUNDEF117",A) //!< Not implemented. // U_EMRGRADIENTFILL 118 /** \brief Print a pointer to a U_EMR_GRADIENTFILL record. \param contents pointer to a buffer holding all EMR records */ void U_EMRGRADIENTFILL_print(const char *contents){ - unsigned i; + unsigned int i; PU_EMRGRADIENTFILL pEmr = (PU_EMRGRADIENTFILL)(contents); printf(" rclBounds: "); rectl_print( pEmr->rclBounds); printf("\n"); printf(" nTriVert: %u\n", pEmr->nTriVert ); @@ -2197,11 +2230,11 @@ void U_EMRGRADIENTFILL_print(const char *contents){ } // U_EMRSETLINKEDUFIS 119 Not implemented -#define U_EMRSETLINKEDUFIS_print(A) U_EMRNOTIMPLEMENTED_print("U_EMR_SETLINKEDUFIS",A) +#define U_EMRSETLINKEDUFIS_print(A) U_EMRNOTIMPLEMENTED_print("U_EMR_SETLINKEDUFIS",A) //!< Not implemented. // U_EMRSETTEXTJUSTIFICATION120 Not implemented (denigrated) -#define U_EMRSETTEXTJUSTIFICATION_print(A) U_EMRNOTIMPLEMENTED_print("U_EMR_SETTEXTJUSTIFICATION",A) +#define U_EMRSETTEXTJUSTIFICATION_print(A) U_EMRNOTIMPLEMENTED_print("U_EMR_SETTEXTJUSTIFICATION",A) //!< Not implemented. // U_EMRCOLORMATCHTOTARGETW 121 Not implemented -#define U_EMRCOLORMATCHTOTARGETW_print(A) U_EMRNOTIMPLEMENTED_print("U_EMR_COLORMATCHTOTARGETW",A) +#define U_EMRCOLORMATCHTOTARGETW_print(A) U_EMRNOTIMPLEMENTED_print("U_EMR_COLORMATCHTOTARGETW",A) //!< Not implemented. // U_EMRCREATECOLORSPACEW 122 /** @@ -2209,16 +2242,16 @@ void U_EMRGRADIENTFILL_print(const char *contents){ \param contents pointer to a buffer holding all EMR records */ void U_EMRCREATECOLORSPACEW_print(const char *contents){ - unsigned i; + unsigned int i; PU_EMRCREATECOLORSPACEW pEmr = (PU_EMRCREATECOLORSPACEW)(contents); printf(" ihCS: %u\n", pEmr->ihCS ); printf(" ColorSpace: "); logcolorspacew_print(pEmr->lcs); printf("\n"); - printf(" dwFlags: %u\n", pEmr->dwFlags ); + printf(" dwFlags: 0x%8.8X\n", pEmr->dwFlags ); printf(" cbData: %u\n", pEmr->cbData ); - printf(" Data: "); + printf(" Data(hexvalues):"); if(pEmr->dwFlags & 1){ for(i=0; icbData; i++){ - printf("[%u]:%2.2X ",i,pEmr->Data[i]); + printf("[%d]:%2.2X ",i,pEmr->Data[i]); } } printf("\n"); @@ -2234,9 +2267,9 @@ 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 size; + unsigned int size; - printf("%-30srecord:%5d type:%3d offset:%8d size:%8d\n",U_emr_names(lpEMFR->iType),recnum,lpEMFR->iType,(int) off,lpEMFR->nSize); + 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; @@ -2317,7 +2350,7 @@ int U_emf_onerec_print(const char *contents, const char *blimit, int recnum, siz 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); 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; diff --git a/src/libuemf/uemf_print.h b/src/libuemf/uemf_print.h index 238e0e659..896de659e 100644 --- a/src/libuemf/uemf_print.h +++ b/src/libuemf/uemf_print.h @@ -1,5 +1,7 @@ /** - @file uemf_print.h Functions for printing records from EMF files. + @file uemf_print.h + + @brief Prototypes for functions for printing records from EMF files. */ /* @@ -18,6 +20,7 @@ Copyright: 2013 David Mathog and California Institute of Technology (Caltech) extern "C" { #endif +//! \cond /* prototypes for objects used in EMR records */ void hexbytes_print(uint8_t *buf,unsigned int num); void colorref_print(U_COLORREF color); @@ -55,112 +58,114 @@ void emrtext_print(const char *emt, const char *record, int type); /* prototypes for EMR records */ void U_EMRNOTIMPLEMENTED_print(const char *name, const char *contents, int recnum, int off); -void U_EMRHEADER_print(const char *contents, int recnum, int off); -void U_EMRPOLYBEZIER_print(const char *contents, int recnum, int off); -void U_EMRPOLYGON_print(const char *contents, int recnum, int off); -void U_EMRPOLYLINE_print(const char *contents, int recnum, int off); -void U_EMRPOLYBEZIERTO_print(const char *contents, int recnum, int off); -void U_EMRPOLYLINETO_print(const char *contents, int recnum, int off); -void U_EMRPOLYPOLYLINE_print(const char *contents, int recnum, int off); -void U_EMRPOLYPOLYGON_print(const char *contents, int recnum, int off); -void U_EMRSETWINDOWEXTEX_print(const char *contents, int recnum, int off); -void U_EMRSETWINDOWORGEX_print(const char *contents, int recnum, int off); -void U_EMRSETVIEWPORTEXTEX_print(const char *contents, int recnum, int off); -void U_EMRSETVIEWPORTORGEX_print(const char *contents, int recnum, int off); -void U_EMRSETBRUSHORGEX_print(const char *contents, int recnum, int off); -void U_EMREOF_print(const char *contents, int recnum, int off); -void U_EMRSETPIXELV_print(const char *contents, int recnum, int off); -void U_EMRSETMAPPERFLAGS_print(const char *contents, int recnum, int off); -void U_EMRSETMAPMODE_print(const char *contents, int recnum, int off); -void U_EMRSETBKMODE_print(const char *contents, int recnum, int off); -void U_EMRSETPOLYFILLMODE_print(const char *contents, int recnum, int off); -void U_EMRSETROP2_print(const char *contents, int recnum, int off); -void U_EMRSETSTRETCHBLTMODE_print(const char *contents, int recnum, int off); -void U_EMRSETTEXTALIGN_print(const char *contents, int recnum, int off); -void U_EMRSETCOLORADJUSTMENT_print(const char *contents, int recnum, int off); -void U_EMRSETTEXTCOLOR_print(const char *contents, int recnum, int off); -void U_EMRSETBKCOLOR_print(const char *contents, int recnum, int off); -void U_EMROFFSETCLIPRGN_print(const char *contents, int recnum, int off); -void U_EMRMOVETOEX_print(const char *contents, int recnum, int off); -void U_EMRSETMETARGN_print(const char *contents, int recnum, int off); -void U_EMREXCLUDECLIPRECT_print(const char *contents, int recnum, int off); -void U_EMRINTERSECTCLIPRECT_print(const char *contents, int recnum, int off); -void U_EMRSCALEVIEWPORTEXTEX_print(const char *contents, int recnum, int off); -void U_EMRSCALEWINDOWEXTEX_print(const char *contents, int recnum, int off); -void U_EMRSAVEDC_print(const char *contents, int recnum, int off); -void U_EMRRESTOREDC_print(const char *contents, int recnum, int off); -void U_EMRSETWORLDTRANSFORM_print(const char *contents, int recnum, int off); -void U_EMRMODIFYWORLDTRANSFORM_print(const char *contents, int recnum, int off); -void U_EMRSELECTOBJECT_print(const char *contents, int recnum, int off); -void U_EMRCREATEPEN_print(const char *contents, int recnum, int off); -void U_EMRCREATEBRUSHINDIRECT_print(const char *contents, int recnum, int off); -void U_EMRDELETEOBJECT_print(const char *contents, int recnum, int off); -void U_EMRANGLEARC_print(const char *contents, int recnum, int off); -void U_EMRELLIPSE_print(const char *contents, int recnum, int off); -void U_EMRRECTANGLE_print(const char *contents, int recnum, int off); -void U_EMRROUNDRECT_print(const char *contents, int recnum, int off); -void U_EMRARC_print(const char *contents, int recnum, int off); -void U_EMRCHORD_print(const char *contents, int recnum, int off); -void U_EMRPIE_print(const char *contents, int recnum, int off); -void U_EMRSELECTPALETTE_print(const char *contents, int recnum, int off); -void U_EMRCREATEPALETTE_print(const char *contents, int recnum, int off); -void U_EMRSETPALETTEENTRIES_print(const char *contents, int recnum, int off); -void U_EMRRESIZEPALETTE_print(const char *contents, int recnum, int off); -void U_EMRREALIZEPALETTE_print(const char *contents, int recnum, int off); -void U_EMREXTFLOODFILL_print(const char *contents, int recnum, int off); -void U_EMRLINETO_print(const char *contents, int recnum, int off); -void U_EMRARCTO_print(const char *contents, int recnum, int off); -void U_EMRPOLYDRAW_print(const char *contents, int recnum, int off); -void U_EMRSETARCDIRECTION_print(const char *contents, int recnum, int off); -void U_EMRSETMITERLIMIT_print(const char *contents, int recnum, int off); -void U_EMRBEGINPATH_print(const char *contents, int recnum, int off); -void U_EMRENDPATH_print(const char *contents, int recnum, int off); -void U_EMRCLOSEFIGURE_print(const char *contents, int recnum, int off); -void U_EMRFILLPATH_print(const char *contents, int recnum, int off); -void U_EMRSTROKEANDFILLPATH_print(const char *contents, int recnum, int off); -void U_EMRSTROKEPATH_print(const char *contents, int recnum, int off); -void U_EMRFLATTENPATH_print(const char *contents, int recnum, int off); -void U_EMRWIDENPATH_print(const char *contents, int recnum, int off); -void U_EMRSELECTCLIPPATH_print(const char *contents, int recnum, int off); -void U_EMRABORTPATH_print(const char *contents, int recnum, int off); -void U_EMRCOMMENT_print(const char *contents, int recnum, int off); -void U_EMRFILLRGN_print(const char *contents, int recnum, int off); -void U_EMRFRAMERGN_print(const char *contents, int recnum, int off); -void U_EMRINVERTRGN_print(const char *contents, int recnum, int off); -void U_EMRPAINTRGN_print(const char *contents, int recnum, int off); -void U_EMREXTSELECTCLIPRGN_print(const char *contents, int recnum, int off); -void U_EMRBITBLT_print(const char *contents, int recnum, int off); -void U_EMRSTRETCHBLT_print(const char *contents, int recnum, int off); -void U_EMRMASKBLT_print(const char *contents, int recnum, int off); -void U_EMRPLGBLT_print(const char *contents, int recnum, int off); -void U_EMRSETDIBITSTODEVICE_print(const char *contents, int recnum, int off); -void U_EMRSTRETCHDIBITS_print(const char *contents, int recnum, int off); -void U_EMREXTCREATEFONTINDIRECTW_print(const char *contents, int recnum, int off); -void U_EMREXTTEXTOUTA_print(const char *contents, int recnum, int off); -void U_EMREXTTEXTOUTW_print(const char *contents, int recnum, int off); -void U_EMRPOLYBEZIER16_print(const char *contents, int recnum, int off); -void U_EMRPOLYGON16_print(const char *contents, int recnum, int off); -void U_EMRPOLYLINE16_print(const char *contents, int recnum, int off); -void U_EMRPOLYBEZIERTO16_print(const char *contents, int recnum, int off); -void U_EMRPOLYLINETO16_print(const char *contents, int recnum, int off); -void U_EMRPOLYPOLYLINE16_print(const char *contents, int recnum, int off); -void U_EMRPOLYPOLYGON16_print(const char *contents, int recnum, int off); -void U_EMRPOLYDRAW16_print(const char *contents, int recnum, int off); -void U_EMRCREATEMONOBRUSH_print(const char *contents, int recnum, int off); -void U_EMRCREATEDIBPATTERNBRUSHPT_print(const char *contents, int recnum, int off); -void U_EMREXTCREATEPEN_print(const char *contents, int recnum, int off); -void U_EMRSETICMMODE_print(const char *contents, int recnum, int off); -void U_EMRCREATECOLORSPACE_print(const char *contents, int recnum, int off); -void U_EMRSETCOLORSPACE_print(const char *contents, int recnum, int off); -void U_EMRDELETECOLORSPACE_print(const char *contents, int recnum, int off); -void U_EMRPIXELFORMAT_print(const char *contents, int recnum, int off); -void U_EMRSMALLTEXTOUT_print(const char *contents, int recnum, int off); -void U_EMRALPHABLEND_print(const char *contents, int recnum, int off); -void U_EMRSETLAYOUT_print(const char *contents, int recnum, int off); -void U_EMRTRANSPARENTBLT_print(const char *contents, int recnum, int off); -void U_EMRGRADIENTFILL_print(const char *contents, int recnum, int off); -void U_EMRCREATECOLORSPACEW_print(const char *contents, int recnum, int off); +void U_EMRHEADER_print(const char *contents); +void U_EMRPOLYBEZIER_print(const char *contents); +void U_EMRPOLYGON_print(const char *contents); +void U_EMRPOLYLINE_print(const char *contents); +void U_EMRPOLYBEZIERTO_print(const char *contents); +void U_EMRPOLYLINETO_print(const char *contents); +void U_EMRPOLYPOLYLINE_print(const char *contents); +void U_EMRPOLYPOLYGON_print(const char *contents); +void U_EMRSETWINDOWEXTEX_print(const char *contents); +void U_EMRSETWINDOWORGEX_print(const char *contents); +void U_EMRSETVIEWPORTEXTEX_print(const char *contents); +void U_EMRSETVIEWPORTORGEX_print(const char *contents); +void U_EMRSETBRUSHORGEX_print(const char *contents); +void U_EMREOF_print(const char *contents); +void U_EMRSETPIXELV_print(const char *contents); +void U_EMRSETMAPPERFLAGS_print(const char *contents); +void U_EMRSETMAPMODE_print(const char *contents); +void U_EMRSETBKMODE_print(const char *contents); +void U_EMRSETPOLYFILLMODE_print(const char *contents); +void U_EMRSETROP2_print(const char *contents); +void U_EMRSETSTRETCHBLTMODE_print(const char *contents); +void U_EMRSETTEXTALIGN_print(const char *contents); +void U_EMRSETCOLORADJUSTMENT_print(const char *contents); +void U_EMRSETTEXTCOLOR_print(const char *contents); +void U_EMRSETBKCOLOR_print(const char *contents); +void U_EMROFFSETCLIPRGN_print(const char *contents); +void U_EMRMOVETOEX_print(const char *contents); +void U_EMRSETMETARGN_print(const char *contents); +void U_EMREXCLUDECLIPRECT_print(const char *contents); +void U_EMRINTERSECTCLIPRECT_print(const char *contents); +void U_EMRSCALEVIEWPORTEXTEX_print(const char *contents); +void U_EMRSCALEWINDOWEXTEX_print(const char *contents); +void U_EMRSAVEDC_print(const char *contents); +void U_EMRRESTOREDC_print(const char *contents); +void U_EMRSETWORLDTRANSFORM_print(const char *contents); +void U_EMRMODIFYWORLDTRANSFORM_print(const char *contents); +void U_EMRSELECTOBJECT_print(const char *contents); +void U_EMRCREATEPEN_print(const char *contents); +void U_EMRCREATEBRUSHINDIRECT_print(const char *contents); +void U_EMRDELETEOBJECT_print(const char *contents); +void U_EMRANGLEARC_print(const char *contents); +void U_EMRELLIPSE_print(const char *contents); +void U_EMRRECTANGLE_print(const char *contents); +void U_EMRROUNDRECT_print(const char *contents); +void U_EMRARC_print(const char *contents); +void U_EMRCHORD_print(const char *contents); +void U_EMRPIE_print(const char *contents); +void U_EMRSELECTPALETTE_print(const char *contents); +void U_EMRCREATEPALETTE_print(const char *contents); +void U_EMRSETPALETTEENTRIES_print(const char *contents); +void U_EMRRESIZEPALETTE_print(const char *contents); +void U_EMRREALIZEPALETTE_print(const char *contents); +void U_EMREXTFLOODFILL_print(const char *contents); +void U_EMRLINETO_print(const char *contents); +void U_EMRARCTO_print(const char *contents); +void U_EMRPOLYDRAW_print(const char *contents); +void U_EMRSETARCDIRECTION_print(const char *contents); +void U_EMRSETMITERLIMIT_print(const char *contents); +void U_EMRBEGINPATH_print(const char *contents); +void U_EMRENDPATH_print(const char *contents); +void U_EMRCLOSEFIGURE_print(const char *contents); +void U_EMRFILLPATH_print(const char *contents); +void U_EMRSTROKEANDFILLPATH_print(const char *contents); +void U_EMRSTROKEPATH_print(const char *contents); +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_EMRFILLRGN_print(const char *contents); +void U_EMRFRAMERGN_print(const char *contents); +void U_EMRINVERTRGN_print(const char *contents); +void U_EMRPAINTRGN_print(const char *contents); +void U_EMREXTSELECTCLIPRGN_print(const char *contents); +void U_EMRBITBLT_print(const char *contents); +void U_EMRSTRETCHBLT_print(const char *contents); +void U_EMRMASKBLT_print(const char *contents); +void U_EMRPLGBLT_print(const char *contents); +void U_EMRSETDIBITSTODEVICE_print(const char *contents); +void U_EMRSTRETCHDIBITS_print(const char *contents); +void U_EMREXTCREATEFONTINDIRECTW_print(const char *contents); +void U_EMREXTTEXTOUTA_print(const char *contents); +void U_EMREXTTEXTOUTW_print(const char *contents); +void U_EMRPOLYBEZIER16_print(const char *contents); +void U_EMRPOLYGON16_print(const char *contents); +void U_EMRPOLYLINE16_print(const char *contents); +void U_EMRPOLYBEZIERTO16_print(const char *contents); +void U_EMRPOLYLINETO16_print(const char *contents); +void U_EMRPOLYPOLYLINE16_print(const char *contents); +void U_EMRPOLYPOLYGON16_print(const char *contents); +void U_EMRPOLYDRAW16_print(const char *contents); +void U_EMRCREATEMONOBRUSH_print(const char *contents); +void U_EMRCREATEDIBPATTERNBRUSHPT_print(const char *contents); +void U_EMREXTCREATEPEN_print(const char *contents); +void U_EMRSETICMMODE_print(const char *contents); +void U_EMRCREATECOLORSPACE_print(const char *contents); +void U_EMRSETCOLORSPACE_print(const char *contents); +void U_EMRDELETECOLORSPACE_print(const char *contents); +void U_EMRPIXELFORMAT_print(const char *contents); +void U_EMRSMALLTEXTOUT_print(const char *contents); +void U_EMRALPHABLEND_print(const char *contents); +void U_EMRSETLAYOUT_print(const char *contents); +void U_EMRTRANSPARENTBLT_print(const char *contents); +void U_EMRGRADIENTFILL_print(const char *contents); +void U_EMRCREATECOLORSPACEW_print(const char *contents); int U_emf_onerec_print(const char *contents, char *blimit, int recnum, int off); +//! \endcond + #ifdef __cplusplus } diff --git a/src/libuemf/uemf_utf.c b/src/libuemf/uemf_utf.c index 48d2510f0..f329e74d9 100644 --- a/src/libuemf/uemf_utf.c +++ b/src/libuemf/uemf_utf.c @@ -1,5 +1,7 @@ /** - @file uemf_utf.c Functions for manipulating UTF and various types of text. + @file uemf_utf.c + + @brief Functions for manipulating UTF and various types of text. Compile with "U_VALGRIND" defined defined to enable code which lets valgrind check each record for @@ -32,10 +34,12 @@ extern "C" { #include // for U_ROUND() #include "uemf_utf.h" +//! \cond /* Prototypes for functions used here and defined in uemf_endian.c, but which are not supposed to be used in end user code. */ void U_swap2(void *ul, unsigned int count); +//! \endcond /* ******************************************************************************************** */ diff --git a/src/libuemf/uemf_utf.h b/src/libuemf/uemf_utf.h index e42de23e6..68452b687 100644 --- a/src/libuemf/uemf_utf.h +++ b/src/libuemf/uemf_utf.h @@ -1,5 +1,7 @@ /** - @file uemf_utf.h for manipulating UTF and various types of text. + @file uemf_utf.h + + @brief Prototypes for functions that manipulate UTF and various types of text. */ diff --git a/src/libuemf/upmf.c b/src/libuemf/upmf.c new file mode 100644 index 000000000..742b8b0f7 --- /dev/null +++ b/src/libuemf/upmf.c @@ -0,0 +1,8057 @@ +/** + @file upmf.c + + @brief Functions for manipulating EMF+ files and structures. + + EMF+ is much more object based than is EMF or WMF, so the U_PMR_*_set and most U_PMF_*_set functions + return a pointer to a PseudoObject. PseudoObjects are structs that contain a data field to hold the + object in EMF+ file byte order, size information, and some type information. This is sufficient to allow + complex records to be built up from the various sorts of nested objects which they normally contain. + If something goes wrong a NULL pointer is returned and recsize is set to 0. + + EMF+ does not use a separate set of endian functions, _get and _set routines convert from/to + the EMF+ file byte order on the fly. + + WARNING: Microsoft's EMF+ documentation is little-endian for everything EXCEPT + bitfields, which are big-endian. See EMF+ manual section 1.3.2 + That documentation also uses 0 as the MOST significant bit, N-1 as the least. + This code is little-endian throughout, and 0 is the LEAST significant bit + +*/ + +/* +File: upmf.c +Version: 0.0.4 +Date: 27-NOV-2013 +Author: David Mathog, Biology Division, Caltech +email: mathog@caltech.edu +Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include +#include +#include +#include +#include +#include // for INT_MAX, INT_MIN +#include // for sin, cos, tan2, use U_ROUND() instead of roundf() +#include /* for offsetof() macro */ +#if 0 +#include //Not actually used, looking for collisions +#include //Not actually used, looking for collisions +#include //Not actually used, looking for collisions +#endif +#include "upmf.h" // includes uemf.h +#include "uemf_endian.h" // for U_swap* functions + +//! \cond + +/// things Doxygen should not process +/* remove this after debugging is completed */ +void dumphex(uint8_t *buf,unsigned int num){ + for(; num; num--,buf++){ + printf("%2.2X",*buf); + } +} + + +/* Prototypes for functions used here and defined in uemf_endian.c, but which are not supposed +to be used in end user code. */ + +void U_swap2(void *ul, unsigned int count); +void U_swap4(void *ul, unsigned int count); +//! \endcond + +/** + \brief Utility function for writing one or more EMF+ records in a PseudoObject to the EMF output file + \param po U_PSEUDO_OBJ to write + \param sum U_PSEUDO_OBJ to use for scratch space + \param et EMFTRACK used to write records to EMF file +*/ +void U_PMR_write(U_PSEUDO_OBJ *po, U_PSEUDO_OBJ *sum, EMFTRACK *et){ + char *rec; + sum->Used = 0; /* clean it out, retaining allocated memory */ + sum = U_PO_append(sum, "EMF+", 4); /* indicates that this comment holds an EMF+ record */ + sum = U_PO_append(sum, po->Data, po->Used); /* the EMF+ record itself */ + rec = U_EMRCOMMENT_set(sum->Used, sum->Data); /* stuff it into the EMF comment */ + (void) emf_append((PU_ENHMETARECORD)rec, et, 1); /* write it to the EMF file */ + U_PO_free(&po); /* delete the PseudoObjects */ +} + +/** + \brief Utility function to draw a line. + \return 1 on success, 0 on error. + \param PenID Index of U_PMF_PEN object to use in the EMF+ object table (0-63, inclusive) + \param PathID Index of U_PMF_PATH object to use in the EMF+ object table (0-63, inclusive) + \param Start U_PMF_POINTF coordinates of start of line. + \param End U_PMF_POINTF coordinates of end of line. + \param Dashed Set if the line is dashed, clear if it is not. + \param sum PseudoObject used for scratch space + \param et EMFTRACK used to write records to EMF file + +*/ +int U_PMR_drawline(uint32_t PenID, uint32_t PathID, U_PMF_POINTF Start, U_PMF_POINTF End, int Dashed, U_PSEUDO_OBJ *sum, EMFTRACK *et){ + U_DPSEUDO_OBJ *dpath; + U_PSEUDO_OBJ *poPath; + U_PSEUDO_OBJ *po; + int status=0; + int PTP_value = ( Dashed ? U_PTP_DashMode : U_PTP_None); + dpath = U_PATH_create(0, NULL, 0, 0); /* create an empty path*/ + if(dpath){ + if(U_PATH_moveto(dpath, Start, PTP_value) && U_PATH_lineto(dpath, End, PTP_value)){ + poPath = U_PMF_PATH_set2(U_PMF_GRAPHICSVERSIONOBJ_set(2), dpath); + if(poPath){ + po = U_PMR_OBJECT_PO_set(PathID, poPath); + U_PO_free(&poPath); + if(po){ + U_PMR_write(po, sum, et); + po = U_PMR_DRAWPATH_set(PathID, PenID); + if(po){ + U_PMR_write(po, sum, et); + status = 1; + } + } + } + } + U_DPO_free(&dpath); + } + return(status); +} + +/** + \brief Utility function for drawing strings onto the baseline in one call. + \return 1 on success, 0 on error. + \param string Text to draw in UTF-8 format + \param Vpos StringAlignment Enumeration. Always drawn on baseline, but using one of these three modes. + \param FontID Index of U_PMF_FONT object to use in the EMF+ object table (0-63, inclusive) + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param FormatID index of U_PMF_STRINGFORMAT object to use in the EMF+ Object Table. + \param Sfs StringFormat structure. Ignored values: StringAlignment, LineAlign, Flags + \param FontName Name of font to draw with + \param Height Height of font in pixels (positive) + \param fip U_FontInfoParams (ascent, descent, and so forth) + \param FontFlags FontStyle Flags + \param x X position in pixels of left side of EM box of first character + \param y Y position in pixels of baseline of first character + \param sum PseudoObject used for scratch space + \param et EMFTRACK used to write records to EMF file + + EMF+ manual 2.3.4.14, Microsoft name: EmfPlusDrawString Record, Index 0x1C + + For most fonts Ascent and Descent are used to adjust the bounding box to properly position the + baseline. Some fonts, like Verdana, are strange and they position the baseline on the bottom of + the bounding box if that box has the same height as the font. For those fonts specify 0.0 for + both Ascent and Descent. +*/ +int U_PMR_drawstring( const char *string, int Vpos, uint32_t FontID, const U_PSEUDO_OBJ *BrushID, uint32_t FormatID, + U_PMF_STRINGFORMAT Sfs, const char *FontName, U_FLOAT Height, U_FontInfoParams *fip, uint32_t FontFlags, + U_FLOAT x, U_FLOAT y, U_PSEUDO_OBJ *sum, EMFTRACK *et){ + U_PSEUDO_OBJ *po; + U_PSEUDO_OBJ *poSF; + U_PSEUDO_OBJ *poFont; + U_PSEUDO_OBJ *poRect; + U_FLOAT rx,ry,rw,rh,rd; + uint16_t *UFontName; + uint16_t *Text16; + int slen; + int status = 0; + double aval, dval; + + Sfs.Flags = U_SF_NoFitBlackBox + U_SF_NoClip; + + if(Vpos < U_SA_Near || Vpos > U_SA_Far)return(0); + Sfs.StringAlignment = U_SA_Near; // Horizontal + Sfs.LineAlign = Vpos; // Vertical + + UFontName = U_Utf8ToUtf16le(FontName, 0, NULL); + slen = strlen(FontName); + poFont = U_PMF_FONT_set(U_PMF_GRAPHICSVERSIONOBJ_set(2), Height, U_UT_World, FontFlags, slen, UFontName); + if(poFont){ + po = U_PMR_OBJECT_PO_set(FontID, poFont); /* font to use */ + if(po){ + U_PMR_write(po, sum, et); + + poSF = U_PMF_STRINGFORMAT_set(&Sfs, NULL); + if(poSF){ + po = U_PMR_OBJECT_PO_set(FormatID, poSF); + U_PO_free(&poSF); + if(po){ + U_PMR_write(po, sum, et); + + rw = 4*Height*slen; /* This could probably be any value */ + rh = Height; + rx = x; + if(fip->LineGap > -fip->Descent){ aval = fip->yMax; } // sylfaen, palatino + else { aval = fip->Ascent; } // others + if(fip->LineGap && (fip->LineGap < -fip->Descent)){ dval = ((double) (fip->Descent - fip->LineGap)) / ((double) fip->EmSize); } //shruti and some others + else { dval = ((double) fip->Descent ) / ((double) fip->EmSize); } + switch(Vpos){ + case U_SA_Near: + rd = Height * aval / ((double) fip->EmSize); + break; + case U_SA_Center: + rd = 0.5 * ( Height * aval / ((double) fip->EmSize) + Height * ( 1.0 + dval)); + break; + case U_SA_Far: + rd = Height * ( 1.0 + dval); + break; + } + ry = y - rd; /* draw from upper left corner, which is shifted to put baseline on y */ + poRect = U_PMF_RECTF4_set(rx, ry, rw, rh); +#if 0 +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x-100, ry}, (U_PMF_POINTF){x+100, ry}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x-100, ry+rh}, (U_PMF_POINTF){x+100, ry+rh}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x-100, ry}, (U_PMF_POINTF){x-100, ry + Height * (double) fip->Ascent / ((double) fip->EmSize)}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x- 90, ry}, (U_PMF_POINTF){x- 90, ry - Height * (double) fip->Descent / ((double) fip->EmSize)}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x- 80, ry}, (U_PMF_POINTF){x- 80, ry + Height * (double) fip->yMax / ((double) fip->EmSize)}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x- 70, ry}, (U_PMF_POINTF){x- 70, ry - Height * (double) fip->yMin / ((double) fip->EmSize)}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x- 60, ry}, (U_PMF_POINTF){x- 60, ry + Height * (double) fip->LineGap / ((double) fip->EmSize)}, 0, sum, et); +(void) U_PMR_drawline(OBJ_PEN_BLACK_1,OBJ_PATH_1, (U_PMF_POINTF){x- 50, ry}, (U_PMF_POINTF){x- 50, ry + Height * ( 1.0 - (((double) (fip->LineGap - fip->Descent)) / ((double) fip->EmSize)) )}, 0, sum, et); +#endif + + Text16 = U_Utf8ToUtf16le(string, 0, NULL); + slen = strlen(string); + po = U_PMR_DRAWSTRING_set(FontID, BrushID, FormatID, slen, poRect, Text16); + if(po){ + U_PMR_write(po, sum, et); + status = 1; /* Success!!! */ + } + U_PO_free(&poRect); + free(Text16); + } + } + } + U_PO_free(&poFont); + } + free(UFontName); + return(status); +} + +/** + \brief Allocate and construct an array of U_POINT16 objects from a set of U_PMF_POINTF objects, endianness in and out is LE + \returns pointer to an array of U_POINT16 structures. + \param points pointer to the source U_POINT structures + \param count number of members in points + + If a coordinate is out of range it saturates at boundary. +*/ +U_PMF_POINT *POINTF_To_POINT16_LE(U_PMF_POINTF *points, int count){ + U_PMF_POINT *newpts; + U_PMF_POINTF ptfl; + int i; + newpts = (U_PMF_POINT *) malloc(count * sizeof(U_PMF_POINT)); + + for(i=0; i U_PMR_MAX){ idx = 0; } + static char *U_PMR_NAMES[U_PMR_MAX+1]={ + "U_PMR_INVALID", + "U_PMR_Header", + "U_PMR_EndOfFile", + "U_PMR_Comment", + "U_PMR_GetDC", + "U_PMR_MultiFormatStart", + "U_PMR_MultiFormatSection", + "U_PMR_MultiFormatEnd", + "U_PMR_Object", + "U_PMR_Clear", + "U_PMR_FillRects", + "U_PMR_DrawRects", + "U_PMR_FillPolygon", + "U_PMR_DrawLines", + "U_PMR_FillEllipse", + "U_PMR_DrawEllipse", + "U_PMR_FillPie", + "U_PMR_DrawPie", + "U_PMR_DrawArc", + "U_PMR_FillRegion", + "U_PMR_FillPath", + "U_PMR_DrawPath", + "U_PMR_FillClosedCurve", + "U_PMR_DrawClosedCurve", + "U_PMR_DrawCurve", + "U_PMR_DrawBeziers", + "U_PMR_DrawImage", + "U_PMR_DrawImagePoints", + "U_PMR_DrawString", + "U_PMR_SetRenderingOrigin", + "U_PMR_SetAntiAliasMode", + "U_PMR_SetTextRenderingHint", + "U_PMR_SetTextContrast", + "U_PMR_SetInterpolationMode", + "U_PMR_SetPixelOffsetMode", + "U_PMR_SetCompositingMode", + "U_PMR_SetCompositingQuality", + "U_PMR_Save", + "U_PMR_Restore", + "U_PMR_BeginContainer", + "U_PMR_BeginContainerNoParams", + "U_PMR_EndContainer", + "U_PMR_SetWorldTransform", + "U_PMR_ResetWorldTransform", + "U_PMR_MultiplyWorldTransform", + "U_PMR_TranslateWorldTransform", + "U_PMR_ScaleWorldTransform", + "U_PMR_RotateWorldTransform", + "U_PMR_SetPageTransform", + "U_PMR_ResetClip", + "U_PMR_SetClipRect", + "U_PMR_SetClipPath", + "U_PMR_SetClipRegion", + "U_PMR_OffsetClip", + "U_PMR_DrawDriverstring", + "U_PMR_StrokeFillPath", + "U_PMR_SerializableObject", + "U_PMR_SetTSGraphics", + "U_PMR_SetTSClip" + }; + return(U_PMR_NAMES[idx]); +} + +/** + \brief Convert from PseudoObject OID to ObjectType enumeration. + \returns OT value on success, 0 if no match + \param OID PseudoObject OID (based on EMF+ manual chapter number. ) + + Only OTs that may be stored in the EMF+ object table are supported. +*/ + +int U_OID_To_OT(uint32_t OID){ + int otype; + if( OID==U_PMF_BRUSH_OID ){ otype = U_OT_Brush; } + else if(OID==U_PMF_PEN_OID ){ otype = U_OT_Pen; } + else if(OID==U_PMF_PATH_OID ){ otype = U_OT_Path; } + else if(OID==U_PMF_REGION_OID ){ otype = U_OT_Region; } + else if(OID==U_PMF_IMAGE_OID ){ otype = U_OT_Image; } + else if(OID==U_PMF_FONT_OID ){ otype = U_OT_Font; } + else if(OID==U_PMF_STRINGFORMAT_OID ){ otype = U_OT_StringFormat; } + else if(OID==U_PMF_IMAGEATTRIBUTES_OID){ otype = U_OT_ImageAttributes; } + else if(OID==U_PMF_CUSTOMLINECAP_OID ){ otype = U_OT_CustomLineCap; } + else { otype = U_OT_Invalid; } + return(otype); +} + +/** + \brief Convert from PseudoObject OID to BrushType enumeration. + \returns BT value on success, -1 if no match + \param OID PseudoObject OID (based on EMF+ manual chapter number. ) + + Only OIDs that map to BT's are supported. +*/ + +int U_OID_To_BT(uint32_t OID){ + int otype; + if( OID==U_PMF_HATCHBRUSHDATA_OID ){ otype = U_BT_HatchFill; } + else if(OID==U_PMF_LINEARGRADIENTBRUSHDATA_OID ){ otype = U_BT_LinearGradient; } + else if(OID==U_PMF_PATHGRADIENTBRUSHDATA_OID ){ otype = U_BT_PathGradient; } + else if(OID==U_PMF_SOLIDBRUSHDATA_OID ){ otype = U_BT_SolidColor; } + else if(OID==U_PMF_TEXTUREBRUSHDATA_OID ){ otype = U_BT_TextureFill; } + else { otype = -1; } + return(otype); +} + +/** + \brief Convert from PseudoObject OID to CustomLineCapDataType Enumeration. + \returns BT value on success, -1 if no match + \param OID PseudoObject OID (based on EMF+ manual chapter number. ) + + Only OIDs that map to CLCDT's are supported. +*/ + +int U_OID_To_CLCDT(uint32_t OID){ + int otype; + if( OID==U_PMF_CUSTOMLINECAPDATA_OID ){ otype = U_CLCDT_Default; } + else if(OID==U_PMF_CUSTOMLINECAPARROWDATA_OID ){ otype = U_CLCDT_AdjustableArrow; } + else { otype = -1; } + return(otype); +} + +/** + \brief Convert from PseudoObject OID to ImageDataType Enumeration. + \returns BT value on success, -1 if no match + \param OID PseudoObject OID (based on EMF+ manual chapter number. ) + + Only OIDs that map to IDT's are supported. +*/ + +int U_OID_To_IDT(uint32_t OID){ + int otype; + if( OID==U_PMF_BITMAP_OID ){ otype = U_IDT_Bitmap; } + else if(OID==U_PMF_METAFILE_OID ){ otype = U_IDT_Metafile; } + else { otype = -1; } + return(otype); +} + +/** + \brief Convert from PseudoObject OID to RegionNodeDataType Enumeration. + \returns BT value on success, -1 if no match + \param OID PseudoObject OID (based on EMF+ manual chapter number. ) + + Only OIDs that map to RNDT's are supported. +*/ + +int U_OID_To_RNDT(uint32_t OID){ + int otype; + if( OID==U_PMF_REGIONNODECHILDNODES_OID ){ otype = U_RNDT_Kids; } /* there are 5 types, which must be specified separately */ + else if(OID==U_PMF_RECTF_OID ){ otype = U_RNDT_Rect; } + else if(OID==U_PMF_REGIONNODEPATH_OID ){ otype = U_RNDT_Path; } + else { otype = -1; } + return(otype); +} + +/** + \brief Append data to an U_OBJ_ACCUM structure. + \param oa pointer to the U_OBJ_ACCUM structure + \param data data to add + \param size bytes in data + \param Type object type + \param Id Object ID + \returns 0 on success, !0 on error. -1 on Type change, -2 on Id change + + Safe to test for Id, Type changes by calling with size=0. +*/ +int U_OA_append(U_OBJ_ACCUM *oa, const char *data, int size, int Type, int Id){ + int tail; + if(!oa)return(2); + if(oa->used){ + if(oa->Type != Type)return(-1); + if(oa->Id != Id)return(-2); + } + tail = oa->used; + if(oa->used + size >= oa->space){ + oa->space += size; + oa->accum = (char *) realloc(oa->accum, oa->space); + if(!oa->accum)return(1); + } + memcpy(oa->accum + tail,data,size); + oa->used += size; + oa->Type = Type; + oa->Id = Id; + return(0); +} + + +/** + \brief Clear an U_OBJ_ACCUM structure. Accumulated storage is retained. + \param oa pointer to the U_OBJ_ACCUM structure + \returns 0 on success, !0 on error. +*/ +int U_OA_clear(U_OBJ_ACCUM *oa){ + if(!oa)return(2); + oa->used=0; + /* Type and Id may be ignored as they are reset on the first append */ + return(0); +} + +/** + \brief Release an U_OBJ_ACCUM structure. Accumulated storage is free'd. + \param oa pointer to the U_OBJ_ACCUM structure + \returns 0 on success, !0 on error. +*/ +int U_OA_release(U_OBJ_ACCUM *oa){ + if(!oa)return(2); + oa->used=0; + oa->space = 0; + if(oa->accum)free(oa->accum); + oa->accum=NULL; + return(0); +} + +/** + \brief Create and set an U_PSEUDO_OBJ + \returns pointer to the U_PSEUDO_OBJ, NULL on error + \param Data Data to copy into the PseudoObject's data. If NULL, space is allocated, but is cleared instead of filled. + \param Size Number of bytes to allocate for Data (may be >Use if padding is present) + \param Use Number of data bytes in Data (whether or not Data is actually copied) + \param Type Type numbers are from manual section: 1.2.3.47 -> 0x01020347 + + If Data is NULL and Size is 0 an empty PseudoObject is created. One byte of storage + is allocated for Data, Size is set to 1, and Used to 0. + + If Data is NULL and Size is !0 a zero filled PseudoObject is created. + + If Data is !Null and Size is !0 a data filled PseudoObject is created. +*/ +U_PSEUDO_OBJ *U_PO_create(char *Data, size_t Size, size_t Use, uint32_t Type){ + if(Use>Size)return(NULL); + size_t tSize = (Size ? Size : 1); + U_PSEUDO_OBJ *po = (U_PSEUDO_OBJ *)malloc(sizeof(U_PSEUDO_OBJ)); + if(po){ + po->Data = malloc(tSize); + if(po->Data){ + po->Size = tSize; + po->Used = Use; + po->Type = Type; + if(Data){ memcpy(po->Data, Data, Use); } /* if Use < Size uninitialized bytes will be present! */ + else { memset(po->Data, 0, tSize); } + } + else { + free(po); + po=NULL; + } + } + return(po); +} + +/** + \brief Append data to a U_PSEUDO_OBJ object and return it + \returns pointer to the U_PSEUDO_OBJ object, NULL on error + \param po PseudoObject to append to. Cannot be NULL. + \param Data Data to copy into the PseudoObject's data. If NULL, space is allocated (if necessary) and cleared instead of filled. + \param Size Number of data bytes in Data +*/ +U_PSEUDO_OBJ *U_PO_append(U_PSEUDO_OBJ *po, const char *Data, size_t Size){ + /* po cannot be NULL,as in U_PO_po_append(), because there would be no way to determine the TYPE of the resulting PO */ + if(po){ + if(po->Used + Size > po->Size){ + po->Size = po->Used + Size; + po->Data = realloc(po->Data, po->Size); + } + if(po->Data){ + if(Data){ memcpy(po->Data + po->Used, Data, Size); } + else { memset(po->Data + po->Used, 0, Size); } + po->Used += Size; + } + if(!po->Data){ + free(po); + po=NULL; + } + } + return(po); +} + +/** + \brief Append data to a U_PSEUDO_OBJ object and return it + \returns pointer to the U_PSEUDO_OBJ object, NULL on error + \param po PseudoObject to append to. May be NULL. + \param Src PseudoObject to append. + \param StripE Set: leading Elements in Src->Data is not copied, Clear: it is copied. +*/ +U_PSEUDO_OBJ *U_PO_po_append(U_PSEUDO_OBJ *po, U_PSEUDO_OBJ *Src, int StripE){ + if(!Src){ return(NULL); } + char *Data = Src->Data; + size_t Size = Src->Size; + if(StripE){ Size -= 4; } + if(!po){ + po = U_PO_create(NULL, 0, 0, Src->Type); /* create an empty pseudoobject */ + } + if(po){ + if(po->Data){ + if(po->Used + Size > po->Size){ + po->Size = po->Used + Size; + po->Data = realloc(po->Data, po->Size); + } + if(po->Data){ + if(Data){ + if(StripE){ memcpy(po->Data + po->Used, Data + 4, Size); } /* Size is already 4 less, skip the leading Elements value */ + else { memcpy(po->Data + po->Used, Data, Size); } /* copy everything */ + } + else { memset(po->Data + po->Used, 0, Size); } /* set everything */ + po->Used += Size; + } + } + if(!po->Data){ + free(po); + po=NULL; + } + } + return(po); +} + +/** + \brief Free an U_PSEUDO_OBJ structure. All associated memory is released. + \param po Address of a pointer to the U_PSEUDO_OBJ structure, Pointer is set to NULL. + \returns 1 on success, 0 on error. +*/ +int U_PO_free(U_PSEUDO_OBJ **po){ + if(!po)return(0); + if(!*po)return(1); + if((*po)->Data)free((*po)->Data); + free(*po); + *po=NULL; + return(1); +} + +/** \brief create a PseudoObject with data in the correct byte order for an EMF+ file. + \returns The PseudoObject on success, NULL on error. + + \param Type the type of the PseudoObject that is created. Allowed values are in U_PID_Values. + \param List an array of U_SERIAL_DESC structures containing the data to store. + + The U_PMF_SERIAL_set() function should not ever be called directly by end user code. + + Each U_SERIAL_DESC element in List consists of Data fields and a description of that data. List is terminated + by the first U_SERIAL_DESC element having a TE value of U_XX. + + Data fields: an array of a basic type of Units bytes repeated Reps times with the target byte order + described in TE. + + Ptrs: Address of the first byte of the data fields. + + Units: Number of bytes of in each data field unit + + Reps: Number of repeats of the unit in data fields. + If a Ptr is NULL, and Units*Reps is not zero, then Units*Reps 0x00 bytes are stored. + If a Ptr is NULL, and Units*Reps is zero, this U_SERIAL_DESC is ignored. + if a Ptr is NOT NULL, and Units * Reps is not zero, then the data is stored in the indicated byte order. + If a Ptr is NOT NULL, and Units or Reps is zero an error is signaled. + + TE: (Target Endian) the byte order in which to store each unit of a data field as defined in U_Endian. + Byte swapping is only enabled when Units is 2 or 4. In addition to the byte order values U_XE, U_LE, + and U_BE, and the array terminator U_XX, the value may also be U_RP. U_RP means there is only a + single unit in the data fields, but it is to be copied to the target Reps times. That is, the data + was passed in with a form of run length encoding. + + Creates an empty PseudoObject if all pointers are NULL and all sizes are zero. + */ +U_PSEUDO_OBJ *U_PMF_SERIAL_set(uint32_t Type, const U_SERIAL_DESC *List){ + U_PSEUDO_OBJ *po=NULL; + size_t Total=0; + size_t FSize; + char *cptr; + char *hptr; + const U_SERIAL_DESC *lptr; + if(!List)return(NULL); + for(lptr=List; lptr->TE != U_XX; lptr++){ + if(!(lptr->Units * lptr->Reps) && lptr->Ptr)return(po); + Total += lptr->Units * lptr->Reps; + } + po = U_PO_create(NULL, Total, Total, Type); + if(po){ + cptr = po->Data; + for(lptr=List; lptr->TE != U_XX; lptr++){ + FSize = lptr->Units * lptr->Reps; + if(FSize){ /* Ptr is not NULL, that would have been detected already */ + hptr = cptr; + if(lptr->TE & U_RP){ U_PMF_REPCPY_DSTSHIFT(&cptr, lptr->Ptr, lptr->Units, lptr->Reps); } + else { U_PMF_MEMCPY_DSTSHIFT(&cptr, lptr->Ptr, FSize); } + if(((lptr->TE & U_LE) && U_IS_BE) || ((lptr->TE & U_BE) && U_IS_LE)){ + if(lptr->Units==2){ U_swap2(hptr,lptr->Reps); } + else if(lptr->Units==4){ U_swap4(hptr,lptr->Reps); } + } + } + } + } + return(po); +} + +/** + \brief Create U_DPSEUDO_OBJ's for the Points and Types of a path + \param Elements Number of elements in Points. May be zero, which creates an empty path. + \param Points Array of U_PMF_POINTF values. + \param First Apply to first point, unsigned byte, lower 4 bits hold the PathPointType flag upper 4 bits hold the PathPointType enumeration. Must have U_PPT_Start set. + \param Others Apply to all other points, unsigned byte, lower 4 bits hold the PathPointType flag upper 4 bits hold the PathPointType enumeration. Must have U_PPT_Line or U_PPT_Bezier set. + \returns pointer to the DU_PSEUDO_OBJ object, NULL on error +*/ +U_DPSEUDO_OBJ *U_PATH_create(int Elements, const U_PMF_POINTF *Points, uint8_t First, uint8_t Others){ + if(Elements){ + if(!Points){ return(NULL); } + if( (First & U_PPT_MASK) != U_PPT_Start ){ return(NULL); } + if(!(Others & U_PPT_Bezier)){ return(NULL); } /* will pass if either line or bezier is set */ + } + + U_DPSEUDO_OBJ *Path = (U_DPSEUDO_OBJ *)malloc(sizeof(U_DPSEUDO_OBJ)); + const U_SERIAL_DESC List[] = { {NULL,0,0,U_XX} }; + if(Path){ + Path->Elements = Elements; + Path->poPoints = U_PMF_SERIAL_set(U_PMF_RAW_OID, List); /* Empty PO to hold points as raw data */ + if(!Elements){ + Path->poTypes = U_PMF_SERIAL_set(U_PMF_RAW_OID, List); /* Empty PO to hold types as raw data */ + } + else { + Path->poPoints = U_PO_append(Path->poPoints, (char *)Points, Elements*sizeof(U_PMF_POINTF)); + if(Path->poPoints){ + U_PSEUDO_OBJ *tpo = U_PMF_PATHPOINTTYPE_set2(Elements, First | U_PPT_Start, Others); /* PO holding types, has leading Elements value */ + Path->poTypes = U_PO_po_append(NULL, tpo, U_PMF_DROP_ELEMENTS); /* remove the leading Elements value*/ + U_PO_free(&tpo); + if(!Path->poTypes){ U_PO_free(&Path->poPoints); } + } + if(!Path->poPoints){ U_DPO_free(&Path); } + } + } + return(Path); +} + +/** + \brief Free U_DPSEUDO_OBJ's + \returns 1 on success, 0 on error. +*/ +int U_DPO_free(U_DPSEUDO_OBJ **dpo){ + if(!dpo){ return(0); } + if(!*dpo){ return(1); } + U_DPSEUDO_OBJ *kpo = *dpo; + if(kpo->poPoints){ U_PO_free(&kpo->poPoints); } + if(kpo->poTypes){ U_PO_free(&kpo->poTypes); } + free(*dpo); + *dpo=NULL; + return(1); +} + +/** + \brief Clear U_DPSEUDO_OBJ's. Memory is retained, Elements and Used values are set to 0. + \returns 1 on success, 0 on error. + + It is much more efficient to clear a DPO and reuse it than to free that DPO and create another. +*/ +int U_DPO_clear(U_DPSEUDO_OBJ *dpo){ + if(!dpo){ return(0); } + if(dpo->poPoints){ dpo->poPoints->Used = 0; } + if(dpo->poTypes){ dpo->poTypes->Used = 0; } + dpo->Elements = 0; + return(1); +} + +/** + \brief Append a "moveto" point to a path + \param Path Address of a DoublePseudoObject holding the path to append to. + \param Point Point to move to. + \param Flags Flags may be (U_PTP_None, U_PTP_DashMode, U_PTP_PathMarker, U_PTP_NoBit, U_PTP_CloseSubpath) + \returns 1 on success, 0 on error. +*/ +int U_PATH_moveto(U_DPSEUDO_OBJ *Path, U_PMF_POINTF Point, uint8_t Flags){ + if(!Path){ return(0); } + U_PSEUDO_OBJ *tpo; + uint8_t Type = (Flags & U_PTP_NotClose) | U_PPT_Start; + + tpo = U_PMF_POINTF_set(1, &Point); + if(!tpo){ return(0); } + Path->poPoints = U_PO_po_append(Path->poPoints, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + tpo = U_PMF_PATHPOINTTYPE_set(1, &Type); + if(!tpo){ return(0); } + Path->poTypes = U_PO_po_append(Path->poTypes, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + Path->Elements++; + return(1); +} + +/** + \brief Append a "lineto" point to a path + \param Path Address of a DoublePseudoObject holding the path to append to. + \param Point U_PMF_POINTF point to draw to. + \param Flags Flags may be (U_PTP_None, U_PTP_DashMode, U_PTP_PathMarker, U_PTP_NoBit, U_PTP_CloseSubpath) + \returns 1 on success, 0 on error. +*/ +int U_PATH_lineto(U_DPSEUDO_OBJ *Path, U_PMF_POINTF Point, uint8_t Flags){ + if(!Path || !Path->Elements){ return(0); } /* must be at least one point to extend from */ + if(Path->poTypes->Data[Path->Elements - 1] & U_PTP_CloseSubpath){ return(0); } /* cannot extend a closed subpath */ + U_PSEUDO_OBJ *tpo; + uint8_t Type = (Flags & U_PTP_NotClose) | U_PPT_Line; + tpo = U_PMF_POINTF_set(1, &Point); + if(!tpo){ return(0); } + Path->poPoints = U_PO_po_append(Path->poPoints, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + tpo = U_PMF_PATHPOINTTYPE_set(1, &Type); + if(!tpo){ return(0); } + Path->poTypes = U_PO_po_append(Path->poTypes, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + Path->Elements++; + return(1); +} + +/** + \brief Set the closepath bit in the last point + \param Path Address of a DoublePseudoObject holding the path to act upon. + \returns 1 on success, 0 on error. +*/ +int U_PATH_closepath(U_DPSEUDO_OBJ *Path){ + if(!Path || !Path->poTypes){ return(0); } + uint32_t Elements = Path->Elements; + uint8_t *Type = (uint8_t *)(Path->poTypes->Data) + Elements - 1; + if(*Type & U_PPT_Start){ return(0); } /* single point closed path makes no sense */ + *Type = *Type | U_PTP_CloseSubpath; + return(1); +} + +/** + \brief Append a "polylineto" set of point to a path + \param Path Address of a DoublePseudoObject holding the path to append to. + \param Elements number of Points and Flags + \param Points Line points. + \param Flags Flags (U_PTP_None, U_PTP_DashMode, U_PTP_PathMarker, U_PTP_NoBit, but NOT U_PTP_CloseSubpath) + \param StartSeg If set, use U_PPT_Start PathPointType enumeration for first point, otherwise use U_PPT_Line. + \returns 1 on success, 0 on error. +*/ +int U_PATH_polylineto(U_DPSEUDO_OBJ *Path, uint32_t Elements, const U_PMF_POINTF *Points, uint8_t Flags, uint8_t StartSeg){ + if(!Path || !Points){ return(0); } + if(!Elements){ return(1); } /* harmless - do nothing */ + U_PSEUDO_OBJ *tpo; + uint8_t First, Others; + + tpo = U_PMF_POINTF_set(Elements, Points); + Path->poPoints = U_PO_po_append(Path->poPoints, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + if(StartSeg){ First = (Flags & U_PTP_NotClose) | U_PPT_Start; } + else { First = (Flags & U_PTP_NotClose) | U_PPT_Line; } + Others = (Flags & U_PTP_NotClose) | U_PPT_Line; + tpo = U_PMF_PATHPOINTTYPE_set2(Elements, First, Others); + if(!tpo){ return(0); } + Path->poTypes = U_PO_po_append(Path->poTypes, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + Path->Elements += Elements; + return(1); +} + + +/** + \brief Append a "polybezierto" set of point to a path + \param Path Address of a DoublePseudoObject holding the path to append to. + \param Elements number of Points + \param Points Bezier points. Optional starting point, then N sets of 3, example: [P1] (Q12A Q12B P2) (Q23A Q23B P3). + \param Flags Flags (U_PTP_None, U_PTP_DashMode, U_PTP_PathMarker, U_PTP_NoBit, but NOT U_PTP_CloseSubpath) + \param StartSeg If set, use U_PPT_Start PathPointType enumeration for first point, otherwise use U_PPT_Bezier. + \returns 1 on success, 0 on error. + + If Start is set Elements must be 1 + multiple of 3. Ie, P1 Q12A Q12B P2 Q23A Q23B P3 + + If Start is clear Elements must be a multiple of 3. Ie, (P1, already in path) Q12A Q12B P2 Q23A Q23B P3 +*/ +int U_PATH_polybezierto(U_DPSEUDO_OBJ *Path, uint32_t Elements, const U_PMF_POINTF *Points, uint8_t Flags, uint8_t StartSeg){ + if(!Path || !Points){ return(0); } + if(!Elements){ + if(StartSeg){ return(0); } /* cannot have both a NEW segment and ZERO points */ + else{ return(1); } /* harmless - do nothing */ + } + if(StartSeg && ((Elements - 1) % 3)){ return(0); } /* new segment must be 1 + N*3 points */ + if(!StartSeg && (Elements % 3)){ return(0); } /* extend segment must be N*3 points */ + U_PSEUDO_OBJ *tpo; + uint8_t First, Others; + + tpo = U_PMF_POINTF_set(Elements, Points); + Path->poPoints = U_PO_po_append(Path->poPoints, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + if(StartSeg){ First = (Flags & U_PTP_NotClose) | U_PPT_Start; } + else { First = (Flags & U_PTP_NotClose) | U_PPT_Bezier; } + Others = (Flags & U_PTP_NotClose) | U_PPT_Bezier; + tpo = U_PMF_PATHPOINTTYPE_set2(Elements, First, Others); + if(!tpo){ return(0); } + Path->poTypes = U_PO_po_append(Path->poTypes, tpo, U_PMF_DROP_ELEMENTS); + U_PO_free(&tpo); + + Path->Elements += Elements; + return(1); +} + +/** + \brief Append a "polygon" set of points to a path. + \param Path Address of a DoublePseudoObject holding the path to append to. + \param Elements number of Points and Flags + \param Points Line points. + \param Flags Flags (U_PTP_None, U_PTP_DashMode, U_PTP_PathMarker, U_PTP_NoBit, but NOT U_PTP_CloseSubpath) + \returns 1 on success, 0 on error. +*/ +int U_PATH_polygon(U_DPSEUDO_OBJ *Path, uint32_t Elements, const U_PMF_POINTF *Points, uint8_t Flags){ + int status = U_PATH_polylineto(Path, Elements, Points, Flags, U_SEG_NEW); + if(status){ + status = U_PATH_closepath(Path); + } + return(status); +} + +//! \cond +// These are not exposed in the API +/* Parameterized Ellipse coordinates */ +U_PMF_POINTF U_eparam(U_FLOAT a, U_FLOAT b, U_PMF_POINTF *center, double Ang, double Theta){ + U_PMF_POINTF point; + point.X = center->X + a*cos(Theta)*cos(Ang) - b*sin(Theta)*sin(Ang); + point.Y = center->Y + a*sin(Theta)*cos(Ang) + b*cos(Theta)*sin(Ang); + return(point); +} + +/* Parameterized Ellipse derivative */ +U_PMF_POINTF U_eparam2(U_FLOAT a, U_FLOAT b, double Ang, double Theta){ + U_PMF_POINTF point; + point.X = -a*cos(Theta)*sin(Ang) - b*sin(Theta)*cos(Ang); + point.Y = -a*sin(Theta)*sin(Ang) + b*cos(Theta)*cos(Ang); + return(point); +} + +double U_aparam(double Ang1, double Ang2){ + double Alpha; + double t2; + t2 = tan((Ang2 - Ang1)/2.0); + t2 *= t2; + Alpha = sin(Ang2 - Ang1) * (sqrt(4 + 3*t2) -1.0)/3.0; + return(Alpha); +} + +/* Parameterized Bezier point Q1 or Q2 derivative */ +U_PMF_POINTF U_qparam(double Alpha, double a, double b, U_PMF_POINTF *Point, double Ang, double Theta, int mode){ + U_PMF_POINTF Q, Prime; + Prime = U_eparam2(a,b,Ang,Theta); + if(mode==1){ /* Q1, anything else is Q2*/ + Q.X = Point->X + Alpha * Prime.X; + Q.Y = Point->Y + Alpha * Prime.Y; + } + else { + Q.X = Point->X - Alpha * Prime.X; + Q.Y = Point->Y - Alpha * Prime.Y; + } + return(Q); +} +//! \endcond + +/** + \brief Append an "arcto" set of points to a path (Bezier points are calculated, and these are appended + \param Path Address of a pointer to the U_PSEUDO_OBJ that holds points + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param Rot Rotation angle to apply to coordinate system (Start and Rect), positive is degrees clockwise + \param Rect U_PMF_RECTF that defines the bounding rectangle. + \param Flags Flags (U_PTP_None, U_PTP_DashMode, U_PTP_PathMarker, U_PTP_NoBit, but NOT U_PTP_CloseSubpath) + \param StartSeg If set, the arc starts a new segment, if clear, continue the existing segment. Starting a new segment does not automatically apply U_PATH_closepath to the existing path. + \returns 1 on success, 0 on error. + + Based on Luc Maisonobe's work, http://www.spaceroots.org/documents/ellipse/ +*/ +int U_PATH_arcto(U_DPSEUDO_OBJ *Path, U_FLOAT Start, U_FLOAT Sweep, U_FLOAT Rot, U_PMF_RECTF *Rect, uint8_t Flags, int StartSeg){ + U_PMF_POINTF Bz[3]; + U_PMF_POINTF Center; + U_PMF_POINTF P1,P2; + double a, b; + int done = 0; + int fpoint = 0; + double L1, L2; /* These are degrees CounterClockwise from 3:00 */ + double Ang1, Ang2; /* These are parametric angles, derived from L1, L2*/ + double Alpha; /* Dimensionless number used for Q1, Q2 */ + double Theta; /* Rot in radians */ + double Slop; /* do not let rounding errors cause spurious end points */ + if(!Path){ return(0); } + if((Sweep > 360.0) || (Sweep < -360.0)){ return(0); } + /* Start should be between 0 and 360 degrees, but it does not really matter because sin, and cos will accept anything */ + /* the sign on Sweep and Start is correct bacause LM's derivation has y positive up, but GDI+ has y positive down. */ + a = Rect->Width/2.0; + b = Rect->Height/2.0; + if(!a || !b){ return(0); } + Center.X = Rect->X + a; + Center.Y = Rect->Y + b; + /* convert to radians */ + Start = (2.0 * U_PI * Start)/360.0; + Sweep = (2.0 * U_PI * Sweep)/360.0; + Theta = (2.0 * U_PI * Rot )/360.0; + Slop = Sweep/100000.0; + L1 = Start; + + while(!done){ + if(Sweep < 0){ + L2 = L1 - U_PI/2.0; + if(L2 <= Sweep + Start - Slop){ L2 = Sweep + Start; done = 1; } + else {done = 0; } + } + else { + L2 = L1 + U_PI/2.0; + if(L2 >= Sweep + Start + Slop){ L2 = Sweep + Start; done = 1; } + else {done = 0; } + } + Ang1 = atan2(sin(L1)/b, cos(L1)/a); + Ang2 = atan2(sin(L2)/b, cos(L2)/a); + Alpha = U_aparam(Ang1, Ang2); + P1 = U_eparam(a, b, &Center, Ang1, Theta); /* P1 */ + P2 = U_eparam(a, b, &Center, Ang2, Theta); /* P2 */ + Bz[0] = U_qparam(Alpha, a, b, &P1, Ang1, Theta, 1); /* Q1 */ + Bz[1] = U_qparam(Alpha, a, b, &P2, Ang2, Theta, 2); /* Q2 */ + Bz[2] = P2; + if(!fpoint){ + if(StartSeg){ U_PATH_moveto(Path, P1, Flags); } + else { U_PATH_lineto(Path, P1, Flags); } + fpoint = 1; + } + U_PATH_polybezierto(Path, 3, Bz, Flags, U_SEG_OLD ); + L1 = L2; + } + return(1); +} + +/** + \brief Allocate and construct an array of U_PMF_POINTF objects which have been subjected to a U_XFORM + \returns pointer to an array of U_PMF_POINTF structures. + \param points pointer to the source U_PMF_POINTF structures + \param count number of members in points + \param xform U_XFORM to apply + +*/ +U_PMF_POINTF *pointfs_transform(U_PMF_POINTF *points, int count, U_XFORM xform){ + U_PMF_POINTF *newpts=NULL;; + int i; + float X,Y; + newpts = (U_PMF_POINTF *) malloc(count * sizeof(U_PMF_POINTF)); + if(newpts){ + for(i=0; i 1.0e-10 || (A) < -1.0e-10 ? (A) : 0.0) //! \hideinitializer +//! \endcond + U_PMF_TRANSFORMMATRIX tm; + double dang = Angle * 2*U_PI /360.0; + double scale; + double cd,sd; + if((Periods <=0.0) || (w <= 0.0) || (h <= 0.0)){ + tm.m11 = tm.m12 = tm.m21 = tm.m22 = tm.dX = tm.dY = 0.0; + } + else { + /* + scale is gradient period divided by w + The scale value sets the gradient period to match exactly with the inscribed (w,h) rectangle + in the direction specified by the angle. + The numberator of scale is the max of the four dot product values of the rotated X basis unit vector with (w,h), + with each of the vectors {w,h}, {-w,h}, {-w,-h}, {w,h}. Those vectors run from each corner in turn + to the opposite corner. The one most parallel to the rotated unit vector will have both terms positive. + + Trig results like cos(pi/2) are not stable between platforms due to minor differences in the + implementation. Detect these and make them zero, which then allows binary comparison of output files. + Otherwise the binary comparisons between platforms would fail because of a bunch of insignificant digits. + */ + cd = CLOSE_TO_IS_REALLY_ZERO(cos(dang)); + sd = CLOSE_TO_IS_REALLY_ZERO(sin(dang)); + scale = (w*fabs(cd) + h*fabs(sd))/(w*Periods); + tm.m11 = scale * cd; + tm.m12 = -scale * sd; + tm.m21 = scale * sd; + tm.m22 = scale * cd; + /* offset is to one corner of the square, depending on which quadrant the rotation selects. */ + if(cos(dang)>=0){ + tm.dX = x; + if(sin(dang)>=0){tm.dY = y + h; } // LL corner + else { tm.dY = y; } // UL corner + } + else { + tm.dX = x + w; + if(sin(dang)>=0){ tm.dY = y + h; } // LR corner + else { tm.dY = y; } // UR corner + } + } + return tm; +#undef CLOSE_TO_IS_REALLY_ZERO +} +/** + \brief Create a U_PSEUDO_OBJ containing a U_PMR_FILLPATH and U_PMR_DRAWPATH records. + \returns pointer to U_PSEUDO_OBJ or NULL on error. + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) +*/ +U_PSEUDO_OBJ *U_PMR_drawfill(uint32_t PathID, uint32_t PenID, const U_PSEUDO_OBJ *BrushID){ + U_PSEUDO_OBJ *po = U_PMR_FILLPATH_set(PathID, BrushID); + if(po){ + U_PSEUDO_OBJ *tpo = U_PMR_DRAWPATH_set(PathID, PenID); + po = U_PO_po_append(po, tpo, U_PMF_KEEP_ELEMENTS); + U_PO_free(&tpo); + } + return(po); +} + + + +/** + \brief Extract a single data field from a source. + \returns 1 on success, 0 on error. + \param Src where the data is coming from. It is incremented by the number of bytes retrieved. + \param Dst where the data will be stored. This must either be NULL (in which case the Src + is advanced and nothing is stored, or it must be allocated to Reps * Units bytes!!!! + \param Units number of bytes in each unit of the data field + \param Reps number of repeats of units in the data field. + If a Ptr is NULL, then Units*Reps 0 bytes are stored. + If a Ptr is NOT NULL, and Units or Reps, is zero an error is signaled. + If a Ptr is NULL and Units*Reps is 0, nothing happens. + \param SE logical (Source Endian). Only relevant for Sizes of 2 or 4 + Indicates when Bytes may need to be rearranged when they are retrieved. + U_XE no change (this is used when the data has already been set to the proper orientation or it is not known) + U_LE source is Little Endian + U_BE source is Big Endian. + U_XX error + +*/ +int U_PMF_SERIAL_get(const char **Src, void *Dst, size_t Units, size_t Reps, int SE){ + if(!Src || !*Src || SE == U_XX){ return(0); } + U_PMF_MEMCPY_SRCSHIFT(Dst, Src, Units * Reps); + if(!Dst){ return(1); } /* "fake" get, no data was retrieved, so we are done */ + if(SE == U_XE){ return(1); } + if(SE == U_LE && U_IS_LE){ return(1); } + if(SE == U_BE && U_IS_BE){ return(1); } + /* need to swap */ + if( Units==2){ U_swap2(Dst,Reps); } + else if(Units==4){ U_swap4(Dst,Reps); } + return(1); +} + +/** + \brief Conditionally extract an array of data from a source, allocating space to hold it. + \returns 1 on success, 0 on error. + \param Src where the data is coming from. It is incremented by the number of bytes retrieved. + \param Dst Caller must free. Where the pointer to the data will be stored. Reps * Units bytes will be allocated, + \param Units number of bytes in each unit of the data field + \param Reps number of repeats of units in the data field. + If a Ptr is NULL, then Units*Reps 0 bytes are stored. + If a Ptr is NOT NULL, and Units or Reps, is zero an error is signaled. + If a Ptr is NULL and Units*Reps is 0, nothing happens. + \param SE logical (Source Endian). Only relevant for Sizes of 2 or 4 + Indicates when Bytes may need to be rearranged when they are retrieved. + U_XE no change (this is used when the data has already been set to the proper orientation or it is not known) + U_LE source is Little Endian + U_BE source is Big Endian. + U_XX error + \param Cond Store the data into *Dst if true, set *Dst to NULL otherwise. + +*/ +int U_PMF_SERIAL_array_copy_get(const char **Src, void **Dst, size_t Units, size_t Reps, int SE, int Cond){ + if(!Src || !*Src || !Dst || SE == U_XX){ return(0); } + if(!Cond){ + *Src += Units * Reps; + *Dst = NULL; + return(1); + } + *Dst = malloc(Units * Reps); + if(!*Dst){ return(1); } /* "fake" get, no data was retrieved, so we are done */ + U_PMF_MEMCPY_SRCSHIFT(*Dst, Src, Units * Reps); + if(SE == U_XE){ return(1); } + if(SE == U_LE && U_IS_LE){ return(1); } + if(SE == U_BE && U_IS_BE){ return(1); } + /* need to swap */ + if( Units==2){ U_swap2(*Dst,Reps); } + else if(Units==4){ U_swap4(*Dst,Reps); } + return(1); +} + + + +/** + \brief Calculate the length in bytes of a relative path object composed of U_PMF_INTEGER7 and U_PMF_INTER15 values + \return >=0 length == success, <0 error + \param contents Start of a relative path consisting of int7 and int15 X,Y pairs. + \param Elements number of relative X,Y pairs in the object +*/ +int U_PMF_LEN_REL715(const char *contents, int Elements){ + int length=0; + Elements *= 2; /* N pairs = 2N values */ + for( ; Elements; Elements--){ + /* X or Y value */ + if(*contents & U_TEST_INT7){ contents +=2; length +=2; } //int15 + else { contents +=1; length +=1; } //int7 + } + return(length); +} + +/** + \brief Calculate the length in bytes of objects which are a 4 byte Count followed by Count * float bytes + \return >=0 length == success, <0 error + Object types whose size may be derived with this function are: + U_PMF_COMPOUNDLINEDATA + U_PMF_DASHEDLINEDATA +*/ +int U_PMF_LEN_FLOATDATA(const char *contents){ + int Size; + U_PMF_SERIAL_get(&contents, &Size, 4, 1, U_LE); + Size = 4*Size + 4; + return(Size); +} + +/** + \brief Calculate the length in bytes of objects which are a 4 byte count followed by count bytes + \return >=0 length == success, <0 error + Object types whose size may be derived with this function are: + U_PMF_BOUNDARYPATHDATA + U_PMF_BOUNDARYPOINTDATA + U_PMF_CUSTOMSTARTCAPDATA + U_PMF_PATH + U_PMF_LINEPATH + U_PMF_REGIONNODEPATH +*/ +int U_PMF_LEN_BYTEDATA(const char *contents){ + int Size; + U_PMF_SERIAL_get(&contents, &Size, 4, 1, U_LE); + Size += 4; + return(Size); +} + +/** + \brief Create a string containing the curly bracket form of the 16 byte GUID value + \return number of bytes in record, 0 on error + \param GUID pointer to the 16 unsigned bytes + \return string in curly bracket form. + http://msdn.microsoft.com/en-us/library/cc230316.aspx + + Text form is Data1-Data2-Data3-Data4, the first 3 are stored as little endian integers, the last as a string (big endian). +*/ +char *U_PMF_CURLYGUID_set(uint8_t *GUID){ + char *string=malloc(64); + if(string){ + sprintf(string,"{%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X}", + GUID[3],GUID[2],GUID[1],GUID[0], + GUID[5],GUID[4], + GUID[7],GUID[6], + GUID[8],GUID[9], + GUID[10],GUID[11],GUID[12],GUID[13],GUID[14],GUID[15] + ); + } + return(string); +} + +/** + \brief Identify a known curly GUID + \param string Curly GUID form. + \return EmageEffects Enumerator + + EMF+ manual 2.1.3.1, Microsoft name: ImageEffects Identifier +*/ +int U_PMF_KNOWNCURLYGUID_set(const char *string){ + int status; + if( !strcmp(string,"{633C80A4-1843-482B-9EF2-BE2834C5FDD4}")){ status = U_IEE_BlurEffectGuid; } + else if(!strcmp(string,"{D3A1DBE1-8EC4-4C17-9F4C-EA97AD1C343D}")){ status = U_IEE_BrightnessContrastEffectGuid; } + else if(!strcmp(string,"{537E597D-251E-48DA-9664-29CA496B70F8}")){ status = U_IEE_ColorBalanceEffectGuid; } + else if(!strcmp(string,"{DD6A0022-58E4-4A67-9D9B-D48EB881A53D}")){ status = U_IEE_ColorCurveEffectGuid; } + else if(!strcmp(string,"{A7CE72A9-0F7F-40D7-B3CC-D0C02D5C3212}")){ status = U_IEE_ColorLookupTableEffectGuid; } + else if(!strcmp(string,"{718F2615-7933-40E3-A511-5F68FE14DD74}")){ status = U_IEE_ColorMatrixEffectGuid; } + else if(!strcmp(string,"{8B2DD6C3-EB07-4D87-A5F0-7108E26A9C5F}")){ status = U_IEE_HueSaturationLightnessEffectGuid;} + else if(!strcmp(string,"{99C354EC-2A31-4F3A-8C34-17A803B33A25}")){ status = U_IEE_LevelsEffectGuid; } + else if(!strcmp(string,"{74D29D05-69A4-4266-9549-3CC52836B632}")){ status = U_IEE_RedEyeCorrectionEffectGuid; } + else if(!strcmp(string,"{63CBF3EE-C526-402C-8F71-62C540BF5142}")){ status = U_IEE_SharpenEffectGuid; } + else if(!strcmp(string,"{1077AF00-2848-4441-9489-44AD4C2D7A2C}")){ status = U_IEE_TintEffectGuid; } + else { status = U_IEE_Unknown; } + return(status); +} + +/** \brief Load a GUID from text format into EMF+ file binary format. + \param string Curly GUID as text, minus the barckets and dashes. + \return GUID in EMF+ file binary format. + + +This accepts a string that is 16 bytes long = 32 characters hex (no dash spaces or brackets) as text. +Text form is; Data1|Data2|Data3|Data4, first three are stored as little endian integers of 4,2,2 bytes, respectively, +last is stored like a string (big endian), after conversion from text hex to binary. + +This function is not normally called by end user code. +*/ +uint8_t *U_LOAD_GUID(char *string){ + uint32_t Data1,tData2,tData3,tByte; + uint16_t Data2,Data3; + char *Data4 = string + 16; + uint8_t *hold = malloc(16); + char *lf = (char *) hold; + int i; + if(hold){ + Data1=tData2=tData3=0; + if(3 != sscanf(string + 0,"%8X",&Data1) + + sscanf(string + 8,"%4X",&tData2) + + sscanf(string + 12,"%4X",&tData3)){ + free(lf); + return(NULL); + } + Data2=tData2; + Data3=tData3; + U_PMF_MEMCPY_DSTSHIFT(&lf, &Data1, 4); + U_PMF_MEMCPY_DSTSHIFT(&lf, &Data2, 2); + U_PMF_MEMCPY_DSTSHIFT(&lf, &Data3, 2); + if(U_IS_BE){ /* these fields are stored little endian */ + U_swap4(hold,1); + U_swap2(hold+4,2); + } + /* remainder is converted byte by byte and stored in that order */ + for(i=0;i<8;i++,Data4+=2,lf++){ + if(1 != sscanf(Data4,"%2X",&tByte)){ + free(lf); + return(NULL); + } + *lf=tByte; + } + } + return(hold); +} + +/** + \brief Generate the 16 byte form from OID of the ImageEffects Identifier + \param OID OID of the ImageEffects Identifier + \return pointer to 16 byte buffer holding the long GUID binary form, or NULL on error. + + EMF+ manual 2.1.3.1, Microsoft name: ImageEffects Identifier +*/ +uint8_t *U_OID_To_GUID(uint32_t OID){ + uint8_t *lf = NULL; + if( OID == U_PMF_IE_BLUR_OID ){ lf = U_LOAD_GUID("633C80A41843482B9EF2BE2834C5FDD4"); } + else if(OID == U_PMF_IE_BRIGHTNESSCONTRAST_OID ){ lf = U_LOAD_GUID("D3A1DBE18EC44C179F4CEA97AD1C343D"); } + else if(OID == U_PMF_IE_COLORBALANCE_OID ){ lf = U_LOAD_GUID("537E597D251E48DA966429CA496B70F8"); } + else if(OID == U_PMF_IE_COLORCURVE_OID ){ lf = U_LOAD_GUID("DD6A002258E44A679D9BD48EB881A53D"); } + else if(OID == U_PMF_IE_COLORLOOKUPTABLE_OID ){ lf = U_LOAD_GUID("A7CE72A90F7F40D7B3CCD0C02D5C3212"); } + else if(OID == U_PMF_IE_COLORMATRIX_OID ){ lf = U_LOAD_GUID("718F2615793340E3A5115F68FE14DD74"); } + else if(OID == U_PMF_IE_HUESATURATIONLIGHTNESS_OID){ lf = U_LOAD_GUID("8B2DD6C3EB074D87A5F07108E26A9C5F"); } + else if(OID == U_PMF_IE_LEVELS_OID ){ lf = U_LOAD_GUID("99C354EC2A314F3A8C3417A803B33A25"); } + else if(OID == U_PMF_IE_REDEYECORRECTION_OID ){ lf = U_LOAD_GUID("74D29D0569A4426695493CC52836B632"); } + else if(OID == U_PMF_IE_SHARPEN_OID ){ lf = U_LOAD_GUID("63CBF3EEC526402C8F7162C540BF5142"); } + else if(OID == U_PMF_IE_TINT_OID ){ lf = U_LOAD_GUID("1077AF0028484441948944AD4C2D7A2C"); } + return(lf); +} + +/** + \brief copy data and shift source pointer by the amount of data moved + \param Dst Destination in memory + \param Src Source in memory + \param Size Number of bytes to move +*/ +void U_PMF_MEMCPY_SRCSHIFT(void *Dst, const char **Src, size_t Size){ + if(Dst)memcpy(Dst, *Src, Size); + *Src += Size; +} + +/** + \brief copy data and shift destination pointer by the amount of data moved + \param Dst Destination in memory (this must not be NULL) + \param Src Source in memory (if this is NULL, fill with that many zero bytes instead) + \param Size Number of bytes to move +*/ +void U_PMF_MEMCPY_DSTSHIFT(char **Dst, const void *Src, size_t Size){ + if(Src){ memcpy(*Dst, Src, Size); } + else { memset(*Dst, 0, Size); } + *Dst += Size; +} + +/** + \brief Copy the single instance at Src repeatedly to Dst. + \param Dst Destination in memory + \param Src Source in memory (if this is NULL, fill with that many zero bytes instead) + \param Size number of bytes in single instance that is template. + \param Reps Number of instances of the template to opy +*/ +void U_PMF_REPCPY_DSTSHIFT(char **Dst, const void *Src, size_t Size, size_t Reps){ + for(;Reps;Reps--){ + if(Src){ memcpy(*Dst, Src, Size); } + else { memset(*Dst, 0, Size); } + *Dst += Size; + } +} + +/** + \brief save pointer to data and shift source pointer by the amount of data moved + \param Dst Destination in memory + \param Src Source in memory or NULL. If NULL Dst is set to NULL. + \param Size Number of bytes to move +*/ +void U_PMF_PTRSAV_SHIFT(const char **Dst, const char **Src, size_t Size){ + if(*Src){ + if(Dst)*Dst = *Src; + *Src += Size; + } + else { + if(Dst)*Dst = NULL; + } +} + +/** + \brief save pointer to data and shift source pointer by the amount of data moved + \return 1 on sucess, 0 on error + \param Dst Destination in memory + \param Src Source in memory or NULL. If NULL Dst is set to NULL. + \param Doit Assign if true, otherwise, set to NULL +*/ +int U_PMF_PTRSAV_COND(const char **Dst, const char *Src, int Doit){ + if(!Dst){ return(0); } + if(Src && Doit){ *Dst = Src; } + else { *Dst = NULL; } + return(1); +} + +/** + \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. +*/ +uint16_t U_PMF_HEADERFLAGS_get(const char *contents){ + uint16_t Flags; + const char *cptr = contents + offsetof(U_PMF_CMN_HDR,Flags); + U_PMF_SERIAL_get(&cptr, &Flags, 2, 1, U_LE); /* EMF+ manual documents it as BE, but this code implements it as LE*/ + return(Flags); +} + +/** + \brief Retrieve whichever header fields are requested. NULL pointers do not retrieve. + \param contents Record from which to extract data, will be incremented by header size. + \param Type Record type + \param Flags Record flags + \param Size Records size + \param Datasize Data size + \return 1 on success, 0 on failure. +*/ +int U_PMF_HEADERFIELDS_get(const char *contents, + uint16_t *Type, uint16_t *Flags, uint32_t *Size, uint32_t *Datasize){ + if(!contents){ return(0); } + U_PMF_SERIAL_get(&contents, Type, 2, 1, U_LE); + U_PMF_SERIAL_get(&contents, Flags, 2, 1, U_LE); /* EMF+ manual documents it as BE, but this code implements it as LE*/ + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Datasize, 4, 1, U_LE); + return(1); +} + +/** + \brief Get the entire EMF+ record header. + \param contents Record from which to extract data, will be offset by header size. + \param Header Location to store data (may be NULL) + \returns 1 + If Header is Null, nothing is stored but contents is still offset. +*/ +int U_PMF_CMN_HDR_get(const char **contents, U_PMF_CMN_HDR *Header){ + if(!contents || !*contents){ return(0); } + if(Header){ + U_PMF_SERIAL_get(contents, &(Header->Type), 2, 1, U_LE); + U_PMF_SERIAL_get(contents, &(Header->Flags), 2, 1, U_LE); /* EMF+ manual documents it as BE, but this code implements it as LE*/ + U_PMF_SERIAL_get(contents, &(Header->Size), 4, 1, U_LE); + U_PMF_SERIAL_get(contents, &(Header->DataSize), 4, 1, U_LE); + } + else { + *contents += sizeof(U_PMF_CMN_HDR); + } + return(1); +} + +/** + \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 +*/ +int U_PMF_LEN_PENDATA(const char *PenData){ + uint32_t Flags; + int length=12; /* Flags, Unit, Width */ + U_PMF_SERIAL_get(&PenData, &Flags, 4, 1, U_LE); + PenData += 8; /* skip Unit and Width */ + length += U_PMF_LEN_OPTPENDATA(PenData, Flags); + return(length); +} + +/** + \brief Return the size of an OptPenData object from an EMF+ record. + \param PenData Address in memory where the PenData object starts. + \param Flags PenData Flags that indicate which fields are present. + \returns size of the object in bytes +*/ +int U_PMF_LEN_OPTPENDATA(const char *PenData, uint32_t Flags){ + int length=0; + if(Flags & U_PD_Transform){ length += sizeof(U_PMF_TRANSFORMMATRIX); } + if(Flags & U_PD_StartCap){ length += sizeof(int32_t); } + if(Flags & U_PD_EndCap){ length += sizeof(int32_t); } + if(Flags & U_PD_Join){ length += sizeof(uint32_t); } + if(Flags & U_PD_MiterLimit){ length += sizeof(U_FLOAT); } + if(Flags & U_PD_LineStyle){ length += sizeof(int32_t); } + if(Flags & U_PD_DLCap){ length += sizeof(int32_t); } + if(Flags & U_PD_DLOffset){ length += sizeof(int32_t); } + if(Flags & U_PD_DLData){ length += U_PMF_LEN_FLOATDATA(PenData + length); } + if(Flags & U_PD_NonCenter){ length += sizeof(int32_t); } + if(Flags & U_PD_CLData){ length += U_PMF_LEN_FLOATDATA(PenData + length); } + if(Flags & U_PD_CustomStartCap){ length += U_PMF_LEN_BYTEDATA(PenData + length); } + if(Flags & U_PD_CustomEndCap){ length += U_PMF_LEN_BYTEDATA(PenData + length); } + return(length); +} + +/** + \brief Create and set a U_PMF_BRUSH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Bd U_PSEUDO_OBJ containing one of the 5 types of Brush data + + EMF+ manual 2.2.1.1, Microsoft name: EmfPlusBrush Object +*/ +U_PSEUDO_OBJ *U_PMF_BRUSH_set(uint32_t Version, const U_PSEUDO_OBJ *Bd){ + if(!Bd){ return(NULL); } + int32_t Type = U_OID_To_BT(Bd->Type); + if(Type < 0){ return(NULL); } + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {&Type, 4, 1, U_LE}, + {Bd->Data, Bd->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BRUSH_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_CUSTOMLINECAP PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Ld U_PSEUDO_OBJ containing one of the 2 types of Linecap data + + EMF+ manual 2.2.1.2, Microsoft name: EmfPlusCustomLineCap Object +*/ +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAP_set(uint32_t Version, const U_PSEUDO_OBJ *Ld){ + if(!Ld){ return(NULL); } + int32_t Type = U_OID_To_CLCDT(Ld->Type); + if(Type<0){ return(NULL); } + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {&Type, 4, 1, U_LE}, + {Ld->Data, Ld->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CUSTOMLINECAP_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_FONT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param EmSize em size in units of SizeUnit + \param SizeUnit UnitType enumeration + \param FSFlags FontStyle flags + \param Length Number of Unicode Characters in FamilyName + \param Font Unicode (UTF-16LE) fontname + + EMF+ manual 2.2.1.3, Microsoft name: EmfPlusFont Object +*/ +U_PSEUDO_OBJ *U_PMF_FONT_set(uint32_t Version, U_FLOAT EmSize, uint32_t SizeUnit, + int32_t FSFlags, uint32_t Length, const uint16_t *Font){ + uint32_t cbFont = 2 * wchar16len(Font); /* this need not be 2*Length parameter */ + uint32_t pad = (0x3 & cbFont ? 2 : 0); + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {&EmSize, 4, 1, U_LE}, + {&SizeUnit,4, 1, U_LE}, + {&FSFlags, 4, 1, U_LE}, + {NULL, 4, 1, U_LE}, /* NULL is for Reserved field */ + {&Length, 4, 1, U_LE}, + {Font, cbFont, 1, U_LE}, + {NULL, pad, (pad ? 1 : 0), (pad ? U_XE : U_XX)}, /* Entire record must be a multiple of 4 */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_FONT_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IMAGE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Id U_PSEUDO_OBJ containing one of the 2 types of image data + + EMF+ manual 2.2.1.4, Microsoft name: EmfPlusImage Object +*/ +U_PSEUDO_OBJ *U_PMF_IMAGE_set(uint32_t Version, const U_PSEUDO_OBJ *Id){ + if(!Id){ return(NULL); } + int32_t Type = U_OID_To_IDT(Id->Type); + if(Type<0){ return(NULL);} + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {&Type, 4, 1, U_LE}, + {Id->Data, Id->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IMAGE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IMAGEATTRIBUTES PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param WrapMode WrapMode object + \param ClampColor EmfPlusARGB object + \param ObjectClamp ObjectClamp Identifiers + + EMF+ manual 2.2.1.5, Microsoft name: EmfPlusImageAttributes Object +*/ +U_PSEUDO_OBJ *U_PMF_IMAGEATTRIBUTES_set(uint32_t Version, uint32_t WrapMode, uint32_t ClampColor, uint32_t ObjectClamp){ + uint32_t Reserved=0; + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {&Reserved, 4, 1, U_LE}, + {&WrapMode, 4, 1, U_LE}, + {&ClampColor, 4, 1, U_LE}, + {&ObjectClamp, 4, 1, U_LE}, + {&Reserved, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IMAGEATTRIBUTES_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_PATH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Points U_PSEUDO_OBJ containing array of points (of type PMFPointR, PMFPoint, or PMFPointF, determined by U_PPF_P and U_PPF_C bits in Flags) + \param Types U_PSEUDO_OBJ containing array of types (U_PMF_PATHPOINTTYPE or U_PMF_PATHPOINTTYPERLE, determined by U_PPF_R big in Flags) + + EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object +*/ +U_PSEUDO_OBJ *U_PMF_PATH_set(uint32_t Version, const U_PSEUDO_OBJ *Points, const U_PSEUDO_OBJ *Types){ + int ctype, RelAbs, rtype; + int pad; + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + if(Types){ + if( Types->Type == (U_PMF_PATHPOINTTYPERLE_OID | U_PMF_ARRAY_OID)){ rtype = 1; } + else if(Types->Type == (U_PMF_PATHPOINTTYPE_OID | U_PMF_ARRAY_OID)){ rtype = 0; } + else { return(NULL); } + } + else { return(NULL); } + uint16_t Flags = (rtype ? U_PPF_R : 0) | (ctype ? U_PPF_C : 0)| (RelAbs ? U_PPF_P : 0); + pad = (0x3 & (Points->Used + Types->Used)); + if(pad){ pad = 4 - pad; } + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE }, + {Points->Data, 4, 1, U_XE }, /* Elements from Points */ + {&Flags, 2, 1, U_LE }, + {NULL, 2, 1, U_LE }, /* Reserved field */ + {Points->Data + 4, Points->Used - 4, 1, U_XE }, /* omit Points Elements */ + {Types->Data +4, Types->Used - 4, 1, U_XE }, /* omit Types Elements */ + {NULL, pad, (pad ? 1 : 0), (pad ? U_XE : U_XX)}, /* if no padding is needed the Units will be zero and nothing will happen */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATH_OID, List); + return(po); +} + + +/** + \brief Create and set a U_PMF_PATH PseudoObject that uses U_PMF_POINTF coordinates + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Path U_DPSEUDO_OBJ containing a path. + + EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object +*/ +U_PSEUDO_OBJ *U_PMF_PATH_set2(uint32_t Version, const U_DPSEUDO_OBJ *Path){ + if(!Path || !Path->Elements){ return(NULL); } + uint16_t Flags = 0; + int pad = (0x3 & Path->Elements); + if(pad){ pad = 4 - pad; } + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE }, + {&Path->Elements, 4, 1, U_LE }, + {&Flags, 2, 1, U_LE }, + {NULL, 2, 1, U_LE }, /* Reserved field */ + {Path->poPoints->Data, 4, 2*Path->Elements,U_XE }, /* raw OID, so no leading Elements to omit */ + {Path->poTypes->Data, 1, Path->Elements, U_XE }, /* raw OID, so no leading Elements to omit */ + {NULL, pad, (pad ? 1 : 0), (pad ? U_XE : U_XX)}, /* if no padding is needed the Units will be zero and nothing will happen */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATH_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_PATH PseudoObject that uses U_PMF_POINT (int 16) coordinates + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Path U_DPSEUDO_OBJ containing a path. + + EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object +*/ +U_PSEUDO_OBJ *U_PMF_PATH_set3(uint32_t Version, const U_DPSEUDO_OBJ *Path){ + if(!Path || !Path->Elements){return(NULL); } + uint16_t Flags = U_PPF_C; + int pad = (0x3 & Path->Elements); + if(pad){ pad = 4 - pad; } + U_PMF_POINT *Points16 = POINTF_To_POINT16_LE((U_PMF_POINTF *)Path->poPoints->Data, Path->Elements); + if(!Points16){ return(NULL); } + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE }, + {&Path->Elements, 4, 1, U_LE }, + {&Flags, 2, 1, U_LE }, + {NULL, 2, 1, U_LE }, /* Reserved field */ + {Points16, 2, 2*Path->Elements,U_XE }, /* raw data, so no leading Elements to omit */ + {Path->poTypes->Data, 1, Path->Elements, U_XE }, /* raw data, so no leading Elements to omit */ + {NULL, pad, (pad ? 1 : 0), (pad ? U_XE : U_XX)}, /* if no padding is needed the Units will be zero and nothing will happen */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATH_OID, List); + free(Points16); + return(po); +} + +/** + \brief Create and set a U_PMF_PEN PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param PenData U_PSEUDO_OBJ containing U_PMF_PENDATA object + \param Brush U_PSEUDO_OBJ containing U_PMF_BRUSH object + + EMF+ manual 2.2.1.7, Microsoft name: EmfPlusPen Object +*/ +U_PSEUDO_OBJ *U_PMF_PEN_set(uint32_t Version, const U_PSEUDO_OBJ *PenData, const U_PSEUDO_OBJ *Brush){ + if(!PenData || (PenData->Type != U_PMF_PENDATA_OID)){ return(NULL); } + if(!Brush || (Brush->Type != U_PMF_BRUSH_OID) ){ return(NULL); } + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {NULL, 4, 1, U_LE}, + {PenData->Data, PenData->Used, 1, U_XE}, + {Brush->Data, Brush->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PEN_OID, List); + return(po); +} + + +/** + \brief Create and set a U_PMF_REGION PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Version EmfPlusGraphicsVersion object + \param Count Number of CHILD nodes. This is one less than the total number of U_PMF_REGIONNODE objects in Nodes. + \param Nodes U_PSEUDO_OBJ containing U_PMF_REGIONNODE object (Nodes defining region, may be a single element or a binary tree) + + EMF+ manual 2.2.1.8, Microsoft name: EmfPlusRegion Object +*/ +U_PSEUDO_OBJ *U_PMF_REGION_set(uint32_t Version, uint32_t Count, const U_PSEUDO_OBJ *Nodes){ + if(Nodes->Type != U_PMF_REGIONNODE_OID)return(NULL); + const U_SERIAL_DESC List[] = { + {&Version, 4, 1, U_LE}, + {&Count, 4, 1, U_LE}, + {Nodes->Data, Nodes->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_REGION_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_STRINGFORMAT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Sfs pointer to U_PMF_STRINGFORMAT structure, with no variable part + \param Sfd (optional) U_PSEUDO_OBJ containing U_PMF_STRINGFORMATDATA object + + EMF+ manual 2.2.1.9, Microsoft name: EmfPlusStringFormat Object +*/ +U_PSEUDO_OBJ *U_PMF_STRINGFORMAT_set(U_PMF_STRINGFORMAT *Sfs, const U_PSEUDO_OBJ *Sfd){ + if(Sfd){ + if((!Sfs->TabStopCount && !Sfs->RangeCount) || (Sfd->Type != U_PMF_STRINGFORMATDATA_OID))return(NULL); + } + else { + if(Sfs->TabStopCount || Sfs->RangeCount)return(NULL); + } + const U_SERIAL_DESC List[] = { + {&Sfs->Version, 4, 1, U_LE}, + {&Sfs->Flags, 4, 1, U_LE}, + {&Sfs->Language, 4, 1, U_LE}, + {&Sfs->StringAlignment, 4, 1, U_LE}, + {&Sfs->LineAlign, 4, 1, U_LE}, + {&Sfs->DigitSubstitution, 4, 1, U_LE}, + {&Sfs->DigitLanguage, 4, 1, U_LE}, + {&Sfs->FirstTabOffset, 4, 1, U_LE}, + {&Sfs->HotkeyPrefix, 4, 1, U_LE}, + {&Sfs->LeadingMargin, 4, 1, U_LE}, + {&Sfs->TrailingMargin, 4, 1, U_LE}, + {&Sfs->Tracking, 4, 1, U_LE}, + {&Sfs->Trimming, 4, 1, U_LE}, + {&Sfs->TabStopCount, 4, 1, U_LE}, + {&Sfs->RangeCount, 4, 1, U_LE}, + {(Sfd ? Sfd->Data : NULL), (Sfd ? Sfd->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_STRINGFORMAT_OID, List); + return(po); +} + +/** + \brief Create and set a PMF_4NUM PseudoObject (used for BrushID's) + \return Pointer to PseudoObject, NULL on error + \param BrushID U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + +*/ +U_PSEUDO_OBJ *U_PMF_4NUM_set(uint32_t BrushID){ + if(BrushID>63){ return(NULL); } + const U_SERIAL_DESC List[] = { + {&BrushID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_4NUM_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_ARGB PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Alpha Alpha (0-255) + \param Red Red color (0-255) + \param Green Green color (0-255) + \param Blue Blue color (0-255) + + EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object +*/ +U_PSEUDO_OBJ *U_PMF_ARGB_set(uint8_t Alpha, uint8_t Red, uint8_t Green, uint8_t Blue){ + const U_SERIAL_DESC List[] = { + {&Blue, 1, 1, U_XE}, + {&Green, 1, 1, U_XE}, + {&Red, 1, 1, U_XE}, + {&Alpha, 1, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_ARGB_OID, List); + return(po); +} + +/** + \brief Create and set an Array of U_PMF_ARGB valus in a PseudoObject + \return Pointer to PseudoObject containing the count, followed by the array of colors, NULL on error + \param Count Number of entries in Colors + \param Colors Array of ARGB values + + EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object +*/ +U_PSEUDO_OBJ *U_PMF_ARGBN_set(uint32_t Count, U_PMF_ARGB *Colors){ + const U_SERIAL_DESC List[] = { + {&Count, 4, 1, U_LE}, + {Colors, 4, Count, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_ARGB_OID | U_PMF_ARRAY_OID, List); + return(po); +} + +/** + \brief Set a U_PMF_ARGB object + \return Object + \param Alpha Alpha (0-255) + \param Red Red color (0-255) + \param Green Green color (0-255) + \param Blue Blue color (0-255) + + EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object +*/ +U_PMF_ARGB U_PMF_ARGBOBJ_set(uint8_t Alpha, uint8_t Red, uint8_t Green, uint8_t Blue){ + U_PMF_ARGB argb; + char *ptr = (char *) &argb; + U_PMF_MEMCPY_DSTSHIFT(&ptr, &Blue, 1); + U_PMF_MEMCPY_DSTSHIFT(&ptr, &Green, 1); + U_PMF_MEMCPY_DSTSHIFT(&ptr, &Red, 1); + U_PMF_MEMCPY_DSTSHIFT(&ptr, &Alpha, 1); + return(argb); +} + +/** + \brief Create and set a U_PMF_BITMAP PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Bs pointer to U_PMF_BITMAP structure, with no variable part + \param Bm U_PSEUDO_OBJ containing an U_PMF_BITMAPDATA or U_PMF_COMPRESSEDIMAGE object + + EMF+ manual 2.2.2.2, Microsoft name: EmfPlusBitmap Object +*/ +U_PSEUDO_OBJ *U_PMF_BITMAP_set(const U_PMF_BITMAP *Bs, const U_PSEUDO_OBJ *Bm){ + if(Bm->Type != U_PMF_BITMAPDATA_OID && + Bm->Type != U_PMF_COMPRESSEDIMAGE_OID )return(NULL); + uint32_t Pad = UP4(Bm->Used) - Bm->Used; /* undocumented padding, must be present for at least PNG */ + const U_SERIAL_DESC List[] = { + {Bs, 4, 5, U_LE}, + {Bm->Data, Bm->Used, 1, U_XE}, + {NULL, (Pad ? Pad : 0), (Pad ? 1 : 0), U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BITMAP_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_BITMAPDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Ps (optional) U_PSEUDO_OBJ containing a U_PMF_PALETTE structure + \param cbBm Bytes in Bm + \param Bm 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 +*/ +U_PSEUDO_OBJ *U_PMF_BITMAPDATA_set( const U_PSEUDO_OBJ *Ps, int cbBm, const char *Bm){ + if(Ps && (Ps->Type != U_PMF_PALETTE_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {(Ps ? Ps->Data : NULL), (Ps ? Ps->Used : 0), (Ps ? 1 : 0), U_LE}, + {Bm, cbBm, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BITMAPDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_BLENDCOLORS PseudoObject + \return Pointer to PseudoObject, NULL on Positions and Colors + \param Elements number of elements in Positions, must agree with the number of Colors. + \param Positions positions along gradient line. The first position MUST be 0.0 and the last MUST be 1.0. + \param Colors U_PSEUDO_OBJ containing an array of U_PMF_ARGB objects: object colors at positions on gradient line + + EMF+ manual 2.2.2.4, Microsoft name: EmfPlusBlendColors Object +*/ +U_PSEUDO_OBJ *U_PMF_BLENDCOLORS_set(uint32_t Elements, const U_FLOAT *Positions, const U_PSEUDO_OBJ *Colors){ + if(!Colors || !Positions || Colors->Type != (U_PMF_ARGB_OID | U_PMF_ARRAY_OID)){ return(NULL); } + uint32_t CElements = (Colors->Used - 4)/4; + if(CElements != Elements){ return(NULL); } + const U_SERIAL_DESC List[] = { + {&CElements, 4, 1, U_LE}, + {Positions, 4, CElements, U_LE}, + {Colors->Data + 4, Colors->Used - 4, 1, U_XE}, /* omit Elements part of this PseudoObject */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BLENDCOLORS_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_BLENDCOLORS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Elements members in osition, inluding Start and End (0.0 - 1.0) + \param StartColor Start Color (U_PMF_ARGB) + \param EndColor End Color (U_PMF_ARGB) + + EMF+ manual 2.2.2.5, Microsoft name: EmfPlusBlendFactors Object + + + Positions always start at 0.0 and always end at 1.0. It is not well documented but other + start and end values generally do not work. +*/ +U_PSEUDO_OBJ *U_PMF_BLENDCOLORS_linear_set(uint32_t Elements, U_PMF_ARGB StartColor, U_PMF_ARGB EndColor){ + double dP,dR,dG,dB,dA,P,R,G,B,A; + U_FLOAT StartPos = 0.0; + U_FLOAT EndPos = 1.0; + U_FLOAT *Positions; + U_FLOAT *pP; + U_PMF_ARGB *Colors; + U_PMF_ARGB *pC; + unsigned int i; + if(Elements <= 2 ){ return(NULL); } + pP = Positions = (U_FLOAT *)malloc(Elements *sizeof(U_FLOAT)); + if(!Positions){ return(NULL); } + pC = Colors = (U_PMF_ARGB *)malloc(Elements *sizeof(U_PMF_ARGB)); + if(!Colors){ + free(Positions); + return(NULL); + } + dP = (EndPos - StartPos )/(float)(Elements - 1); + dB = ((double)EndColor.Blue - (double)StartColor.Blue )/(double)(Elements - 1); + dG = ((double)EndColor.Green - (double)StartColor.Green)/(double)(Elements - 1); + dR = ((double)EndColor.Red - (double)StartColor.Red )/(double)(Elements - 1); + dA = ((double)EndColor.Alpha - (double)StartColor.Alpha)/(double)(Elements - 1); + P = StartPos; + B = StartColor.Blue; + G = StartColor.Green; + R = StartColor.Red; + A = StartColor.Alpha; + for(i=0;i1.0 values, inclusiv + + EMF+ manual 2.2.2.5, Microsoft name: EmfPlusBlendFactors Object +*/ +U_PSEUDO_OBJ *U_PMF_BLENDFACTORS_set(uint32_t Elements, const U_FLOAT *Positions, const U_FLOAT *Factors){ + if(!Positions || !Factors)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + {Positions, 4, Elements, U_LE}, + {Factors, 4, Elements, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BLENDFACTORS_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_BLENDFACTORS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Elements members in osition, inluding Start and End (0.0 - 1.0) + \param StartFactor Start Factor (0.0 - 1.0) + \param EndFactor End Factor (0.0 - 1.0) + + EMF+ manual 2.2.2.5, Microsoft name: EmfPlusBlendFactors Object + + + Positions always start at 0.0 and always end at 1.0. It is not well documented but other + start and end values generally do not work. +*/ +U_PSEUDO_OBJ *U_PMF_BLENDFACTORS_linear_set(uint32_t Elements, U_FLOAT StartFactor, U_FLOAT EndFactor){ + double dP,dF,P,F; + U_FLOAT StartPos = 0.0; + U_FLOAT EndPos = 1.0; + U_FLOAT *Positions; + U_FLOAT *Factors; + U_FLOAT *pP; + U_FLOAT *pF; + unsigned int i; + if(Elements <= 2 ){ return(NULL); } + pP = Positions = (U_FLOAT *)malloc(Elements *sizeof(U_FLOAT)); + if(!Positions){ return(NULL); } + pF = Factors = (U_FLOAT *)malloc(Elements *sizeof(U_FLOAT)); + if(!Factors){ + free(Positions); + return(NULL); + } + dP = (EndPos - StartPos )/(float)(Elements - 1); + dF = (EndFactor - StartFactor)/(float)(Elements - 1); + P = StartPos; + F = StartFactor; + for(i=0;iType != U_PMF_PATH_OID)return(NULL); + /* PO Used is size_t, might be 8 bytes, value in record must be 4 bytes */ + uint32_t Used = Path->Used; + const U_SERIAL_DESC List[] = { + {&Used, 4, 1, U_LE}, + {Path->Data, Path->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BOUNDARYPATHDATA_OID, List); + return(po); +} + + +/** + \brief Create and set a U_PMF_BOUNDARYPOINTDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Elements members in each array + \param Points array of U_PMF_POINTF + + EMF+ manual 2.2.2.7, Microsoft name: EmfPlusBoundaryPointData Object +*/ +U_PSEUDO_OBJ *U_PMF_BOUNDARYPOINTDATA_set(uint32_t Elements, const U_PMF_POINTF *Points){ + if(!Points)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + {Points, 4, 2*Elements,U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_BOUNDARYPOINTDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_CHARACTERRANGE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param First First position in range + \param Length Range length + + EMF+ manual 2.2.2.8, Microsoft name: EmfPlusCharacterRange Object +*/ +U_PSEUDO_OBJ *U_PMF_CHARACTERRANGE_set(int32_t First, int32_t Length){ + const U_SERIAL_DESC List[] = { + {&First, 4, 1, U_LE}, + {&Length, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CHARACTERRANGE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_COMPOUNDLINEDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Elements Members in Widths + \param Widths Array of U_FLOAT Line or gap widths (0.0 <-> 1.0, fraction of total line width ) + + EMF+ manual 2.2.2.9, Microsoft name: EmfPlusCompoundLineData Object +*/ +U_PSEUDO_OBJ *U_PMF_COMPOUNDLINEDATA_set(int32_t Elements, const char *Widths){ + if(!Widths)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements ,4, 1, U_LE}, + {Widths, 4, Elements,U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_COMPOUNDLINEDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_COMPRESSEDIMAGE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param cbImage Bytes in Image + \param Image Stored image in one of the supported formats (GIF, PNG, etc.). + + EMF+ manual 2.2.2.10, Microsoft name: EmfPlusCompressedImage Object +*/ +U_PSEUDO_OBJ *U_PMF_COMPRESSEDIMAGE_set(int32_t cbImage, const char *Image){ + if(!cbImage || !Image)return(NULL); + const U_SERIAL_DESC List[] = { + {Image, cbImage, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_COMPRESSEDIMAGE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_CUSTOMENDCAPDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Clc U_PSEUDO_OBJ containing a U_PMF_CUSTOMLINECAP object + + EMF+ manual 2.2.2.11, Microsoft name: EmfPlusCustomEndCapData Object +*/ +U_PSEUDO_OBJ *U_PMF_CUSTOMENDCAPDATA_set(const U_PSEUDO_OBJ *Clc){ + if(Clc->Type != U_PMF_CUSTOMLINECAP_OID)return(NULL); + /* PO Used is size_t, might be 8 bytes, value in record must be 4 bytes */ + uint32_t Used = Clc->Used; + const U_SERIAL_DESC List[] = { + {&Used, 4, 1, U_LE}, + {Clc->Data, Clc->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CUSTOMENDCAPDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_CUSTOMLINECAPARROWDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Width Arrow cap width (is multiplied by line width before draw) + \param Height Arrow cap length (is multiplied by line width before draw) + \param MiddleInset Pixels between outer edge and filled region + \param FillState If set, fill, otherwise, only border + \param StartCap LineCap enumeration (type of cap) + \param EndCap LineCap enumeration + \param Join LineJoin enumeration + \param MiterLimit Maximum (miter length / line width) + \param WidthScale Scale for U_PMF_CUSTOMLINECAP object + + EMF+ manual 2.2.2.12, Microsoft name: EmfPlusCustomLineCapArrowData Object +*/ +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAPARROWDATA_set(U_FLOAT Width, U_FLOAT Height, + U_FLOAT MiddleInset, uint32_t FillState, uint32_t StartCap, uint32_t EndCap, uint32_t Join, + U_FLOAT MiterLimit, U_FLOAT WidthScale + ){ + const U_SERIAL_DESC List[] = { + {&Width, 4, 1, U_LE}, + {&Height ,4, 1, U_LE}, + {&MiddleInset, 4, 1, U_LE}, + {&FillState, 4, 1, U_LE}, + {&StartCap, 4, 1, U_LE}, + {&EndCap, 4, 1, U_LE}, + {&Join, 4, 1, U_LE}, + {&MiterLimit, 4, 1, U_LE}, + {&WidthScale, 4, 1, U_LE}, + {NULL, 8, 2, U_LE}, /* FillHotSpots and LineHotSpots */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CUSTOMLINECAPARROWDATA_OID, List); + return(po); +} + + +/** + \brief Create and set a U_PMF_CUSTOMLINECAPDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Flags CustomLineCapData flags + \param Cap LineCap enumeration (type of cap) + \param Inset Distance line cap start -> line end + \param StartCap LineCap enumeration + \param EndCap LineCap enumeration + \param Join LineJoin enumeration + \param MiterLimit Maximum (miter length / line width) + \param WidthScale Scale for U_PMF_CUSTOMLINECAP object + \param Clcod U_PSEUDO_OBJ containing a U_PMF_CUSTOMLINECAPOPTIONALDATA object + + EMF+ manual 2.2.2.13, Microsoft name: EmfPlusCustomLineCapData Object +*/ +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAPDATA_set(uint32_t Flags, uint32_t Cap, + U_FLOAT Inset, uint32_t StartCap, uint32_t EndCap, + uint32_t Join, U_FLOAT MiterLimit, U_FLOAT WidthScale, + const U_PSEUDO_OBJ *Clcod + ){ + if(Clcod->Type != U_PMF_CUSTOMLINECAPOPTIONALDATA_OID)return(NULL); + const U_SERIAL_DESC List[] = { + {&Flags, 4, 1, U_LE}, + {&Cap, 4, 1, U_LE}, + {&Inset, 4, 1, U_LE}, + {&StartCap, 4, 1, U_LE}, + {&EndCap, 4, 1, U_LE}, + {&Join, 4, 1, U_LE}, + {&MiterLimit, 4, 1, U_LE}, + {&WidthScale, 4, 1, U_LE}, + {NULL, 8, 2, U_LE}, /* FillHotSpots and LineHotSpots */ + {Clcod->Data, Clcod->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CUSTOMLINECAPDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_CUSTOMLINECAPOPTIONALDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Fill U_PSEUDO_OBJ containing a U_PMF_FILLPATHOBJ object (optional) + \param Line U_PSEUDO_OBJ containing a U_PMF_LINEPATH object (optional) + + EMF+ manual 2.2.2.14, Microsoft name: EmfPlusCustomLineCapOptionalData Object +*/ +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAPOPTIONALDATA_set(const U_PSEUDO_OBJ *Fill, const U_PSEUDO_OBJ *Line){ + if(Fill && (Fill->Type != U_PMF_FILLPATHOBJ_OID))return(NULL); + if(Line && (Line->Type != U_PMF_LINEPATH_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {Fill->Data, Fill->Used, 1, U_XE}, + {Line->Data, Line->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CUSTOMLINECAPOPTIONALDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_CUSTOMSTARTCAPDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Clc U_PSEUDO_OBJ containing a U_PMF_CUSTOMLINECAPDATA object + + EMF+ manual 2.2.2.15, Microsoft name: EmfPlusCustomStartCapData Object +*/ +U_PSEUDO_OBJ *U_PMF_CUSTOMSTARTCAPDATA_set(const U_PSEUDO_OBJ *Clc){ + if(Clc && (Clc->Type != U_PMF_CUSTOMLINECAP_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {Clc->Data, Clc->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_CUSTOMSTARTCAPDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_DASHEDLINEDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Elements Members in Lengths + \param Lengths Array of U_FLOAT holding lengths of dashes and spaces. + + EMF+ manual 2.2.2.16, Microsoft name: EmfPlusDashedLineData Object +*/ +U_PSEUDO_OBJ *U_PMF_DASHEDLINEDATA_set(int32_t Elements, const U_FLOAT *Lengths){ + if(!Lengths)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + {Lengths, 4, Elements, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_DASHEDLINEDATA_OID, List); + return(po); +} + +/** + \brief Utility function to create and set a U_PMF_DASHEDLINEDATA PseudoObject from one of a predefined set of patterns + \return Pointer to PseudoObject, NULL on error + \param Unit Length of the repeat unit + \param StdPat Members in Lengths + + EMF+ manual 2.2.2.16, Microsoft name: EmfPlusDashedLineData Object +*/ +U_PSEUDO_OBJ *U_PMF_DASHEDLINEDATA_set2(U_FLOAT Unit, int StdPat){ + uint32_t Elements; + uint8_t *p; + U_FLOAT SubUnit; + U_FLOAT Lengths[8]; /* This is the most dash/spaces that will be needed*/ + int i; + /* Dot = 1, Dash = 2; Long = 3, 0 = terminate pattern */ + uint8_t SB[U_DD_Types][5] = + { + {0,0,0,0,0}, // Solid + {2,0,0,0,0}, // Dash + {2,2,0,0,0}, // DashDash + {2,2,2,0,0}, // DashDashDash + {2,2,2,2,0}, // DashDashDashDash + {1,0,0,0,0}, // Dot + {1,1,0,0,0}, // DotDot + {1,1,1,0,0}, // DotDotDot + {1,1,1,1,0}, // DotDotDotDot + {2,1,0,0,0}, // DashDot + {2,2,1,0,0}, // DashDashDot + {2,2,1,1,0}, // DashDashDotDot + {2,2,2,1,0}, // DashDashDashDot + {2,1,1,0,0}, // DashDotDot + {2,1,1,1,0}, // DashDotDotDot + {2,1,2,1,0}, // DashDotDashDot + {3,0,0,0,0}, // Long + {3,3,0,0,0}, // LongLong + {3,3,3,0,0}, // LongLongLong + {3,3,3,3,0}, // LongLongLongLong + {3,1,0,0,0}, // LongDot + {3,3,1,0,0}, // LongLongDot + {3,3,1,1,0}, // LongLongDotDot + {3,3,3,1,0}, // LongLongLongDot + {3,1,1,0,0}, // LongDotDot + {3,1,1,1,0}, // LongDotDotDot + {3,1,3,1,0} // LongDotLongDot + }; + if(Unit <= 0 ){ return(NULL); } + if((StdPat <= 0) || (StdPat > U_DD_LongDotLongDot)){ return(NULL); } + p = &(SB[StdPat][0]); + for(Elements = 0; *p; p++, Elements++){} + SubUnit = Unit/((U_FLOAT) Elements); + Elements *= 2; + p = &(SB[StdPat][0]); + for(i=0; *p; p++){ + switch(*p){ + case 0: break; + case 1: /* dot */ + Lengths[i++] = SubUnit * 0.125; + Lengths[i++] = SubUnit * 0.875; + break; + case 2: /* dash */ + Lengths[i++] = SubUnit * 0.5; + Lengths[i++] = SubUnit * 0.5; + break; + case 3: /* long */ + Lengths[i++] = SubUnit * 0.75; + Lengths[i++] = SubUnit * 0.25; + break; + } + } + + U_PSEUDO_OBJ *po = U_PMF_DASHEDLINEDATA_set(Elements, Lengths); + return(po); +} + +/** + \brief Utility function to create and set a U_PMF_DASHEDLINEDATA PseudoObject from the bits that are set in a uint32_t + \return Pointer to PseudoObject, NULL on error + \param Unit Length of the repeat unit + \param BitPat uint32_t holding the bit pattern, the lowest order bit MUST be set and the highest order MUST be clear. + + Make a line with a dot/dash pattern defined by the bits in the BitPat value. If a bit is set it is drawn, + if clear it is not. Every bit drawn has length Unit/32, and consecutive drawn bits are merged together. + The lowest order bit is the first bit that may be drawn, the highest the last. + + Example: if the integer has value 0x13 the pattern produced will be: + 0 -> 2*unit/32 drawn + 2*unit/32 -> 5*unit/32 not drawn + 5*unit/32 -> 6*unit/32 drawn + 6*unit/32 -> unit not drawn + + EMF+ manual 2.2.2.16, Microsoft name: EmfPlusDashedLineData Object +*/ +U_PSEUDO_OBJ *U_PMF_DASHEDLINEDATA_set3(U_FLOAT Unit, uint32_t BitPat){ + uint32_t Elements=0; + U_FLOAT SubUnit = Unit/32.0; + U_FLOAT Lengths[32]; /* This is the most dash/spaces that will be needed*/ + if(!(0x00000001 & BitPat))return(NULL); /* Pattern must start with a drawn segment, this bit must be set */ + if( 0x80000000 & BitPat )return(NULL); /* Pattern must end with an undrawn segment, this bit must be clear */ + int i=0; + int k; + int lastType=1; + int newType=0; + uint32_t j=1; + Lengths[0]=0; + for(k=0; k<32; k++, j=j<<1){ + if(j & BitPat){ + if(!lastType){ + newType=1; + } + } + else { + if(lastType){ + newType=1; + } + } + if(newType){ + i++; + Lengths[i]=0; + Elements++; + lastType = !lastType; + newType = 0; + } + Lengths[i] += SubUnit; + } + Elements = i+1; + + U_PSEUDO_OBJ *po = U_PMF_DASHEDLINEDATA_set(Elements, Lengths); + return(po); +} + +/** + \brief Create and set a U_PMF_FILLPATHOBJ PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Path U_PSEUDO_OBJ containing a U_PMF_PATH object + + EMF+ manual 2.2.2.17, Microsoft name: EmfPlusFillPath Object +*/ +U_PSEUDO_OBJ *U_PMF_FILLPATHOBJ_set(const U_PSEUDO_OBJ *Path){ + if(Path && (Path->Type != U_PMF_PATH_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {Path->Data, Path->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_FILLPATHOBJ_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_FOCUSSCALEDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param ScaleX value 0.0 <-> 1.0 + \param ScaleY value 0.0 <-> 1.0 + + EMF+ manual 2.2.2.18, Microsoft name: EmfPlusFocusScaleData Object +*/ +U_PSEUDO_OBJ *U_PMF_FOCUSSCALEDATA_set(U_FLOAT ScaleX, U_FLOAT ScaleY){ + uint32_t tmp = 2; + const U_SERIAL_DESC List[] = { + {&tmp, 4, 1, U_LE}, + {&ScaleX, 4, 1, U_LE}, + {&ScaleY, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_FOCUSSCALEDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_GRAPHICSVERSION object (Signature always set to 0xDBC01) + \return Pointer to PseudoObject, NULL on error + \param GrfVersion GraphicsVersion enumeration + + EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object +*/ +U_PSEUDO_OBJ *U_PMF_GRAPHICSVERSION_set(int GrfVersion){ + uint32_t tmp; + tmp = U_GFVR_PMF << 12; /* signature, can only have this value */ + tmp |= (GrfVersion & U_GFVR_MASKLO); + const U_SERIAL_DESC List[] = { + {&tmp, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_GRAPHICSVERSION_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_GRAPHICSVERSION object Structure (Signature always set to 0xDBC01) + \return U_PMF_GRAPHICSVERSION + \param GrfVersion GraphicsVersion enumeration + + EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object +*/ +U_PMF_GRAPHICSVERSION U_PMF_GRAPHICSVERSIONOBJ_set(int GrfVersion){ + uint32_t tmp; + tmp = U_GFVR_PMF << 12; /* signature, can only have this value */ + tmp |= (GrfVersion & U_GFVR_MASKLO); + return(tmp); +} + + +/** + \brief Create and set a U_PMF_HATCHBRUSHDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Style HatchStyle enumeration + \param Fg U_PSEUDO_OBJ containing a U_ARGB object, Foreground hatch pattern line color + \param Bg U_PSEUDO_OBJ containing a U_ARGB object, Background hatch pattern line color + + EMF+ manual 2.2.2.20, Microsoft name: EmfPlusHatchBrushData Object +*/ +U_PSEUDO_OBJ *U_PMF_HATCHBRUSHDATA_set(uint32_t Style, const U_PSEUDO_OBJ *Fg, const U_PSEUDO_OBJ *Bg){ + if(!Fg ||(Fg->Type != U_PMF_ARGB_OID))return(NULL); + if(!Bg ||(Bg->Type != U_PMF_ARGB_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {&Style, 4, 1, U_LE}, + {Fg->Data, Fg->Used, 1, U_XE}, + {Bg->Data, Bg->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_HATCHBRUSHDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_INTEGER7 PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Value 7 bit signed integer (stored in an integer, range 63 <-> -64, inclusive) + + EMF+ manual 2.2.2.21, Microsoft name: EmfPlusInteger7 Object +*/ +U_PSEUDO_OBJ *U_PMF_INTEGER7_set(int Value){ + uint8_t utmp; + if(Value < -64 || Value > 63)return(NULL); + utmp = U_MASK_INT7 & *(unsigned int *)&Value; + U_PSEUDO_OBJ *po = U_PO_create((char *)&utmp, 1, 1, U_PMF_INTEGER7_OID); /* simple method is OK, no possibility of Endian issues */ + return(po); +} + +/** + \brief Create and set a U_PMF_INTEGER15 PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Value 15 bit signed integer (stored in an integer, range 32677 <-> -32678, inclusive) + + EMF+ manual 2.2.2.22, Microsoft name: EmfPlusInteger15 Object +*/ +U_PSEUDO_OBJ *U_PMF_INTEGER15_set(int Value){ + uint16_t utmp; + if(Value < -32678 || Value > 32677)return(NULL); + utmp = U_TEST_INT15 | (U_MASK_INT15 & *(unsigned int *)&Value); + const U_SERIAL_DESC List[] = { + {&utmp, 2, 1, U_BE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_INTEGER15_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_LANGUAGEIDENTIFIER value in 4 byte unsigned int, in NATIVE byte order + \return LID value in least significant two bytes and 0 in most significant two bytes. + \param SubLId Example: code for USA + \param PriLId Example: code for English + + EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier Object +*/ +U_PMF_LANGUAGEIDENTIFIER U_PMF_LANGUAGEIDENTIFIEROBJ_set(int SubLId, int PriLId){ + U_PMF_LANGUAGEIDENTIFIER utmp32; + utmp32 = ((SubLId & U_FF_MASK_SUBLID) << U_FF_SHFT_SUBLID) | ((PriLId & U_FF_MASK_PRILID) << U_FF_SHFT_PRILID); + return(utmp32); +} + +/** + \brief Create and set a U_PMF_LANGUAGEIDENTIFIER PseudoObject + \return Pointer to PseudoObject, NULL on error + \param LId Language Identifier as produced by U_PMF_LANGUAGEIDENTIFIEROBJ_set(). + + EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier Object +*/ +U_PSEUDO_OBJ *U_PMF_LANGUAGEIDENTIFIER_set(U_PMF_LANGUAGEIDENTIFIER LId){ + uint16_t utmp16; + utmp16 = (LId & U_FF_MASK_LID) << U_FF_SHFT_LID; + const U_SERIAL_DESC List[] = { + {&utmp16, 2, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_LANGUAGEIDENTIFIER_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_LINEARGRADIENTBRUSHDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Lgbd U_PMF_LINEARGRADIENTBRUSHDATA object (constant part) + \param Lgbod U_PSEUDO_OBJ containing a U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA object (variable part of a U_PMF_LINEARGRADIENTBRUSHDATA object) + + + EMF+ manual 2.2.2.24, Microsoft name: EmfPlusLinearGradientBrushData Object +*/ +U_PSEUDO_OBJ *U_PMF_LINEARGRADIENTBRUSHDATA_set(const U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const U_PSEUDO_OBJ *Lgbod){ + if(!Lgbd || !Lgbod || (Lgbod->Type != U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {Lgbd, 4, 6, U_LE}, + {&(Lgbd->StartColor), 4, 2, U_XE}, + {&(Lgbd->StartColor), 4, 2, U_XE}, /* repeat the start/end colors. Supposedly reserved. */ +// {NULL, 4, 2, U_LE}, /* zero fill the two Reserved fields, no matter what is passed in */ + {(Lgbod->Used ? Lgbod->Data : NULL), Lgbod->Used, 1, U_XE}, /* optional Data can exist and Used can be zero, SERIAL_set would throw an error on that */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_LINEARGRADIENTBRUSHDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Flags Bits are set that indicate which of the following were included. The caller must clear before passing it in. + \param Tm U_PSEUDO_OBJ containing a U_PMF_TRANSFORMMATRIX object + \param Bc U_PSEUDO_OBJ containing a U_PMF_BLENDCOLORS object or NULL + \param BfH U_PSEUDO_OBJ containing a U_PMF_BLENDFACTORS (H) object or NULL + \param BfV U_PSEUDO_OBJ containing a U_PMF_BLENDFACTORS (V) object or NULL (WARNING, GDI+ defines this field but does not render it. DO NOT USE.) + + + EMF+ manual 2.2.2.25, Microsoft name: EmfPlusLinearGradientBrushOptionalData Object + + + The rectangular gradients repeat in a tiled pattern. Tm can rotate and offset the gradient within each tile. + The gradient wraps when it is offset. + +*/ +U_PSEUDO_OBJ *U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_set(uint32_t *Flags, const U_PSEUDO_OBJ *Tm, + const U_PSEUDO_OBJ *Bc, const U_PSEUDO_OBJ *BfH, const U_PSEUDO_OBJ *BfV){ + if(!Flags )return(NULL); + if(Tm && (Tm->Type != U_PMF_TRANSFORMMATRIX_OID))return(NULL); + if(Bc && (Bc->Type != U_PMF_BLENDCOLORS_OID) )return(NULL); + if(BfH && (BfH->Type != U_PMF_BLENDFACTORS_OID) )return(NULL); + if(BfV && (BfV->Type != U_PMF_BLENDFACTORS_OID) )return(NULL); + if(Bc && (BfH || BfV) )return(NULL); + const U_SERIAL_DESC List[] = { + {(Tm ? Tm->Data : NULL), (Tm ? Tm->Used : 0), 1, U_XE}, + {(Bc ? Bc->Data : NULL), (Bc ? Bc->Used : 0), 1, U_XE}, + {(BfH ? BfH->Data : NULL), (BfH ? BfH->Used : 0), 1, U_XE}, + {(BfV ? BfV->Data : NULL), (BfV ? BfV->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_OID, List); + if(Tm ){ *Flags |= U_BD_Transform; } + if(Bc ){ *Flags |= U_BD_PresetColors; } + if(BfH){ *Flags |= U_BD_BlendFactorsH; } + if(BfV){ *Flags |= U_BD_BlendFactorsV; } + return(po); +} + +/** + \brief Create and set a U_PMF_LINEPATH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Path U_PSEUDO_OBJ containing a U_PMF_PATH object + + + EMF+ manual 2.2.2.26, Microsoft name: EmfPlusLinePath Object +*/ +U_PSEUDO_OBJ *U_PMF_LINEPATH_set(const U_PSEUDO_OBJ *Path){ + if(!Path || (Path->Type != U_PMF_PATH_OID))return(NULL); + const U_SERIAL_DESC List[] = { + {&Path->Data, Path->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_LINEPATH_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_METAFILE object (NOT SUPPORTED!) + \return Null + + + EMF+ manual 2.2.2.27, Microsoft name: EmfPlusMetafile Object +*/ +U_PSEUDO_OBJ *U_PMF_METAFILE_set(void){ + return(NULL); +} + +/** + \brief Create and set a U_PMF_PALETTE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Flags PaletteStyle flags + \param Elements Members in Lengths + \param Pd Array of U_PMF_ARGB holding colors of palettes. (Palette Data) + + EMF+ manual 2.2.2.28, Microsoft name: EmfPlusPalette Object +*/ +U_PSEUDO_OBJ *U_PMF_PALETTE_set(uint32_t Flags, uint32_t Elements, const U_PMF_ARGB *Pd){ + if(!Pd)return(NULL); + const U_SERIAL_DESC List[] = { + {&Flags, 4, 1, U_LE}, + {&Elements, 4, 1, U_LE}, + {Pd, 4, Elements, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PALETTE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_PATHGRADIENTBRUSHDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Flags PaletteStyle flags + \param WrapMode WrapMode enumeration + \param CenterColor U_PMF_ARGB Center color + \param Center Center coordinates + \param Gradient U_PSEUDO_OBJ containing an Array of U_PMF_ARGB holding colors of Gradient + \param Boundary U_PSEUDO_OBJ containing a U_PMF_BOUNDARYPATHDATA or U_PMF_BOUNDARYPOINTDATA object. (Boundary Data) + \param Data variable part of U_PMF_LINEARGRADIENTBRUSHDATA, exact composition depends on Flags + + EMF+ manual 2.2.2.29, Microsoft name: EmfPlusPathGradientBrushData Object +*/ +U_PSEUDO_OBJ *U_PMF_PATHGRADIENTBRUSHDATA_set(uint32_t Flags, int32_t WrapMode, U_PMF_ARGB CenterColor, + U_PMF_POINTF Center, + const U_PSEUDO_OBJ *Gradient, const U_PSEUDO_OBJ *Boundary, const U_PSEUDO_OBJ *Data){ + if( (Flags & U_BD_Path) && (!Boundary || (Boundary->Type != U_PMF_BOUNDARYPATHDATA_OID)))return(NULL); + if(!(Flags & U_BD_Path) && (!Boundary || (Boundary->Type != U_PMF_BOUNDARYPOINTDATA_OID)))return(NULL); + if(!(Gradient) || (Gradient->Type != (U_PMF_ARGB_OID | U_PMF_ARRAY_OID)))return(NULL); + if(!(Flags & U_BD_Transform) && + !(Flags & U_BD_PresetColors) && + !(Flags & U_BD_BlendFactorsH) && + !(Flags & U_BD_FocusScales) && + (!Data || (Data->Type != U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_OID)))return(NULL); + + const U_SERIAL_DESC List[] = { + {&Flags, 4, 1, U_LE}, + {&WrapMode, 4, 1, U_LE}, + {&CenterColor, 4, 1, U_XE}, + {&Center.X, 4, 2, U_LE}, + {Gradient->Data, Gradient->Used, 1, U_XE}, /* includes Elements */ + {Boundary->Data, Boundary->Used, 1, U_XE}, + {(Data ? Data->Data : NULL), (Data ? Data->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATHGRADIENTBRUSHDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_PATHGRADIENTBRUSHOPTIONALDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Flags PaletteStyle flags + \param Tm U_PSEUDO_OBJ containing a U_PMF_TRANSFORMMATRIX. (Transformation matrix) + \param Pd U_PSEUDO_OBJ containing a U_PMF_BLENDCOLORS or U_PMF_BLENDFACTORS object. (Pattern Data) + \param Fsd U_PSEUDO_OBJ containing a U_PMF_FOCUSSSCALEDATA object. (Focus Scale Data) + + EMF+ manual 2.2.2.30, Microsoft name: EmfPlusPathGradientBrushOptionalData Object +*/ +U_PSEUDO_OBJ *U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_set(uint32_t Flags, + const U_PSEUDO_OBJ *Tm, const U_PSEUDO_OBJ *Pd, const U_PSEUDO_OBJ *Fsd){ + if(Tm && (Tm->Type != U_PMF_TRANSFORMMATRIX_OID))return(NULL); + if(Pd && !(Flags & (U_BD_PresetColors | U_BD_BlendFactorsH)))return(NULL); + if( (Flags & U_BD_PresetColors) && ((Flags & U_BD_BlendFactorsH) || !Pd || (Pd->Type != U_PMF_BLENDCOLORS_OID) ))return(NULL); + if( (Flags & U_BD_BlendFactorsH) && ((Flags & U_BD_PresetColors) || !Pd || (Pd->Type != U_PMF_BLENDFACTORS_OID)))return(NULL); + if(Fsd && !(Flags & U_BD_FocusScales))return(NULL); + if( (Flags & U_BD_FocusScales) && (!Fsd || (Fsd->Type != U_PMF_BLENDCOLORS_OID) ))return(NULL); + const U_SERIAL_DESC List[] = { + {(Tm ? Tm->Data : NULL), (Tm ? Tm->Used : 0), 1, U_XE}, + {(Pd ? Pd->Data : NULL), (Pd ? Pd->Used : 0), 1, U_XE}, + {(Fsd ? Fsd->Data : NULL), (Fsd ? Fsd->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_OID, List); + return(po); +} + +/** + \brief Create and set an ARRAY of U_PMF_PATHPOINTTYPE objects + \return Pointer to PseudoObject, NULL on error + \param Elements Number of entries in Flags and Enumerations + \param Ppt Array of unsigned bytes, lower 4 bits hold the PathPointType flag upper 4 bits hold the PathPointType enumeration. + + EMF+ manual 2.2.2.31, Microsoft name: EmfPlusPathPointType Object +*/ +U_PSEUDO_OBJ *U_PMF_PATHPOINTTYPE_set(uint32_t Elements, const uint8_t *Ppt){ + if(!Elements || !Ppt)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + {Ppt, 1, Elements, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATHPOINTTYPE_OID | U_PMF_ARRAY_OID, List); + return(po); +} + +/** + \brief Create and set an ARRAY of U_PMF_PATHPOINTTYPE objects, with a preceding Elements count + \return Pointer to PseudoObject, NULL on error + \param Elements Number of elements to add. First is added once and Others Elements-1 times. + \param First Apply to first point, unsigned byte, lower 4 bits hold the PathPointType flag upper 4 bits hold the PathPointType enumeration. + \param Others Apply to all other points, unsigned byte, lower 4 bits hold the PathPointType flag upper 4 bits hold the PathPointType enumeration. + + EMF+ manual 2.2.2.31, Microsoft name: EmfPlusPathPointType Object +*/ +U_PSEUDO_OBJ *U_PMF_PATHPOINTTYPE_set2(uint32_t Elements, uint8_t First, uint8_t Others){ + if(!Elements)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_XE}, + {&First, 1, 1, U_XE}, + {&Others, 1, Elements-1, U_RP}, /* replicate the one value N-1 times */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PATHPOINTTYPE_OID | U_PMF_ARRAY_OID, List); + return(po); +} + +/** + \brief Create and set an ARRAY of U_PMF_PATHPOINTTYPERLE objects + \return Pointer to PseudoObject containing first the number of elements, then an array of U_PMF_PATHPOINTTYPERLE, NULL on error + \param Elements Number of entries in the arrays + \param Bz Array of unsigned bytes, if not zero, element has Bezier bit set + \param RL Array of unsigned bytes, Run lengths. + \param Ppte Array of unsigned bytes, PathPointType enumerations. + + EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE Object +*/ +U_PSEUDO_OBJ *U_PMF_PATHPOINTTYPERLE_set(uint32_t Elements, const uint8_t *Bz, const uint8_t *RL, const uint8_t *Ppte){ + uint8_t utmp; + if(!Bz || !RL || !Ppte)return(NULL); + /* allocate space in the structure but put no data in */ + U_PSEUDO_OBJ *po = U_PO_create(NULL, 4 + 2*Elements, 0, U_PMF_PATHPOINTTYPERLE_OID | U_PMF_ARRAY_OID); + + U_PSEUDO_OBJ *poi = U_PMF_4NUM_set(Elements); + po = U_PO_append(po, poi->Data, poi->Used); + U_PO_free(&poi); + + if(po){ + for( ;Elements; Elements--, Bz++, RL++, Ppte++){ + po = U_PO_append(po, (char *)Ppte, 1); + if(*RL > 0x3F){ /* run length too big for field */ + U_PO_free(&po); + return(NULL); + } + utmp = (*Bz ? 1 : 0) | ((*RL & 0x3F)<<2); /* bit 1 is not used and is set to 0 */ + po = U_PO_append(po, (char *)&utmp, 1); + } + } + return(po); +} + +/** + \brief Create and set a U_PMF_PENDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Unit UnitType enumeration + \param Width Width in units set by Unit + \param Pod U_PSEUDO_OBJ containing first the PenData flags then a U_PMF_PENOPTIONALDATA object (the second part + may be an empty if Flags is 0) + + + EMF+ manual 2.2.2.33, Microsoft name: EmfPlusPenData Object +*/ +U_PSEUDO_OBJ *U_PMF_PENDATA_set(uint32_t Unit, U_FLOAT Width, const U_PSEUDO_OBJ *Pod){ + if(Pod && ((Pod->Type != U_PMF_PENOPTIONALDATA_OID) || Pod->Used < 4))return(NULL); + const U_SERIAL_DESC List[] = { + {(Pod ? Pod->Data : NULL), 4, 1, U_XE}, /* the Flags field, clear if no optional data */ + {&Unit, 4, 1, U_LE}, + {&Width, 4, 1, U_LE}, + /* next is the (optional) U_PMF_PENOPTIONALDATA part or a terminator */ + {(Pod ? Pod->Data + 4 : NULL), (Pod ? Pod->Used - 4 : 0), (Pod ? 1 : 0), (Pod ? U_XE : U_XX)}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PENDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_PENOPTIONALDATA PseudoObject + \return Pointer to PseudoObject, NULL on error. Returned PO contains first the Flags, then the PO proper. + \param Flags Determines which of the values are stored. + \param Tm U_PSEUDO_OBJ containing a U_PMF_TRANSFORMMATRIX object (Transformation matrix) + \param StartCap LineCapType enumeration + \param EndCap LineCapType enumeration + \param Join LineJoinType enumeration + \param MiterLimit Maximum (miter length / line width) + \param Style LineStyle enumeration + \param DLCap DashedLineCapType enumeration + \param DLOffset Distance line start to first dash start + \param DLData U_PSEUDO_OBJ containing a U_PMF_DASHEDLINEDATA object Dash and space widths + \param PenAlignment PenAlignment enumeration + \param CmpndLineData U_PSEUDO_OBJ containing a U_PMF_COMPOUNDLINEDATA object Compount Line (parallel lines drawn instead of one) + \param CSCapData U_PSEUDO_OBJ containing a U_PMF_CUSTOMSTARTCAPDATA object Custom start cap + \param CECapData U_PSEUDO_OBJ containing a U_PMF_CUSTOMENDCAPDATA object Custom end cap + + + EMF+ manual 2.2.2.34, Microsoft name: EmfPlusPenOptionalData Object +*/ +U_PSEUDO_OBJ *U_PMF_PENOPTIONALDATA_set(uint32_t Flags, U_PSEUDO_OBJ *Tm, int32_t StartCap, int32_t EndCap, uint32_t Join, + U_FLOAT MiterLimit, int32_t Style, int32_t DLCap, U_FLOAT DLOffset, + U_PSEUDO_OBJ *DLData, int32_t PenAlignment, U_PSEUDO_OBJ *CmpndLineData, U_PSEUDO_OBJ *CSCapData, + U_PSEUDO_OBJ *CECapData + ){ + + if((Flags & U_PD_Transform) && (!Tm || (Tm->Type != U_PMF_TRANSFORMMATRIX_OID)) )return(NULL); + if((Flags & U_PD_DLData) && (!DLData || (DLData->Type != U_PMF_DASHEDLINEDATA_OID)) )return(NULL); + if((Flags & U_PD_CLData) && (!CmpndLineData || (CmpndLineData->Type != U_PMF_COMPOUNDLINEDATA_OID)) )return(NULL); + if((Flags & U_PD_CustomStartCap) && (!CSCapData || (CSCapData->Type != U_PMF_CUSTOMSTARTCAPDATA_OID)))return(NULL); + if((Flags & U_PD_CustomEndCap) &&(!CECapData || (CECapData->Type != U_PMF_CUSTOMENDCAPDATA_OID)) )return(NULL); + + /* prepend the Flags field to the PseudoObject proper */ + const U_SERIAL_DESC List[] = { + {&Flags, 4, 1, U_LE}, + {((Flags & U_PD_Transform) ? Tm->Data : NULL), ((Flags & U_PD_Transform) ? Tm->Used : 0), 1, U_XE}, + {((Flags & U_PD_StartCap ) ? (char *)&StartCap : NULL), ((Flags & U_PD_StartCap ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_EndCap ) ? (char *)&EndCap : NULL), ((Flags & U_PD_EndCap ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_Join ) ? (char *)&Join : NULL), ((Flags & U_PD_Join ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_MiterLimit ) ? (char *)&MiterLimit : NULL), ((Flags & U_PD_MiterLimit ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_LineStyle ) ? (char *)&Style : NULL), ((Flags & U_PD_LineStyle ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_DLCap ) ? (char *)&DLCap : NULL), ((Flags & U_PD_DLCap ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_DLOffset ) ? (char *)&DLOffset : NULL), ((Flags & U_PD_DLOffset ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_DLData ) ? DLData->Data : NULL), ((Flags & U_PD_DLData ) ? DLData->Used : 0), 1, U_XE}, + {((Flags & U_PD_NonCenter ) ? (char *)&PenAlignment : NULL), ((Flags & U_PD_NonCenter ) ? 4 : 0), 1, U_LE}, + {((Flags & U_PD_CLData ) ? CmpndLineData->Data : NULL), ((Flags & U_PD_CLData ) ? CmpndLineData->Used : 0), 1, U_XE}, + {((Flags & U_PD_CustomStartCap) ? CSCapData->Data : NULL), ((Flags & U_PD_CustomStartCap) ? CSCapData->Used : 0), 1, U_XE}, + {((Flags & U_PD_CustomEndCap ) ? CECapData->Data : NULL), ((Flags & U_PD_CustomEndCap ) ? CECapData->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_PENOPTIONALDATA_OID, List); + return(po); +} + +/** + \brief Create and set an ARRAY of U_PMF_POINT objects + \return Pointer to PseudoObject, NULL on error + \param Elements Number of pairs of points in Coords + \param Coords Array of X,Y pairs. + + EMF+ manual 2.2.2.35, Microsoft name: EmfPlusPoint Object +*/ +U_PSEUDO_OBJ *U_PMF_POINT_set(uint32_t Elements, const U_PMF_POINT *Coords){ + if(!Elements || !Coords)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + { Coords, 2, 2*Elements, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_POINT_OID | U_PMF_ARRAY_OID, List); + return(po); +} + +/** + \brief Create and set an ARRAY of U_PMF_POINTF objects, with a leading Elements value + \return Pointer to PseudoObject, NULL on error + \param Elements Number of pairs of points in Coords + \param Coords Array of X,Y pairs. + + EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object +*/ +U_PSEUDO_OBJ *U_PMF_POINTF_set(uint32_t Elements, const U_PMF_POINTF *Coords){ + if(!Elements || !Coords)return(NULL); + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + {Coords, 4, 2*Elements, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_POINTF_OID | U_PMF_ARRAY_OID, List); + return(po); +} + +/** + \brief Create and set an ARRAY of U_PMF_POINTR objects + \return Pointer to PseudoObject, NULL on error + \param Elements Number of pairs of points in Coords + \param Coords Array of X,Y pairs. These are absolute coordinates, they are converted to Relative here. + + EMF+ manual 2.2.2.37, Microsoft name: EmfPlusPointR Object +*/ +U_PSEUDO_OBJ *U_PMF_POINTR_set(uint32_t Elements, const U_PMF_POINTF *Coords){ + int X,Y; + U_FLOAT Xf,Yf; + U_PSEUDO_OBJ *poi; + /* Worst case scenario it is 4 bytes per coord, plus the count */ + U_PSEUDO_OBJ *po = U_PO_create(NULL, 4 + 4*Elements, 0, U_PMF_POINTR_OID); /* not exactly an array, so no U_PMF_ARRAY_OID */ + + poi = U_PMF_4NUM_set(Elements); + po = U_PO_append(po, poi->Data, poi->Used); + U_PO_free(&poi); + + for(Xf = Yf = 0.0 ;Elements; Elements--, Coords++){ + Xf = U_ROUND(Coords->X) - Xf; + Yf = U_ROUND(Coords->Y) - Yf; + X = ( Xf >= UINT16_MAX ? UINT16_MAX : ( Xf <= INT16_MIN ? INT16_MIN : Xf)); + Y = ( Yf >= UINT16_MAX ? UINT16_MAX : ( Yf <= INT16_MIN ? INT16_MIN : Yf)); + Xf = U_ROUND(Coords->X); + Yf = U_ROUND(Coords->Y); + + /* this is not a very efficient method, too much mucking around with memory */ + + poi = U_PMF_INTEGER7_set(X); + if(!poi)poi = U_PMF_INTEGER15_set(X); /* This one must work because of the range checking, above */ + po = U_PO_append(po, poi->Data, poi->Used); + U_PO_free(&poi); + + poi = U_PMF_INTEGER7_set(Y); + if(!poi)poi = U_PMF_INTEGER15_set(Y); /* This one must work because of the range checking, above */ + po = U_PO_append(po, poi->Data, poi->Used); + U_PO_free(&poi); + } + /* Because the values stored were some unpredictable combination of 1 and 2 bytes, the last byte may not end + on a 4 byte boundary. Make it do so by padding with up to 3 zero bytes. */ +#if 1 + int residual; + unsigned long int us, uu; + us = po->Size; /* printing size_t portably is a pain, this avoids the issue */ + uu = po->Used; + residual = 3 & po->Used; +printf("DEBUG Used:%lu residual:%d\n",uu, residual);fflush(stdout); + if(residual){ + po = U_PO_append(po, NULL, (4 - residual)); + } +printf("DEBUG Size:%lu Used:%lu \n",us,uu);fflush(stdout); +#endif + return(po); +} + +/** + \brief Create and set a U_PMF_RECT object + \return Pointer to PseudoObject, NULL on error + \param X UL X value + \param Y UL Y value + \param Width Width + \param Height Height + + EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object +*/ +U_PSEUDO_OBJ *U_PMF_RECT4_set(int16_t X, int16_t Y, int16_t Width, int16_t Height){ + const U_SERIAL_DESC List[] = { + {&X, 2, 1, U_LE}, + {&Y, 2, 1, U_LE}, + {&Width, 2, 1, U_LE}, + {&Height, 2, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_RECT_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_RECT object + \return Pointer to PseudoObject, NULL on error + \param Rect U_PMF_RECT structures + + EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object +*/ +U_PSEUDO_OBJ *U_PMF_RECT_set(U_PMF_RECT *Rect){ + const U_SERIAL_DESC List[] = { + {Rect, 2, 4, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_RECT_OID, List); + return(po); +} + +/** + \brief Create and set an array of U_PMF_RECT objects in a PseudoObject + \return Pointer to PseudoObject, NULL on error. PseudoObject contains Elements followed by the array of U_PMF_RECT objects. + \param Elements Number of elements in Rects + \param Rects Array of U_PMF_RECT structures + + EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object +*/ +U_PSEUDO_OBJ *U_PMF_RECTN_set(uint32_t Elements, U_PMF_RECT *Rects){ + if(!Rects){ return(NULL); } + uint32_t count = Elements; + U_SERIAL_DESC *Lptr = (U_SERIAL_DESC *) malloc(4 + (Elements * 2 * 4) + 4); + U_SERIAL_DESC *List = List; + if(!List){ return(NULL); } + *Lptr++ = (U_SERIAL_DESC){&Elements, 4, 1, U_LE}; + for(; count; count--, Lptr++, Rects++){ *Lptr = (U_SERIAL_DESC){Rects, 2, 4, U_LE}; } + *Lptr = (U_SERIAL_DESC){NULL,0,0,U_XX}; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_RECTF_OID | U_PMF_ARRAY_OID, List); + free(List); + return(po); +} + +/** + \brief Create and set a U_PMF_RECTF object in a PseudoObject + \return Pointer to PseudoObject, NULL on error + \param X UL X value + \param Y UL Y value + \param Width Width + \param Height Height + + EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object +*/ +U_PSEUDO_OBJ *U_PMF_RECTF4_set(U_FLOAT X, U_FLOAT Y, U_FLOAT Width, U_FLOAT Height){ + const U_SERIAL_DESC List[] = { + {&X, 4, 1, U_LE}, + {&Y, 4, 1, U_LE}, + {&Width, 4, 1, U_LE}, + {&Height, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_RECTF_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_RECTF object in a PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Rect U_PMF_RECTF structure + + EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object +*/ +U_PSEUDO_OBJ *U_PMF_RECTF_set(U_PMF_RECTF *Rect){ + const U_SERIAL_DESC List[] = { + {Rect, 4, 4, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_RECTF_OID, List); + return(po); +} + +/** + \brief Create and set an array of U_PMF_RECTF objects in a PseudoObject + \return Pointer to PseudoObject, NULL on error. PseudoObject contains Elements followed by the array of U_PMF_RECTF objects. + \param Elements Number of elements in Rects + \param Rects Array of U_PMF_RECTF structures + + EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object +*/ +U_PSEUDO_OBJ *U_PMF_RECTFN_set(uint32_t Elements, U_PMF_RECTF *Rects){ + if(!Rects){ return(NULL); } + uint32_t count = Elements; + U_SERIAL_DESC *List = (U_SERIAL_DESC *) malloc((Elements + 2) * sizeof(U_SERIAL_DESC)); + U_SERIAL_DESC *Lptr = List; + if(!List){ return(NULL); } + *Lptr++ = (U_SERIAL_DESC){&Elements, 4, 1, U_LE}; + for(; count; count--, Lptr++, Rects++){ + *Lptr = (U_SERIAL_DESC){Rects, 4, 4, U_LE}; + } + *Lptr = (U_SERIAL_DESC){NULL,0,0,U_XX}; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_RECTF_OID | U_PMF_ARRAY_OID, List); + free(List); + return(po); +} + +/** + \brief Create and set a U_PMF_REGIONNODE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Type RegionNodeDataType Enumeration + \param Rnd (optional) U_PSEUDO_OBJ containing a U_PMF_REGIONNODEPATH, U_PMF_RECTF, or U_PMF_REGIONNODECHILDNODES object (Region Node Data) + + + EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object +*/ +U_PSEUDO_OBJ *U_PMF_REGIONNODE_set(int32_t Type, const U_PSEUDO_OBJ *Rnd){ + int32_t pType; + /* make sure that the type of Rnd agrees with Type */ + if(Rnd){ + pType = U_OID_To_RNDT(Rnd->Type); + if( pType < 0){ return(NULL); } + if((pType > 0) && (pType != Type)){ return(NULL); } + if((pType == 0) && + ( + (Type < U_RNDT_And) || + (Type > U_RNDT_Complement) + ) + ){ return(NULL); } + if((Type == U_RNDT_Rect) && (Rnd->Type != U_PMF_RECTF_OID)){ return(NULL); } + if((Type == U_RNDT_Path) && (Rnd->Type != U_PMF_REGIONNODEPATH_OID)){ return(NULL); } + + } + else { /* only U_RNDT_Empty and U_RNDT_Infinite do not have data */ + if((Type != U_RNDT_Empty) || + (Type != U_RNDT_Infinite) ){ return(NULL); } + } + + + const U_SERIAL_DESC List[] = { + {&Type, 4, 1, U_LE}, + {(Rnd ? Rnd->Data : NULL), (Rnd ? Rnd->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_REGIONNODE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_REGIONNODECHILDNODES PseudoObject + \return Pointer to PseudoObject containing a U_PMF_REGIONNODECHILDNODES_OID object, NULL on error + \param Left U_PSEUDO_OBJ containing a U_PMF_REGIONNODE object + \param Right U_PSEUDO_OBJ containing a U_PMF_REGIONNODE object + + + EMF+ manual 2.2.2.41, Microsoft name: EmfPlusRegionNodeChildNodes Object +*/ +U_PSEUDO_OBJ *U_PMF_REGIONNODECHILDNODES_set(const U_PSEUDO_OBJ *Left, const U_PSEUDO_OBJ *Right){ + if(!Left || (Left->Type != U_PMF_REGIONNODE_OID)){ return(NULL); } + if(!Right || (Right->Type != U_PMF_REGIONNODE_OID)){ return(NULL); } + + const U_SERIAL_DESC List[] = { + {Left->Data, Left->Used, 1, U_XE}, + {Right->Data, Right->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_REGIONNODECHILDNODES_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_REGIONNODEPATH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Path U_PSEUDO_OBJ containing a U_PMF_PATH object + + + EMF+ manual 2.2.2.42, Microsoft name: EmfPlusRegionNodePath Object +*/ +U_PSEUDO_OBJ *U_PMF_REGIONNODEPATH_set(const U_PSEUDO_OBJ *Path){ + if(!Path || (Path->Type != U_PMF_PATH_OID)){ return(NULL); } + /* PO Used is size_t, might be 8 bytes, value in record must be 4 bytes */ + uint32_t Used = Path->Used; + + const U_SERIAL_DESC List[] = { + {&Used, 4, 1, U_LE}, + {Path->Data, Path->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_REGIONNODEPATH_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_SOLIDBRUSHDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Color U_PSEUDO_OBJ containing a U_PMF_ARGB object + + + EMF+ manual 2.2.2.43, Microsoft name: EmfPlusSolidBrushData Object +*/ +U_PSEUDO_OBJ *U_PMF_SOLIDBRUSHDATA_set(const U_PSEUDO_OBJ *Color){ + if(!Color || (Color->Type != U_PMF_ARGB_OID)){ return(NULL); } + + const U_SERIAL_DESC List[] = { + {Color->Data, Color->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_SOLIDBRUSHDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_STRINGFORMATDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param TabStopCount Entries in TabStop array + \param TabStops (optional) Array of tabstop locations + \param Ranges (optional) U_PSEUDO_OBJ containing an array of U_PMF_CHARACTERRANGE objects + + + EMF+ manual 2.2.2.44, Microsoft name: EmfPlusStringFormatData Object +*/ +U_PSEUDO_OBJ *U_PMF_STRINGFORMATDATA_set(uint32_t TabStopCount, U_FLOAT *TabStops, const U_PSEUDO_OBJ *Ranges){ + if(Ranges && (Ranges->Type != (U_PMF_CHARACTERRANGE_OID | U_PMF_ARRAY_OID))){ return(NULL); } + + const U_SERIAL_DESC List[] = { + {TabStops, TabStopCount*4, 1, U_LE}, + {(Ranges ? Ranges->Data : NULL), (Ranges ? Ranges->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_STRINGFORMATDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_TEXTUREBRUSHDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Flags BrushData flags + \param WrapMode WrapMode enumeration + \param Tbod U_PSEUDO_OBJ containing an U_PMF_TEXTUREBRUSHOPTIONALDATA object + + + EMF+ manual 2.2.2.45, Microsoft name: EmfPlusTextureBrushData Object +*/ +U_PSEUDO_OBJ *U_PMF_TEXTUREBRUSHDATA_set(uint32_t Flags, uint32_t WrapMode, const U_PSEUDO_OBJ *Tbod){ + if(Flags & ~U_BD_MASKB){ return(NULL); } /* a bit was set that is not supported for this record */ + if(WrapMode > U_WM_Clamp){ return(NULL); } + if(!Tbod || (Tbod->Type != (U_PMF_TEXTUREBRUSHOPTIONALDATA_OID))){ return(NULL); } + + const U_SERIAL_DESC List[] = { + {&Flags, 4, 1, U_LE}, + {&WrapMode, 4, 1, U_LE}, + {Tbod->Data, Tbod->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_TEXTUREBRUSHDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_TEXTUREBRUSHOPTIONALDATA PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Tm (optional) U_PSEUDO_OBJ containing an U_PMF_TRANSFORMMATRIX object + \param Image (optional) U_PSEUDO_OBJ containing an U_PMF_IMAGE object + + + EMF+ manual 2.2.2.46, Microsoft name: EmfPlusTextureBrushOptionalData Object +*/ +U_PSEUDO_OBJ *U_PMF_TEXTUREBRUSHOPTIONALDATA_set(const U_PSEUDO_OBJ *Tm, const U_PSEUDO_OBJ *Image){ + if(Tm && (Tm->Type != (U_PMF_TRANSFORMMATRIX_OID))){ return(NULL); } + if(Image && (Image->Type != (U_PMF_IMAGE_OID))){ return(NULL); } + + const U_SERIAL_DESC List[] = { + {(Tm ? Tm->Data : NULL), (Tm ? Tm->Used : 0), 1, U_XE}, + {(Image ? Image->Data : NULL), (Image ? Image->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_TEXTUREBRUSHOPTIONALDATA_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_TRANSFORMMATRIX PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Tm U_PMF_TRANSFORMMATRIX_ object + + + EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object +*/ +U_PSEUDO_OBJ *U_PMF_TRANSFORMMATRIX_set(U_PMF_TRANSFORMMATRIX *Tm){ + if(!Tm){ return(NULL); } + + const U_SERIAL_DESC List[] = { + {Tm, 4, 6, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_TRANSFORMMATRIX_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_BLUR PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Radius Blur radius in pixels + \param ExpandEdge 1: expand bitmap by Radius; 0: bitmap size unchanged + + + EMF+ manual 2.2.3.1, Microsoft name: BlurEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_BLUR_set(U_FLOAT Radius, uint32_t ExpandEdge){ + + const U_SERIAL_DESC List[] = { + {&Radius, 4, 1, U_LE}, + {&ExpandEdge, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_BLUR_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_BRIGHTNESSCONTRAST PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Brightness -255 to 255, 0 is unchanged, positive increases, negative decreases + \param Contrast -100 to 100, 0 is unchanged, positive increases, negative decreases + + + EMF+ manual 2.2.3.2, Microsoft name: BrightnessContrastEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_BRIGHTNESSCONTRAST_set(int32_t Brightness, int32_t Contrast){ + + const U_SERIAL_DESC List[] = { + {&Brightness, 4, 1, U_LE}, + {&Contrast, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_BRIGHTNESSCONTRAST_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_COLORBALANCE PseudoObject + \return Pointer to PseudoObject, NULL on error + \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 + + + EMF+ manual 2.2.3.3, Microsoft name: ColorBalanceEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_COLORBALANCE_set(int32_t CyanRed, int32_t MagentaGreen, int32_t YellowBlue){ + + const U_SERIAL_DESC List[] = { + {&CyanRed, 4, 1, U_LE}, + {&MagentaGreen, 4, 1, U_LE}, + {&YellowBlue, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_COLORBALANCE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_COLORCURVE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Adjust CurveAdjustment enumeration + \param Channel CurveChannel enumeration + \param Intensity adjustment to apply. "Adjust" determines what field this is and range values. + + + EMF+ manual 2.2.3.4, Microsoft name: ColorCurveEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_COLORCURVE_set(uint32_t Adjust, uint32_t Channel, int32_t Intensity){ + + const U_SERIAL_DESC List[] = { + {&Adjust, 4, 1, U_LE}, + {&Channel, 4, 1, U_LE}, + {&Intensity, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_COLORCURVE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_COLORLOOKUPTABLE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param BLUT Blue color lookup table + \param GLUT Green color lookup table + \param RLUT Red color lookup table + \param ALUT Alpha color lookup table + + + + EMF+ manual 2.2.3.5, Microsoft name: ColorLookupTableEffect Object. + All tables have 256 entries. +*/ +U_PSEUDO_OBJ *U_PMF_IE_COLORLOOKUPTABLE_set(const uint8_t *BLUT, const uint8_t *GLUT, const uint8_t *RLUT, const uint8_t *ALUT){ + if(!BLUT || !GLUT || !RLUT || !ALUT)return(NULL); + + const U_SERIAL_DESC List[] = { + {BLUT, 1, 256, U_XE}, + {GLUT, 1, 256, U_XE}, + {RLUT, 1, 256, U_XE}, + {ALUT, 1, 256, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_COLORLOOKUPTABLE_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_COLORMATRIX PseudoObject + \return Pointer to PseudoObject, NULL on error + \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] + + + EMF+ manual 2.2.3.6, Microsoft name: ColorMatrixEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_COLORMATRIX_set(const U_FLOAT *Matrix){ + if(!Matrix)return(NULL); + + const U_SERIAL_DESC List[] = { + {Matrix, 4, 25, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_COLORMATRIX_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_HUESATURATIONLIGHTNESS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Hue -180 to 180, 0 is unchanged + \param Saturation -100 to 100, 0 is unchanged + \param Lightness -100 to 100, 0 is unchanged + + + EMF+ manual 2.2.3.7, Microsoft name: HueSaturationLightnessEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_HUESATURATIONLIGHTNESS_set(int32_t Hue, int32_t Saturation, int32_t Lightness){ + + const U_SERIAL_DESC List[] = { + {&Hue, 4, 1, U_LE}, + {&Saturation, 4, 1, U_LE}, + {&Lightness, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_HUESATURATIONLIGHTNESS_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_LEVELS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Highlight 0 to 100, 100 is unchanged + \param Midtone -100 to 0, 0 is unchanged + \param Shadow 0 to 100, 0 is unchanged + + + EMF+ manual 2.2.3.8, Microsoft name: LevelsEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_LEVELS_set(int32_t Highlight, int32_t Midtone, int32_t Shadow){ + + const U_SERIAL_DESC List[] = { + {&Highlight, 4, 1, U_LE}, + {&Midtone, 4, 1, U_LE}, + {&Shadow, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_LEVELS_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_REDEYECORRECTION PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Elements Number of members in Rects + \param Rects Array of U_RECTL rectangular area(s) to apply red eye correction + + + EMF+ manual 2.2.3.9, Microsoft name: RedEyeCorrectionEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_REDEYECORRECTION_set(uint32_t Elements, const U_RECTL *Rects){ + if(!Elements || !Rects){return(NULL);} + + const U_SERIAL_DESC List[] = { + {&Elements, 4, 1, U_LE}, + {Rects, 4*4, Elements,U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_REDEYECORRECTION_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_SHARPEN PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Radius Sharpening radius in pixels + \param Sharpen 0 to 100, 0 is unchanged + + + EMF+ manual 2.2.3.10, Microsoft name: SharpenEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_SHARPEN_set(U_FLOAT Radius, int32_t Sharpen){ + + const U_SERIAL_DESC List[] = { + {&Radius, 4, 1, U_LE}, + {&Sharpen, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_SHARPEN_OID, List); + return(po); +} + +/** + \brief Create and set a U_PMF_IE_TINT PseudoObject + \return Pointer to PseudoObject, NULL on error + \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 + + + EMF+ manual 2.2.3.11, Microsoft name: TintEffect Object +*/ +U_PSEUDO_OBJ *U_PMF_IE_TINT_set(const int32_t Hue, const int32_t Amount){ + + const U_SERIAL_DESC List[] = { + {&Hue, 4, 1, U_LE}, + {&Amount, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMF_IE_TINT_OID, List); + return(po); +} + +//! \cond +/* internal routine, not part of the API. + Returns a PseudoObject containing a U_PMR_CMN_HDR_OID object. + The type is something like U_PMR_OFFSETCLIP (the record type, NOT the U_PMR_OFFSETCLIP_OID PseudoObject Type!). + The U_PMR_RECFLAG bit is added both in the data and in the Type of the PseudoObject. + If that bit is already set no harm, no foul. +*/ + +U_PSEUDO_OBJ *U_PMR_CMN_HDR_set(uint32_t Type, uint16_t Flags, uint32_t DataSize){ + + uint32_t Size = 12 + UP4(DataSize); /* The header itself is always 12, PMR records must be a multiple of 4 */ + Type |= U_PMR_RECFLAG; + uint16_t utmp16 = Type; + const U_SERIAL_DESC List[] = { + {&utmp16, 2, 1, U_LE}, + {&Flags, 2, 1, U_LE}, /* Microsoft EMF+ manual is BE, but this field in this implementation is LE */ + {&Size, 4, 1, U_LE}, + {&DataSize, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_CMN_HDR_OID, List); + return(po); +} +//! \endcond + + +/** + \brief Create and set a U_PMR_STROKEFILLPATH PseudoObject + \return Pointer to PseudoObject, NULL on error + + + EMF+ manual mentioned in 2.1.1.1, not otherwise documented, Microsoft name: EmfPlusStrokeFillPath Record, Index 0x37 + + "This record closes any open figures in a path, strokes the outline of + the path by using the current pen, and fills its interior by using the current brush." + +*/ +U_PSEUDO_OBJ *U_PMR_STROKEFILLPATH_set(void){ + int Size = 0; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_STROKEFILLPATH,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_STROKEFILLPATH_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_OFFSETCLIP PseudoObject + \return Pointer to PseudoObject, NULL on error + \param dX horizontal translation offset to apply to clipping region + \param dY vertical translation offset to apply to clipping region + + + EMF+ manual 2.3.1.1, Microsoft name: EmfPlusOffsetClip Record, Index 0x35 +*/ +U_PSEUDO_OBJ *U_PMR_OFFSETCLIP_set(U_FLOAT dX, U_FLOAT dY){ + int Size = 2*4; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_OFFSETCLIP,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&dX, 4, 1, U_LE}, + {&dY, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_OFFSETCLIP_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_RESETCLIP PseudoObject + \return Pointer to PseudoObject, NULL on error + + + EMF+ manual 2.3.1.2, Microsoft name: EmfPlusResetClip Record, Index 0x31 +*/ +U_PSEUDO_OBJ *U_PMR_RESETCLIP_set(void){ + int Size = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_RESETCLIP,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_RESETCLIP_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETCLIPPATH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param CMenum CombineMode enumeration.. + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + + + EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath Record, Index 0x33 +*/ +U_PSEUDO_OBJ *U_PMR_SETCLIPPATH_set(uint32_t PathID, uint32_t CMenum){ + if(PathID>63)return(NULL); + int Size=0; + uint16_t utmp16 = ((PathID & U_FF_MASK_OID8) << U_FF_SHFT_OID8) | ((CMenum & U_FF_MASK_CM4) << U_FF_SHFT_CM4); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETCLIPPATH,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETCLIPPATH_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETCLIPRECT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param CMenum CombineMode enumeration.. + \param Rect U_PSEUDO_OBJ containing an U_PMF_RECTF object or an array of U_PMF_RECTF objects (the first is used) + + + EMF+ manual 2.3.1.4, Microsoft name: EmfPlusSetClipRect Record, Index 0x32 +*/ +U_PSEUDO_OBJ *U_PMR_SETCLIPRECT_set(uint32_t CMenum, const U_PSEUDO_OBJ *Rect){ + int Size=4*4; + const char *start; + uint16_t utmp16 = ((CMenum & U_FF_MASK_CM4) << U_FF_SHFT_CM4); + if(Rect){ + if( Rect->Type == U_PMF_RECTF_OID){ + start = Rect->Data; + } + else if(Rect->Type == (U_PMF_RECTF_OID | U_PMF_ARRAY_OID)){ + start = Rect->Data + 4; + } + else { return(0); } + } + else { return(0); } + + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETCLIPRECT,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {start, 4, 4, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETCLIPRECT_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETCLIPREGION PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + \param CMenum CombineMode enumeration.. + + + EMF+ manual 2.3.1.5, Microsoft name: EmfPlusSetClipRegion Record, Index 0x34 +*/ +U_PSEUDO_OBJ *U_PMR_SETCLIPREGION_set(uint32_t PathID, uint32_t CMenum){ + if(PathID>63)return(NULL); + int Size=0; + uint16_t utmp16 = ((PathID & U_FF_MASK_OID8) << U_FF_SHFT_OID8) | ((CMenum & U_FF_MASK_CM4) << U_FF_SHFT_CM4); + + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETCLIPREGION,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETCLIPREGION_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_COMMENT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param cbData Number of bytes in Data, must be a multiple of 4 + \param Data Private data, may be anything. Stored in PseudoObject without adjusting byte order. + + + EMF+ manual 2.3.2.1, Microsoft name: EmfPlusComment Record, Index 0x03 +*/ +U_PSEUDO_OBJ *U_PMR_COMMENT_set(size_t cbData, const void *Data){ + if(UP4(cbData) != cbData){ return(NULL); } + int Size=cbData; + + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_COMMENT,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Data, cbData, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_COMMENT_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_ENDOFFILE PseudoObject + \return Pointer to PseudoObject, NULL on error + + + EMF+ manual 2.3.3.1, Microsoft name: EmfPlusEndOfFile Record, Index 0x02 +*/ +U_PSEUDO_OBJ *U_PMR_ENDOFFILE_set(void){ + int Size=0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_ENDOFFILE,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_ENDOFFILE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_GETDC PseudoObject + \return Pointer to PseudoObject, NULL on error + + + EMF+ manual 2.3.3.2, Microsoft name: EmfPlusGetDC Record, Index 0x04 +*/ +U_PSEUDO_OBJ *U_PMR_GETDC_set(void){ + int Size=0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_GETDC,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_GETDC_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_HEADER PseudoObject + \return Pointer to PseudoObject, NULL on error + \param IsDual set = Dual-mode file, clear= EMF+ only file. + \param IsVideo set = video device, clear= printer. Ignore all other bits. + \param Version U_PSEUDO_OBJ containing a U_PMF_GRAPHICSVERSION object + \param LogicalDpiX Horizontal resolution reference device in DPI + \param LogicalDpiY Vertical resolution reference device in DPI + + + EMF+ manual 2.3.3.3, Microsoft name: EmfPlusHeader Record, Index 0x01 +*/ +U_PSEUDO_OBJ *U_PMR_HEADER_set(int IsDual, int IsVideo, const U_PSEUDO_OBJ *Version, + uint32_t LogicalDpiX, uint32_t LogicalDpiY){ + if(!Version || (Version->Type != U_PMF_GRAPHICSVERSION_OID)){ return(NULL); } + int Size=Version->Used + 3*4; + uint16_t utmp16 = (IsDual ? U_PPF_DM : 0); + uint32_t Flags = (IsVideo ? U_PPF_VIDEO : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_HEADER,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Version->Data, Version->Used, 1, U_XE}, + {&Flags, 4, 1, U_LE}, + {&LogicalDpiX, 4, 1, U_LE}, + {&LogicalDpiY, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_HEADER_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_CLEAR PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Color U_PSEUDO_OBJ containing a U_PMF_ARGB object. + + + + EMF+ manual 2.3.4.1, Microsoft name: EmfPlusClear Record, Index 0x09 + + Erase everything preceding, set background ARGB to Color. +*/ +U_PSEUDO_OBJ *U_PMR_CLEAR_set(const U_PSEUDO_OBJ *Color){ + if(!Color || (Color->Type != U_PMF_ARGB_OID)){ return(NULL); } + int Size=Color->Used; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_CLEAR,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Color->Data, Color->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_CLEAR_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWARC PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param Rect U_PSEUDO_OBJ containing a U_PMF_RECT or U_PMF_RECTF object + + + EMF+ manual 2.3.4.2, Microsoft name: EmfPlusDrawArc Record, Index 0x12 +*/ +U_PSEUDO_OBJ *U_PMR_DRAWARC_set(uint32_t PenID, U_FLOAT Start, U_FLOAT Sweep, const U_PSEUDO_OBJ *Rect){ + int ctype; + if(PenID>63)return(NULL); + if(!Rect){ return(NULL); } + else { + if( Rect->Type == U_PMF_RECT_OID ){ ctype = 1; } + else if(Rect->Type == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + int Size = 2*4 + Rect->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWARC,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Start, 4, 1, U_LE}, + {&Sweep, 4, 1, U_LE}, + {Rect->Data, Rect->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWARC_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWBEZIERS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Points U_PSEUDO_OBJ containing first Elements, then a U_PMF_POINT, U_PMF_POINTR or U_PMF_POINTF object + + + EMF+ manual 2.3.4.3, Microsoft name: EmfPlusDrawBeziers Record, Index 0x19 +*/ +U_PSEUDO_OBJ *U_PMR_DRAWBEZIERS_set(uint32_t PenID, const U_PSEUDO_OBJ *Points){ + int ctype, RelAbs; + if(PenID>63)return(NULL); + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = Points->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (RelAbs ? U_PPF_P : 0) |(PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWBEZIERS,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Points->Data, Points->Used, 1, U_XE}, /* Includes Elements */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWBEZIERS_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWCLOSEDCURVE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Tension Controls splines, 0 is straight line, >0 is curved + \param Points U_PSEUDO_OBJ containing a U_PMF_POINT, U_PMF_POINTR or U_PMF_POINTF object + + + EMF+ manual 2.3.4.4, Microsoft name: EmfPlusDrawClosedCurve Record, Index 0x17 + + Curve is a cardinal spline. + + References sent by MS support: + + http://alvyray.com/Memos/CG/Pixar/spline77.pdf + + http://msdn.microsoft.com/en-us/library/4cf6we5y(v=vs.110).aspx + + +*/ +U_PSEUDO_OBJ *U_PMR_DRAWCLOSEDCURVE_set(uint32_t PenID, U_FLOAT Tension, const U_PSEUDO_OBJ *Points){ + int ctype, RelAbs; + if(PenID>63)return(NULL); + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = 4 + Points->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (RelAbs ? U_PPF_P : 0) |(PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWCLOSEDCURVE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Tension, 4, 1, U_LE}, + {Points->Data, Points->Used, 1, U_XE}, /* includes Elements*/ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWCLOSEDCURVE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWCURVE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Tension Controls splines, 0 is straight line, >0 is curved + \param Offset The starting point in the list of points, 0 is first. + \param NSegs Number of segments to draw. Starting at Offset go NSegs straight lines, must not run out of points.. + \param Points U_PSEUDO_OBJ containing an element count then a series of U_PMF_POINT or U_PMF_POINTF object + + + EMF+ manual 2.3.4.5, Microsoft name: EmfPlusDrawCurve Record, Index 0x18 + + Curve is a cardinal spline, using doubled terminator points to generate curves for the terminal segments. + + References sent by MS support: + + http://alvyray.com/Memos/CG/Pixar/spline77.pdf + + http://msdn.microsoft.com/en-us/library/4cf6we5y(v=vs.110).aspx + +*/ +U_PSEUDO_OBJ *U_PMR_DRAWCURVE_set(uint32_t PenID, U_FLOAT Tension, uint32_t Offset, uint32_t NSegs, const U_PSEUDO_OBJ *Points){ + int ctype; + if(PenID>63)return(NULL); + if(!Points){ return(NULL); } + if(!NSegs){ return(NULL); } + else { + if( Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ ctype = 0; } + else { return(NULL); } + } + uint32_t Elements = (Points->Used - 4)/(ctype ? 4 : 8); /* This way do not need to worry about byte order */ + if(Offset + NSegs + 1 > Elements){ return(NULL); } + int Size = 3*4 + Points->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) |(PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWCURVE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Tension, 4, 1, U_LE}, + {&Offset, 4, 1, U_LE}, + {&NSegs, 4, 1, U_LE}, + {Points->Data, Points->Used, 1, U_XE}, /* Elements, points */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWCURVE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWDRIVERSTRING PseudoObject + \return Pointer to PseudoObject, NULL on error + \param FontID U_PMF_FONT object in the EMF+ object table (0-63, inclusive) + \param Tension Controls splines, 0 is straight line, >0 is curved + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param DSOFlags DriverStringOptions flags + \param HasMatrix If 1 record contains a TransformMatrix field, if 0 it does not. + \param GlyphCount The number of Elements in Glyphs, must agree with the number of elements in Points. + \param Glyphs If U_DSO_CmapLookup is set in DSOFlags this is an array of UTF16LE characters, otherwise, it is an array of indices into the U_PMF_FONT object indexed by Object_ID in flags. + \param Points U_PSEUDO_OBJ containing a U_PMF_POINTF object + \param Tm U_PSEUDO_OBJ containing a U_PMF_TRANSFORMMATRIX object. Apply to Glyphs & Positions. Present if HasMatrix is 1 + + + EMF+ manual 2.3.4.6, Microsoft name: EmfPlusDrawDriverString Record, Index 0x36 +*/ +U_PSEUDO_OBJ *U_PMR_DRAWDRIVERSTRING_set(uint32_t FontID, U_FLOAT Tension, const U_PSEUDO_OBJ *BrushID, + uint32_t DSOFlags, uint32_t HasMatrix, uint32_t GlyphCount, + const uint16_t *Glyphs, const U_PSEUDO_OBJ *Points, const U_PSEUDO_OBJ *Tm){ + int btype; + if(FontID>63){ return(NULL); } + if(!Glyphs){ return(NULL); } + if(!Points || (Points->Type != (U_PMF_POINTF_OID | U_PMF_ARRAY_OID))){ return(NULL); } + uint32_t Elements = (Points->Used -4)/4; + if(GlyphCount != Elements){ return(NULL); } + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = 4 + BrushID->Used + 3*4 + Elements*2 + (Points->Used - 4); + if(HasMatrix){ + if(!Tm){ return(NULL); } + else if(Tm->Type != (U_PMF_TRANSFORMMATRIX_OID)){ return(NULL); } + Size += Tm->Used; + } + uint16_t utmp16 = (btype ? U_PPF_B : 0) |(FontID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWDRIVERSTRING,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data,ph->Used, 1, U_XE}, + {&Tension, 4, 1, U_LE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {&DSOFlags, 4, 1, U_LE}, + {&HasMatrix, 4, 1, U_LE}, + {&Elements, 4, 1, U_LE}, + {Glyphs, 2, Elements, U_LE}, + {Points->Data + 4, Points->Used - 4, 1, U_XE}, /* omit Elements */ + {(HasMatrix ? Tm->Data : NULL), (HasMatrix ? Tm->Used : 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWDRIVERSTRING_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWELLIPSE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Rect U_PSEUDO_OBJ containing a U_PMF_RECT or U_PMF_RECTF object + + + EMF+ manual 2.3.4.7, Microsoft name: EmfPlusDrawEllipse Record, Index 0x0F +*/ +U_PSEUDO_OBJ *U_PMR_DRAWELLIPSE_set(uint32_t PenID, const U_PSEUDO_OBJ *Rect){ + if(PenID>63)return(NULL); + int ctype; + if(!Rect){ return(NULL); } + else { + if( Rect->Type == U_PMF_RECT_OID ){ ctype = 1; } + else if(Rect->Type == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + int Size = Rect->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWELLIPSE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Rect->Data, Rect->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWELLIPSE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWIMAGE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param ImgID U_PMF_IMAGE object in the EMF+ object table (0-63, inclusive) + \param ImgAttrID index of a U_PMF_IMAGEATTRIBUTES object in the object table + \param SrcUnit UnitType enumeration + \param SrcRect U_PSEUDO_OBJ containing a U_PMF_RECTF object, Source region of image + \param DstRect U_PSEUDO_OBJ containing a U_PMF_RECT or U_PMF_RECTF object + + + EMF+ manual 2.3.4.8, Microsoft name: EmfPlusDrawImage Record, Index 0x1A +*/ +U_PSEUDO_OBJ *U_PMR_DRAWIMAGE_set(uint32_t ImgID, + int32_t ImgAttrID, int32_t SrcUnit, const U_PSEUDO_OBJ *SrcRect, const U_PSEUDO_OBJ *DstRect){ + int ctype; + if(ImgID>63)return(NULL); + if(!SrcRect || (SrcRect->Type != U_PMF_RECTF_OID)){ return(NULL); } + if(!DstRect){ return(NULL); } + else { + if( DstRect->Type == U_PMF_RECT_OID ){ ctype = 1; } + else if(DstRect->Type == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + int Size = 2*4 + SrcRect->Used + DstRect->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (ImgID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWIMAGE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&ImgAttrID, 4, 1, U_LE}, + {&SrcUnit, 4, 1, U_LE}, + {SrcRect->Data, SrcRect->Used, 1, U_XE}, + {DstRect->Data, DstRect->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWIMAGE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWIMAGEPOINTS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param ImgID U_PMF_IMAGE object in the EMF+ object table (0-63, inclusive) + \param etype Set: effect from previous U_PMR_SERIALIZABLEOBJECT record will be applied; Clear: no effect applied + \param ImgAttrID index of a U_PMF_IMAGEATTRIBUTES object in the object table + \param SrcUnit UnitType enumeration + \param SrcRect U_PSEUDO_OBJ containing a U_PMF_RECTF object, Source region of image + \param Points U_PSEUDO_OBJ containing an array of 3 (U_PMF_POINT, U_PMF_POINTF, or U_PMF_POINTF) objects. These points are the UL, UR, and LL vertices of a parallelogram. + + + EMF+ manual 2.3.4.9, Microsoft name: EmfPlusDrawImagePoints Record, Index 0x1B + + + WARNING! Windows XP Preview does not show filter effects, whether or not U_PPF_E is set. They are visible if the EMF+ + file is inserted as an image into PowerPoint. +*/ +U_PSEUDO_OBJ *U_PMR_DRAWIMAGEPOINTS_set(uint32_t ImgID, int etype, + int32_t ImgAttrID, int32_t SrcUnit, const U_PSEUDO_OBJ *SrcRect, + const U_PSEUDO_OBJ *Points){ + int ctype, RelAbs; + if(ImgID>63){ return(NULL); } + if(!SrcRect || (SrcRect->Type != U_PMF_RECTF_OID)){ return(NULL); } + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = 2*4 + SrcRect->Used + Points->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (etype ? U_PPF_E : 0) | (RelAbs ? U_PPF_P : 0) | (ImgID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWIMAGEPOINTS,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&ImgAttrID, 4, 1, U_LE}, + {&SrcUnit, 4, 1, U_LE}, + {SrcRect->Data, SrcRect->Used, 1, U_XE}, + {Points->Data, Points->Used, 1, U_XE}, /* includes Elements*/ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWIMAGEPOINTS_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWLINES PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param dtype Set: path must be closed, Clear: path is open + \param Points U_PSEUDO_OBJ containing an array of 3 U_PMF_POINT, U_PMF_POINTR, or U_PMF_POINTF objects + + + EMF+ manual 2.3.4.10, Microsoft name: EmfPlusDrawLines Record, Index 0x0D +*/ +U_PSEUDO_OBJ *U_PMR_DRAWLINES_set(uint32_t PenID, int dtype, const U_PSEUDO_OBJ *Points){ + int ctype, RelAbs; + if(PenID>63){ return(NULL); } + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = Points->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (dtype ? U_PPF_D : 0) | (RelAbs ? U_PPF_P : 0) | (PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWLINES,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Points->Data, Points->Used, 1, U_XE}, /* includes Elements */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWLINES_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWPATH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + + + EMF+ manual 2.3.4.11, Microsoft name: EmfPlusDrawPath Record, Index 0x15 +*/ +U_PSEUDO_OBJ *U_PMR_DRAWPATH_set(uint32_t PathID, uint32_t PenID){ + if(PathID>63)return(NULL); + if(PenID>63)return(NULL); + int Size = 4; + uint16_t utmp16 = (PathID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWPATH,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&PenID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWPATH_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWPIE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param Rect U_PSEUDO_OBJ containing a U_PMF_RECT or U_PMF_RECTF object + + + EMF+ manual 2.3.4.12, Microsoft name: EmfPlusDrawPie Record, Index 0x0D +*/ +U_PSEUDO_OBJ *U_PMR_DRAWPIE_set(uint32_t PenID, + U_FLOAT Start, U_FLOAT Sweep, const U_PSEUDO_OBJ *Rect){ + int ctype; + if(PenID>63)return(NULL); + if(!Rect){ return(NULL); } + else { + if( Rect->Type == U_PMF_RECT_OID ){ ctype = 1; } + else if(Rect->Type == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + int Size = 2*4 + Rect->Used; + uint16_t utmp16 = (ctype ? U_PPF_C : 0) | (PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWPIE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Start, 4, 1, U_LE}, + {&Sweep, 4, 1, U_LE}, + {Rect->Data, Rect->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWPIE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWRECTS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param Rects U_PSEUDO_OBJ containing 1 rect OR a count N follwed by N rects. Rects may be either U_PMF_RECT or U_PMF_RECTF + + + EMF+ manual 2.3.4.13, Microsoft name: EmfPlusDrawRects Record, Index 0x0B +*/ +U_PSEUDO_OBJ *U_PMR_DRAWRECTS_set(uint32_t PenID, const U_PSEUDO_OBJ *Rects){ + int ctype; + int just1; + uint32_t Elements=1; /* only used when a single rect is passed in, not an array, not even an array with one member*/ + if(PenID>63){ return(NULL); } + if(Rects){ + if( (Rects->Type & U_PMF_MASK_OID) == U_PMF_RECT_OID ){ ctype = 1; } + else if( (Rects->Type & U_PMF_MASK_OID) == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + just1 = (Rects->Type & U_PMF_ARRAY_OID ? 0 : 1); + int Size = Rects->Used + (just1 ? 4 : 0); /* Elements in Rects for array, not for single */ + uint16_t utmp16 = (ctype ? U_PPF_C : 0)| (PenID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWRECTS,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {(just1 ? (char *)&Elements : NULL), (just1 ? 4: 0), 1, U_LE}, /* element count if a single Rect was passed in, empty otherwise */ + {Rects->Data, Rects->Used, 1, U_XE}, /* Elements + Array, already stored in Rects, if an array was passed in, just rect if a single */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWRECTS_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_DRAWSTRING PseudoObject + \return Pointer to PseudoObject, NULL on error + \param FontID U_PMF_FONT object in the EMF+ object table (0-63, inclusive) + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param FormatID U_PMF_STRINGFORMAT object in EMF+ Object Table. + \param Length Number of characters in the string. + \param Rect U_PSEUDO_OBJ containing a U_PMF_RECTF object, string's bounding box + \param Text Array of UFT-16LE unicode characters. + + + EMF+ manual 2.3.4.14, Microsoft name: EmfPlusDrawString Record, Index 0x1C +*/ +U_PSEUDO_OBJ *U_PMR_DRAWSTRING_set(uint32_t FontID, const U_PSEUDO_OBJ *BrushID, + uint32_t FormatID, uint32_t Length, const U_PSEUDO_OBJ *Rect, const uint16_t *Text){ + int btype; + if(FontID>63){ return(NULL); } + if(!Length){ return(NULL); } + if(!Rect || Rect->Type != U_PMF_RECTF_OID){ return(NULL); } + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = BrushID->Used + 2*4 + Rect->Used +2*Length; + uint16_t utmp16 = (btype ? U_PPF_B : 0)| (FontID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + uint32_t pad = (0x1 & Length ? 2 : 0); + Size+=pad; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_DRAWSTRING,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {&FormatID, 4, 1, U_LE}, + {&Length, 4, 1, U_LE}, + {Rect->Data, Rect->Used, 1, U_XE}, + {Text, 2*Length, 1, U_XE}, + {NULL, pad, (pad ? 1 : 0), (pad ? U_XE : U_XX)}, /* Entire record must be a multiple of 4 */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_DRAWSTRING_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLCLOSEDCURVE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param ftype If U_WINDING use winding fill, else use fill + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param Tension Controls splines, 0 is straight line, >0 is curved + \param Points U_PSEUDO_OBJ containing a U_PMF_POINT, U_PMF_POINTR or U_PMF_POINTF object + + + EMF+ manual 2.3.4.15, Microsoft name: EmfPlusFillClosedCurve Record, Index 0x16 +*/ +U_PSEUDO_OBJ *U_PMR_FILLCLOSEDCURVE_set(int ftype, U_FLOAT Tension, const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Points){ + int btype, ctype, RelAbs; + int Size=0; + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + Size = BrushID->Used + 4 + Points->Used; + uint16_t utmp16 = (btype ? U_PPF_B : 0) | (ctype ? U_PPF_C : 0) |((ftype == U_WINDING) ? U_PPF_F : 0) |(RelAbs ? U_PPF_P : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLCLOSEDCURVE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {&Tension, 4, 1, U_LE}, + {Points->Data, Points->Used, 1, U_XE}, /* includes Elements */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLCLOSEDCURVE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLELLIPSE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param Rect U_PSEUDO_OBJ containing a U_PMF_RECT or U_PMF_RECTF object + + + EMF+ manual 2.3.4.16, Microsoft name: EmfPlusFillEllipse Record, Index 0x0E +*/ +U_PSEUDO_OBJ *U_PMR_FILLELLIPSE_set(const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Rect){ + int btype, ctype; + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + if(Rect){ + if( Rect->Type == U_PMF_RECT_OID ){ ctype = 1; } + else if(Rect->Type == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = BrushID->Used + Rect->Used; + uint16_t utmp16 = (btype ? U_PPF_B : 0) | (ctype ? U_PPF_C : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLELLIPSE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {Rect->Data, Rect->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLELLIPSE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLPATH PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + + + EMF+ manual 2.3.4.17, Microsoft name: EmfPlusFillPath Record, Index 0x14 +*/ +U_PSEUDO_OBJ *U_PMR_FILLPATH_set(uint32_t PathID, const U_PSEUDO_OBJ *BrushID){ + int btype; + int Size=0; + if(PathID>63)return(NULL); + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + Size = BrushID->Used; + uint16_t utmp16 = (btype ? U_PPF_B : 0) | (PathID & U_FF_MASK_OID8) << U_FF_SHFT_OID8 ; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLPATH,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLPATH_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLPIE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param Rect U_PSEUDO_OBJ containing a U_PMF_RECT or U_PMF_RECTF object + + + EMF+ manual 2.3.4.18, Microsoft name: EmfPlusFillPie Record, Index 0x10 +*/ +U_PSEUDO_OBJ *U_PMR_FILLPIE_set(U_FLOAT Start, U_FLOAT Sweep, const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Rect){ + int btype, ctype; + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + if(!Rect){ return(NULL); } + else { + if( Rect->Type == U_PMF_RECT_OID ){ ctype = 1; } + else if(Rect->Type == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + int Size = BrushID->Used + 2*4 + Rect->Used; + uint16_t utmp16 = (btype ? U_PPF_B : 0) | (ctype ? U_PPF_C : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLPIE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {&Start, 4, 1, U_LE}, + {&Sweep, 4, 1, U_LE}, + {Rect->Data, Rect->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLPIE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLPOLYGON PseudoObject + \return Pointer to PseudoObject, NULL on error + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param Points U_PSEUDO_OBJ containing an array of 3 U_PMF_POINT, U_PMF_POINTR, or U_PMF_POINTF objects + + + EMF+ manual 2.3.4.19, Microsoft name: EmfPlusFillPolygon Record, Index 0x0C +*/ +U_PSEUDO_OBJ *U_PMR_FILLPOLYGON_set(const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Points){ + int btype, ctype, RelAbs; + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + if(Points){ + if( Points->Type == U_PMF_POINTR_OID){ RelAbs = 1; ctype = 0; } + else if(Points->Type == (U_PMF_POINT_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 1; } + else if(Points->Type == (U_PMF_POINTF_OID | U_PMF_ARRAY_OID)){ RelAbs = 0; ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = BrushID->Used + Points->Used; + uint16_t utmp16 = (btype ? U_PPF_B : 0) | (ctype ? U_PPF_C : 0) |(RelAbs ? U_PPF_P : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLPOLYGON,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {Points->Data, Points->Used, 1, U_XE}, /* includes Elements */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLPOLYGON_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLRECTS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + \param Rects U_PSEUDO_OBJ containing 1 rect OR a count N followed by N rects. Rects may be either U_PMF_RECT or U_PMF_RECTF + + + EMF+ manual 2.3.4.20, Microsoft name: EmfPlusFillRects Record, Index 0x0A +*/ +U_PSEUDO_OBJ *U_PMR_FILLRECTS_set(const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Rects){ + int btype, ctype; + int just1; + uint32_t Elements=1; /* only used when a single rect is passed in, not an array, not even an array with one member*/ + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + if(Rects){ + if( (Rects->Type & U_PMF_MASK_OID) == U_PMF_RECT_OID ){ ctype = 1; } + else if( (Rects->Type & U_PMF_MASK_OID) == U_PMF_RECTF_OID){ ctype = 0; } + else { return(NULL); } + } + else { return(NULL); } + just1 = (Rects->Type & U_PMF_ARRAY_OID ? 0 : 1); + int Size = BrushID->Used + Rects->Used + (just1 ? 4 : 0); /* Elements in Rects for array, not for single */ + uint16_t utmp16 = (btype ? U_PPF_B : 0)|(ctype ? U_PPF_C : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLRECTS,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {(just1 ? (char *)&Elements : NULL), (just1 ? 4: 0), 1, U_LE}, /* element count if a single Rect was passed in, empty otherwise */ + {Rects->Data, Rects->Used, 1, U_XE}, /* Elements + Array, already stored in Rects, if an array was passed in, just rect if a single */ + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLRECTS_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_FILLREGION PseudoObject + \return Pointer to PseudoObject, NULL on error + \param RgnID U_PMF_REGION object in the EMF+ object table (0-63, inclusive) + \param BrushID U_PSEUDO_OBJ containing a U_PMF_ARGB or a U_PMF_4NUM. Color or U_PMF_BRUSH object in the EMF+ object table (0-63, inclusive) + + + EMF+ manual 2.3.4.21, Microsoft name: EmfPlusFillRegion Record, Index 0x13 +*/ +U_PSEUDO_OBJ *U_PMR_FILLREGION_set(uint32_t RgnID, const U_PSEUDO_OBJ *BrushID){ + int btype; + if(BrushID){ + if( BrushID->Used != 4){ return(NULL); } + else if( BrushID->Type == U_PMF_ARGB_OID){ btype = 1; } + else if( BrushID->Type == U_PMF_4NUM_OID){ btype = 0; } + else { return(NULL); } + } + else { return(NULL); } + int Size = BrushID->Used; + uint16_t utmp16 = (btype ? U_PPF_B : 0) | (RgnID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_FILLREGION,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {BrushID->Data, BrushID->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_FILLREGION_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_OBJECT PseudoObject from another PseudoObject + \return Pointer to PseudoObject, NULL on error + \param ObjID Index for this object in the EMF+ object table (0-63, inclusive) + \param Po U_PSEUDO_OBJ containing an object type that may be stored in the EMF+ object table +*/ +U_PSEUDO_OBJ *U_PMR_OBJECT_PO_set(uint32_t ObjID, U_PSEUDO_OBJ *Po){ + int otype = U_OID_To_OT(Po->Type); /* This will return 0 if the type is not valid for an object */ + if(!otype){ return(NULL); } + U_PSEUDO_OBJ *po = U_PMR_OBJECT_set(ObjID, otype, 0, 0, Po->Used, Po->Data); /* 0,0 = rec. not continued, TSize value (ignored) */ + return(po); +} + +/** + \brief Create and set a U_PMR_OBJECT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param ObjID Index for this object in the EMF+ object table (0-63, inclusive) + \param otype ObjectType enumeration for this Object + \param ntype Set: object definition continues in next record; Clear: this is the sole object definition record + \param TSize If ntype is set the total number of data bytes split across multiple records. If ntype is clear, it is ignored. + \param cbData Object's data size, in bytes. + \param Data Object's data. Type from otype. + + + EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject Record, Index 0x13 + + Normally this is only called by U_PMR_OBJECT_PO_set(). + + U_PMR_OBJECT records can only hold a maximum of 65020 bytes of data. If the object is larger than that + then multiple U_PMR_OBJECT records are created, one after the other. If this + happens each record has cbData following ph, and the ntype flag is set. If all of the data is less than 65020 + then cbData is NOT entered following ph, and the ntype flag is clear. + + Call initially in all cases with ntype clear and TSize = 0. If the record needs to be fragmented + the function will call itself recursively to do so. + +*/ +U_PSEUDO_OBJ *U_PMR_OBJECT_set(uint32_t ObjID, int otype, int ntype, uint32_t TSize, size_t cbData, const char *Data){ + uint32_t CSize; + int Pad = UP4(TSize) - TSize; + if((otype < U_OT_Brush) || (otype > U_OT_CustomLineCap)){ return(NULL); } + if(ntype && (cbData > U_OBJRECLIM)){ return(NULL); } + U_PSEUDO_OBJ *po; + + if(!ntype && !TSize && (cbData > U_OBJRECLIM)){ + ntype = 1; + TSize = cbData; + po = U_PO_create(NULL, TSize + 16 * (1 + (TSize/cbData)), 0, U_PMR_OBJECT_OID); + if(!po)return(po); + while(cbData){ + CSize = (cbData > U_OBJRECLIM ? U_OBJRECLIM : cbData); + U_PSEUDO_OBJ *pot = U_PMR_OBJECT_set(ObjID, otype, ntype, TSize, CSize, Data); + po = U_PO_po_append(po, pot, U_PMF_KEEP_ELEMENTS); + U_PO_free(&pot); + Data += U_OBJRECLIM; + cbData -= CSize; + } + } + else { + /* Send in DataSize, U_PMR_CMN_HDR_set will adjust Header Size with 1-3 pad bytes if needed */ + uint16_t utmp16 = otype << 8 | (ntype ? U_PPF_N : 0) | (ObjID & U_FF_MASK_OID8) << U_FF_SHFT_OID8; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_OBJECT,utmp16,cbData + (ntype ? 4 : 0)); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE }, + {(ntype ? &TSize : NULL), (ntype ? 4 : 0), (ntype ? 1 : 0), U_LE }, + {Data, cbData, 1, U_XE }, + {NULL, (Pad ? Pad : 0), (Pad ? 1 : 0), (Pad ? U_XE : U_XX)}, /* Either 1-3 pad bytes or a terminator */ + {NULL,0,0,U_XX} /* terminator, possibly a second in the list, which is harmless */ + }; + po = U_PMF_SERIAL_set(U_PMR_OBJECT_OID, List); + U_PO_free(&ph); + } + return(po); +} + +/** + \brief Create and set a U_PMR_SERIALIZABLEOBJECT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Siepb U_PSEUDO_OBJ containing a "Serialized image effects parameter block". One of the ImageEffects objects. + + EMF+ manual 2.3.5.2, Microsoft name: EmfPlusSerializableObject Record, Index 0x38 + + + This sets an ImageEffect in the renderer, which will be applied to the next EmfPlusDrawImagePoints + record that is encountered. The image effect is "consumed" by that EmfPlusDrawImagePoints record, resetting + the renderer to its original state.\n + + WARNING! Windows XP Preview does not show filter effects, whether or not U_PPF_E is set. They are visible if the EMF+ + file is inserted as an image into PowerPoint. + +*/ +U_PSEUDO_OBJ *U_PMR_SERIALIZABLEOBJECT_set(const U_PSEUDO_OBJ *Siepb){ + if(!Siepb){ return(NULL); } + uint8_t *GUID = U_OID_To_GUID(Siepb->Type); + if(!GUID){ return(NULL); } + /* PO Used is size_t, might be 8 bytes, value in record must be 4 bytes */ + uint32_t Used = Siepb->Used; + int Size = 16 + 4 + Siepb->Used; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SERIALIZABLEOBJECT,0,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {GUID, 16, 1, U_XE}, + {&Used, 4, 1, U_LE}, + {Siepb->Data, Siepb->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SERIALIZABLEOBJECT_OID, List); + U_PO_free(&ph); + free(GUID); + return(po); +} + +/** + \brief Create and set a U_PMR_SETANTIALIASMODE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param SMenum SmoothingMode enumeration + \param aatype Set: anti-aliasing on; Clear: anti-aliasing off + + + EMF+ manual 2.3.6.1, Microsoft name: EmfPlusSetAntiAliasMode Record, Index 0x1E +*/ +U_PSEUDO_OBJ *U_PMR_SETANTIALIASMODE_set(int SMenum, int aatype){ + int Size = 0; + uint16_t utmp16 = (aatype ? U_PPF_AA : 0) | (SMenum & U_FF_MASK_AA)<Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETANTIALIASMODE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETCOMPOSITINGMODE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param CMenum CompositingMode enumeration + + + EMF+ manual 2.3.6.2, Microsoft name: EmfPlusSetCompositingMode Record, Index 0x23 +*/ +U_PSEUDO_OBJ *U_PMR_SETCOMPOSITINGMODE_set(int CMenum){ + int Size = 0; + uint16_t utmp16 = (CMenum & U_FF_MASK_CM)<Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETCOMPOSITINGMODE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETCOMPOSITINGQUALITY PseudoObject + \return Pointer to PseudoObject, NULL on error + \param CQenum CompositingQuality enumeration + + + EMF+ manual 2.3.6.3, Microsoft name: EmfPlusSetCompositingQuality Record, Index 0x24 +*/ +U_PSEUDO_OBJ *U_PMR_SETCOMPOSITINGQUALITY_set(int CQenum){ + int Size = 0; + uint16_t utmp16 = (CQenum & U_FF_MASK_CQ)<Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETCOMPOSITINGQUALITY_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETINTERPOLATIONMODE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param IMenum InterpolationMode enumeration + + + EMF+ manual 2.3.6.4, Microsoft name: EmfPlusSetInterpolationMode Record, Index 0x21 +*/ +U_PSEUDO_OBJ *U_PMR_SETINTERPOLATIONMODE_set(int IMenum){ + int Size = 0; + uint16_t utmp16 = (IMenum & U_FF_MASK_IM)<Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETINTERPOLATIONMODE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETPIXELOFFSETMODE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param POMenum PixelOffsetMode enumeration + + + EMF+ manual 2.3.6.5, Microsoft name: EmfPlusSetPixelOffsetMode Record, Index 0x22 +*/ +U_PSEUDO_OBJ *U_PMR_SETPIXELOFFSETMODE_set(int POMenum){ + int Size = 0; + uint16_t utmp16 = (POMenum & U_FF_MASK_PxOffM) << U_FF_SHFT_PxOffM; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETPIXELOFFSETMODE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETPIXELOFFSETMODE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETRENDERINGORIGIN PseudoObject + \return Pointer to PseudoObject, NULL on error + \param X X coordinate of rendering origin. + \param Y Y coordinate of rendering origin. + + + EMF+ manual 2.3.6.6, Microsoft name: EmfPlusSetRenderingOrigin Record, Index 0x1D +*/ +U_PSEUDO_OBJ *U_PMR_SETRENDERINGORIGIN_set(int32_t X, int32_t Y){ + int Size = 2*4; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETRENDERINGORIGIN,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&X, 4, 1, U_LE}, + {&Y, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETRENDERINGORIGIN_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETTEXTCONTRAST PseudoObject + \return Pointer to PseudoObject, NULL on error + \param TGC Text Gamma correction value (x 1000). + + + EMF+ manual 2.3.6.7, Microsoft name: EmfPlusSetTextContrast Record, Index 0x20 +*/ +U_PSEUDO_OBJ *U_PMR_SETTEXTCONTRAST_set(int TGC){ + int Size = 0; + uint16_t utmp16 = (TGC & U_FF_MASK_TGC) << U_FF_SHFT_TGC; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETTEXTCONTRAST,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETTEXTCONTRAST_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETTEXTRENDERINGHINT PseudoObject + \return Pointer to PseudoObject, NULL on error + \param TRHenum TextRenderingHint enumeration + + + EMF+ manual 2.3.6.8, Microsoft name: EmfPlusSetTextRenderingHint Record, Index 0x1F +*/ +U_PSEUDO_OBJ *U_PMR_SETTEXTRENDERINGHINT_set(int TRHenum){ + int Size = 0; + uint16_t utmp16 = (TRHenum & U_FF_MASK_TRH) << U_FF_SHFT_TRH; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETTEXTRENDERINGHINT,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETTEXTRENDERINGHINT_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_BEGINCONTAINER PseudoObject + \return Pointer to PseudoObject, NULL on error + \param UTenum UnitType enumeration + \param DstRect a U_PSEUDO_OBJ containing a U_PMF_RECTF object. with SrcRect specifies a transformation + \param SrcRect a U_PSEUDO_OBJ containing a U_PMF_RECTF object. with DstRect specifies a transformation + \param StackID EMF+ Object Stack Index to use for this graphics container + + + EMF+ manual 2.3.7.1, Microsoft name: EmfPlusBeginContainer Record, Index 0x27 +*/ +U_PSEUDO_OBJ *U_PMR_BEGINCONTAINER_set(int UTenum, U_PSEUDO_OBJ *DstRect, U_PSEUDO_OBJ *SrcRect, uint32_t StackID){ + if(UTenum < U_UT_World || UTenum > U_UT_Millimeter){ return(NULL); } + if(!DstRect || (DstRect->Type != U_PMF_RECTF_OID)){ return(NULL); } + if(!SrcRect || (SrcRect->Type != U_PMF_RECTF_OID)){ return(NULL); } + int Size = DstRect->Used + SrcRect->Used + 4; + uint16_t utmp16 = (UTenum & U_FF_MASK_UT) << U_FF_SHFT_UT; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_BEGINCONTAINER,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {DstRect->Data, DstRect->Used, 1, U_XE}, + {SrcRect->Data, SrcRect->Used, 1, U_XE}, + {&StackID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_BEGINCONTAINER_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_BEGINCONTAINERNOPARAMS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param StackID EMF+ Object Stack Index to use for this graphics container + + + EMF+ manual 2.3.7.2, Microsoft name: EmfPlusBeginContainerNoParams Record, Index 0x28 +*/ +U_PSEUDO_OBJ *U_PMR_BEGINCONTAINERNOPARAMS_set(int StackID){ + int Size = 4; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_BEGINCONTAINERNOPARAMS,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&StackID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_BEGINCONTAINERNOPARAMS_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_ENDCONTAINER PseudoObject + \return Pointer to PseudoObject, NULL on error + \param StackID EMF+ Object Stack Index to use for this graphics container + + + EMF+ manual 2.3.7.3, Microsoft name: EmfPlusEndContainer Record, Index 0x29 +*/ +U_PSEUDO_OBJ *U_PMR_ENDCONTAINER_set(int StackID){ + int Size = 4; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_ENDCONTAINER,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&StackID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_ENDCONTAINER_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_RESTORE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param StackID EMF+ Graphics State Stack to restore from. Must have been put on the GSS with a U_PMR_SAVE. + + + EMF+ manual 2.3.7.4, Microsoft name: EmfPlusRestore Record, Index 0x26 +*/ +U_PSEUDO_OBJ *U_PMR_RESTORE_set(int StackID){ + int Size = 4; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_RESTORE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&StackID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_RESTORE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SAVE PseudoObject + \return Pointer to PseudoObject, NULL on error + \param StackID EMF+ Graphics State Stack to restore from. Must have been put on the GSS with a U_PMR_SAVE. + + + EMF+ manual 2.3.7.5, Microsoft name: EmfPlusSave Record, Index 0x25 +*/ +U_PSEUDO_OBJ *U_PMR_SAVE_set(int StackID){ + int Size = 4; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SAVE,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&StackID, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SAVE_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETTSCLIP PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Rects a U_PSEUDO_OBJ containing an array of U_PMF_RECT or U_PMF_RECTF objects. + + + EMF+ manual 2.3.8.1, Microsoft name: EmfPlusSetTSClip Record, Index 0x3A +*/ +U_PSEUDO_OBJ *U_PMR_SETTSCLIP_set(U_PSEUDO_OBJ *Rects){ + int ctype; + uint32_t Elements; + if(Rects){ + if( Rects->Type == (U_PMF_RECT_OID | U_PMF_ARRAY_OID)){ ctype = 1; Elements = (Rects->Used - 4)/8; } + else if(Rects->Type == (U_PMF_RECTF_OID | U_PMF_ARRAY_OID)){ ctype = 0; Elements = (Rects->Used - 4)/16; } + else { return(NULL); } + } + else { return(NULL); } + int Size = Rects->Used; /* Rects includes Elements */ + uint16_t utmp16 = (ctype ? U_PPF_K : 0) | (Elements & U_FF_MASK_TSC) << U_FF_SHFT_TSC; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETTSCLIP,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Rects->Data, Rects->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETTSCLIP_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETTSGRAPHICS PseudoObject + \return Pointer to PseudoObject, NULL on error + \param vgatype Set: Palette is VGA basic colors; Clear: Palette is ??? + \param Tsg A U_PMF_SETTSGRAPHICS object + \param Palette (optional) a U_PSEUDO_OBJ containing a U_PMF_PALETTE object. + + + EMF+ manual 2.3.8.2, Microsoft name: EmfPlusSetTSGraphics Record, Index 0x39 +*/ +U_PSEUDO_OBJ *U_PMR_SETTSGRAPHICS_set(int vgatype, U_PMF_SETTSGRAPHICS *Tsg, U_PSEUDO_OBJ *Palette){ + if(!Tsg){ return(NULL); } + int Size = sizeof(U_PMF_SETTSGRAPHICS) + (Palette ? Palette->Used : 0); + uint16_t utmp16 = (vgatype ? U_PPF_VGA : 0) | (Palette ? U_PPF_PP : 0) ; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETTSGRAPHICS,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&(Tsg->AntiAliasMode), 1, 1, U_XE}, + {&(Tsg->TextRenderHint), 1, 1, U_XE}, + {&(Tsg->CompositingMode), 1, 1, U_XE}, + {&(Tsg->CompositingQuality), 1, 1, U_XE}, + {&(Tsg->RenderOriginX), 2, 1, U_LE}, + {&(Tsg->RenderOriginY), 2, 1, U_LE}, + {&(Tsg->TextContrast), 2, 1, U_LE}, + {&(Tsg->FilterType), 1, 1, U_XE}, + {&(Tsg->PixelOffset), 1, 1, U_XE}, + {&(Tsg->WorldToDevice), 4, 6, U_LE}, + {(Palette ? Palette->Data : NULL), (Palette ? Palette->Used: 0), 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETTSGRAPHICS_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_MULTIPLYWORLDTRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + \param xmtype Set: Post multiply; Clear: Pre multiply + \param Tm a U_PSEUDO_OBJ containing a U_PMF_TRANSFORMMATRIX. (Transformation matrix) + + + EMF+ manual 2.3.9.1, Microsoft name: EmfPlusMultiplyWorldTransform Record, Index 0x2C +*/ +U_PSEUDO_OBJ *U_PMR_MULTIPLYWORLDTRANSFORM_set(int xmtype, U_PSEUDO_OBJ *Tm){ + if(!Tm || (Tm->Type != U_PMF_TRANSFORMMATRIX_OID)){ return(NULL); } + int Size = Tm->Used; + uint16_t utmp16 = (xmtype ? U_PPF_XM : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_MULTIPLYWORLDTRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Tm->Data, Tm->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_MULTIPLYWORLDTRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_RESETWORLDTRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + + + EMF+ manual 2.3.9.2, Microsoft name: EmfPlusResetWorldTransform Record, Index 0x2B +*/ +U_PSEUDO_OBJ *U_PMR_RESETWORLDTRANSFORM_set(void){ + int Size = 0; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_RESETWORLDTRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_RESETWORLDTRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_ROTATEWORLDTRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + \param xmtype Set: Post multiply; Clear: Pre multiply + \param Angle Rotation angle, in degrees + + + EMF+ manual 2.3.9.3, Microsoft name: EmfPlusRotateWorldTransform Record, Index 0x2F +*/ +U_PSEUDO_OBJ *U_PMR_ROTATEWORLDTRANSFORM_set(int xmtype, U_FLOAT Angle){ + int Size = 4; + uint16_t utmp16 = (xmtype ? U_PPF_XM : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_ROTATEWORLDTRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Angle, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_ROTATEWORLDTRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SCALEWORLDTRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + \param xmtype Set: Post multiply; Clear: Pre multiply + \param X Scale in X + \param Y Scale in Y + + EMF+ manual 2.3.9.4, Microsoft name: EmfPlusScaleWorldTransform Record, Index 0x2E +*/ +U_PSEUDO_OBJ *U_PMR_SCALEWORLDTRANSFORM_set(int xmtype, U_FLOAT X, U_FLOAT Y){ + int Size = 2*4; + uint16_t utmp16 = (xmtype ? U_PPF_XM : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SCALEWORLDTRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&X, 4, 1, U_LE}, + {&Y, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SCALEWORLDTRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETPAGETRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + \param PUenum Page Unit, in UnitType enumeration + \param Scale Scale factor to convert page space to device space + + + + EMF+ manual 2.3.9.5, Microsoft name: EmfPlusSetPageTransform Record, Index 0x30 + + Defines Page Space -> Device Space transformation +*/ +U_PSEUDO_OBJ *U_PMR_SETPAGETRANSFORM_set(int PUenum, U_FLOAT Scale){ + int Size = 4; + uint16_t utmp16 = (PUenum & U_FF_MASK_PU) << U_FF_SHFT_PU; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETPAGETRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Scale, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETPAGETRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_SETWORLDTRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + \param Tm a U_PSEUDO_OBJ containing a U_PMF_TRANSFORMMATRIX. (Transformation matrix) + + + + EMF+ manual 2.3.9.6, Microsoft name: EmfPlusSetWorldTransform Record, Index 0x2A + + Defines World Space -> Page Space transformation +*/ +U_PSEUDO_OBJ *U_PMR_SETWORLDTRANSFORM_set(U_PSEUDO_OBJ *Tm){ + if(!Tm || (Tm->Type != U_PMF_TRANSFORMMATRIX_OID)){ return(NULL); } + int Size = Tm->Used; + uint16_t utmp16 = 0; + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_SETWORLDTRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {Tm->Data, Tm->Used, 1, U_XE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_SETWORLDTRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + +/** + \brief Create and set a U_PMR_TRANSLATEWORLDTRANSFORM PseudoObject + \return Pointer to PseudoObject, NULL on error + \param xmtype Set: Post multiply; Clear: Pre multiply + \param Dx X offset + \param Dy Y offset + + + EMF+ manual 2.3.9.7, Microsoft name: EmfPlusTranslateWorldTransform Record, Index 0x2D +*/ +U_PSEUDO_OBJ *U_PMR_TRANSLATEWORLDTRANSFORM_set(int xmtype, U_FLOAT Dx, U_FLOAT Dy){ + int Size = 2*4; + uint16_t utmp16 = (xmtype ? U_PPF_XM : 0); + U_PSEUDO_OBJ *ph = U_PMR_CMN_HDR_set(U_PMR_TRANSLATEWORLDTRANSFORM,utmp16,Size); + const U_SERIAL_DESC List[] = { + {ph->Data, ph->Used, 1, U_XE}, + {&Dx, 4, 1, U_LE}, + {&Dy, 4, 1, U_LE}, + {NULL,0,0,U_XX} + }; + U_PSEUDO_OBJ *po = U_PMF_SERIAL_set(U_PMR_TRANSLATEWORLDTRANSFORM_OID, List); + U_PO_free(&ph); + return(po); +} + + +//! \cond +/* core _get functions, not accessed outside of this routine */ + +/* get copies of up to 0-6 consecutive 4 byte values and a pointer to the rest */ +int U_PMF_CORE1_get(const char *contents, void *v1, void *v2, void *v3, void *v4, void *v5, void *v6, const char **vR){ + if(v1){ U_PMF_MEMCPY_SRCSHIFT(v1, &contents, 4); + if(v2){ U_PMF_MEMCPY_SRCSHIFT(v2, &contents, 4); + if(v3){ U_PMF_MEMCPY_SRCSHIFT(v3, &contents, 4); + if(v4){ U_PMF_MEMCPY_SRCSHIFT(v4, &contents, 4); + if(v5){ U_PMF_MEMCPY_SRCSHIFT(v5, &contents, 4); + if(v6){ U_PMF_MEMCPY_SRCSHIFT(v6, &contents, 4); }}}}}} + if(vR){ *vR = contents; } + return(1); +} +//! \endcond + + +/** + \brief Get data from a U_PMF_BRUSH object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param Type BrushType Enumeration + \param Data one of the 5 types of Brush data + + EMF+ manual 2.2.1.1, Microsoft name: EmfPlusBrush Object +*/ +int U_PMF_BRUSH_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data){ + if(!contents || !Version || !Type || !Data){ 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); + return(1); +} + +/** + \brief Get data from a U_PMF_CUSTOMLINECAP object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param Type CustomLineCapData Enumeration + \param Data one of the 2 types of Linecap data + + EMF+ manual 2.2.1.2, Microsoft name: EmfPlusCustomLineCap Object +*/ +int U_PMF_CUSTOMLINECAP_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data){ + if(!contents || !Version || !Type || !Data){ 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); + return(1); +} + +/** + \brief Get data from a U_PMF_FONT object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param EmSize em size in units of SizeUnit + \param SizeUnit UnitType enumeration + \param FSFlags FontStyle flags + \param Length Number of Unicode Characters in FamilyName + \param Data Unicode (UTF-16LE) name of font family + + EMF+ manual 2.2.1.3, Microsoft name: EmfPlusFont Object +*/ +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); } + 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); + U_PMF_SERIAL_get(&contents, FSFlags, 4, 1, U_LE); + contents += 4; /* Reserved field, which is ignored */ + U_PMF_SERIAL_get(&contents, Length, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + + +/** + \brief Get data from a U_PMF_IMAGE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param Type ImageDataType Enumeration + \param Data one of the 2 types of image data + + EMF+ manual 2.2.1.4, Microsoft name: EmfPlusImage Object +*/ +int U_PMF_IMAGE_get(const char *contents, uint32_t *Version, uint32_t *Type, const char **Data){ + if(!contents || !Version || !Type){ 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); + return(1); +} + +/** + \brief Get data from a U_PMF_IMAGEATTRIBUTES object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param WrapMode WrapMode object + \param ClampColor EmfPlusARGB object + \param ObjectClamp ObjectClamp Identifiers + + 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); } + 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); + U_PMF_SERIAL_get(&contents, ClampColor, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, ObjectClamp,4, 1, U_LE); + /* Skip Reserved 2*/ + return(1); +} + +/** + \brief Get data from a U_PMF_PATH object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param Count Number of points and point types in this object + \param Flags PathPoint Flags + \param Points array of points type PMFPointR, PMFPoint, or PMFPointF + \param Types array of U_PMF_PATHPOINTTYPERLE and/or U_PMF_PATHPOINTTYPE + + EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object +*/ +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); } + 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); + 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; + } + else if(*Flags & U_PPF_C){ contents += *Count * sizeof(U_PMF_POINT); } + else { contents += *Count * sizeof(U_PMF_POINTF); } + U_PMF_PTRSAV_SHIFT(Types, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_PEN object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param Type must be zero + \param PenData Pen description + \param Brush Brush Description + + EMF+ manual 2.2.1.7, Microsoft name: EmfPlusPen Object +*/ +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); } + 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); + *Brush = *PenData + U_PMF_LEN_PENDATA(*PenData); + return(1); +} + +/** + \brief Get data from a U_PMF_REGION object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Version EmfPlusGraphicsVersion object + \param Count Number of CHILD nodes. This is one less than the total number of U_PMF_REGIONNODE objects in Nodes. + \param Nodes Nodes defining region + + 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); } + 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); + return(1); +} + +/** + \brief Get data from a U_PMF_STRINGFORMAT object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Sfs pointer to U_PMF_STRINGFORMAT structure, with no variable part + \param Data pointer to variable part + + 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); } + U_PMF_SERIAL_get(&contents, Sfs, 4, 15, U_LE); + *Data = contents; + return(1); +} + +/** + \brief Get data from a U_PMF_ARGB object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Blue Blue color (0-255) + \param Green Green color (0-255) + \param Red Red color (0-255) + \param Alpha Alpha (0-255) + + 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); } + 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); + U_PMF_SERIAL_get(&contents, Alpha, 1, 1, U_XE); + return(1); +} + +/** + \brief Get data from a U_PMF_BITMAP object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Bs pointer to U_PMF_BITMAP structure, with no variable part + \param Data pointer to variable part + + EMF+ manual 2.2.2.2, Microsoft name: EmfPlusBitmap Object +*/ +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); + return(1); +} + +/** + \brief Get data from a U_PMF_BITMAPDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Ps pointer to U_PMF_PALETTE structure, with no variable part + \param Colors Color part of U_PMF_PALETTE object + \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 +*/ +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); } + U_PMF_SERIAL_get(&contents, Ps, 4, 2, U_LE); + U_PMF_PTRSAV_SHIFT(Colors, &contents, Ps->Elements * sizeof(U_PMF_ARGB)); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_BLENDCOLORS object + \return 1 on success, 0 on error + \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. + + 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); } + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + 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); +} + +/** + \brief Get data from a U_PMF_BLENDFACTORS object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Elements members in each array + \param Positions Caller must free. Pointer to memory holding positions along gradient line. + \param Factors Caller must free. Pointer to memory holding blending factors, 0.0->1.0 values, inclusive along gradient line. + + 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); } + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + 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); + return(0); + } + return(1); +} + +/** + \brief Get data from a U_PMF_BOUNDARYPATHDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Size bytes in Data + \param Data boundary of the brush + + EMF+ manual 2.2.2.6, Microsoft name: EmfPlusBoundaryPathData Object +*/ +int U_PMF_BOUNDARYPATHDATA_get(const char *contents, int32_t *Size, const char **Data){ + if(!contents || !Size || !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \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 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); } + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + if(!U_PMF_SERIAL_array_copy_get(&contents, (void **)Points, 4, *Elements * 2, U_LE, 1)){ return(0); } + return(1); +} + +/** + \brief Get data from a U_PMF_CHARACTERRANGE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param First First position in range + \param Length Range length + + 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); } + U_PMF_SERIAL_get(&contents, First, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Length, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_COMPOUNDLINEDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Elements Members in the array + \param Widths Caller must free. Pointer to memory holding Line or gap widths (0.0 <-> 1.0, fraction of total line width ). + + 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); } + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + *Widths = (U_FLOAT *)malloc(*Elements * sizeof(U_FLOAT)); + if(!*Widths){ return(0); } + U_PMF_SERIAL_get(&contents, *Widths, 4, *Elements, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_COMPRESSEDIMAGE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Data Stored image in one of the supported formats. + + 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_get(const char *contents, const char **Data){ + if(!contents || !Data){ return(0); } + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_CUSTOMENDCAPDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Size Bytes in Data + \param Data Description of linecap + + EMF+ manual 2.2.2.11, Microsoft name: EmfPlusCustomEndCapData Object +*/ +int U_PMF_CUSTOMENDCAPDATA_get(const char *contents, int32_t *Size, const char **Data){ + if(!contents || !Size || !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_CUSTOMLINECAPARROWDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Ccad pointer to U_PMF_CUSTOMLINECAPARROWDATA structure + + 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); } + U_PMF_SERIAL_get(&contents, Ccad, 4, 13, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_CUSTOMLINECAPDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Clcd pointer to U_PMF_CUSTOMLINECAPDATA structure, with no variable part + \param Data variable part of U_PMF_CUSTOMLINECAPDATA + + EMF+ manual 2.2.2.13, Microsoft name: EmfPlusCustomLineCapData Object +*/ +int U_PMF_CUSTOMLINECAPDATA_get(const char *contents, U_PMF_CUSTOMLINECAPDATA *Clcd, const char **Data){ + if(!contents || !Clcd){ return(0); } + U_PMF_SERIAL_get(&contents, Clcd, 4, 12, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_CUSTOMLINECAPOPTIONALDATA object + \return on success 3,5, or 7 (for varying combinations of data present) or 1 (no data is present), 0 on error + \param contents Record from which to extract data + \param Flags bits set to indicate the presence of FillData and/or LineData + \param FillData Path to fill (optional) + \param LineData Path to stroke (optional) + + EMF+ manual 2.2.2.14, Microsoft name: EmfPlusCustomLineCapOptionalData Object +*/ +int U_PMF_CUSTOMLINECAPOPTIONALDATA_get(const char *contents, uint32_t Flags, const char **FillData, const char **LineData){ + uint32_t length; + int status = 1; + if(!contents){ return(0); } + if(Flags & U_CLCD_FillPath){ + if(!FillData){ return(0); } + U_PMF_SERIAL_get(&contents, &length, 4, 1, U_LE); + contents -= 4; /* undo the unneeded shift from preceding */ + U_PMF_PTRSAV_SHIFT(FillData, &contents, 4 + length); + status += 2; + } + else { *FillData = NULL; } + + if(Flags & U_CLCD_LinePath){ + if(!LineData){ return(0); } + U_PMF_PTRSAV_SHIFT(LineData, &contents, 0); + status += 4; + } + else { *LineData = NULL; } + return(status); +} + +/** + \brief Get data from a U_PMF_CUSTOMSTARTCAPDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Size Bytes in Data + \param Data Description of linecap + + EMF+ manual 2.2.2.15, Microsoft name: EmfPlusCustomStartCapData Object +*/ +int U_PMF_CUSTOMSTARTCAPDATA_get(const char *contents, int32_t *Size, const char **Data){ + if(!contents || !Size || !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_DASHEDLINEDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Elements Members in the array + \param Lengths Caller must free. Pointer to memory holding lengths of dashes and spaces. + + 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); } + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + *Lengths = (U_FLOAT *)malloc(*Elements * sizeof(U_FLOAT)); + if(!*Lengths){ return(0); } + U_PMF_SERIAL_get(&contents, *Lengths, 4, *Elements, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_FILLPATHOBJ object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Size Bytes in Data + \param Data Path specification + + EMF+ manual 2.2.2.17, Microsoft name: EmfPlusFillPath Object +*/ +int U_PMF_FILLPATHOBJ_get(const char *contents, int32_t *Size, const char **Data){ + if(!contents || !Size || !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_FOCUSSCALEDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Count must be 2 + \param ScaleX value 0.0 <-> 1.0 + \param ScaleY value 0.0 <-> 1.0 + + 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); } + 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); + U_PMF_SERIAL_get(&contents, ScaleY, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_GRAPHICSVERSION object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Signature Must be U_GFVR_PMF (0xDBC01) + \param GrfVersion GraphicsVersion enumeration + + 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); } + uint32_t tmp; + memcpy(&tmp, contents, 4); + *Signature = tmp >> 12; + *GrfVersion = tmp & U_GFVR_MASKLO; + return(1); +} + +/** + \brief Get data from a U_PMF_HATCHBRUSHDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Style HatchStyle enumeration + \param Foreground Hatch pattern line color + \param Background Hatch pattern bkground color + + 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); } + 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); + return(1); +} + +/** + \brief Get data from a U_PMF_INTEGER7 object + \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) + + 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); } + uint8_t tmp; + 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){ + tmp |= U_TEST_INT7; /* now it has the bit pattern of a signed int8_t */ + *Value = *(int8_t *)&tmp; + } + else { + *Value = tmp; + } + return(1); +} + +/** + \brief Get data from a U_PMF_INTEGER15 object + \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) + + 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); } + uint16_t tmp; + 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 */ + if(tmp & U_SIGN_INT15){ + tmp |= U_TEST_INT15; /* now it has the bit pattern of a signed int16_t */ + *Value = *(int16_t *)&tmp; + } + else { + *Value = tmp; + } + return(1); +} + +/** + \brief Get data from a U_PMF_LANGUAGEIDENTIFIER object + \return 1 on success, 0 on error + \param LId U_PMF_LANGUAGEIDENTIFIER from which to extract data + \param SubLId Example: code for USA + \param PriLId Example: code for English + + + + EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier Object + + This type is defined as 16 bits in the manual section, but it is only ever used as part of a 32 bit field! +*/ +int U_PMF_LANGUAGEIDENTIFIER_get(U_PMF_LANGUAGEIDENTIFIER LId, int *SubLId, int *PriLId){ + if(!SubLId || !PriLId){ return(0); } + *SubLId = (LId >> U_FF_SHFT_SUBLID ) & U_FF_MASK_SUBLID; + *PriLId = (LId >> U_FF_SHFT_PRILID ) & U_FF_MASK_PRILID; + /* 16 bits above that are not used */ + return(1); +} + +/** + \brief Get data from a U_PMF_LINEARGRADIENTBRUSHDATA object + \return 1 on success, 0 on error + \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 + + EMF+ manual 2.2.2.24, Microsoft name: EmfPlusLinearGradientBrushData Object +*/ +int U_PMF_LINEARGRADIENTBRUSHDATA_get(const char *contents, U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const char **Data){ + if(!contents || !Lgbd || !Data){ 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); + return(1); +} + +/** + \brief Get data from a U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags BrushData flags - indicates which of the following date fields are present. + \param Tm Transformation matrix + \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.) + + 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){ + uint32_t Elements; + if(!contents || !Tm|| !Bc || !BfH || !BfV){ return(0); } + *Bc = *BfH = *BfV = NULL; + if(Flags & U_BD_Transform)U_PMF_SERIAL_get(&contents, Tm, 4, 6, U_LE); + if(Flags & U_BD_PresetColors){ + 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*/ + 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 */ + if(Flags & U_BD_BlendFactorsV){ + U_PMF_PTRSAV_SHIFT(BfV, &contents, 0); + } + } + else if(Flags & U_BD_BlendFactorsV){ + U_PMF_PTRSAV_SHIFT(BfV, &contents, 0); + } + return(1); +} + +/** + \brief Get data from a U_PMF_LINEPATH object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Size Bytes in Data + \param Data Outline path + + EMF+ manual 2.2.2.26, Microsoft name: EmfPlusLinePath Object +*/ +int U_PMF_LINEPATH_get(const char *contents, int32_t *Size, const char **Data){ + if(!contents || !Size || !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_METAFILE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Type + \param Size Bytes in Data + \param Data Various types of data, like an EMF metafile, WMF metafile, another EMF+ metafile + + EMF+ manual 2.2.2.27, Microsoft name: EmfPlusMetafile Object +*/ +int U_PMF_METAFILE_get(const char *contents, uint32_t *Type, uint32_t *Size, const char **Data){ + if(!contents || !Type || !Size || !Data){ 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); + return(1); +} + +/** + \brief Get data from a U_PMF_PALETTE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags PaletteStyle flags + \param Elements Members in the array + \param Colors Palette data (array of colors) + + 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); } + U_PMF_SERIAL_get(&contents, &Flags, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, &Elements, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Colors, &contents, 0); + return(1); + +} + +/** + \brief Get data from a U_PMF_PATHGRADIENTBRUSHDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Pgbd constant part of U_PMF_PATHGRADIENTBRUSHDATA object + \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 + + EMF+ manual 2.2.2.29, Microsoft name: EmfPlusPathGradientBrushData Object +*/ +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); } + 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 */ + 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); + return(1); +} + +/** + \brief Get data from a U_PMF_PATHGRADIENTBRUSHOPTIONALDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags bits set to indicate the presence of FillData and/or LineData + \param Matrix Transformation matrix + \param Pattern Blend Pattern + \param Data Focus scales for the brush + + 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)); + return(1); +} + +/** + \brief Get data from a U_PMF_PATHPOINTTYPE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags PathPointType flags + \param Type PathPointType enumeration + + 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); } + uint8_t tmp; + memcpy(&tmp, contents, 1); + *Flags =(tmp & U_PTP_MASK) >> U_PTP_SHIFT; + *Type = (tmp & U_PPT_MASK); + return(1); +} + +/** + \brief Get data from a U_PMF_PATHPOINTTYPERLE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Bezier Set: Bezier curve, Clear: straight line + \param RL Run Length + \param Ppt PathPointType enumeration + + 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); } + uint16_t tmp; + 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; + *Ppt = (tmp >> U_FF_SHFT_PPT) & U_FF_MASK_PPT; + return(1); +} + +/** + \brief Get data from a U_PMF_PENDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags PenData flags + \param Unit UnitType enumeration + \param Width Width in units set by Unit + \param Data Optional pen data, exact composition depends on Flags + + 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); } + 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); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_PENOPTIONALDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags; PenData Flags - indicated which of the many fields are present. + \param Matrix; Transformation matrix + \param StartCap LineCapType enumeration + \param EndCap LineCapType enumeration + \param Join LineJoinType enumeration + \param MiterLimit Maximum (miter length / line width) + \param Style LineStyle enumeration + \param DLCap DashedLineCapType enumeration + \param DLOffset Distance line start to first dash start + \param DLData Dash and space widths + \param Alignment PenAlignment enumeration + \param CmpndLineData Compount Line (parallel lines drawn instead of one) + \param CSCapData Custom start cap + \param CECapData Custom end cap + + EMF+ manual 2.2.2.34, Microsoft name: EmfPlusPenOptionalData Object + + This object consists of a large number of optional and or variable values, which + are returned, or not, depending on bits in Flags. +*/ +int U_PMF_PENOPTIONALDATA_get( + const char *contents, + uint32_t Flags, // determines which fields are filled + 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){ + 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)); } + return(1); +} + +/** + \brief Get data from a U_PMF_POINT object + \return 1 on success, 0 on error + \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 + + 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); } + int16_t tmp; + 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); +} + +/** + \brief Get data from a U_PMF_POINTF object + \return 1 on success, 0 on error + \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 + + 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); } + U_PMF_SERIAL_get(contents, X, 4, 1, U_LE); + U_PMF_SERIAL_get(contents, Y, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_POINTR object + \return size in bytes traversed on success, 0 on error + \param contents Record from which to extract data. On return position is offset by returned size. + \param X X coordinate + \param Y Y coordinate + + 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 size=0; + + if( U_PMF_INTEGER7_get( contents, X)){ size +=1; } + else if(U_PMF_INTEGER15_get(contents, X)){ size +=2; } + else { return(0); } + + if( U_PMF_INTEGER7_get( contents, Y)){ size +=1; } + else if(U_PMF_INTEGER15_get(contents, Y)){ size +=2; } + else { return(0); } + + return(size); +} + +/** + \brief Get data from a variable POINTS object, which may be U_PMF_POINTS, U_PMF_POINTF, or U_PMF_POINTR. + \return 1 on success, 0 on error + \param contents Record from which to extract data + \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. +*/ +int U_PMF_VARPOINTS_get(const char **contents, uint16_t Flags, int Elements, U_PMF_POINTF **Points){ + U_PMF_POINTF *pts = (U_PMF_POINTF *)malloc(Elements * sizeof(U_PMF_POINTF)); + U_FLOAT XF, YF; + U_FLOAT XFS, YFS; + + if(!contents || !*contents || !Points){ return(0); } + *Points = pts; + for(XFS = YFS = 0.0; Elements; Elements--, pts++){ + if(Flags & U_PPF_P){ + U_PMF_POINTR_get(contents, &XF, &YF); + 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){ + (void) U_PMF_POINT_get(contents, &XF, &XF); + pts->X = XF; + pts->Y = YF; + } + else { + (void) U_PMF_POINTF_get(contents, &(pts->X), &(pts->Y)); + } + } + return(1); +} + +/** + \brief Get data from a U_PMF_RECT object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param X UL X value + \param Y UL Y value + \param Width Width + \param Height Height + + 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){ + if(!contents || !X || !Y|| !Width || !Height){ 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); + U_PMF_SERIAL_get(contents, Height, 2, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_RECTF object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param X UL X value + \param Y UL Y value + \param Width Width + \param Height Height + + 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){ + if(!contents || !X || !Y|| !Width || !Height){ 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); + U_PMF_SERIAL_get(contents, Height, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a variable RECTS object, which may be U_PMF_RECT or U_PMF_RECTF + \return 1 on success, 0 on error + \param contents Record from which to extract data + \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. + + 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){ + int16_t X16, Y16, Width, Height; + if(!contents || !*contents || !Rects){ return(0); } + U_PMF_RECTF *rts = (U_PMF_RECTF *)malloc(Elements * sizeof(U_PMF_RECTF)); + if(!rts){ + *Rects = NULL; + return(0); + } + + *Rects = rts; + for(; Elements; Elements--, rts++){ + if(Flags & U_PPF_C){ + (void) U_PMF_RECT_get(contents, &X16, &Y16, &Width, &Height); + 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)); + } + } + return(1); +} + +/** + \brief Get data from a U_PMF_REGIONNODE object + \return 1 on success, 0 on error + \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 + + + EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object +*/ +int U_PMF_REGIONNODE_get(const char *contents, uint32_t *Type, const char **Data){ + if(!contents || !Type|| !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Type, 4, 1, U_LE); + U_PMF_PTRSAV_COND(Data, contents, !(*Type == U_RNDT_Empty || *Type == U_RNDT_Infinite )); + return(1); +} + +/** + There is no U_PMF_REGIONNODECHILDNODES_get! + + The Region object is recursive allowing U_PMF_REGIONNODECHILDNODES -> + U_PMF_REGIONNODE -> U_PMF_REGIONNODECHILDNODES etc. + So the data stored in each node must be handled as the tree is followed recursively. + + See U_PMF_REGIONNODECHILDNODES_print() and U_PMF_REGIONNODE_print() for an example. + + + EMF+ manual 2.2.2.41, Microsoft name: EmfPlusRegionNodeChildNodes Object +*/ + +/** + \brief Get data from a U_PMF_REGIONNODEPATH object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Size Bytes in Data + \param Data Boundary of region node + + 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); } + U_PMF_SERIAL_get(&contents, Size, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_SOLIDBRUSHDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Color Color of brush + + 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); } + U_PMF_SERIAL_get(&contents, Color, 4, 1, U_XE); + return(1); +} + +/** + \brief Get data from a U_PMF_STRINGFORMATDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param TabStopCount Entries in TabStop array + \param RangeCount Entries in CharRange array + \param TabStops Array of tabstop locations + \param CharRange Array of character ranges in the text + + 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); } + *TabStops = NULL; + if(TabStopCount > 0){ U_PMF_SERIAL_get(&contents, TabStops, 4, TabStopCount, U_LE); } + *CharRange = NULL; + if(RangeCount > 0){ U_PMF_SERIAL_get(&contents, CharRange, 4, 2*RangeCount, U_LE); } + return(1); +} + +/** + \brief Get data from a U_PMF_TEXTUREBRUSHDATA object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Flags BrushData flags + \param WrapMode WrapMode enumeration + \param Data Optional texture data + + EMF+ manual 2.2.2.45, Microsoft name: EmfPlusTextureBrushData Object +*/ +int U_PMF_TEXTUREBRUSHDATA_get(const char *contents, uint32_t *Flags, int32_t *WrapMode, const char **Data){ + if(!contents || !Flags || !WrapMode || !Data){ return(0); } + U_PMF_SERIAL_get(&contents, Flags, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, WrapMode, 4, 1, U_LE); + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMF_TEXTUREBRUSHOPTIONALDATA object + \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 Image Image that contains the texture. + + + EMF+ manual 2.2.2.46, Microsoft name: EmfPlusTextureBrushOptionalData Object +*/ +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); + return(1); +} + +/** + \brief Get data from a U_PMF_TRANSFORMMATRIX object + \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. + + 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); } + U_PMF_SERIAL_get(&contents, Matrix, 4, 6, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_BLUR object + \return 1 on success, 0 on error + \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 + + 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); } + U_PMF_SERIAL_get(&contents, Radius, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, ExpandEdge, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_BRIGHTNESSCONTRAST object + \return 1 on success, 0 on error + \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 + + 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); } + U_PMF_SERIAL_get(&contents, Brightness, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Contrast, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_COLORBALANCE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \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 + + 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); } + 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); + return(1); +} + + +/** + \brief Get data from a U_PMF_IE_COLORCURVE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Adjust CurveAdjustment enumeration + \param Channel CurveChannel enumeration + \param Intensity adjustment to apply. "Adjust" determines what field this is and range values. + + 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); } + 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); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_COLORLOOKUPTABLE object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param BLUT Blue color lookup table + \param GLUT Green color lookup table + \param RLUT Red color lookup table + \param ALUT Alpha color lookup table + + 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); } + 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); + U_PMF_PTRSAV_SHIFT((const char **)ALUT, &contents, 256); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_COLORMATRIX object + \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] + + 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); } + U_PMF_SERIAL_get(&contents, Matrix, 4, 5*5, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_HUESATURATIONLIGHTNESS object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Hue -180 to 180, 0 is unchanged + \param Saturation -100 to 100, 0 is unchanged + \param Lightness -100 to 100, 0 is unchanged + + 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); } + 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); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_LEVELS object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Highlight 0 to 100, 100 is unchanged + \param Midtone -100 to 100, 0 is unchanged + \param Shadow 0 to 100, 0 is unchanged + + 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); } + 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); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_REDEYECORRECTION object + \return 1 on success, 0 on error + \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. + + 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); } + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + *Rects = (U_RECTL *) malloc(*Elements * sizeof(U_RECTL)); + if(!*Rects){ return(0); } + U_PMF_SERIAL_get(&contents, *Rects, 4, *Elements * 4, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_SHARPEN object + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Radius Sharpening radius in pixels + \param Sharpen 0 to 100, 0 is unchanged + + 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); } + U_PMF_SERIAL_get(&contents, Radius, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Sharpen, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMF_IE_TINT object + \return 1 on success, 0 on error + \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 + + 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); } + U_PMF_SERIAL_get(&contents, Hue, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Amount, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_OFFSETCLIP record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + \param dX horizontal translation offset to apply to clipping region + \param dY vertical translation offset to apply to clipping region + + EMF+ manual 2.3.1.1, Microsoft name: EmfPlusOffsetClip Record, Index 0x35 +*/ +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_SERIAL_get(&contents, dX, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, dY, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_RESETCLIP record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + EMF+ manual 2.3.1.2, Microsoft name: EmfPlusResetClip Record, Index 0x31 +*/ +int U_PMR_RESETCLIP_get(const char *contents, U_PMF_CMN_HDR *Header){ + if(!contents){ return(0); } + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_SETCLIPPATH record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param CMenum CombineMode enumeration.. + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + + EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath Record, Index 0x33 +*/ +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); + return(1); +} + +/** + \brief Get data from a U_PMR_SETCLIPRECT record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + \param CMenum Combine mode enumeration. + \param Rect Rectangle used with CombineMode enumeration from Header.Flags + + EMF+ manual 2.3.1.4, Microsoft name: EmfPlusSetClipRect Record, Index 0x32 +*/ +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_SERIAL_get(&contents, Rect, 4, 4, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_SETCLIPREGION record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param CMenum CombineMode enumeration.. + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + + EMF+ manual 2.3.1.5, Microsoft name: EmfPlusSetClipRegion Record, Index 0x34 +*/ +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); + return(1); +} + +/** + \brief Get data from a U_PMR_COMMENT record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + \param Data Private data, may be anything + + EMF+ manual 2.3.2.1, Microsoft name: EmfPlusComment Record, Index 0x03 +*/ +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_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMR_ENDOFFILE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + EMF+ manual 2.3.3.1, Microsoft name: EmfPlusEndOfFile Record, Index 0x02 +*/ +int U_PMR_ENDOFFILE_get(const char *contents, U_PMF_CMN_HDR *Header){ + if(!contents){ return(0); } + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_GETDC record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + EMF+ manual 2.3.3.2, Microsoft name: EmfPlusGetDC Record, Index 0x04 +*/ +int U_PMR_GETDC_get(const char *contents, U_PMF_CMN_HDR *Header){ + if(!contents){ return(0); } + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_HEADER record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + \param Version EmfPlusGraphicsVersion object + \param IsDual set = Dual-mode file, clear= EMF+ only file. + \param IsVideo set = video device, clear= printer. Ignore all other bits. + \param LogicalDpiX Horizontal resolution reference device in DPI + \param LogicalDpiY Vertical resolution reference device in DPI + + EMF+ manual 2.3.3.3, Microsoft name: EmfPlusHeader Record, Index 0x01 +*/ +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_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); + U_PMF_SERIAL_get(&contents, LogicalDpiY, 4, 1, U_LE); + *IsVideo = (tmp & U_PPF_VIDEO ? 1 : 0 ); + return(1); +} + +/** + \brief Get data from a U_PMR_CLEAR record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + \param Color Erase everything preceding, set background ARGB color. + + EMF+ manual 2.3.4.1, Microsoft name: EmfPlusClear Record, Index 0x09 +*/ +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_SERIAL_get(&contents, Color, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWARC record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param Rect Caller must free. Bounding rectangle. Coordinate type set by ctype. + + EMF+ manual 2.3.4.2, Microsoft name: EmfPlusDrawArc Record, Index 0x12 +*/ +int U_PMR_DRAWARC_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWBEZIERS record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param RelAbs Set: Coordinates are relative; Clear: Coordinates are absolute and their type is set by ctype + \param Elements Number of members in the Data array + \param Points Caller must free. Array of U_POINT_F = Sequence of points to connect. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.3, Microsoft name: EmfPlusDrawBeziers Record, Index 0x19 +*/ +int U_PMR_DRAWBEZIERS_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, int *RelAbs, + 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); + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWCLOSEDCURVE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param RelAbs Set: Coordinates are relative; Clear: Coordinates are absolute and their type is set by ctype + \param Tension Controls splines, 0 is straight line, >0 is curved + \param Elements Number of members in the Data array + \param Points Caller must free. Array of U_POINT_F = Sequence of points to connect. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.4, Microsoft name: EmfPlusDrawClosedCurve Record, Index 0x17 +*/ +int U_PMR_DRAWCLOSEDCURVE_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, int *RelAbs, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWCURVE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param Tension Controls splines, 0 is straight line, >0 is curved + \param Offset Element in Points that is the spline's starting point + \param NSegs Number of segments + \param Elements Number of members in Data array + \param Points Caller must free. Array of U_POINT_F = Sequence of points to connect. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.5, Microsoft name: EmfPlusDrawCurve Record, Index 0x18 +*/ +int U_PMR_DRAWCURVE_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWDRIVERSTRING record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param FontID U_PMF_FONT object in the EMF+ object table (0-63, inclusive) + \param btype Set: BrushID is an U_PFM_ARGB; Clear: index of U_PMF_BRUSH object in EMF+ object table. + \param Tension Controls splines, 0 is straight line, >0 is curved + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depends on Flags bit0 + \param DSOFlags DriverStringOptions flags + \param HasMatrix If 1 record contains a TransformMatrix field, if 0 it does not. + \param Elements Number of members in Glyphs and Positions array + \param Glyphs Caller must free. If U_DSO_CmapLookup is set in DSOFlags this is an array of UTF16LE characters, otherwise, it is an array of indices into the U_PMF_FONT object indexed by Object_ID in flags. + \param Points Caller must free. Coordinates of each member of Glyphs. U_DSO_RealizedAdvance set in DSOFlags Relative then positions are calculated relative to the first glyph which is stored in Positions, otherwise, all glyph positions are stored in Positions. + \param Matrix Caller must free. Transformation to apply to Glyphs & Positions. Present if HasMatrix is 1 + + EMF+ manual 2.3.4.6, Microsoft name: EmfPlusDrawDriverString Record, Index 0x36 +*/ +int U_PMR_DRAWDRIVERSTRING_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *FontID, int *btype, + U_FLOAT *Tension, uint32_t *BrushID, uint32_t *DSOFlags, uint32_t *HasMatrix, uint32_t *Elements, + 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); + 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(!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); } + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWELLIPSE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param Rect Caller must free. Bounding rectangle. Coordinate type set by ctype. + + EMF+ manual 2.3.4.7, Microsoft name: EmfPlusDrawEllipse Record, Index 0x0F +*/ +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_SERIAL_get(&contents, Rect, 4, 4, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWIMAGE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param ImgID U_PMF_IMAGE object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param ImgAttrID index of a U_PMF_IMAGEATTRIBUTES object in the object table + \param SrcUnit UnitType enumeration + \param SrcRect Region of image + \param DstRect Destination rectangle for image. Coordinate type set by ctype. + + EMF+ manual 2.3.4.8, Microsoft name: EmfPlusDrawImage Record, Index 0x1A +*/ +int U_PMR_DRAWIMAGE_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *ImgID, int *ctype, + 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_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, DstRect, 4, 4, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWIMAGEPOINTS record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param ImgID U_PMF_IMAGE object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param etype Set: effect from previous U_PMR_SERIALIZABLEOBJECT record will be applied; Clear: no effect applied + \param RelAbs Set: Data is relative, Clear: if it is absolute + \param ImgAttrID EmfPlusImageAttributes object + \param SrcUnit UnitType enumeration + \param SrcRect Region of image + \param Elements Number of members in Points, must be 3 + \param Points Caller must free. 3 points of a parallelogram.. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.9, Microsoft name: EmfPlusDrawImagePoints Record, Index 0x1B +*/ +int U_PMR_DRAWIMAGEPOINTS_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *ImgID, int *ctype, int *etype, int *RelAbs, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWLINES record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param dtype Set: path must be closed, Clear: path is open + \param RelAbs Set: Coordinates are relative; Clear: Coordinates are absolute and their type is set by ctype + \param Elements Number of members in Points + \param Points Caller must free. Array of U_POINT_F = Sequence of points to connect. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.10, Microsoft name: EmfPlusDrawLines Record, Index 0x0D +*/ +int U_PMR_DRAWLINES_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, int *dtype, int *RelAbs, + 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); + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + U_PMF_VARPOINTS_get(&contents, Flags, *Elements, Points); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWPATH record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + + EMF+ manual 2.3.4.11, Microsoft name: EmfPlusDrawPath Record, Index 0x15 +*/ +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_SERIAL_get(&contents, PenID, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWPIE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param Rect Caller must free. Bounding rectangle. Coordinate type set by ctype. + + EMF+ manual 2.3.4.12, Microsoft name: EmfPlusDrawPie Record, Index 0x0D +*/ +int U_PMR_DRAWPIE_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWRECTS record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PenID U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param Elements Number of members in Rects + \param Rects Caller must free. Array of U_PMF_RECTF rectangles to draw. + + EMF+ manual 2.3.4.13, Microsoft name: EmfPlusDrawRects Record, Index 0x0B + + Rects in record may be either U_PMF_RECT or U_PMF_RECTF, but this function always + returns U_PMF_RECTF +*/ +int U_PMR_DRAWRECTS_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *PenID, int *ctype, + 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); + U_PMF_SERIAL_get(&contents, Elements, 4, 1, U_LE); + U_PMF_VARRECTS_get(&contents, Flags, *Elements, Rects); + return(1); +} + +/** + \brief Get data from a U_PMR_DRAWSTRING record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param FontID U_PMF_FONT object in the EMF+ object table (0-63, inclusive) + \param btype Set: BrushID is an U_PFM_ARGB; Clear: index of U_PMF_BRUSH object in EMF+ object table. + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + \param FormatID U_PMF_STRINGFORMAT object in EMF+ Object Table. + \param Elements Number of characters in the string. + \param Rect String's bounding box. + \param String Caller must free. Array of UFT-16LE unicode characters. + + EMF+ manual 2.3.4.14, Microsoft name: EmfPlusDrawString Record, Index 0x1C +*/ +int U_PMR_DRAWSTRING_get(const char *contents, U_PMF_CMN_HDR *Header, + uint32_t *FontID, int *btype, + 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); + 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(!U_PMF_SERIAL_array_copy_get(&contents, (void **)String, 2, *Elements, U_XE, 1)){ return(0); } + return(1); +} + +/** + \brief Get data from a U_PMR_FILLCLOSEDCURVE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param ftype Set: winding fill; Clear: alternate fill + \param RelAbs Set: Coordinates are relative; Clear: Coordinates are absolute and their type is set by ctype + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + \param Tension Controls splines, 0 is straight line, >0 is curved + \param Elements Number of members in Points + \param Points Caller must free. Array of U_POINT_F = Sequence of points to connect. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.15, Microsoft name: EmfPlusFillClosedCurve Record, Index 0x16 +*/ +int U_PMR_FILLCLOSEDCURVE_get(const char *contents, U_PMF_CMN_HDR *Header, + int *btype, int *ctype, int *ftype, int *RelAbs, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_FILLELLIPSE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + \param Rect Caller must free. Bounding box for elliptical pie segment being drawn. Coordinate type set by ctype. + + EMF+ manual 2.3.4.16, Microsoft name: EmfPlusFillEllipse Record, Index 0x0E +*/ +int U_PMR_FILLELLIPSE_get(const char *contents, U_PMF_CMN_HDR *Header, + int *btype, int *ctype, + 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_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); +} + +/** + \brief Get data from a U_PMR_FILLPATH record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param PathID U_PMF_PATH object in the EMF+ object table (0-63, inclusive) + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + + EMF+ manual 2.3.4.17, Microsoft name: EmfPlusFillPath Record, Index 0x14 + + Note: U_PMF_FILLPATHOBJ is the object, U_PMF_FILLPATH is the file record +*/ +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_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */ + return(1); +} + +/** + \brief Get data from a U_PMR_FILLPIE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + \param Start Start angle, >=0.0, degrees clockwise from 3:00 + \param Sweep Sweep angle, -360<= angle <=360, degrees clockwise from Start + \param Rect Bounding box for elliptical pie segment being filled. Coordinate type set by ctype. + + EMF+ manual 2.3.4.18, Microsoft name: EmfPlusFillPie Record, Index 0x10 +*/ +int U_PMR_FILLPIE_get(const char *contents, U_PMF_CMN_HDR *Header, + int *btype, int *ctype, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_FILLPOLYGON record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param RelAbs Set: U_PMF_PathPointTypeRLE and/or U_PMF_PathPointType objects; Clear: only U_PMF_PathPointType + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + \param Elements Number of members in Data. + \param Points Sequence of points to connect with line segments. Coordinate type set by ctype and RelAbs. + + EMF+ manual 2.3.4.19, Microsoft name: EmfPlusFillPolygon Record, Index 0x0C +*/ +int U_PMR_FILLPOLYGON_get(const char *contents, U_PMF_CMN_HDR *Header, + int *btype, int *ctype, int *RelAbs, + 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); + 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); + return(1); +} + +/** + \brief Get data from a U_PMR_FILLRECTS record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + \param Elements Number of members in Data. + \param Rects Caller must free. Array of U_PMF_RECTF rectangles to draw. + + EMF+ manual 2.3.4.20, Microsoft name: EmfPlusFillRects Record, Index 0x0A + + EMF+ files have been encountered where BrushID must be a color, because it has a value like FFFF0000 but + the flags are set wrong, so that U_PPF_B is not set. Detect these by BrushID >63 for btype=0 and correct. + If the opposite problem occurs it cannot be reliably detected, so it cannot be corrected. + + Rects in record may be either U_PMF_RECT or U_PMF_RECTF, but this function always + returns U_PMF_RECTF +*/ +int U_PMR_FILLRECTS_get(const char *contents, U_PMF_CMN_HDR *Header, + int *btype, int *ctype, + 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); + 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); + /* correct btype, if necessary, for invalid EMF+ input */ + if((*BrushID > 63) & !*btype)*btype=1; + return(1); +} + + +/** + \brief Get data from a U_PMR_FILLREGION record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param RgnID U_PMF_REGION object in the EMF+ object table (0-63, inclusive) + \param btype Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param BrushID Color or index of U_PMF_BRUSH object in the EMF+ object table, depending on btype. + + EMF+ manual 2.3.4.21, Microsoft name: EmfPlusFillRegion Record, Index 0x13 +*/ +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_SERIAL_get(&contents, BrushID, 4, 1, (*btype ? U_XE : U_LE)); /* color is not byte swapped, ID integer is */ + return(1); +} + +/** + \brief Get data from a U_PMR_OBJECT record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param ObjID Index for this object in the EMF+ object table (0-63, inclusive) + \param otype ObjectType enumeration + \param ntype Set: object definition continue bit is set + \param TSize If ntype is set, holds the total number of data bytes split across multiple records. If ntype is clear, has no meaning. + \param Data Object's data. Type from otype. + + EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject Record, Index 0x13 + + 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 + field which references it can code for values 0-127. + If a new object has the same index as an existing object the old one is deleted and + the new one goes into its storage slot. + The continuation bit (U_PPF_N) is documented as indicating that the object is continued into + the next record. Examination of emf+ records in emf files produced by PowerPoint 2003 + show that changing the ObjID also serves as a continued record terminator, and that it apparently + overrides the value for the continue bit. That is, even though the preceding records said + that it was continued, the change of ObjID terminates that preceding record without adding + any more data to it. In one example the sequential emf+ records were: + ObjID type size continue + 0 5 65008 Y + 0 5 65008 Y + 0 5 63104 Y + 1 8 24 N + A DrawImagePoints record followed that referenced ObjID 0. + Examination of the records with continue set showed that data in each + was preceded by a uint32_t size value equivalent to the size of the + data that had been split across multiple records, in this case + 0x0002F254 = 193108. It is not clear at present if this size value + will also be present at the end of a continued series that terminates + by not using the continue bit, rather than changing the ObjID. +*/ +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); + if(*ntype){ U_PMF_SERIAL_get(&contents, TSize, 4, 1, U_LE); } + else { *TSize = 0; } + U_PMF_PTRSAV_SHIFT(Data, &contents, 0); + return(1); +} + +/** + \brief Get data from a U_PMR_SERIALIZABLEOBJECT record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param GUID ImageEffects identifier. + \param Size Bytes in Data. + \param Data "Serialized image effects parameter block". One of the ImageEffects objects. + + EMF+ manual 2.3.5.2, Microsoft name: EmfPlusSerializableObject Record, Index 0x38 +*/ +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_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); + return(1); +} + +/** + \brief Get data from a U_PMR_SETANTIALIASMODE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param SMenum SmoothingMode enumeration + \param aatype Set: anti-aliasing on; Clear: anti-aliasing off + + EMF+ manual 2.3.6.1, Microsoft name: EmfPlusSetAntiAliasMode Record, Index 0x1E +*/ +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); + return(1); +} + +/** + \brief Get data from a U_PMR_SETCOMPOSITINGMODE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param CMenum CompositingMode enumeration + + EMF+ manual 2.3.6.2, Microsoft name: EmfPlusSetCompositingMode Record, Index 0x23 +*/ +int U_PMR_SETCOMPOSITINGMODE_get(const char *contents, U_PMF_CMN_HDR *Header, + int *CMenum){ + if(!contents || !CMenum){ return(0); } + uint16_t Flags = U_PMF_HEADERFLAGS_get(contents); + *CMenum = (Flags >> U_FF_SHFT_CM) & U_FF_MASK_CM; + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_SETCOMPOSITINGQUALITY record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param CQenum CompositingQuality enumeration + + EMF+ manual 2.3.6.3, Microsoft name: EmfPlusSetCompositingQuality Record, Index 0x24 +*/ +int U_PMR_SETCOMPOSITINGQUALITY_get(const char *contents, U_PMF_CMN_HDR *Header, + int *CQenum){ + if(!contents || !CQenum){ return(0); } + uint16_t Flags = U_PMF_HEADERFLAGS_get(contents); + *CQenum = (Flags >> U_FF_SHFT_CQ) & U_FF_MASK_CQ; + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_SETINTERPOLATIONMODE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param IMenum InterpolationMode enumeration + + EMF+ manual 2.3.6.4, Microsoft name: EmfPlusSetInterpolationMode Record, Index 0x21 +*/ +int U_PMR_SETINTERPOLATIONMODE_get(const char *contents, U_PMF_CMN_HDR *Header, + int *IMenum){ + if(!contents || !IMenum){ return(0); } + uint16_t Flags = U_PMF_HEADERFLAGS_get(contents); + *IMenum = (Flags >> U_FF_SHFT_IM) & U_FF_MASK_IM; + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_SETPIXELOFFSETMODE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param POMenum PixelOffsetMode enumeration. + + EMF+ manual 2.3.6.5, Microsoft name: EmfPlusSetPixelOffsetMode Record, Index 0x22 +*/ +int U_PMR_SETPIXELOFFSETMODE_get(const char *contents, U_PMF_CMN_HDR *Header, + int *POMenum){ + if(!contents || !POMenum){ return(0); } + uint16_t Flags = U_PMF_HEADERFLAGS_get(contents); + *POMenum = (Flags >> U_FF_SHFT_PxOffM) & U_FF_MASK_PxOffM; + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_SETRENDERINGORIGIN record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header. + \param X X coordinate of rendering origin. + \param Y Y coordinate of rendering origin. + + EMF+ manual 2.3.6.6, Microsoft name: EmfPlusSetRenderingOrigin Record, Index 0x1D +*/ +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_SERIAL_get(&contents, X, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Y, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_SETTEXTCONTRAST record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header. + \param TGC Text Gamma correction value (x 1000). + + EMF+ manual 2.3.6.7, Microsoft name: EmfPlusSetTextContrast Record, Index 0x20 +*/ +int U_PMR_SETTEXTCONTRAST_get(const char *contents, U_PMF_CMN_HDR *Header, + int *TGC){ + if(!contents || !TGC){ return(0); } + uint16_t Flags = U_PMF_HEADERFLAGS_get(contents); + *TGC = (Flags >> U_FF_SHFT_TGC) & U_FF_MASK_TGC; + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_SETTEXTRENDERINGHINT record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header. + \param TRHenum TextRenderingHint enumeration + + EMF+ manual 2.3.6.8, Microsoft name: EmfPlusSetTextRenderingHint Record, Index 0x1F +*/ +int U_PMR_SETTEXTRENDERINGHINT_get(const char *contents, U_PMF_CMN_HDR *Header, + int *TRHenum){ + if(!contents || !TRHenum){ return(0); } + uint16_t Flags = U_PMF_HEADERFLAGS_get(contents); + *TRHenum = (Flags >> U_FF_SHFT_TRH) & U_FF_MASK_TRH; + U_PMF_CMN_HDR_get(&contents, Header); + return(1); +} + +/** + \brief Get data from a U_PMR_BEGINCONTAINER record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param UTenum UnitType enumeration + \param DstRect with SrcRect specifies a transformation + \param SrcRect with DstRect specifies a transformation + \param StackID EMF+ Object Stack Index to use for this graphics container + + EMF+ manual 2.3.7.1, Microsoft name: EmfPlusBeginContainer Record, Index 0x27 +*/ +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_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); + return(1); +} + +/** + \brief Get data from a U_PMR_BEGINCONTAINERNOPARAMS record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param StackID EMF+ Object Stack Index to use for this graphics container + + 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); +} + +/** + \brief Get data from a U_PMR_ENDCONTAINER record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param StackID EMF+ Object Stack Index of this graphics container + + 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); +} + +/** + \brief Get data from a U_PMR_RESTORE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param StackID State (level) to restore from the EMF+ Graphics Stack. Must have been put on the GS with a U_PMR_SAVE. + + 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); +} + +/** + \brief Get data from a U_PMR_SAVE record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param StackID State (level) to save.on the EMF+ Graphics Stack + + 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); +} + +/** + \brief Get data from a U_PMR_SETTSCLIP record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param ctype Set: int16_t coordinates; Clear: U_FLOAT coordinates + \param Elements Number of members in Data. + \param Rects Caller must free. Array of rectangles to draw. Coordinate type set by ctype. + + EMF+ manual 2.3.8.1, Microsoft name: EmfPlusSetTSClip Record, Index 0x3A +*/ +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); + return(1); +} + +/** + \brief Get data from a U_PMR_SETTSGRAPHICS record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param vgatype Set: Palette is VGA basic colors; Clear: Palette is ??? + \param pptype Set: Palette is present; Clear: Palette is absent. + \param AntiAliasMode SmoothingMode enumeration + \param TextRenderHint TextRenderingHint enumeration + \param CompositingMode CompositingMode enumeration + \param CompositingQuality CompositingQuality enumeration + \param RenderOriginX Origin X for halftoning and dithering + \param RenderOriginY Origin Y for halftoning and dithering + \param TextContrast Gamma correction, range 0 to 12 + \param FilterType FilterType enumeraton + \param PixelOffset PixelOffsetMode enumeration + \param WorldToDevice world to device transform + \param Data Palette (optional) + + EMF+ manual 2.3.8.2, Microsoft name: EmfPlusSetTSGraphics Record, Index 0x39 +*/ +int U_PMR_SETTSGRAPHICS_get(const char *contents, U_PMF_CMN_HDR *Header, + int *vgatype, int *pptype, + uint8_t *AntiAliasMode, uint8_t *TextRenderHint, uint8_t *CompositingMode, uint8_t *CompositingQuality, + int16_t *RenderOriginX, int16_t *RenderOriginY, uint16_t *TextContrast, uint8_t *FilterType, + uint8_t *PixelOffset, U_PMF_TRANSFORMMATRIX *WorldToDevice, + const char **Data){ + if(!contents || !vgatype || !pptype || + !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_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); + U_PMF_SERIAL_get(&contents, CompositingQuality, 1, 1, U_XE); + U_PMF_SERIAL_get(&contents, RenderOriginX, 2, 1, U_LE); + U_PMF_SERIAL_get(&contents, RenderOriginY, 2, 1, U_LE); + U_PMF_SERIAL_get(&contents, TextContrast, 2, 1, U_LE); + U_PMF_SERIAL_get(&contents, FilterType, 1, 1, U_XE); + U_PMF_SERIAL_get(&contents, WorldToDevice, 4, 6, U_LE); + U_PMF_PTRSAV_COND(Data, contents, *pptype); + return(1); +} + +/** + \brief Get data from a U_PMR_MULTIPLYWORLDTRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param xmtype Set: Post multiply; Clear: Pre multiply + \param Matrix Transformation matrix + + EMF+ manual 2.3.9.1, Microsoft name: EmfPlusMultiplyWorldTransform Record, Index 0x2C +*/ +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_SERIAL_get(&contents, Matrix, 4, 6, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_RESETWORLDTRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common 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); +} + +/** + \brief Get data from a U_PMR_ROTATEWORLDTRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param xmtype Set: Post multiply; Clear: Pre multiply + \param Angle Rotation angle, in degrees + + EMF+ manual 2.3.9.3, Microsoft name: EmfPlusRotateWorldTransform Record, Index 0x2F +*/ +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_SERIAL_get(&contents, Angle, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_SCALEWORLDTRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param xmtype Set: Post multiply; Clear: Pre multiply. + \param Sx X scale factor. + \param Sy Y scale factor. + + EMF+ manual 2.3.9.4, Microsoft name: EmfPlusScaleWorldTransform Record, Index 0x2E +*/ +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_SERIAL_get(&contents, Sx, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Sy, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_SETPAGETRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param PUenum Page Unit, UnitType enumeration + \param Scale Scale factor to convert page space to device space + + EMF+ manual 2.3.9.5, Microsoft name: EmfPlusSetPageTransform Record, Index 0x30 +*/ +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_SERIAL_get(&contents, Scale, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_SETWORLDTRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param Matrix Transformation matrix + + EMF+ manual 2.3.9.6, Microsoft name: EmfPlusSetWorldTransform Record, Index 0x2A +*/ +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_SERIAL_get(&contents, Matrix, 4, 6, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_TRANSLATEWORLDTRANSFORM record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header + \param xmtype Set: Post multiply; Clear: Pre multiply + \param Dx X offset + \param Dy Y offset + + EMF+ manual 2.3.9.7, Microsoft name: EmfPlusTranslateWorldTransform Record, Index 0x2D +*/ +int U_PMR_TRANSLATEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, + 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_SERIAL_get(&contents, Dx, 4, 1, U_LE); + U_PMF_SERIAL_get(&contents, Dy, 4, 1, U_LE); + return(1); +} + +/** + \brief Get data from a U_PMR_STROKEFILLPATH record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + + EMF+ manual mentioned in 2.1.1.1, not otherwise documented, Microsoft name: EmfPlusStrokeFillPath Record, Index 0x37 + + "This record closes any open figures in a path, strokes the outline of + 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); +} + +/** + \brief Get data from a U_PMR_MULTIFORMATSTART record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + 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); +} + +/** + \brief Get data from a U_PMR_MULTIFORMATSECTION record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + 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); +} + +/** + \brief Get data from a U_PMR_MULTIFORMATEND record + \return 1 on success, 0 on error + \param contents Record from which to extract data + \param Header Common header (ignore flags) + + 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); +} + + +#ifdef __cplusplus +} +#endif diff --git a/src/libuemf/upmf.h b/src/libuemf/upmf.h new file mode 100644 index 000000000..48fc9bf53 --- /dev/null +++ b/src/libuemf/upmf.h @@ -0,0 +1,3177 @@ +/** + @file upmf.h + + @brief Structures, definitions, and function prototypes for EMF+ files. + + EMF+ file Record structure derived from Microsoft's EMF+ Information pdf, releade date July 5,2012, link from + here: + + http://msdn.microsoft.com/en-us/library/cc230724.aspx + + If the direct link fails the document may be found + by searching for: "[MS-EMFPLUS]: Enhanced Metafile Format Plus Extensions " + + EMR records and structures are EMF or common with EMF+ + PMR records and structures are specific to EMF+ + + Using PMF instead of EMF+ because "+" is a problem in symbol names. + + ***************************************************************************************** + * WARNING: Microsoft's EMF+ documentation is little-endian for everything EXCEPT * + * bitfields, which are big-endian. See section 1.3.2 * + * That documentation also uses 0 as the MOST significant bit, N-1 as the least. * + * This code is little-endian throughout, and 0 is the LEAST significant bit * + ***************************************************************************************** + +*/ + +/* +File: upmf.h +Version: 0.0.2 +Date: 04-NOV-2013 +Author: David Mathog, Biology Division, Caltech +email: mathog@caltech.edu +Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +*/ + +#ifndef _UPMF_ +#define _UPMF_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include "uemf.h" + + +/** \defgroup U_PMF_PMF_Misc PMF Miscellaneous defines + @{ +*/ +#define U_PMF_DROP_ELEMENTS 1 //!< Remove leading Elements value from data. +#define U_PMF_KEEP_ELEMENTS 0 //!< Retain leading Elements value from data. + +#define U_SEG_NEW 1 //!< start a new segment in the path +#define U_SEG_OLD 0 //!< continue the old (current) segment in the path + +#define U_FILTER_APPLY 1 //!< With U_PMR_DRAWIMAGEPOINTS_set, use whatever filter has been set up up. +#define U_FILTER_IGNORE 0 //!< With U_PMR_DRAWIMAGEPOINTS_set, ignore whatever filter has been set up up. +#define U_OBJRECLIM 65020 //!< Longest U_PMR_OBJECT that GDI+ will process + // used 9728 to test fragmenting of emitted object records + +/** @} */ + +/** \defgroup U_PMF_DD_ PMF "standard" custom Dash Dot patterns for lines. + + U_DD_DASH, U_DD_DOT, U_DD_DASHDOT, and U_DD_DASHDOTDOT are the only ones with corresponding + standard EMF and EMF+ dash/dot patterns. + + These values are used to tell U_PMF_DASHEDLINEDATA_set2() to create one of 27 custom line patterns. + Other custom line patterns may be created using U_PMF_DASHEDLINEDATA_set(), but this provides an easier + way to get the same result if one of these patterns is acceptable. + + The length is divided by 2X the number of elements, so dashdash has twice as many + dashes of half the length as just dash. + + Dot is 1/8 of (sub)unit length + Dash is 1/2 of (sub)unit length + Long is 3/4 of (sub)unit length + Example: DotDot has (sub)unit length 1/2, so each dot will be 1/16 of unit length. + + @{ +*/ +#define U_DD_Solid 0 //!< Solid line. +#define U_DD_Dash 1 //!< Dash line. +#define U_DD_DashDash 2 //!< Dash Dash line. +#define U_DD_DashDashDash 3 //!< Dash Dash Dash line. +#define U_DD_DashDashDashDash 4 //!< Dash Dash Dash Dash line. +#define U_DD_Dot 5 //!< Dot line. +#define U_DD_DotDot 6 //!< Dot Dot line. +#define U_DD_DotDotDot 7 //!< Dot Dot Dot line. +#define U_DD_DotDotDotDot 8 //!< Dot Dot Dot Dot line. +#define U_DD_DashDot 9 //!< Dash Dot line. +#define U_DD_DashDashDot 10 //!< Dash Dash Dot line. +#define U_DD_DashDashDotDot 11 //!< Dash Dash Dot Dot line. +#define U_DD_DashDashDashDot 12 //!< Dash Dash Das hDot line. +#define U_DD_DashDotDot 13 //!< Dash Dot Dot line. +#define U_DD_DashDotDotDot 14 //!< Dash Dot Dot Dot line. +#define U_DD_DashDotDashDot 15 //!< Dash Dot Dash Dot line. +#define U_DD_Long 16 //!< Long line. +#define U_DD_LongLong 17 //!< Long Long line. +#define U_DD_LongLongLong 18 //!< Long Long Long line. +#define U_DD_LongLongLongLong 19 //!< Long Long Long Long line. +#define U_DD_LongDot 20 //!< Long Dot line. +#define U_DD_LongLongDot 21 //!< Long Long Dot line. +#define U_DD_LongLongDotDot 22 //!< Long Long Dot Dot line. +#define U_DD_LongLongLongDot 23 //!< Long Long Long Dot line. +#define U_DD_LongDotDot 24 //!< Long Dot Dot line. +#define U_DD_LongDotDotDot 25 //!< Long Dot Dot Dot line. +#define U_DD_LongDotLongDot 26 //!< Long Dot Long Dot line. +#define U_DD_Types 27 //!< Types + +/** @} */ + + +/** \defgroup U_PMF_PMR_Qualifiers PMF RecordType Enumeration + EMF+ manual 2.1.1.1, Microsoft name: RecordType Enumeration + @{ +*/ +#define U_PMR_HEADER 0x0001 //!< U_PMRHeader record +#define U_PMR_ENDOFFILE 0x0002 //!< U_PMREndOfFile record +#define U_PMR_COMMENT 0x0003 //!< U_PMRComment record +#define U_PMR_GETDC 0x0004 //!< U_PMRGetDC record +#define U_PMR_MULTIFORMATSTART 0x0005 //!< U_PMRMultiFormatStart record +#define U_PMR_MULTIFORMATSECTION 0x0006 //!< U_PMRMultiFormatSection record +#define U_PMR_MULTIFORMATEND 0x0007 //!< U_PMRMultiFormatEnd record +#define U_PMR_OBJECT 0x0008 //!< U_PMRObject record +#define U_PMR_CLEAR 0x0009 //!< U_PMRClear record +#define U_PMR_FILLRECTS 0x000A //!< U_PMRFillRects record +#define U_PMR_DRAWRECTS 0x000B //!< U_PMRDrawRects record +#define U_PMR_FILLPOLYGON 0x000C //!< U_PMRFillPolygon record +#define U_PMR_DRAWLINES 0x000D //!< U_PMRDrawLines record +#define U_PMR_FILLELLIPSE 0x000E //!< U_PMRFillEllipse record +#define U_PMR_DRAWELLIPSE 0x000F //!< U_PMRDrawEllipse record +#define U_PMR_FILLPIE 0x0010 //!< U_PMRFillPie record +#define U_PMR_DRAWPIE 0x0011 //!< U_PMRDrawPie record +#define U_PMR_DRAWARC 0x0012 //!< U_PMRDrawArc record +#define U_PMR_FILLREGION 0x0013 //!< U_PMRFillRegion record +#define U_PMR_FILLPATH 0x0014 //!< U_PMRFillPath record +#define U_PMR_DRAWPATH 0x0015 //!< U_PMRDrawPath record +#define U_PMR_FILLCLOSEDCURVE 0x0016 //!< U_PMRFillClosedCurve record +#define U_PMR_DRAWCLOSEDCURVE 0x0017 //!< U_PMRDrawClosedCurve record +#define U_PMR_DRAWCURVE 0x0018 //!< U_PMRDrawCurve record +#define U_PMR_DRAWBEZIERS 0x0019 //!< U_PMRDrawBeziers record +#define U_PMR_DRAWIMAGE 0x001A //!< U_PMRDrawImage record +#define U_PMR_DRAWIMAGEPOINTS 0x001B //!< U_PMRDrawImagePoints record +#define U_PMR_DRAWSTRING 0x001C //!< U_PMRDrawString record +#define U_PMR_SETRENDERINGORIGIN 0x001D //!< U_PMRSetRenderingOrigin record +#define U_PMR_SETANTIALIASMODE 0x001E //!< U_PMRSetAntiAliasMode record +#define U_PMR_SETTEXTRENDERINGHINT 0x001F //!< U_PMRSetTextRenderingHint record +#define U_PMR_SETTEXTCONTRAST 0x0020 //!< U_PMRSetTextContrast record +#define U_PMR_SETINTERPOLATIONMODE 0x0021 //!< U_PMRSetInterpolationMode record +#define U_PMR_SETPIXELOFFSETMODE 0x0022 //!< U_PMRSetPixelOffsetMode record +#define U_PMR_SETCOMPOSITINGMODE 0x0023 //!< U_PMRSetCompositingMode record +#define U_PMR_SETCOMPOSITINGQUALITY 0x0024 //!< U_PMRSetCompositingQuality record +#define U_PMR_SAVE 0x0025 //!< U_PMRSave record +#define U_PMR_RESTORE 0x0026 //!< U_PMRRestore record +#define U_PMR_BEGINCONTAINER 0x0027 //!< U_PMRBeginContainer record +#define U_PMR_BEGINCONTAINERNOPARAMS 0x0028 //!< U_PMRBeginContainerNoParams record +#define U_PMR_ENDCONTAINER 0x0029 //!< U_PMREndContainer record +#define U_PMR_SETWORLDTRANSFORM 0x002A //!< U_PMRSetWorldTransform record +#define U_PMR_RESETWORLDTRANSFORM 0x002B //!< U_PMRResetWorldTransform record +#define U_PMR_MULTIPLYWORLDTRANSFORM 0x002C //!< U_PMRMultiplyWorldTransform record +#define U_PMR_TRANSLATEWORLDTRANSFORM 0x002D //!< U_PMRTranslateWorldTransform record +#define U_PMR_SCALEWORLDTRANSFORM 0x002E //!< U_PMRScaleWorldTransform record +#define U_PMR_ROTATEWORLDTRANSFORM 0x002F //!< U_PMRRotateWorldTransform record +#define U_PMR_SETPAGETRANSFORM 0x0030 //!< U_PMRSetPageTransform record +#define U_PMR_RESETCLIP 0x0031 //!< U_PMRResetClip record +#define U_PMR_SETCLIPRECT 0x0032 //!< U_PMRSetClipRect record +#define U_PMR_SETCLIPPATH 0x0033 //!< U_PMRSetClipPath record +#define U_PMR_SETCLIPREGION 0x0034 //!< U_PMRSetClipRegion record +#define U_PMR_OFFSETCLIP 0x0035 //!< U_PMROffsetClip record +#define U_PMR_DRAWDRIVERSTRING 0x0036 //!< U_PMRDrawDriverstring record +#define U_PMR_STROKEFILLPATH 0x0037 //!< U_PMRStrokeFillPath record +#define U_PMR_SERIALIZABLEOBJECT 0x0038 //!< U_PMRSerializableObject record +#define U_PMR_SETTSGRAPHICS 0x0039 //!< U_PMRSetTSGraphics record +#define U_PMR_SETTSCLIP 0x003A //!< U_PMRSetTSClip record +#define U_PMR_RECFLAG 0x4000 //!< In EMF+ files the type is one of the above + this flag +#define U_PMR_TYPE_MASK 0x003F //!< mask for EMF+ types +#define U_PMR_MIN 1 //!< Minimum U_PMR_ value. +#define U_PMR_MAX 58 //!< Maximum U_PMR_ value. + +/** @} */ + +/** \defgroup U_PMF_PID_Values PMF Identifiers for PseudoObjects + These are used by the *_set routines to identify types of PseudoObject. + Note that records are U_PMR_*_OID and other objects are U_PMF_*_OID + The numbers are derived from the EMF+ manual sections, as in 2.2.1.3 become + 02020103. Numbers 40000000 and up are not derived from manual setions. + @{ +*/ +#define U_UNDEFINED_OID 0x00000000 //!< Undefined PseudoObject +#define U_PMF_BRUSH_OID 0x02020101 //!< PMF_BRUSH PseudoObject type. +#define U_PMF_CUSTOMLINECAP_OID 0x02020102 //!< PMF_CUSTOMLINECAP PseudoObject type. +#define U_PMF_FONT_OID 0x02020103 //!< PMF_FONT PseudoObject type. +#define U_PMF_IMAGE_OID 0x02020104 //!< PMF_IMAGE PseudoObject type. +#define U_PMF_IMAGEATTRIBUTES_OID 0x02020105 //!< PMF_IMAGEATTRIBUTES PseudoObject type. +#define U_PMF_PATH_OID 0x02020106 //!< PMF_PATH PseudoObject type. +#define U_PMF_PEN_OID 0x02020107 //!< PMF_PEN PseudoObject type. +#define U_PMF_REGION_OID 0x02020108 //!< PMF_REGION PseudoObject type. +#define U_PMF_STRINGFORMAT_OID 0x02020109 //!< PMF_STRINGFORMAT PseudoObject type. +#define U_PMF_ARGB_OID 0x02020201 //!< PMF_ARGB PseudoObject type. +#define U_PMF_BITMAP_OID 0x02020202 //!< PMF_BITMAP PseudoObject type. +#define U_PMF_BITMAPDATA_OID 0x02020203 //!< PMF_BITMAPDATA PseudoObject type. +#define U_PMF_BLENDCOLORS_OID 0x02020204 //!< PMF_BLENDCOLORS PseudoObject type. +#define U_PMF_BLENDFACTORS_OID 0x02020205 //!< PMF_BLENDFACTORS PseudoObject type. +#define U_PMF_BOUNDARYPATHDATA_OID 0x02020206 //!< PMF_BOUNDARYPATHDATA PseudoObject type. +#define U_PMF_BOUNDARYPOINTDATA_OID 0x02020207 //!< PMF_BOUNDARYPOINTDATA PseudoObject type. +#define U_PMF_CHARACTERRANGE_OID 0x02020208 //!< PMF_CHARACTERRANGE PseudoObject type. +#define U_PMF_COMPOUNDLINEDATA_OID 0x02020209 //!< PMF_COMPOUNDLINEDATA PseudoObject type. +#define U_PMF_COMPRESSEDIMAGE_OID 0x02020210 //!< PMF_COMPRESSEDIMAGE PseudoObject type. +#define U_PMF_CUSTOMENDCAPDATA_OID 0x02020211 //!< PMF_CUSTOMENDCAPDATA PseudoObject type. +#define U_PMF_CUSTOMLINECAPARROWDATA_OID 0x02020212 //!< PMF_CUSTOMLINECAPARROWDATA PseudoObject type. +#define U_PMF_CUSTOMLINECAPDATA_OID 0x02020213 //!< PMF_CUSTOMLINECAPDATA PseudoObject type. +#define U_PMF_CUSTOMLINECAPOPTIONALDATA_OID 0x02020214 //!< PMF_CUSTOMLINECAPOPTIONALDATA PseudoObject type. +#define U_PMF_CUSTOMSTARTCAPDATA_OID 0x02020215 //!< PMF_CUSTOMSTARTCAPDATA PseudoObject type. +#define U_PMF_DASHEDLINEDATA_OID 0x02020216 //!< PMF_DASHEDLINEDATA PseudoObject type. +#define U_PMF_FILLPATHOBJ_OID 0x02020217 //!< PMF_FILLPATHOBJ PseudoObject type. +#define U_PMF_FOCUSSCALEDATA_OID 0x02020218 //!< PMF_FOCUSSCALEDATA PseudoObject type. +#define U_PMF_GRAPHICSVERSION_OID 0x02020219 //!< PMF_GRAPHICSVERSION PseudoObject type. +#define U_PMF_HATCHBRUSHDATA_OID 0x02020220 //!< PMF_HATCHBRUSHDATA PseudoObject type. +#define U_PMF_INTEGER7_OID 0x02020221 //!< PMF_INTEGER7 PseudoObject type. +#define U_PMF_INTEGER15_OID 0x02020222 //!< PMF_INTEGER15 PseudoObject type. +#define U_PMF_LANGUAGEIDENTIFIER_OID 0x02020223 //!< PMF_LANGUAGEIDENTIFIER PseudoObject type. +#define U_PMF_LINEARGRADIENTBRUSHDATA_OID 0x02020224 //!< PMF_LINEARGRADIENTBRUSHDATA PseudoObject type. +#define U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_OID 0x02020225 //!< PMF_LINEARGRADIENTBRUSHOPTIONALDATA PseudoObject type. +#define U_PMF_LINEPATH_OID 0x02020226 //!< PMF_LINEPATH PseudoObject type. +#define U_PMF_METAFILE_OID 0x02020227 //!< PMF_METAFILE PseudoObject type. +#define U_PMF_PALETTE_OID 0x02020228 //!< PMF_PALETTE PseudoObject type. +#define U_PMF_PATHGRADIENTBRUSHDATA_OID 0x02020229 //!< PMF_PATHGRADIENTBRUSHDATA PseudoObject type. +#define U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_OID 0x02020230 //!< PMF_PATHGRADIENTBRUSHOPTIONALDATA PseudoObject type. +#define U_PMF_PATHPOINTTYPE_OID 0x02020231 //!< PMF_PATHPOINTTYPE PseudoObject type. +#define U_PMF_PATHPOINTTYPERLE_OID 0x02020232 //!< PMF_PATHPOINTTYPERLE PseudoObject type. +#define U_PMF_PENDATA_OID 0x02020233 //!< PMF_PENDATA PseudoObject type. +#define U_PMF_PENOPTIONALDATA_OID 0x02020234 //!< PMF_PENOPTIONALDATA PseudoObject type. +#define U_PMF_POINT_OID 0x02020235 //!< PMF_POINT PseudoObject type. +#define U_PMF_POINTF_OID 0x02020236 //!< PMF_POINTF PseudoObject type. +#define U_PMF_POINTR_OID 0x02020237 //!< PMF_POINTR PseudoObject type. +#define U_PMF_RECT_OID 0x02020238 //!< PMF_RECT PseudoObject type. +#define U_PMF_RECTF_OID 0x02020239 //!< PMF_RECTF PseudoObject type. +#define U_PMF_REGIONNODE_OID 0x02020240 //!< PMF_REGIONNODE PseudoObject type. +#define U_PMF_REGIONNODECHILDNODES_OID 0x02020241 //!< PMF_REGIONNODECHILDNODES PseudoObject type. +#define U_PMF_REGIONNODEPATH_OID 0x02020242 //!< PMF_REGIONNODEPATH PseudoObject type. +#define U_PMF_SOLIDBRUSHDATA_OID 0x02020243 //!< PMF_SOLIDBRUSHDATA PseudoObject type. +#define U_PMF_STRINGFORMATDATA_OID 0x02020244 //!< PMF_STRINGFORMATDATA PseudoObject type. +#define U_PMF_TEXTUREBRUSHDATA_OID 0x02020245 //!< PMF_TEXTUREBRUSHDATA PseudoObject type. +#define U_PMF_TEXTUREBRUSHOPTIONALDATA_OID 0x02020246 //!< PMF_TEXTUREBRUSHOPTIONALDATA PseudoObject type. +#define U_PMF_TRANSFORMMATRIX_OID 0x02020247 //!< PMF_TRANSFORMMATRIX PseudoObject type. +#define U_PMF_IE_BLUR_OID 0x02020301 //!< PMF_IE_BLUR PseudoObject type. +#define U_PMF_IE_BRIGHTNESSCONTRAST_OID 0x02020302 //!< PMF_IE_BRIGHTNESSCONTRAST PseudoObject type. +#define U_PMF_IE_COLORBALANCE_OID 0x02020303 //!< PMF_IE_COLORBALANCE PseudoObject type. +#define U_PMF_IE_COLORCURVE_OID 0x02020304 //!< PMF_IE_COLORCURVE PseudoObject type. +#define U_PMF_IE_COLORLOOKUPTABLE_OID 0x02020305 //!< PMF_IE_COLORLOOKUPTABLE PseudoObject type. +#define U_PMF_IE_COLORMATRIX_OID 0x02020306 //!< PMF_IE_COLORMATRIX PseudoObject type. +#define U_PMF_IE_HUESATURATIONLIGHTNESS_OID 0x02020307 //!< PMF_IE_HUESATURATIONLIGHTNESS PseudoObject type. +#define U_PMF_IE_LEVELS_OID 0x02020308 //!< PMF_IE_LEVELS PseudoObject type. +#define U_PMF_IE_REDEYECORRECTION_OID 0x02020309 //!< PMF_IE_REDEYECORRECTION PseudoObject type. +#define U_PMF_IE_SHARPEN_OID 0x02020310 //!< PMF_IE_SHARPEN PseudoObject type. +#define U_PMF_IE_TINT_OID 0x02020311 //!< PMF_IE_TINT PseudoObject type. +#define U_PMR_STROKEFILLPATH_OID 0x02010101 //!< PMR_STROKEFILLPATH PseudoObject type. (Mentioned in passing here). +#define U_PMR_OFFSETCLIP_OID 0x02030101 //!< PMR_OFFSETCLIP PseudoObject type. +#define U_PMR_RESETCLIP_OID 0x02030102 //!< PMR_RESETCLIP PseudoObject type. +#define U_PMR_SETCLIPPATH_OID 0x02030103 //!< PMR_SETCLIPPATH PseudoObject type. +#define U_PMR_SETCLIPRECT_OID 0x02030104 //!< PMR_SETCLIPRECT PseudoObject type. +#define U_PMR_SETCLIPREGION_OID 0x02030105 //!< PMR_SETCLIPREGION PseudoObject type. +#define U_PMR_COMMENT_OID 0x02030201 //!< PMR_COMMENT PseudoObject type. +#define U_PMR_ENDOFFILE_OID 0x02030301 //!< PMR_ENDOFFILE PseudoObject type. +#define U_PMR_GETDC_OID 0x02030302 //!< PMR_GETDC PseudoObject type. +#define U_PMR_HEADER_OID 0x02030303 //!< PMR_HEADER PseudoObject type. +#define U_PMR_CLEAR_OID 0x02030401 //!< PMR_CLEAR PseudoObject type. +#define U_PMR_DRAWARC_OID 0x02030402 //!< PMR_DRAWARC PseudoObject type. +#define U_PMR_DRAWBEZIERS_OID 0x02030403 //!< PMR_DRAWBEZIERS PseudoObject type. +#define U_PMR_DRAWCLOSEDCURVE_OID 0x02030404 //!< PMR_DRAWCLOSEDCURVE PseudoObject type. +#define U_PMR_DRAWCURVE_OID 0x02030405 //!< PMR_DRAWCURVE PseudoObject type. +#define U_PMR_DRAWDRIVERSTRING_OID 0x02030406 //!< PMR_DRAWDRIVERSTRING PseudoObject type. +#define U_PMR_DRAWELLIPSE_OID 0x02030407 //!< PMR_DRAWELLIPSE PseudoObject type. +#define U_PMR_DRAWIMAGE_OID 0x02030408 //!< PMR_DRAWIMAGE PseudoObject type. +#define U_PMR_DRAWIMAGEPOINTS_OID 0x02030409 //!< PMR_DRAWIMAGEPOINTS PseudoObject type. +#define U_PMR_DRAWLINES_OID 0x02030410 //!< PMR_DRAWLINES PseudoObject type. +#define U_PMR_DRAWPATH_OID 0x02030411 //!< PMR_DRAWPATH PseudoObject type. +#define U_PMR_DRAWPIE_OID 0x02030412 //!< PMR_DRAWPIE PseudoObject type. +#define U_PMR_DRAWRECTS_OID 0x02030413 //!< PMR_DRAWRECTS PseudoObject type. +#define U_PMR_DRAWSTRING_OID 0x02030414 //!< PMR_DRAWSTRING PseudoObject type. +#define U_PMR_FILLCLOSEDCURVE_OID 0x02030415 //!< PMR_FILLCLOSEDCURVE PseudoObject type. +#define U_PMR_FILLELLIPSE_OID 0x02030416 //!< PMR_FILLELLIPSE PseudoObject type. +#define U_PMR_FILLPATH_OID 0x02030417 //!< PMR_FILLPATH PseudoObject type. +#define U_PMR_FILLPIE_OID 0x02030418 //!< PMR_FILLPIE PseudoObject type. +#define U_PMR_FILLPOLYGON_OID 0x02030419 //!< PMR_FILLPOLYGON PseudoObject type. +#define U_PMR_FILLRECTS_OID 0x02030420 //!< PMR_FILLRECTS PseudoObject type. +#define U_PMR_FILLREGION_OID 0x02030421 //!< PMR_FILLREGION PseudoObject type. +#define U_PMR_OBJECT_OID 0x02030501 //!< PMR_OBJECT PseudoObject type. +#define U_PMR_SERIALIZABLEOBJECT_OID 0x02030502 //!< PMR_SERIALIZABLEOBJECT PseudoObject type. +#define U_PMR_SETANTIALIASMODE_OID 0x02030601 //!< PMR_SETANTIALIASMODE PseudoObject type. +#define U_PMR_SETCOMPOSITINGMODE_OID 0x02030602 //!< PMR_SETCOMPOSITINGMODE PseudoObject type. +#define U_PMR_SETCOMPOSITINGQUALITY_OID 0x02030603 //!< PMR_SETCOMPOSITINGQUALITY PseudoObject type. +#define U_PMR_SETINTERPOLATIONMODE_OID 0x02030604 //!< PMR_SETINTERPOLATIONMODE PseudoObject type. +#define U_PMR_SETPIXELOFFSETMODE_OID 0x02030605 //!< PMR_SETPIXELOFFSETMODE PseudoObject type. +#define U_PMR_SETRENDERINGORIGIN_OID 0x02030606 //!< PMR_SETRENDERINGORIGIN PseudoObject type. +#define U_PMR_SETTEXTCONTRAST_OID 0x02030607 //!< PMR_SETTEXTCONTRAST PseudoObject type. +#define U_PMR_SETTEXTRENDERINGHINT_OID 0x02030608 //!< PMR_SETTEXTRENDERINGHINT PseudoObject type. +#define U_PMR_BEGINCONTAINER_OID 0x02030701 //!< PMR_BEGINCONTAINER PseudoObject type. +#define U_PMR_BEGINCONTAINERNOPARAMS_OID 0x02030702 //!< PMR_BEGINCONTAINERNOPARAMS PseudoObject type. +#define U_PMR_ENDCONTAINER_OID 0x02030703 //!< PMR_ENDCONTAINER PseudoObject type. +#define U_PMR_RESTORE_OID 0x02030704 //!< PMR_RESTORE PseudoObject type. +#define U_PMR_SAVE_OID 0x02030705 //!< PMR_SAVE PseudoObject type. +#define U_PMR_SETTSCLIP_OID 0x02030801 //!< PMR_SETTSCLIP PseudoObject type. +#define U_PMR_SETTSGRAPHICS_OID 0x02030802 //!< PMR_SETTSGRAPHICS PseudoObject type. +#define U_PMR_MULTIPLYWORLDTRANSFORM_OID 0x02030901 //!< PMR_MULTIPLYWORLDTRANSFORM PseudoObject type. +#define U_PMR_RESETWORLDTRANSFORM_OID 0x02030902 //!< PMR_RESETWORLDTRANSFORM PseudoObject type. +#define U_PMR_ROTATEWORLDTRANSFORM_OID 0x02030903 //!< PMR_ROTATEWORLDTRANSFORM PseudoObject type. +#define U_PMR_SCALEWORLDTRANSFORM_OID 0x02030904 //!< PMR_SCALEWORLDTRANSFORM PseudoObject type. +#define U_PMR_SETPAGETRANSFORM_OID 0x02030905 //!< PMR_SETPAGETRANSFORM PseudoObject type. +#define U_PMR_SETWORLDTRANSFORM_OID 0x02030906 //!< PMR_SETWORLDTRANSFORM PseudoObject type. +#define U_PMR_TRANSLATEWORLDTRANSFORM_OID 0x02030907 //!< PMR_TRANSLATEWORLDTRANSFORM PseudoObject type. +#define U_PMR_TRANSLATEWORLDTRANSFORM_OID 0x02030907 //!< PMR_TRANSLATEWORLDTRANSFORM PseudoObject type. +#define U_PMR_CMN_HDR_OID 0x40000000 //!< PMR_CMN_HDR PseudoObject type. +#define U_PMF_4NUM_OID 0x40000001 //!< PMF_4NUM PseudoObject type. PseudoObject contains a 4 unsigned int in EMF+ file byte order, used in some contexts to indicate an object index number.. +#define U_PMF_RAW_OID 0x40000002 //!< PMF_RAW PseudoObject type. Raw data: no preceding elements, data has native endianness. +#define U_PMF_ARRAY_OID 0x80000000 //!< PMF_ARRAY PseudoObject type modifier. PseudoObject contains an array of the data type revealed when this bit is cleared. +#define U_PMF_MASK_OID 0x7FFFFFFF //!< PMF_MASK. Select PseudoObject data type without regard to PMF_ARRAY. + +/** @} */ + + +/** \defgroup U_PMF_BDT_ PMF BitmapDataType Enumeration + For + EMF+ manual 2.1.1.2, Microsoft name: BitmapDataType Enumeration (U_BDT_*) + @{ +*/ +#define U_BDT_Pixel 0x00 //!< Data is a bitmap. +#define U_BDT_Compressed 0x01 //!< Data is a compressed bitmap (like a PNG). +/** @} */ + +/** \defgroup U_PMF_BT_ PMF BrushType Enumeration + For + EMF+ manual 2.1.1.3, Microsoft name: BrushType Enumeration (U_BT_*) + @{ +*/ +#define U_BT_SolidColor 0x00 //!< Solid Color brush. +#define U_BT_HatchFill 0x01 //!< Hatch Fill brush. +#define U_BT_TextureFill 0x02 //!< Texture Fill brush. +#define U_BT_PathGradient 0x03 //!< Path Gradient brush. +#define U_BT_LinearGradient 0x04 //!< Linear Gradient brush. +/** @} */ + +/** \defgroup U_PMF_CM_ PMF CombineMode Enumeration + For + EMF+ manual 2.1.1.4, Microsoft name: CombineMode Enumeration (U_CM_*) + @{ +*/ +#define U_CM_Replace 0x00 //!< Region becomes new region. +#define U_CM_Intersect 0x01 //!< Region becomes intersection of existing region and new region. +#define U_CM_Union 0x02 //!< Region becomes union of existing and new regions. +#define U_CM_XOR 0x03 //!< Region becomes XOR of existing and new regions. +#define U_CM_Exclude 0x04 //!< Region becomes part of existing region not in new region. +#define U_CM_Complement 0x05 //!< Region becomes part of new region not in existing region. +/** @} */ + +/** \defgroup U_PMF_CMS_ PMF CompositingMode Enumeration + For + EMF+ manual 2.1.1.5, Microsoft name: CompositingMode Enumeration (U_CMS_* [S==Source]) + @{ +*/ +#define U_CMS_Over 0x00 //!< Source is alpha blends with destination. +#define U_CMS_Copy 0x01 //!< Source over writes destination. +/** @} */ + +/** \defgroup U_PMF_CQ_ PMF CompositingQuality Enumeration + For + EMF+ manual 2.1.1.6, Microsoft name: CompositingQuality Enumeration (U_CQ_*) + @{ +*/ +#define U_CQ_Default 0x01 //!< Default compositing quality +#define U_CQ_HighSpeed 0x02 //!< High Speed compositing quality +#define U_CQ_HighQuality 0x03 //!< High Quality compositing quality +#define U_CQ_GammaCorrected 0x04 //!< Gamma Corrected compositing quality +#define U_CQ_AssumeLinear 0x05 //!< Assume Linear compositing quality +/** @} */ + +/** \defgroup U_PMF_CA_ PMF CurveAdjustments Enumeration + For + EMF+ manual 2.1.1.7, Microsoft name: CurveAdjustments Enumeration (U_CA_*) + @{ +*/ +#define U_CA_Exposure 0x00 //!< Exposure color curve adjustment +#define U_CA_Density 0x01 //!< Density color curve adjustment +#define U_CA_Contrast 0x02 //!< Contrast color curve adjustment +#define U_CA_Highlight 0x03 //!< Highlight color curve adjustment +#define U_CA_Shadow 0x04 //!< Shadow color curve adjustment +#define U_CA_Midtone 0x05 //!< Midtone color curve adjustment +#define U_CA_WhiteSaturation 0x06 //!< White Saturation color curve adjustment +#define U_CA_BlackSaturation 0x07 //!< Black Saturation color curve adjustment +/** @} */ + +/** \defgroup U_PMF_CC_ PMF CurveChannel Enumeration + For + EMF+ manual 2.1.1.8, Microsoft name: CurveChannel Enumeration (U_CC_*) + @{ +*/ +#define U_CC_All 0x00 //!< All color channels +#define U_CC_Red 0x01 //!< Red color channel +#define U_CC_Green 0x02 //!< Green color channel +#define U_CC_Blue 0x03 //!< Blue color channel +/** @} */ + +/** \defgroup U_PMF_CLCDT_ PMF CustomLineCapDataType Enumeration + For + EMF+ manual 2.1.1.9, Microsoft name: CustomLineCapDataType Enumeration (U_CLCDT_*) + @{ +*/ +#define U_CLCDT_Default 0x00 //!< Default custom line cap +#define U_CLCDT_AdjustableArrow 0x01 //!< Adjustable Arrow custom line cap +/** @} */ + +/** \defgroup U_PMF_DLCT_ PMF DashedLineCapType Enumeration + For + EMF+ manual 2.1.1.10, Microsoft name: DashedLineCapType Enumeration (U_DLCT_*) + @{ +*/ +#define U_DLCT_Flat 0x00 //!< Flat dashed line cap +#define U_DLCT_Round 0x02 //!< Round dashed line cap +#define U_DLCT_Triangle 0x03 //!< Triangle dashed line cap +/** @} */ + +/** \defgroup U_PMF_FT_ PMF FilterType Enumeration + For + EMF+ manual 2.1.1.11, Microsoft name: FilterType Enumeration (U_FT_*) + @{ +*/ +#define U_FT_None 0x00 //!< No filtering +#define U_FT_Point 0x01 //!< Point filtering +#define U_FT_Linear 0x02 //!< Linear filtering +#define U_FT_Triangle 0x03 //!< Triangle filtering +#define U_FT_Box 0x04 //!< Box filtering +#define U_FT_PyramidalQuad 0x06 //!< Pyramidal Quad filtering +#define U_FT_GaussianQuad 0x07 //!< Gaussian Quad filtering +/** @} */ + +/** \defgroup U_PMF_GV_ PMF GraphicsVersion Enumeration + For + EMF+ manual 2.1.1.12, Microsoft name: GraphicsVersion Enumeration (U_GV_*) + @{ +*/ +#define U_GV_1 0x01 //!< 1 graphics version +#define U_GV_1_1 0x02 //!< 1.1 graphics version +/** @} */ + +/** \defgroup U_PMF_HSP_ PMF HatchStyle Enumeration + For + EMF+ manual 2.1.1.13, Microsoft name: HatchStyle Enumeration (U_HSP_* [U_HS_ already used for EMF]) + @{ +*/ +#define U_HSP_Horizontal 0x00000000 //!< Horizontal +#define U_HSP_Vertical 0x00000001 //!< Vertical +#define U_HSP_ForwardDiagonal 0x00000002 //!< Forward Diagonal +#define U_HSP_BackwardDiagonal 0x00000003 //!< Backward Diagonal +#define U_HSP_LargeGrid 0x00000004 //!< Large Grid +#define U_HSP_DiagonalCross 0x00000005 //!< Diagonal Cross +#define U_HSP_05Percent 0x00000006 //!< 05 Percent +#define U_HSP_10Percent 0x00000007 //!< 10 Percent +#define U_HSP_20Percent 0x00000008 //!< 20 Percent +#define U_HSP_25Percent 0x00000009 //!< 25 Percent +#define U_HSP_30Percent 0x0000000A //!< 30 Percent +#define U_HSP_40Percent 0x0000000B //!< 40 Percent +#define U_HSP_50Percent 0x0000000C //!< 50 Percent +#define U_HSP_60Percent 0x0000000D //!< 60 Percent +#define U_HSP_70Percent 0x0000000E //!< 70 Percent +#define U_HSP_75Percent 0x0000000F //!< 75 Percent +#define U_HSP_80Percent 0x00000010 //!< 80 Percent +#define U_HSP_90Percent 0x00000011 //!< 90 Percent +#define U_HSP_LightDownwardDiagonal 0x00000012 //!< Light Downward Diagonal +#define U_HSP_LightUpwardDiagonal 0x00000013 //!< Light Upward Diagonal +#define U_HSP_DarkDownwardDiagonal 0x00000014 //!< Dark Downward Diagonal +#define U_HSP_DarkUpwardDiagonal 0x00000015 //!< Dark Upward Diagonal +#define U_HSP_WideDownwardDiagonal 0x00000016 //!< Wide Downward Diagonal +#define U_HSP_WideUpwardDiagonal 0x00000017 //!< Wide Upward Diagonal +#define U_HSP_LightVertical 0x00000018 //!< Light Vertical +#define U_HSP_LightHorizontal 0x00000019 //!< Light Horizontal +#define U_HSP_NarrowVertical 0x0000001A //!< Narrow Vertical +#define U_HSP_NarrowHorizontal 0x0000001B //!< Narrow Horizontal +#define U_HSP_DarkVertical 0x0000001C //!< Dark Vertical +#define U_HSP_DarkHorizontal 0x0000001D //!< Dark Horizontal +#define U_HSP_DashedDownwardDiagonal 0x0000001E //!< Dashed Downward Diagonal +#define U_HSP_DashedUpwardDiagonal 0x0000001F //!< Dashed Upward Diagonal +#define U_HSP_DashedHorizontal 0x00000020 //!< Dashed Horizontal +#define U_HSP_DashedVertical 0x00000021 //!< Dashed Vertical +#define U_HSP_SmallConfetti 0x00000022 //!< Small Confetti +#define U_HSP_LargeConfetti 0x00000023 //!< LargeC onfetti +#define U_HSP_ZigZag 0x00000024 //!< Zig Zag +#define U_HSP_Wave 0x00000025 //!< Wave +#define U_HSP_DiagonalBrick 0x00000026 //!< Diagonal Brick +#define U_HSP_HorizontalBrick 0x00000027 //!< Horizontal Brick +#define U_HSP_Weave 0x00000028 //!< Weave +#define U_HSP_Plaid 0x00000029 //!< Plaid +#define U_HSP_Divot 0x0000002A //!< Divot +#define U_HSP_DottedGrid 0x0000002B //!< DottedGrid +#define U_HSP_DottedDiamond 0x0000002C //!< DottedDiamond +#define U_HSP_Shingle 0x0000002D //!< Shingle +#define U_HSP_Trellis 0x0000002E //!< Trellis +#define U_HSP_Sphere 0x0000002F //!< Sphere +#define U_HSP_SmallGrid 0x00000030 //!< Small Grid +#define U_HSP_SmallCheckerBoard 0x00000031 //!< Small Checker Board +#define U_HSP_LargeCheckerBoard 0x00000032 //!< Large Checker Board +#define U_HSP_OutlinedDiamond 0x00000033 //!< Outlined Diamond +#define U_HSP_SolidDiamond 0x00000034 //!< Solid Diamond +/** @} */ + +/** \defgroup U_PMF_HKP_ PMF HotkeyPrefix Enumeration + For + EMF+ manual 2.1.1.14, Microsoft name: HotkeyPrefix Enumeration (U_HKP_*) + @{ +*/ +#define U_HKP_None 0x00 //!< No hot key prefix +#define U_HKP_Show 0x01 //!< Show hot key prefix +#define U_HKP_Hide 0x02 //!< Hide hot key prefix +/** @} */ + +/** \defgroup U_PMF_IDT_ PMF ImageDataType Enumeration + For + EMF+ manual 2.1.1.15, Microsoft name: ImageDataType Enumeration (U_IDT_*) + @{ +*/ +#define U_IDT_Unknown 0x00 //!< Unknown image data type +#define U_IDT_Bitmap 0x01 //!< Bitmap image data type +#define U_IDT_Metafile 0x02 //!< Metafile image data type +/** @} */ + +/** \defgroup U_PMF_IM_ PMF InterpolationMode Enumeration + For + EMF+ manual 2.1.1.16, Microsoft name: InterpolationMode Enumeration (U_IM_*) + @{ +*/ +#define U_IM_Default 0x00 //!< Default interpolation mode +#define U_IM_LowQuality 0x01 //!< Low Quality interpolation mode +#define U_IM_HighQuality 0x02 //!< High Quality interpolation mode +#define U_IM_Bilinear 0x03 //!< Bilinear interpolation mode +#define U_IM_Bicubic 0x04 //!< Bicubic interpolation mode +#define U_IM_NearestNeighbor 0x05 //!< Nearest Neighbor interpolation mode +#define U_IM_HighQualityBilinear 0x06 //!< High Quality Bilinear interpolation mode +#define U_IM_HighQualityBicubic 0x07 //!< High Quality Bicubic interpolation mode +/** @} */ + +/** \defgroup U_PMF_LID_ PMF LanguageIdentifier Enumeration + For + EMF+ manual 2.1.1.17, Microsoft name: LanguageIdentifier Enumeration (U_LID_*) + @{ +*/ +#define U_LID_LANG_NEUTRAL 0x0000 //!< LANG_NEUTRAL +#define U_LID_zh_CHS 0x0004 //!< zh_CHS +#define U_LID_LANG_INVARIANT 0x007F //!< LANG_INVARIANT +#define U_LID_LANG_NEUTRAL_USER_DEFAULT 0x0400 //!< LANG_NEUTRAL_USER_DEFAULT +#define U_LID_ar_SA 0x0401 //!< ar_SA +#define U_LID_bg_BG 0x0402 //!< bg_BG +#define U_LID_ca_ES 0x0403 //!< ca_ES +#define U_LID_zh_CHT 0x0404 //!< zh_CHT +#define U_LID_cs_CZ 0x0405 //!< cs_CZ +#define U_LID_da_DK 0x0406 //!< da_DK +#define U_LID_de_DE 0x0407 //!< de_DE +#define U_LID_el_GR 0x0408 //!< el_GR +#define U_LID_en_US 0x0409 //!< en_US +#define U_LID_es_Tradnl_ES 0x040A //!< es_Tradnl_ES +#define U_LID_fi_FI 0x040B //!< fi_FI +#define U_LID_fr_FR 0x040C //!< fr_FR +#define U_LID_he_IL 0x040D //!< he_IL +#define U_LID_hu_HU 0x040E //!< hu_HU +#define U_LID_is_IS 0x040F //!< is_IS +#define U_LID_it_IT 0x0410 //!< it_IT +#define U_LID_ja_JA 0x0411 //!< ja_JA +#define U_LID_ko_KR 0x0412 //!< ko_KR +#define U_LID_nl_NL 0x0413 //!< nl_NL +#define U_LID_nb_NO 0x0414 //!< nb_NO +#define U_LID_pl_PL 0x0415 //!< pl_PL +#define U_LID_pt_BR 0x0416 //!< pt_BR +#define U_LID_rm_CH 0x0417 //!< rm_CH +#define U_LID_ro_RO 0x0418 //!< ro_RO +#define U_LID_ru_RU 0x0419 //!< ru_RU +#define U_LID_hr_HR 0x041A //!< hr_HR +#define U_LID_sk_SK 0x041B //!< sk_SK +#define U_LID_sq_AL 0x041C //!< sq_AL +#define U_LID_sv_SE 0x041D //!< sv_SE +#define U_LID_th_TH 0x041E //!< th_TH +#define U_LID_tr_TR 0x041F //!< tr_TR +#define U_LID_ur_PK 0x0420 //!< ur_PK +#define U_LID_id_ID 0x0421 //!< id_ID +#define U_LID_uk_UA 0x0422 //!< uk_UA +#define U_LID_be_BY 0x0423 //!< be_BY +#define U_LID_sl_SI 0x0424 //!< sl_SI +#define U_LID_et_EE 0x0425 //!< et_EE +#define U_LID_lv_LV 0x0426 //!< lv_LV +#define U_LID_lt_LT 0x0427 //!< lt_LT +#define U_LID_tg_TJ 0x0428 //!< tg_TJ +#define U_LID_fa_IR 0x0429 //!< fa_IR +#define U_LID_vi_VN 0x042A //!< vi_VN +#define U_LID_hy_AM 0x042B //!< hy_AM +#define U_LID_az_Latn_AZ 0x042C //!< az_Latn_AZ +#define U_LID_eu_ES 0x042D //!< eu_ES +#define U_LID_wen_DE 0x042E //!< wen_DE +#define U_LID_mk_MK 0x042F //!< mk_MK +#define U_LID_st_ZA 0x0430 //!< st_ZA +#define U_LID_tn_ZA 0x0432 //!< tn_ZA +#define U_LID_xh_ZA 0x0434 //!< xh_ZA +#define U_LID_zu_ZA 0x0435 //!< zu_ZA +#define U_LID_af_ZA 0x0436 //!< af_ZA +#define U_LID_ka_GE 0x0437 //!< ka_GE +#define U_LID_fa_FA 0x0438 //!< fa_FA +#define U_LID_hi_IN 0x0439 //!< hi_IN +#define U_LID_mt_MT 0x043A //!< mt_MT +#define U_LID_se_NO 0x043B //!< se_NO +#define U_LID_ga_GB 0x043C //!< ga_GB +#define U_LID_ms_MY 0x043E //!< ms_MY +#define U_LID_kk_KZ 0x043F //!< kk_KZ +#define U_LID_ky_KG 0x0440 //!< ky_KG +#define U_LID_sw_KE 0x0441 //!< sw_KE +#define U_LID_tk_TM 0x0442 //!< tk_TM +#define U_LID_uz_Latn_UZ 0x0443 //!< uz_Latn_UZ +#define U_LID_tt_Ru 0x0444 //!< tt_Ru +#define U_LID_bn_IN 0x0445 //!< bn_IN +#define U_LID_pa_IN 0x0446 //!< pa_IN +#define U_LID_gu_IN 0x0447 //!< gu_IN +#define U_LID_or_IN 0x0448 //!< or_IN +#define U_LID_ta_IN 0x0449 //!< ta_IN +#define U_LID_te_IN 0x044A //!< te_IN +#define U_LID_kn_IN 0x044B //!< kn_IN +#define U_LID_ml_IN 0x044C //!< ml_IN +#define U_LID_as_IN 0x044D //!< as_IN +#define U_LID_mr_IN 0x044E //!< mr_IN +#define U_LID_sa_IN 0x044F //!< sa_IN +#define U_LID_mn_MN 0x0450 //!< mn_MN +#define U_LID_bo_CN 0x0451 //!< bo_CN +#define U_LID_cy_GB 0x0452 //!< cy_GB +#define U_LID_km_KH 0x0453 //!< km_KH +#define U_LID_lo_LA 0x0454 //!< lo_LA +#define U_LID_gl_ES 0x0456 //!< gl_ES +#define U_LID_kok_IN 0x0457 //!< kok_IN +#define U_LID_sd_IN 0x0459 //!< sd_IN +#define U_LID_syr_SY 0x045A //!< syr_SY +#define U_LID_si_LK 0x045B //!< si_LK +#define U_LID_iu_Cans_CA 0x045D //!< iu_Cans_CA +#define U_LID_am_ET 0x045E //!< am_ET +#define U_LID_ne_NP 0x0461 //!< ne_NP +#define U_LID_fy_NL 0x0462 //!< fy_NL +#define U_LID_ps_AF 0x0463 //!< ps_AF +#define U_LID_fil_PH 0x0464 //!< fil_PH +#define U_LID_div_MV 0x0465 //!< div_MV +#define U_LID_ha_Latn_NG 0x0468 //!< ha_Latn_NG +#define U_LID_yo_NG 0x046A //!< yo_NG +#define U_LID_quz_BO 0x046B //!< quz_BO +#define U_LID_nzo_ZA 0x046C //!< nzo_ZA +#define U_LID_ba_RU 0x046D //!< ba_RU +#define U_LID_lb_LU 0x046E //!< lb_LU +#define U_LID_kl_GL 0x046F //!< kl_GL +#define U_LID_ig_NG 0x0470 //!< ig_NG +#define U_LID_so_SO 0x0477 //!< so_SO +#define U_LID_ii_CN 0x0478 //!< ii_CN +#define U_LID_arn_CL 0x047A //!< arn_CL +#define U_LID_moh_CA 0x047C //!< moh_CA +#define U_LID_br_FR 0x047E //!< br_FR +#define U_LID_ug_CN 0x0480 //!< ug_CN +#define U_LID_ mi_NZ 0x0481 //!< mi_NZ +#define U_LID_oc_FR 0x0482 //!< oc_FR +#define U_LID_co_FR 0x0483 //!< co_FR +#define U_LID_gsw_FR 0x0484 //!< gsw_FR +#define U_LID_sah_RU 0x0485 //!< sah_RU +#define U_LID_qut_GT 0x0486 //!< qut_GT +#define U_LID_rw_RW 0x0487 //!< rw_RW +#define U_LID_wo_SN 0x0488 //!< wo_SN +#define U_LID_gbz_AF 0x048C //!< gbz_AF +#define U_LID_LANG_NEUTRAL_SYS_DEFAULT 0x0800 //!< LANG_NEUTRAL_SYS_DEFAULT +#define U_LID_ar_IQ 0x0801 //!< ar_IQ +#define U_LID_zh_CN 0x0804 //!< zh_CN +#define U_LID_de_CH 0x0807 //!< de_CH +#define U_LID_en_GB 0x0809 //!< en_GB +#define U_LID_es_MX 0x080A //!< es_MX +#define U_LID_fr_BE 0x080C //!< fr_BE +#define U_LID_it_CH 0x0810 //!< it_CH +#define U_LID_ko_Johab_KR 0x0812 //!< ko_Johab_KR +#define U_LID_nl_BE 0x0813 //!< nl_BE +#define U_LID_nn_NO 0x0814 //!< nn_NO +#define U_LID_pt_PT 0x0816 //!< pt_PT +#define U_LID_sr_Latn_SP 0x081A //!< sr_Latn_SP +#define U_LID_sv_FI 0x081D //!< sv_FI +#define U_LID_ur_IN 0x0820 //!< ur_IN +#define U_LID_lt_C_LT 0x0827 //!< lt_C_LT +#define U_LID_az_Cyrl_AZ 0x082C //!< az_Cyrl_AZ +#define U_LID_wee_DE 0x082E //!< wee_DE +#define U_LID_se_SE 0x083B //!< se_SE +#define U_LID_ga_IE 0x083C //!< ga_IE +#define U_LID_ms_BN 0x083E //!< ms_BN +#define U_LID_uz_Cyrl_UZ 0x0843 //!< uz_Cyrl_UZ +#define U_LID_bn_BD 0x0845 //!< bn_BD +#define U_LID_mn_Mong_CN 0x0850 //!< mn_Mong_CN +#define U_LID_sd_PK 0x0859 //!< sd_PK +#define U_LID_iu_Latn_CA 0x085D //!< iu_Latn_CA +#define U_LID_tzm_Latn_DZ 0x085F //!< tzm_Latn_DZ +#define U_LID_quz_EC 0x086B //!< quz_EC +#define U_LID_LANG_NEUTRAL_CUSTOM_DEFAULT 0x0C00 //!< LANG_NEUTRAL_CUSTOM_DEFAULT +#define U_LID_ar_EG 0x0C01 //!< ar_EG +#define U_LID_zh_HK 0x0C04 //!< zh_HK +#define U_LID_de_AT 0x0C07 //!< de_AT +#define U_LID_en_AU 0x0C09 //!< en_AU +#define U_LID_es_ES 0x0C0A //!< es_ES +#define U_LID_fr_CA 0x0C0C //!< fr_CA +#define U_LID_sr_Cyrl_CS 0x0C1A //!< sr_Cyrl_CS +#define U_LID_se_FI 0x0C3B //!< se_FI +#define U_LID_quz_PE 0x0C6B //!< quz_PE +#define U_LID_LANG_NEUTRAL_CUSTOM 0x1000 //!< LANG_NEUTRAL_CUSTOM +#define U_LID_ar_LY 0x1001 //!< ar_LY +#define U_LID_zh_SG 0x1004 //!< zh_SG +#define U_LID_de_LU 0x1007 //!< de_LU +#define U_LID_en_CA 0x1009 //!< en_CA +#define U_LID_es_GT 0x100A //!< es_GT +#define U_LID_fr_CH 0x100C //!< fr_CH +#define U_LID_hr_BA 0x101A //!< hr_BA +#define U_LID_smj_NO 0x103B //!< smj_NO +#define U_LID_LANG_NEUTRAL_CUSTOM_DEFAULT_MUI 0x1400 //!< LANG_NEUTRAL_CUSTOM_DEFAULT_MUI +#define U_LID_ar_DZ 0x1401 //!< ar_DZ +#define U_LID_zh_MO 0x1404 //!< zh_MO +#define U_LID_de_LI 0x1407 //!< de_LI +#define U_LID_en_NZ 0x1409 //!< en_NZ +#define U_LID_es_CR 0x140A //!< es_CR +#define U_LID_fr_LU 0x140C //!< fr_LU +#define U_LID_bs_Latn_BA 0x141A //!< bs_Latn_BA +#define U_LID_smj_SE 0x143B //!< smj_SE +#define U_LID_ar_MA 0x1801 //!< ar_MA +#define U_LID_en_IE 0x1809 //!< en_IE +#define U_LID_es_PA 0x180A //!< es_PA +#define U_LID_ar_MC 0x180C //!< ar_MC +#define U_LID_sr_Latn_BA 0x181A //!< sr_Latn_BA +#define U_LID_sma_NO 0x183B //!< sma_NO +#define U_LID_ar_TN 0x1C01 //!< ar_TN +#define U_LID_en_ZA 0x1C09 //!< en_ZA +#define U_LID_es_DO 0x1C0A //!< es_DO +#define U_LID_sr_Cyrl_BA 0x1C1A //!< sr_Cyrl_BA +#define U_LID_sma_SE 0x1C3B //!< sma_SE +#define U_LID_ar_OM 0x2001 //!< ar_OM +#define U_LID_el_2_GR 0x2008 //!< el_2_GR +#define U_LID_en_JM 0x2009 //!< en_JM +#define U_LID_es_VE 0x200A //!< es_VE +#define U_LID_bs_Cyrl_BA 0x201A //!< bs_Cyrl_BA +#define U_LID_sms_FI 0x203B //!< sms_FI +#define U_LID_ar_YE 0x2401 //!< ar_YE +#define U_LID_ar_029 0x2409 //!< ar_029 +#define U_LID_es_CO 0x240A //!< es_CO +#define U_LID_smn_FI 0x243B //!< smn_FI +#define U_LID_ar_SY 0x2801 //!< ar_SY +#define U_LID_en_BZ 0x2809 //!< en_BZ +#define U_LID_es_PE 0x280A //!< es_PE +#define U_LID_ar_JO 0x2C01 //!< ar_JO +#define U_LID_en_TT 0x2C09 //!< en_TT +#define U_LID_es_AR 0x2C0A //!< es_AR +#define U_LID_ar_LB 0x3001 //!< ar_LB +#define U_LID_en_ZW 0x3009 //!< en_ZW +#define U_LID_es_EC 0x300A //!< es_EC +#define U_LID_ar_KW 0x3401 //!< ar_KW +#define U_LID_en_PH 0x3409 //!< en_PH +#define U_LID_es_CL 0x340A //!< es_CL +#define U_LID_ar_AE 0x3801 //!< ar_AE +#define U_LID_es_UY 0x380A //!< es_UY +#define U_LID_ar_BH 0x3C01 //!< ar_BH +#define U_LID_es_PY 0x3C0A //!< es_PY +#define U_LID_ar_QA 0x4001 //!< ar_QA +#define U_LID_en_IN 0x4009 //!< en_IN +#define U_LID_es_BO 0x400A //!< es_BO +#define U_LID_en_MY 0x4409 //!< en_MY +#define U_LID_es_SV 0x440A //!< es_SV +#define U_LID_en_SG 0x4809 //!< en_SG +#define U_LID_es_HN 0x480A //!< es_HN +#define U_LID_es_NI 0x4C0A //!< es_NI +#define U_LID_es_PR 0x500A //!< es_PR +#define U_LID_es_US 0x540A //!< es_US +#define U_LID_zh_Hant 0x7C04 //!< zh_Hant +#define U_LID_SEC_MASK 0xFB00 //!< Mask for region part of LID +#define U_LID_PRI_MASK 0x03FF //!< MASK for languagepart of LID +/** @} */ + +/** \defgroup U_PMF_LCT_ PMF LineCapType Enumeration + For + EMF+ manual 2.1.1.18, Microsoft name: LineCapType Enumeration (U_LCT_*) + @{ +*/ +#define U_LCT_Flat 0x00 //!< Flat line cap +#define U_LCT_Square 0x01 //!< Square line cap +#define U_LCT_Round 0x02 //!< Round line cap +#define U_LCT_Triangle 0x03 //!< Triangle line cap +#define U_LCT_NoAnchor 0x10 //!< No Anchor line cap +#define U_LCT_SquareAnchor 0x11 //!< Square Anchor line cap +#define U_LCT_RoundAnchor 0x12 //!< Round Anchor line cap +#define U_LCT_DiamondAnchor 0x13 //!< Diamond Anchor line cap +#define U_LCT_ArrowAnchor 0x14 //!< Arrow Anchor line cap +#define U_LCT_AnchorMask 0xF0 //!< Ancho rMask line cap +#define U_LCT_Custom 0xFF //!< Custom line cap +/** @} */ + +/** \defgroup U_PMF_LJT_ PMF LineJoinType Enumeration + For + EMF+ manual 2.1.1.19, Microsoft name: LineJoinType Enumeration (U_LJT_*) + @{ +*/ +#define U_LJT_Miter 0x00 //!< Miter line join +#define U_LJT_Bevel 0x01 //!< Bevel line join +#define U_LJT_Round 0x02 //!< Round line join +#define U_LJT_MiterClipped 0x03 //!< Miter Clipped line join +/** @} */ + +/** \defgroup U_PMF_LS_ PMF LineStyle Enumeration + For + EMF+ manual 2.1.1.20, Microsoft name: LineStyle Enumeration (U_LS_*) + @{ +*/ +#define U_LS_Solid 0x00 //!< Solid line +#define U_LS_Dash 0x01 //!< Dashed line +#define U_LS_Dot 0x02 //!< Dotted line +#define U_LS_DashDot 0x03 //!< Dash Dot line +#define U_LS_DashDotDot 0x04 //!< Dash Dot Dot line +#define U_LS_Custom 0x05 //!< Custom line +/** @} */ + +/** \defgroup U_PMF_MDT_ PMF MetafileDataType Enumeration + For + EMF+ manual 2.1.1.21, Microsoft name: MetafileDataType Enumeration (U_MDT_*) + @{ +*/ +#define U_MDT_Wmf 0x01 //!< WMF metafile +#define U_MDT_WmfPlaceable 0x02 //!< WMF placeable metafile +#define U_MDT_Emf 0x03 //!< EMF metafile +#define U_MDT_EmfPlusOnly 0x04 //!< EMF+ single mode metafile +#define U_MDT_EmfPlusDual 0x05 //!< EMF+ dual mode metafile +/** @} */ + +/** \defgroup U_PMF_OT_ PMF ObjectType Enumeration + For + EMF+ manual 2.1.1.22, Microsoft name: ObjectType Enumeration (U_OT_*) + @{ +*/ +#define U_OT_Invalid 0x00 //!< Invalid object +#define U_OT_Brush 0x01 //!< Brush object +#define U_OT_Pen 0x02 //!< Pen object +#define U_OT_Path 0x03 //!< Path object +#define U_OT_Region 0x04 //!< Region object +#define U_OT_Image 0x05 //!< Image object +#define U_OT_Font 0x06 //!< Font object +#define U_OT_StringFormat 0x07 //!< StringFormat object +#define U_OT_ImageAttributes 0x08 //!< ImageAttributes object +#define U_OT_CustomLineCap 0x09 //!< CustomLineCap object +/** @} */ + +/** \defgroup U_PMF_PPT_ PMF PathPointType Enumeration + For + EMF+ manual 2.1.1.23, Microsoft name: PathPointType Enumeration (U_PPT_*) + @{ +*/ +#define U_PPT_Start 0x00 //!< Start of path +#define U_PPT_Line 0x01 //!< Line path +#define U_PPT_Bezier 0x03 //!< Bezier path +#define U_PPT_MASK 0x0F //!< MASK for bits in flag +/** @} */ + +/** \defgroup U_PMF_PA_ PMF PenAlignment Enumeration + For + EMF+ manual 2.1.1.24, Microsoft name: PenAlignment Enumeration (U_PA_*) + @{ +*/ +#define U_PA_Center 0x00 //!< Center pen alignment +#define U_PA_Inset 0x01 //!< Inset pen alignment +#define U_PA_Left 0x02 //!< Left pen alignment +#define U_PA_Outset 0x03 //!< Outset pen alignment +#define U_PA_Right 0x04 //!< Right pen alignment +/** @} */ + +/** \defgroup U_PMF_PF_ PMF PixelFormat Enumeration + For U_PMF_BITMAP PxFormat field + EMF+ manual 2.1.1.25, Microsoft name: PixelFormat Enumeration (U_PF_*) + + Bitmap for this 32 bit value is: + 0-9 ignored + 10 Set: 32 bit ARGB; Clear: !32 bit ARGB + 11 Set: 16 bits/channel; Clear: !16 bits + 12 Set: colors premultiplied by alpha; Clear: !premultiplied + 13 Set: has Alpha; Clear: !has Alpha + 14 Set: Windows GDI supports; Clear: !Windows GDI supports + 15 Set: uses LUT; Clear !uses LUT + 16-23 = total number of BITS per pixel + 24-31 = pixel format enumeration index (0->15) + @{ +*/ +#define U_PF_Undefined 0x00000000 //!< undefined Pixel Format +#define U_PF_1bppIndexed 0x00030101 //!< monochrome with LUT +#define U_PF_4bppIndexed 0x00030402 //!< 4 bit with LUT +#define U_PF_8bppIndexed 0x00030803 //!< 8 bit with LUT +#define U_PF_16bppGrayScale 0x00101004 //!< 16 bits grey values +#define U_PF_16bppRGB555 0x00021005 //!< 16 bit RGB values (5,5,5,(1 ignored)) +#define U_PF_16bppRGB565 0x00021006 //!< 16 bit RGB values (5,6,5) +#define U_PF_16bppARGB1555 0x00061007 //!< 16 bit ARGB values (1 alpha, 5,5,5 colors) +#define U_PF_24bppRGB 0x00021808 //!< 24 bit RGB values (8,8.8) +#define U_PF_32bppRGB 0x00022009 //!< 32 bit RGB value (8,8,8,(8 ignored)) +#define U_PF_32bppARGB 0x0026200A //!< 32 bit ARGB values (8 alpha,8,8,8) +#define U_PF_32bppPARGB 0x000E200B //!< 32 bit PARGB values (8,8,8,8, but RGB already multiplied by A) +#define U_PF_48bppRGB 0x0010300C //!< 48 bit RGB (16,16,16) +#define U_PF_64bppARGB 0x0034400D //!< 64 bit ARGB (16 alpha, 16,16,16) +#define U_PF_64bppPARGB 0x001A400E //!< 64 bit PARGB (16,16,16,16, but RGB already multiplied by A) +/** @} */ + +/** \defgroup U_PMF_POM_ PMF PixelOffsetMode Enumeration + For + EMF+ manual 2.1.1.26, Microsoft name: PixelOffsetMode Enumeration (U_POM_*) + @{ +*/ +#define U_POM_Default 0x00 //!< center at {0.0,0.0} +#define U_POM_HighSpeed 0x01 //!< center at {0.0,0.0} +#define U_POM_HighQuality 0x02 //!< center at {0.5,0.5} +#define U_POM_None 0x03 //!< center at {0.0,0.0} +#define U_POM_Half 0x04 //!< center at {0.5,0.5} +/** @} */ + +/** \defgroup U_PMF_RNDT_ PMF RegionNodeDataType Enumeration + For + EMF+ manual 2.1.1.27, Microsoft name: RegionNodeDataType Enumeration (U_RNDT_*) + @{ +*/ +#define U_RNDT_Kids 0x00000000 //!< One of the next 5 is to be applied +#define U_RNDT_And 0x00000001 //!< AND the child nodes +#define U_RNDT_Or 0x00000002 //!< OR the child nodes +#define U_RNDT_Xor 0x00000003 //!< XOR the child nodes +#define U_RNDT_Exclude 0x00000004 //!< Part of 1st child node not in 2nd child node +#define U_RNDT_Complement 0x00000005 //!< Part of 2nd child node not in 1st child node +#define U_RNDT_Rect 0x10000000 //!< Child node is a rectangle +#define U_RNDT_Path 0x10000001 //!< Child node is a path +#define U_RNDT_Empty 0x10000002 //!< Child node is empty +#define U_RNDT_Infinite 0x10000003 //!< Child node has infinite extent (?) +/** @} */ + +/** \defgroup U_PMF_SM_ PMF SmoothingMode Enumeration + For + EMF+ manual 2.1.1.28, Microsoft name: SmoothingMode Enumeration (U_SM_*) + @{ +*/ +#define U_SM_Default 0x00 //!< Default smoothing +#define U_SM_HighSpeed 0x01 //!< High Speed smoothing +#define U_SM_HighQuality 0x02 //!< High Quality smoothing +#define U_SM_None 0x03 //!< No smoothing +#define U_SM_AntiAlias8x4 0x04 //!< Anti Alias 8x4 smoothing +#define U_SM_AntiAlias8x8 0x05 //!< Anti Alias 8x8 smoothing +/** @} */ + +/** \defgroup U_PMF_SA_ PMF StringAlignment Enumeration + For + EMF+ manual 2.1.1.29, Microsoft name: StringAlignment Enumeration (U_SA_*) + + Note, that unlike EMF these are with respect to the bounding rectangle, not to a single point. So + to draw centered text, for instance, U_SA_Center must be used, and the bounding rectangle must also be + centered. + + For horizontal positioning of L->R text Near is all the way left in the box, Far is all the way right, + and Center puts the center of the text in the center of the box. + + For vertical positioning things are a little strange. Near is a certain distance down from the top, Far is a + certain distance up from the bottom, and center puts the center of the text in the center of the box. The + "certain distance" is not specified in the EMF+ documentation. See the function U_PMR_drawstring() for an + implementation that places text on the baseline. + @{ +*/ +#define U_SA_Near 0x00 //!< Position near +#define U_SA_Center 0x01 //!< Position center +#define U_SA_Far 0x02 //!< Position far +/** @} */ + +/** \defgroup U_PMF_SDS_ PMF StringDigitSubstitution Enumeration + For + EMF+ manual 2.1.1.30, Microsoft name: StringDigitSubstitution Enumeration (U_SDS_*) + @{ +*/ +#define U_SDS_User 0x00 //!< Digit substitution is set by implementation +#define U_SDS_None 0x01 //!< No Digit substitution +#define U_SDS_National 0x02 //!< Digit substitution by official locale +#define U_SDS_Traditional 0x03 //!< Digit substitution by traditional locale +/** @} */ + +/** \defgroup U_PMF_ST_ PMF StringTrimming Enumeration + For + EMF+ manual 2.1.1.31, Microsoft name: StringTrimming Enumeration (U_ST_*) + @{ +*/ +#define U_ST_None 0x00 //!< no string trimming +#define U_ST_Character 0x01 //!< Trim at Character +#define U_ST_Word 0x02 //!< Trim at Word +#define U_ST_EllipsisCharacter 0x03 //!< Trim at Ellipsis Character +#define U_ST_EllipsisWord 0x04 //!< Trim at Ellipsis Word +#define U_ST_EllipsisPath 0x05 //!< Trim at Ellipsis Path +/** @} */ + +/** \defgroup U_PMF_TRH_ PMF TextRenderingHint Enumeration + For + EMF+ manual 2.1.1.32, Microsoft name: TextRenderingHint Enumeration (U_TRH_*) + @{ +*/ +#define U_TRH_SystemDefault 0x00 //!< System Default +#define U_TRH_SingleBitPerPixelGridFit 0x01 //!< Single Bit Per Pixel Grid Fit +#define U_TRH_SingleBitPerPixel 0x02 //!< Single Bit Per Pixel +#define U_TRH_AntialiasGridFit 0x03 //!< Antialias Grid Fit +#define U_TRH_Antialias 0x04 //!< Antialias +#define U_TRH_ClearTypeGridFit 0x05 //!< ClearType Grid Fit +/** @} */ + +/** \defgroup U_PMF_UT_ PMF UnitType Enumeration + For + EMF+ manual 2.1.1.33, Microsoft name: UnitType Enumeration (U_UT_*) + @{ +*/ +#define U_UT_World 0x00 //!< World units +#define U_UT_Display 0x01 //!< Display units +#define U_UT_Pixel 0x02 //!< Pixel units +#define U_UT_Point 0x03 //!< Point units +#define U_UT_Inch 0x04 //!< Inch units +#define U_UT_Document 0x05 //!< Document units +#define U_UT_Millimeter 0x06 //!< Millimeter units +/** @} */ + +/** \defgroup U_PMF_WM_ PMF WrapMode Enumeration + For + EMF+ manual 2.1.1.34, Microsoft name: WrapMode Enumeration (U_WM_*) + @{ +*/ +#define U_WM_Tile 0x00000000 //!< Tile +#define U_WM_TileFlipX 0x00000001 //!< Reverse horizontally then tile +#define U_WM_TileFlipY 0x00000002 //!< Reverse vertically then tile +#define U_WM_TileFlipXY 0x00000003 //!< Reverse horizontally and vertically then tile +#define U_WM_Clamp 0x00000004 //!< Clamp pattern to the object boundary +/** @} */ + +/** \defgroup U_PMF_BD_ PMF BrushData Flags + For + EMF+ manual 2.1.2.1, Microsoft name: BrushData Flags (U_BD_*) + + Bit flags allowed in brush object types. Each bit indicates a type of object which is included. + There are 5 brush types abbreviated A through E, and each uses a subset of the + BrushData Flags, as summarized in the following table: + + Bits Brush____Type EMF+ Manual + used Abbrev. Name + 5 A U_PMF_LINEARGRADIENTBRUSHDATA 2.2.2.24 + 6 B U_PMF_PATHGRADIENTBRUSHDATA 2.2.2.29 + 3 C U_PMF_TEXTUREBRUSHDATA 2.2.2.45 + 0 D U_PMF_HATCHBRUSHDATA 2.2.2.20 + 0 E U_PMF_SOLIDBRUSHDATA 2.2.2.45 + @{ +*/ +#define U_BD_None 0x0000 //!< no bits set +#define U_BD_Path 0x0001 //!< Path, in {B} +#define U_BD_Transform 0x0002 //!< Transform in {ABC} +#define U_BD_PresetColors 0x0004 //!< PresetColors in {AB} +#define U_BD_BlendFactorsH 0x0008 //!< BlendFactorsH in {AB} +#define U_BD_BlendFactorsV 0x0010 //!< BlendFactorsV in {A} - Note, not actually implemented in GDI+. +#define U_BD_NoBit 0x0020 //!< unused bit +#define U_BD_FocusScales 0x0040 //!< Focus Scales in {B} +#define U_BD_IsGammaCorrected 0x0080 //!< GammaCorrected in {ABC} +#define U_BD_DoNotTransform 0x0100 //!< Ignore world to device transform in {C} +#define U_BD_MASKA 0x009E //!< all bits that MAY be set in A +#define U_BD_MASKB 0x00CF //!< all bits that MAY be set in B +#define U_BD_MASKC 0x0182 //!< all bits that MAY be set in C +/** @} */ + +/** \defgroup U_PMF_CLCD_ PMF CustomLineCapData Flags + For + EMF+ manual 2.1.2.2, Microsoft name: CustomLineCapData Flags (U_CLCD_*) + @{ +*/ +#define U_CLCD_None 0x00 //!< no bits set +#define U_CLCD_FillPath 0x01 //!< Fill Path +#define U_CLCD_LinePath 0x02 //!< Line Path +/** @} */ + +/** \defgroup U_PMF_DSO_ PMF DriverStringOptions Flags + For + EMF+ manual 2.1.2.3, Microsoft name: DriverStringOptions Flags (U_DSO_*) + @{ +*/ +#define U_DSO_None 0x00 //!< no bits set +#define U_DSO_CmapLookup 0x01 //!< Set: value is a Unicode character; Clear: value is an index into Glyph table in a font +#define U_DSO_Vertical 0x02 //!< Set: draw string verically; Clear: draw horizontally +#define U_DSO_RealizedAdvance 0x04 /**< Set: U_PMF_DRAWDRIVERSTRING Positions field specifies only position of first of Glyphs field, + with the rest calculated from font information; Clear: Positions specifies coordinates for each Glyphs member.*/ +#define U_DSO_LimitSubpixel 0x08 //!< Set: use less memory to cache anti-aliased glyphs; Clear: use more +/** @} */ + +/** \defgroup U_PMF_FS_ PMF FontStyle Flags + For + EMF+ manual 2.1.2.4, Microsoft name: FontStyle Flags (U_FS_*) +# @{ +*/ +#define U_FS_None 0x00 //!< no bits set +#define U_FS_Bold 0x01 //!< Bold +#define U_FS_Italic 0x02 //!< Italic +#define U_FS_Underline 0x04 //!< Underline +#define U_FS_Strikeout 0x08 //!< Strikeout +/** @} */ + +/** \defgroup U_PMF_PLTS_ PMF PaletteStyle Flags + For + EMF+ manual 2.1.2.5, Microsoft name: PaletteStyle Flags (U_PLTS_*) + @{ +*/ +#define U_PLTS_None 0x00 //!< no bits set +#define U_PLTS_HasAlpha 0x01 //!< Has Alpha +#define U_PLTS_GrayScale 0x02 //!< Gray Scale +#define U_PLTS_Halftone 0x04 //!< Halftone +/** @} */ + +/** \defgroup U_PMF_PTP_ PMF PathPointType Flags + For + EMF+ manual 2.1.2.6, Microsoft name: PathPointType Flags (U_PTP_*) + @{ +*/ +#define U_PTP_None 0x00 //!< no bits set +#define U_PTP_DashMode 0x10 //!< Dash Mode +#define U_PTP_PathMarker 0x20 //!< Path Marker +#define U_PTP_NoBit 0x40 //!< unused bit +#define U_PTP_CloseSubpath 0x80 //!< CloseSubpath +#define U_PTP_NotClose 0x70 //!< Everything but close +#define U_PTP_MASK 0xF0 //!< Everything +#define U_PTP_SHIFT 4 //!< offset to this bitfield +/** @} */ + +/** \defgroup U_PMF_PD_ PMF PenData Flags + For + EMF+ manual 2.1.2.7, Microsoft name: PenData Flags (U_PD_*) + +If bit is set the corresponding object must be specfied in the OptionalData field + + @{ +*/ +#define U_PD_None 0x0000 //!< no bits set +#define U_PD_Transform 0x0001 //!< Transform +#define U_PD_StartCap 0x0002 //!< Start Cap +#define U_PD_EndCap 0x0004 //!< End Cap +#define U_PD_Join 0x0008 //!< Join +#define U_PD_MiterLimit 0x0010 //!< Miter Limit +#define U_PD_LineStyle 0x0020 //!< Line Style +#define U_PD_DLCap 0x0040 //!< Dashed Line Cap +#define U_PD_DLOffset 0x0080 //!< Dashed Line Offset +#define U_PD_DLData 0x0100 //!< Dashed Line Data +#define U_PD_NonCenter 0x0200 //!< Alignment must be specified with optinal data +#define U_PD_CLData 0x0400 //!< Compound Line Data +#define U_PD_CustomStartCap 0x0800 //!< Custom Start Cap +#define U_PD_CustomEndCap 0x1000 //!< Custom End Cap +/** @} */ + +/** \defgroup U_PMF_SF_ PMF StringFormat Flags + For EmfPlusStringFormat + EMF+ manual 2.1.2.8, Microsoft name: StringFormat Flags (U_SF_*) + @{ +*/ +#define U_SF_None 0x00000000 //!< no bits set +#define U_SF_DirectionRightToLeft 0x00000001 //!< text Right to Left +#define U_SF_DirectionVertical 0x00000002 //!< text Left to Right +#define U_SF_NoFitBlackBox 0x00000004 //!< text not restricted to layout bbox +#define U_SF_NoBit4 0x00000008 //!< unused bit +#define U_SF_NoBit5 0x00000010 //!< unused bit +#define U_SF_DisplayFormatControl 0x00000020 //!< control codes display as "representative" glyphs +#define U_SF_NoBit7 0x00000040 //!< unused bit +#define U_SF_NoBit8 0x00000080 //!< unused bit +#define U_SF_NoBit9 0x00000100 //!< unused bit +#define U_SF_NoBit10 0x00000200 //!< unused bit +#define U_SF_NoFontFallback 0x00000400 //!< show as missing glyph if not in font +#define U_SF_MeasureTrailingSpaces 0x00000800 //!< trailing spaces included in line length +#define U_SF_NoWrap 0x00001000 //!< text does not wrap +#define U_SF_LineLimit 0x00002000 //!< emit whole lines if not clipped +#define U_SF_NoClip 0x00004000 //!< text is not clipped +#define U_SF_BypassGDI 0x80000000 //!< use implementation specific text rendering instead of GDI +/** @} */ + +/** \defgroup U_PMF_IE_ PMF ImageEffects Identifiers + For + EMF+ manual 2.1.3.1, Microsoft name: ImageEffects Identifiers (U_IE_*) + @{ +*/ +#define U_IE_BlurEffectGuid "{633C80A4-1843-482B-9EF2-BE2834C5FDD4}" //!< Blur Effect +#define U_IE_BrightnessContrastEffectGuid "{D3A1DBE1-8EC4-4C17-9F4C-EA97AD1C343D}" //!< Brightness Contrast Effect +#define U_IE_ColorBalanceEffectGuid "{537E597D-251E-48DA-9664-29CA496B70F8}" //!< Color Balance Effect +#define U_IE_ColorCurveEffectGuid "{DD6A0022-58E4-4A67-9D9B-D48EB881A53D}" //!< Color Curve Effect +#define U_IE_ColorLookupTableEffectGuid "{A7CE72A9-0F7F-40D7-B3CC-D0C02D5C3212}" //!< Color Lookup Table Effect +#define U_IE_ColorMatrixEffectGuid "{718F2615-7933-40E3-A511-5F68FE14DD74}" //!< Color Matrix Effect +#define U_IE_HueSaturationLightnessEffectGuid "{8B2DD6C3-EB07-4D87-A5F0-7108E26A9C5F}" //!< Hue Saturation Lightness Effect +#define U_IE_LevelsEffectGuid "{99C354EC-2A31-4F3A-8C34-17A803B33A25}" //!< Levels Effect +#define U_IE_RedEyeCorrectionEffectGuid "{74D29D05-69A4-4266-9549-3CC52836B632}" //!< Red Eye Correction Effect +#define U_IE_SharpenEffectGuid "{63CBF3EE-C526-402C-8F71-62C540BF5142}" //!< Sharpen Effect +#define U_IE_TintEffectGuid "{1077AF00-2848-4441-9489-44AD4C2D7A2C}" //!< Tint Effect +/** @} */ + +/** \defgroup U_PMF_IEE_ PMF ImageEffects Enumerators + based on U_IE_ + These may be used by a parser to set up for a switch() statement. + @{ +*/ +#define U_IEE_Unknown 0 //!< none of the following +#define U_IEE_BlurEffectGuid 1 //!< Blur Effect +#define U_IEE_BrightnessContrastEffectGuid 2 //!< Brightness Contrast Effect +#define U_IEE_ColorBalanceEffectGuid 3 //!< Color Balance Effect +#define U_IEE_ColorCurveEffectGuid 4 //!< Color Curve Effect +#define U_IEE_ColorLookupTableEffectGuid 5 //!< Color Lookup Table Effect +#define U_IEE_ColorMatrixEffectGuid 6 //!< Color Matrix Effect +#define U_IEE_HueSaturationLightnessEffectGuid 7 //!< Hue Saturation Lightness Effect +#define U_IEE_LevelsEffectGuid 8 //!< Levels Effect +#define U_IEE_RedEyeCorrectionEffectGuid 9 //!< Red Eye Correction Effect +#define U_IEE_SharpenEffectGuid 10 //!< Sharpen Effect +#define U_IEE_TintEffectGuid 11 //!< Tint Effect +/** @} */ + +/** \defgroup U_PMF_OC_ PMF ObjectClamp Identifiers + For U_PMF_IMAGEATTRIBUTES ObjectClamp field + EMF+ manual 2.2.1.5, Microsoft name: ImageEffects Identifiers (U_OC_*) + @{ +*/ +#define U_OC_Rect 0x00 //!< Clamp object to rectangle. +#define U_OC_Bitmap 0x01 //!< Clamp object to bitmap. +/** @} */ + +/** \defgroup U_PMF_PPF_ PMF PathPoint Flags + For U_PMF_PATH Flags field + For U_PMF_CMN_HDR Flags field + EMF+ manual 2.2.1.6, Microsoft name: PathPoint Flags (U_PPF_*) + For U_PMF_CMN_HDR Flags the bits are scattered all over the EMF+ manual. + NOTE: bitfields in manual are BIG endian and MSB 0. + This code reads the 16 bit flag field as LITTLE endian and uses LSB 0. + The values shown are AFTER the data has been read into a uint16_t and the byte order set + appropriately. + All of these come out of a 16 bit field. + @{ +*/ +#define U_PPF_B 0x8000 //!< 15 Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. +#define U_PPF_BZ 0x8000 //!< 15 Set: Points are on a Bezier curve; Clear: Points are on a line +#define U_PPF_N 0x8000 //!< 15 Set: object definition continues in next record; Clear: this is the final object definition record +#define U_PPF_K 0x8000 //!< 15 Set: int16_t coordinates; Clear: use U_FLOAT coordinates +#define U_PPF_C 0x4000 //!< 14 Set: int16_t coordinates; Clear: use U_FLOAT coordinates +#define U_PPF_XM 0x2000 //!< 13 Set: Post multiply matrix; Clear: Pre multiply matrix +#define U_PPF_F 0x2000 //!< 13 Set: winding fill; Clear: alternate fill +#define U_PPF_E 0x2000 //!< 13 Set: effect from previous U_PMF_SERIALIZABLEOBJECT record will be applied,; Clear: no effect applied +#define U_PPF_R 0x1000 //!< 12 Set: U_PMF_PathPointTypeRLE and/or U_PMF_PathPointType objects; Clear: only U_PMF_PathPointType +#define U_PPF_P 0x0800 //!< 11 Set: relative coordinates; Clear absolute coordinates +#define U_PPF_D 0x0400 //!< 10 Set: draw path closed; Clear: draw path open +#define U_PPF_VGA 0x0002 //!< 1 Set: Palette is VGA basic colors; Clear: Palette is ??? +#define U_PPF_PP 0x0001 //!< 0 Set: Palette field is present; Clear: Palette field is absent +#define U_PPF_DM 0x0001 //!< 0 Set: Dual-mode file; Clear: EMF+ only file +#define U_PPF_AA 0x0001 //!< 0 Set: anti-aliasing on; Clear: anti-aliasing off +#define U_PPF_VIDEO 0x0001 //!< 0 Set: reference device is video display; Clear: reference devis is printer +/** @} */ + +/** \defgroup U_PMF_FF_ PMF Masks and offsets for 16 bit flag fields + Documenting the OBSERVED positions of fields in 16 bit flag integers + after they have been read in Little Ended from files. + + Note, some of these are used in more than one record type, only a single reference is provided + @{ +*/ + +#define U_FF_MASK_SUBLID 0x003F //!< EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier +#define U_FF_SHFT_SUBLID 0x000A //!< EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier +#define U_FF_MASK_PRILID 0x03FF //!< EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier +#define U_FF_SHFT_PRILID 0x0000 //!< EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier +#define U_FF_MASK_LID 0xFFFF //!< EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier +#define U_FF_SHFT_LID 0x0000 //!< EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier +#define U_FF_MASK_RL 0x003F //!< EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE +#define U_FF_SHFT_RL 0x0008 //!< EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE +#define U_FF_MASK_PPT 0x00FF //!< EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE +#define U_FF_SHFT_PPT 0x0000 //!< EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE +/* the next one is used most places an object ID is specified */ +#define U_FF_MASK_OID8 0x00FF //!< EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath +#define U_FF_SHFT_OID8 0x0000 //!< EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath +#define U_FF_MASK_CM4 0x000F //!< EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath +#define U_FF_SHFT_CM4 0x0008 //!< EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath +#define U_FF_MASK_OT 0x003F //!< EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject +#define U_FF_SHFT_OT 0x0008 //!< EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject +#define U_FF_MASK_AA 0x007F //!< EMF+ manual 2.3.6.1, Microsoft name: EmfPlusSetAntiAliasMode +#define U_FF_SHFT_AA 0x0001 //!< EMF+ manual 2.3.6.1, Microsoft name: EmfPlusSetAntiAliasMode +#define U_FF_MASK_CM 0x00FF //!< EMF+ manual 2.3.6.2, Microsoft name: EmfPlusSetCompositingMode +#define U_FF_SHFT_CM 0x0000 //!< EMF+ manual 2.3.6.2, Microsoft name: EmfPlusSetCompositingMode +#define U_FF_MASK_CQ 0x00FF //!< EMF+ manual 2.3.6.3, Microsoft name: EmfPlusSetCompositingQuality +#define U_FF_SHFT_CQ 0x0000 //!< EMF+ manual 2.3.6.3, Microsoft name: EmfPlusSetCompositingQuality +#define U_FF_MASK_IM 0x00FF //!< EMF+ manual 2.3.6.4, Microsoft name: EmfPlusSetInterpolationMode +#define U_FF_SHFT_IM 0x0000 //!< EMF+ manual 2.3.6.4, Microsoft name: EmfPlusSetInterpolationMode +#define U_FF_MASK_PxOffM 0x00FF //!< EMF+ manual 2.3.6.5, Microsoft name: EmfPlusSetPixelOffsetMode +#define U_FF_SHFT_PxOffM 0x0000 //!< EMF+ manual 2.3.6.5, Microsoft name: EmfPlusSetPixelOffsetMode +#define U_FF_MASK_TGC 0x0FFF //!< EMF+ manual 2.3.6.7, Microsoft name: EmfPlusSetTextContrast +#define U_FF_SHFT_TGC 0x0000 //!< EMF+ manual 2.3.6.7, Microsoft name: EmfPlusSetTextContrast +#define U_FF_MASK_TRH 0x00FF //!< EMF+ manual 2.3.6.8, Microsoft name: EmfPlusSetTextRenderingHint +#define U_FF_SHFT_TRH 0x0000 //!< EMF+ manual 2.3.6.8, Microsoft name: EmfPlusSetTextRenderingHint +#define U_FF_MASK_UT 0x00FF //!< EMF+ manual 2.3.7.1, Microsoft name: EmfPlusBeginContainer +#define U_FF_SHFT_UT 0x0008 //!< EMF+ manual 2.3.7.1, Microsoft name: EmfPlusBeginContainer +#define U_FF_MASK_TSC 0x7FFF //!< EMF+ manual 2.3.8.1, Microsoft name: EmfPlusSetTSClip +#define U_FF_SHFT_TSC 0x0000 //!< EMF+ manual 2.3.8.1, Microsoft name: EmfPlusSetTSClip +#define U_FF_MASK_PU 0x00FF //!< EMF+ manual 2.3.9.5, Microsoft name: EmfPlusSetPageTransform +#define U_FF_SHFT_PU 0x0000 //!< EMF+ manual 2.3.9.5, Microsoft name: EmfPlusSetPageTransform +/** @} */ + + +/** \defgroup U_PMF_GFVR_ PMF MetafileSignature + For U_PMF_GRAPHICSVERSION Signature field + EMF+ manual 2.2.2.19, Microsoft name: (none) (U_GFVR_*) + @{ +*/ +#define U_GFVR_PMF 0x000DBC01 //!< indicates an EMF+ metafile +#define U_GFVR_MASKHI 0xFFFFF000 //!< mask for the signature bit field (20 bits) +#define U_GFVR_MASKLO 0x00000FFF //!< mask for the version bit field (12 bits) +/** @} */ + +/** \defgroup U_PMF_XM_ PMF Matrix Multiplication Enumerator + For U_PMF_RotateWorldTransform and others + EMF+ manual 2.3.9.3, Microsoft name: (none) (U_XM_*) + @{ +*/ +#define U_XM_PostX 1 //!< Post Multiply change to current Transformation Matrix +#define U_XM_PreX 0 //!< Pre Multiply change to current Transformation Matrix +/** @} */ + + +/* Utility objects, not defined in EMF+ spec */ + +/** @brief Used to accumulate data for objects continued over multiple records. + see EMF+ manual 2.3.5.1 +*/ +typedef struct { + char *accum; /**< data accumulates here */ + uint32_t space; /**< bytes allocated */ + uint32_t used; /**< bytes in use */ + int Type; /**< ObjectType enumeration */ + int Id; /**< Object ID */ +} U_OBJ_ACCUM; + +/** @brief Holds EMF+ objects and records in EMF+ file format byte order. +*/ +typedef struct { + char *Data; /**< Buffer that hold's the PseudoObject's data */ + size_t Size; /**< Number of bytes allocated in Data (may be >Used if padding is present) */ + size_t Used; /**< Number of data bytes that are stored in Data */ + uint32_t Type; /**< Type numbers are from manual section: 1.2.3.4 -> 10203040 */ +} U_PSEUDO_OBJ; + +/** @brief DoublePseudoObject holds pairs of PseudoObjects. Used for constructing paths along with their types. + The data stored in the PsuedoObjects maintains LittleEndian-ness, as expected in the final file. + The type is U_RAW_OID, and there is no elements count at the beginning of Data +*/ +typedef struct { + uint32_t Elements; /**< Element count, applies to both PseudoObjects */ + U_PSEUDO_OBJ *poPoints; /**< Points in path */ + U_PSEUDO_OBJ *poTypes; /**< Types of points in path */ +} U_DPSEUDO_OBJ; + +/** @brief Serializer description records. + +An array of these are passed to U_PMF_SERIAL_set() to construct EMF+ objects from their component parts. +The U_PMF_SERIAL_set() function should not ever be called directly by end user code. +*/ +typedef struct { + const void *Ptr; /**< Pointer to the first byte of the data field. + Each data field is an array of a basic type of Units + bytes repeated Reps times */ + size_t Units; /**< Number of bytes in each unit of each data field. */ + size_t Reps; /**< MNumber of repeats of Units in eah data field. */ + int TE; /**< (Target Endian). Only relevant for Units of 2 or 4*/ +} U_SERIAL_DESC; + +/** @brief FontInfoParams hold font information that is needed by U_PMR_drawstring so that it can + place text on the baseline. This must be extracted from the font file using + an appropriate utility. (See testbed_pmf.c for a table of these values for some + common fonts.) +*/ +typedef struct { + char *name; /**< Font name (like "Arial") */ + int Ascent; /**< in Font units (positive) */ + int Descent; /**< in Font units (negative) */ + int LineGap; /**< in Font units (positive) */ + int EmSize; /**< Y extent of Em square, usually 2048 */ + int yMax; /**< in Font units (positive) */ + int yMin; /**< in Font units (negative) */ +} U_FontInfoParams; + + + +/* EMF+ objects */ + +/** @brief EMF+ manual 2.2.1.1, Microsoft name: EmfPlusBrush Object + +variable part of object follows structure: + uint32_t Data[]; // one of the 5 types of Brush data (2.2.2 20, 24, 29, 43, or 45) +*/ +typedef struct { + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Type; //!< BrushType Enumeration +} U_PMF_BRUSH; + +/** @brief EMF+ manual 2.2.1.2, Microsoft name: EmfPlusCustomLineCap Object */ +typedef struct { +/*@{*/ + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Type; //!< BrushType Enumeration +/* variable part of object, not part of structure + uint32_t Data[]; //!< one of the 2 types of Linecap data (2.2.2 12, 13) +*/ +/*@}*/ +} U_PMF_CUSTOMLINECAP; + +/** @brief EMF+ manual 2.2.1.3, Microsoft name: EmfPlusFont Object */ +typedef struct { +/*@{*/ + uint32_t Version; //!< EmfPlusGraphicsVersion object + U_FLOAT EmSize; //!< em size in units of SizeUnit + uint32_t SizeUnit; //!< UnitType enumeration + int32_t FSFlags; //!< FontStyle flags + uint32_t Reserved; //!< ignored + uint32_t Length; //!< Number of Unicode Characters in FamilyName +/* variable part of object, not part of structure + uint16_t FamilyName[]; //!< Unicode (UTF-16LE) name of font family +*/ +/*@}*/ +} U_PMF_FONT; + +/** @brief EMF+ manual 2.2.1.4, Microsoft name: EmfPlusImage Object */ +typedef struct { +/*@{*/ + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Type; //!< ImageDataType Enumeration +/* variable part of object, not part of structure + uint32_t Data[]; //!< one of the 2 types of image data (2.2.2 2 or 27) +*/ +/*@}*/ +} U_PMF_IMAGE; + +/** @brief EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object, out of order, needed for 2.2.1.5 */ +typedef struct { +/*@{*/ + uint8_t Blue; //!< Blue color (0-255) + uint8_t Green; //!< Green color (0-255) + uint8_t Red; //!< Red color (0-255) + uint8_t Alpha; //!< Alpha (0-255) +/*@}*/ +} U_PMF_ARGB; + +/** @brief EMF+ manual 2.2.1.5, Microsoft name: EmfPlusImageAttributes Object */ +typedef struct { + /*@{*/ + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Reserved1; //!< ignored + uint32_t WrapMode; //!< WrapMode object + U_PMF_ARGB ClampColor; //!< EmfPlusARGB object + int32_t ObjectClamp; //!< ObjectClamp Identifiers + uint32_t Reserved2; //!< ignored +/*@}*/ +} U_PMF_IMAGEATTRIBUTES; + +/** @brief EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object */ +typedef struct { +/*@{*/ + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Count; //!< points and point types in this object + uint16_t Flags; //!< PathPoint Flags +/* variable part of object, not part of structure + points array of points like: + U_PPF_P U_PPF_C Type + 1 x U_PMF_POINTR + 0 1 U_PMF_POINT + 0 0 U_PMF_POINTF + types array of:. + U_PPF_R Type + 1 U_PMF_PATHPOINTTYPERLE and/or U_PMF_PATHPOINTTYPE + 0 U_PMF_PathPointType (only) + alignment padding up to 3 bytes +*/ +/*@}*/ +} U_PMF_PATH; + +/** @brief EMF+ manual 2.2.1.7, Microsoft name: EmfPlusPen Object */ + +typedef struct { + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t type; //!< must be zero +/* variable part of object, not part of structure + U_PMF_PENDATA pen + U_PMF_BRUSH brush +*/ +} U_PMF_PEN; + +/** @brief EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object, out of order, needed for 2.2.1.8 */ +typedef struct { + uint32_t Type; //!< RegionNodeDataType +/* variable part of object, not part of structure, will be absent in object for some types + data data is a tree made up of some combination of these objects + U_PMF_REGIONNODEPATH 2.2.2.42 terminal node + U_PMF_RECTF 2.2.2.39 terminal node + U_PMF_REGIONNODECHILDNODES 2.2.2.41 non-terminal node +*/ +} U_PMF_REGIONNODE; + +/** @brief EMF+ manual 2.2.1.8, Microsoft name: EmfPlusRegion Object */ +typedef struct { + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Elements; //!< Number of members in Nodes array +/* variable part of object, not part of structure, will be absent in object for some types + U_PMF_REGIONNODE Nodes[1]; //!< Nodes defining region +*/ +} U_PMF_REGION; + +/** @brief EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier Object, out of order, needed for 2.2.1.9 + +Bit fields are not used in structs in this implementation, these are serialized/deserialized in +the corresponding routines. Bitfields in the FILE (LITTLE endian here, manual uses BIG endian) are: + int SubLId : 6; Example: code for USA + int PriLId : 10; Example: code for English + +This type is defined as 16 bits in the manual section, but it is only ever used as part of a 32 bit field! +*/ +typedef uint32_t U_PMF_LANGUAGEIDENTIFIER; + +/** @brief EMF+ manual 2.2.1.9, Microsoft name: EmfPlusStringFormat Object */ +typedef struct { + uint32_t Version; //!< EmfPlusGraphicsVersion object + uint32_t Flags; //!< StringFormat flags + U_PMF_LANGUAGEIDENTIFIER + Language; //!< String's Language + uint32_t StringAlignment; //!< StringAlignment enumeration. + uint32_t LineAlign; //!< StringAlignment enumeration. + uint32_t DigitSubstitution; //!< StringDigitSubstitution enumeration + U_PMF_LANGUAGEIDENTIFIER + DigitLanguage; //!< Digit's Language (overrides Language, above) + U_FLOAT FirstTabOffset; //!< the number of spaces to the first tab stop. + int32_t HotkeyPrefix; //!< HotkeyPrefix enumeration + U_FLOAT LeadingMargin; //!< space before starting position (text) of a string + U_FLOAT TrailingMargin; //!< space after last position (text) of a string + U_FLOAT Tracking; //!< horizontal space alotted per character/font specification per character + uint32_t Trimming; //!< StringTrimming enumeration + uint32_t TabStopCount; //!< Number of tab stops in data field. + uint32_t RangeCount; //!< Number of U_PMF_CHARACTERRANGE objects in data field. +/* variable part of object, not part of structure. + U_PMF_STRINGFORMATDATA data + + Note that U_PMF_STRINGFORMATDATA has no struct as it is entirely variable + and the size of the two fields in it are specified by the two preceding fields in this object type. +*/ +} U_PMF_STRINGFORMAT; + +/** U_PMF_ARGB EMF+ manual 2.2.2.1, Microsoft name: EmfPlusARGB Object, defined above, before 2.2.1.6*/ + +/** @brief EMF+ manual 2.2.2.2, Microsoft name: EmfPlusBitmap Object */ +typedef struct { + int32_t Width; //!< Width in pixels + int32_t Height; //!< Height in pixels + int32_t Stride; //!< length in bytes of 1 scan line (multiple of 4) + uint32_t PxFormat; //!< PixelFormat enumeration + uint32_t Type; //!< BitmapDataType enumeration (section 2.1.1.2). +/* variable part of object, not part of structure. + (various types) BitmapData //!< is either an U_PMF_BITMAPDATA or U_PMF_COMPRESSEDIMAGE object +*/ +} U_PMF_BITMAP; + +/** U_PMF_BITMAPDATA EMF+ manual 2.2.2.3, Microsoft name: EmfPlusBitmapData Object +U_PMF_BITMAPDATA is an entirely variable object, there is no corresponding struct. It consists of + + Colors U_PMF_PALETTE object + PixelData An array of bytes, meaning depends on fields in U_PMF_BITMAP object and the PixelFormat enumeration. + +*/ + +/** @brief EMF+ manual 2.2.2.4, Microsoft name: EmfPlusBlendColors Object + For Pattern field of U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA +*/ +typedef struct { + uint32_t Elements; //!< members in each array +/* variable part of object, not part of structure. + U_FLOAT Positions //!< positions along gradient line. The first position MUST be 0.0 and the last MUST be 1.0. + U_PMF_ARGB Colors //!< colors at positions on gradient line +*/ +} U_PMF_BLENDCOLORS; + +/** @brief EMF+ manual 2.2.2.5, Microsoft name: EmfPlusBlendFactors Object */ +typedef struct { + uint32_t Elements; //!< Members in each array +/* variable part of object, not part of structure. + U_FLOAT Positions //!< positions along gradient line. The first position MUST be 0.0 and the last MUST be 1.0. + U_FLOAT Factors //!< blending factors, 0.0->1.0 values, inclusive +*/ +} U_PMF_BLENDFACTORS; + +/** @brief EMF+ manual 2.2.2.6, Microsoft name: EmfPlusBoundaryPathData Object */ +typedef struct { + int32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_PATH Data //!< Boundary of the brush +*/ +} U_PMF_BOUNDARYPATHDATA; + +/** @brief EMF+ manual 2.2.2.7, Microsoft name: EmfPlusBoundaryPointData Object */ +typedef struct { + int32_t Elements; //!< Members in the array +/* variable part of object, not part of structure. + U_PMF_POINTF Points //!< Boundary of the brush +*/ +} U_PMF_BOUNDARYPOINTDATA; + +/** @brief EMF+ manual 2.2.2.8, Microsoft name: EmfPlusCharacterRange Object */ +typedef struct { + int32_t First; //!< First position in range + int32_t Length; //!< Range length +} U_PMF_CHARACTERRANGE; + +/** @brief EMF+ manual 2.2.2.9, Microsoft name: EmfPlusCompoundLineData Object +Compound lines are pens that draw several parallel lines at once. The data here +alternates (sub)line width (as fraction of total width and gaps (also as fraction +of total width). +*/ +typedef struct { + int32_t Elements; //!< Members in the array +/* variable part of object, not part of structure. + U_FLOAT Data //!< Line or gap width (0.0 <-> 1.0, fraction of total line width ) +*/ +} U_PMF_COMPOUNDLINEDATA; + +/** @brief EMF+ manual 2.2.2.10, Microsoft name: EmfPlusCompressedImage Object +Holds an EXIF, GIF, JFIF, PNG, or TIFF image. + For U_PMF_BITMAP BitmapData field + + object has no assocated struct! + U_PMF_COMPRESSEDIMAGE +*/ + +/** @brief EMF+ manual 2.2.2.11, Microsoft name: EmfPlusCustomEndCapData Object */ +typedef struct { + int32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_CUSTOMLINECAP Data //!< Description of linecap +*/ +} U_PMF_CUSTOMENDCAPDATA; + +/** @brief EMF+ manual 2.2.2.12, Microsoft name: EmfPlusCustomLineCapArrowData Object */ +typedef struct { + U_FLOAT Width; //!< Arrow cap width (is multiplied by line width before draw) + U_FLOAT Height; //!< Arrow cap length (is multiplied by line width before draw) + U_FLOAT MiddleInset; //!< Pixels between outer edge and filled region + uint32_t FillState; //!< If set, fill, otherwise, only border + uint32_t StartCap; //!< LineCap enumeration (type of cap) + uint32_t EndCap; //!< LineCap enumeration + uint32_t Join; //!< LineJoin enumeration + U_FLOAT MiterLimit; //!< Maximum (miter length / line width) + U_FLOAT WidthScale; //!< Scale for U_PMF_CUSTOMLINECAP object + U_FLOAT FillHotSpot[2]; //!< must be 0.0, 0.0 + U_FLOAT LineHotSpot[2]; //!< must be 0.0, 0.0 +} U_PMF_CUSTOMLINECAPARROWDATA; + +/** @brief EMF+ manual 2.2.2.13, Microsoft name: EmfPlusCustomLineCapData Object */ +typedef struct { + uint32_t Flags; //!< CustomLineCapData flags + uint32_t Cap; //!< LineCap enumeration (type of cap) + U_FLOAT Inset; //!< Distance line cap start -> line end + uint32_t StartCap; //!< LineCap enumeration + uint32_t EndCap; //!< LineCap enumeration + uint32_t Join; //!< LineJoin enumeration + U_FLOAT MiterLimit; //!< Maximum (miter length / line width) + U_FLOAT WidthScale; //!< Scale for U_PMF_CUSTOMLINECAP object + U_FLOAT FillHotSpot[2]; //!< must be 0.0, 0.0 + U_FLOAT LineHotSpot[2]; //!< must be 0.0, 0.0 +/* variable part of object, not part of structure. + U_PMF_CUSTOMLINECAPOPTIONALDATA Data //!< meaning determined by Flags +*/ +} U_PMF_CUSTOMLINECAPDATA; + +/** U_PMF_CUSTOMLINECAPOPTIONALDATA EMF+ manual 2.2.2.14, Microsoft name: EmfPlusCustomLineCapOptionalData Object + + object has no assocated struct! + + U_PMF_FILLPATHO FillData; //!< path to fill (optional) + U_PMF_LINEPATH LineData; //!< path to stroke (optional) +*/ + +/** @brief EMF+ manual 2.2.2.15, Microsoft name: EmfPlusCustomStartCapData Object */ +typedef struct { + int32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_CUSTOMLINECAP Data //!< Description of linecap +*/ +} U_PMF_CUSTOMSTARTCAPDATA; + +/** @brief EMF+ manual 2.2.2.16, Microsoft name: EmfPlusDashedLineData Object */ +typedef struct { + int32_t Elements; //!< Elements in Data +/* variable part of object, not part of structure. + U_FLOAT Data; //!< Array of lengths of dashes and spaces +*/ +} U_PMF_DASHEDLINEDATA; + +/** @brief EMF+ manual 2.2.2.17, Microsoft name: EmfPlusFillPath Object +Note: U_PMF_FILLPATHOBJ is the object, U_PMF_FILLPATH is the file record +*/ + +typedef struct { + int32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_PATH Data; //!< Path specification +*/ +} U_PMF_FILLPATHO; + +/** @brief EMF+ manual 2.2.2.18, Microsoft name: EmfPlusFocusScaleData Object + for U_PMF_PATHGRADIENTBRUSHOPTIONALDATA data field + +Used with path gradient brushes. May be used to expand the center color +of a gradient, which would otherwise only be found at the center point. +The expanded area is the width, height X scale factor, but in no case +less than 1 pixel. + +*/ +typedef struct { + uint32_t Count; //!< must be 2 + U_FLOAT ScaleX; //!< value 0.0 <-> 1.0 + U_FLOAT ScaleY; //!< value 0.0 <-> 1.0 +} U_PMF_FOCUSSCALEDATA; + +/** @brief EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object + +Bit fields are not used in structs in this implementation, these are serialized/deserialized in +the corresponding routines. Bitfields in the FILE (LITTLE endian here, manual uses BIG endian) are: + unsigned int GrfVersion : 12; GraphicsVersion enumeration + unsigned int Signature : 20; Must be U_GFVR_PMF (0xDBC01) + @{ +*/ +typedef uint32_t U_PMF_GRAPHICSVERSION; //!< EMF+ manual 2.2.2.19, Microsoft name: EmfPlusGraphicsVersion Object +/** @} */ + +/** @brief EMF+ manual 2.2.2.20, Microsoft name: EmfPlusHatchBrushData Object */ +typedef struct { + uint32_t Style; //!< HatchStyle enumeration + U_PMF_ARGB Foreground; //!< Hatch pattern line color + U_PMF_ARGB Background; //!< Hatch pattern bkground color +} U_PMF_HATCHBRUSHDATA; + +/** \defgroup U_PMF_Int7 PMF 7 bit signed integer + @brief EMF+ manual 2.2.2.21, Microsoft name: EmfPlusInteger7 Object + + bit 7 U_INT7 Clear in Integer7 objects + bits 0-6 7 bit signed integer value + @{ +*/ +#define U_TEST_INT7 0x80 //!< This bit is clear in Integer7 objects. +#define U_SIGN_INT7 0x40 //!< Sign bit on an Integer7 object. +#define U_MASK_INT7 0x7F //!< xMask to retrieve integer7 bits. +/** @} */ + +/** \defgroup U_PMF_Int15 PMF 15 bit signed integer + @brief EMF+ manual 2.2.2.22, Microsoft name: EmfPlusInteger15 Object + + bit 15 U_INT15 Set in Integer15 objects + bits 0-15 15 bit signed integer value + + This is the one data type that really does seem to be stored into the file in Big Endian order. + It has to be this way because the bit that determines if data is int7 or int15 must be in the first byte + the parser sees, and that byte is the high order byte. + @{ +*/ +#define U_TEST_INT15 0x8000 //!< This bit is set in Integer15 objects. +#define U_SIGN_INT15 0x4000 //!< Sign bit on an Integer15 object. +#define U_MASK_INT15 0x7FFF //!< Mask to retrieve integer15 bits. +/** @} */ + +/* EMF+ manual 2.2.2.23, Microsoft name: EmfPlusLanguageIdentifier Object, defined above, before 2.2.1.9 */ + +/** @brief EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object, out of order, needed for 2.2.2.24 */ +typedef struct { + U_FLOAT X; //!< UL X value + U_FLOAT Y; //!< UL Y value + U_FLOAT Width; //!< Width + U_FLOAT Height; //!< Height +} U_PMF_RECTF; + +/** @brief EMF+ manual 2.2.2.24, Microsoft name: EmfPlusLinearGradientBrushData Object +Manual says that Reserved1 and Reserved2 must be ignored. In practice if Reserved1 is not set to StartColor +and Reserved2 is not set to EndColor, then XP Preview will not display the gradient. +*/ +typedef struct { + uint32_t Flags; //!< BrushData flags + int32_t WrapMode; //!< WrapMode enumeration + U_PMF_RECTF RectF; //!< UL=start, LR=end of gradient + U_PMF_ARGB StartColor; //!< Gradient start color + U_PMF_ARGB EndColor; //!< Gradient end color + uint32_t Reserved1; //!< ignore + uint32_t Reserved2; //!< ignore +/* variable part of object, not part of structure. + U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA data; //!< presence and meaning depend on Flags field +*/ +} U_PMF_LINEARGRADIENTBRUSHDATA; + +/** @brief EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object, out of order, needed for 2.2.2.25 */ +typedef struct { + U_FLOAT m11; //!< Rotation matrix m11 element + U_FLOAT m12; //!< Rotation matrix m12 element + U_FLOAT m21; //!< Rotation matrix m21 element + U_FLOAT m22; //!< Rotation matrix m22 element + U_FLOAT dX; //!< Translation in X + U_FLOAT dY; //!< Translation in Y +} U_PMF_TRANSFORMMATRIX; + +/** NOT DOCUMENTED. Encountered in actual EmfPlusLinearGradientBrushOptionalData Object made by PowerPoint 2003. This + structure is needed for the next. */ +typedef struct { + U_FLOAT m11; //!< Rotation matrix m11 element + U_FLOAT m12; //!< Rotation matrix m12 element + U_FLOAT m21; //!< Rotation matrix m21 element + U_FLOAT m22; //!< Rotation matrix m22 element +} U_PMF_ROTMATRIX; + +/** @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. + (various) pattern; //!< Presence and meaning depend on Flags field, see below + + Flag values + U_BD_PresetColors U_BD_BlendFactorsH U_BD_BlendFactorsV pattern(s) present? + 0 0 0 none + 1 0 0 U_PMF_BLENDCOLORS + 0 1 0 U_PMF_BLENDFACTORS + 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 { + int32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_PATH Data; //!< Outline path +*/ +} U_PMF_LINEPATH; + +/** @brief EMF+ manual 2.2.2.27, Microsoft name: EmfPlusMetafile Object */ +typedef struct { + uint32_t Type; //!< MetaFileDatatype enumeration + uint32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_IMAGE Data; //!< Various types of data, like an EMF metafile, WMF metafile, another EMF+ metafile +*/ +} U_PMF_METAFILE; + +/** @brief EMF+ manual 2.2.2.28, Microsoft name: EmfPlusPalette Object */ +typedef struct { + uint32_t Flags; //!< PaletteStyle flags + uint32_t Elements; //!< elements in Data +/* variable part of object, not part of structure. + U_PMF_ARGB Data; //!< Palette data (array of colors) +*/ +} U_PMF_PALETTE; + +/** @brief EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object, out of order, needed for 2.2.2.29 */ +typedef struct { + U_FLOAT X; //!< UL X value + U_FLOAT Y; //!< UL Y value +} U_PMF_POINTF; + +/** @brief EMF+ manual 2.2.2.29, Microsoft name: EmfPlusPathGradientBrushData Object */ +typedef struct { + uint32_t Flags; //!< BrushData flags + int32_t WrapMode; //!< WrapMode enumeration + U_PMF_ARGB CenterColor; //!< Gradient center color + U_PMF_POINTF Center; //!< Center coordinates + uint32_t Elements; //!< Number of elements in gradient (not counting center) +/* variable part of object, not part of structure. + U_PMF_ARGB Gradient; //!< Color Gradient with Elements members + (varies) Boundary; //!< U_PMF_BOUNDARYPATHDATA object if BrushDataPath bit set in Flag, else U_PMF_BOUNDARYPOINTDATA object + U_PMF_GRADIENTBRUSHOPTIONALDATA data; //!< exact composition depends on Flags +*/ +} U_PMF_PATHGRADIENTBRUSHDATA; + +/** EMF+ manual 2.2.2.30, Microsoft name: EmfPlusPathGradientBrushOptionalData Object + for U_PMF_PATHGRADIENTNBRUSHDATA data field +*/ +/* Entire thing is variable or optional. +typedef struct { + U_PMF_TRANSFORMMATRIX Matrix; //!< Optional Transformation matrix + U_PMF_BLENDCOLORS Pattern; //!< presence and meaning depend on Flags field + Flag values + U_BD_PresetColors U_BD_BlendFactorsH pattern? + 0 0 none + 1 0 U_PMF_BLENDCOLORS + 0 1 U_PMF_BLENDFACTORS + U_PMF_FOCUSSSCALEDATA data //!< Present if U_BD_FocusScales bit set in Flags in U_PMF_PATHGRADIENTNBRUSHDATA object +} U_PMF_PATHGRADIENTBRUSHOPTIONALDATA; +*/ + +/** \defgroup U_PMF_PPTYPE PMF Path Point Types + @brief EMF+ manual 2.2.2.31, Microsoft name: EmfPlusPathPointType Object + +Bitfields in the FILE (LITTLE endian here, manual uses BIG endian) are: + bits 4-7 PathPointType flags + bits 0-3 PathPointType enumeration +*/ + +/** \defgroup U_PMF_PPTYPERLE PMF Run Length Encoded Path Point Types + @brief EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE Object + +U_PMF_PATHPOINTTYPERLE fields specify point types in a path where the path is Run Length Encoded. +Bit fields are not used in structs in this implementation, these are serialized/deserialized in +the corresponding routines. Bitfields in the FILE (LITTLE endian here, manual uses BIG endian) are: + bit 15 Set: Bezier curve; Clear: straight line + bit 14 ignored + bits 8-13 Run count + bits 0-7 PathPointType enumeration + @{ +*/ +typedef uint16_t U_PMF_PATHPOINTTYPERLE; //!< EMF+ manual 2.2.2.32, Microsoft name: EmfPlusPathPointTypeRLE Object +/** @} */ + +/** @brief EMF+ manual 2.2.2.33, Microsoft name: EmfPlusPenData Object + +Variable part of object follows structure: + U_PMF_PENOPTIONALDATA data; Optional pen data, exact composition depends on Flags +*/ +typedef struct { + uint32_t Flags; //!< PenData flags + uint32_t Unit; //!< UnitType enumeration + U_FLOAT Width; //!< Width in units set by Unit +} U_PMF_PENDATA; + +/** @brief EMF+ manual 2.2.2.34, Microsoft name: EmfPlusPenOptionalData Object + +Every part of this object is variable or optional, there is no corresponding struct + + Present if Flag What is it + U_PMF_TRANSFORMMATRIX Matrix //!< U_PD_Transform Transformation matrix + int32_t StartCap //!< U_PD_StartCap LineCapType enumeration + int32_t EndCap //!< U_PD_EndCap LineCapType enumeration + uint32_t Join //!< U_PD_Join LineJoinType enumeration + U_FLOAT MiterLimit //!< U_PD_MiterLimit Maximum (miter length / line width) + int32_t Style //!< U_PD_LineStyle LineStyle enumeration + int32_t DLCap //!< U_PD_DLCap DashedLineCapType enumeration + U_FLOAT DLOffset //!< U_PD_DLOffset Distance line start to first dash start + U_PMF_DASHEDLINEDATA DLData //!< U_PD_DLData Dash and space widths + int32_t PenAlignment //!< U_PD_NonCenter PenAlignment enumeration + U_PMF_COMPOUNDLINEDATA CLData //!< U_PD_CompoundLineData Compount Line (parallel lines drawn instead of one) + U_PMF_CUSTOMSTARTCAPDATA CSCapData //!< U_PD_CustomStartCap Custom start cap + U_PMF_CUSTOMENDCAPDATA CECapData //!< U_PD_CustomEndCap Custom end cap + */ + +/** @brief EMF+ manual 2.2.2.35, Microsoft name: EmfPlusPoint Object */ +typedef struct { + int16_t X; //!< X coordinate + int16_t Y; //!< Y coordinate +} U_PMF_POINT; + +/** U_PMF_POINTF EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object, defined above, before 2.2.2.29 */ + +/** U_PMF_POINTR EMF+ manual 2.2.2.37, Microsoft name: EmfPlusPointR Object + For U_PMF_DRAWBEZIERS data field (optionally). + Both parts of this object are variable, there is no corresponding struct. + Any combination of the two allowed types of integer is valid. + + (varies) X; //!< U_PMF_INTEGER7 or U_PMF_INTEGER15 + (varies) Y; //!< U_PMF_INTEGER7 or U_PMF_INTEGER15 + +*/ + +/** @brief EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object */ +typedef struct { + int16_t X; //!< UL X value + int16_t Y; //!< UL Y value + int16_t Width; //!< Width + int16_t Height; //!< Height +} U_PMF_RECT; + +/** U_PMF_RECTF EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object, defined above, before 2.2.2.24 */ + +/** U_PMF_REGIONNODE EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object, defined above, before 2.2.1.8 */ + +/** U_PMF_REGIONNODECHILDNODES EMF+ manual 2.2.2.41, Microsoft name: EmfPlusRegionNodeChildNodes Object + For U_PMF_REGIONNODE data field (optionally). + Both parts of this object are variable, there is no corresponding struct. + U_PMF_REGIONNODE Left; //!< Left child + U_PMF_REGIONNODE Right; //!< Right child +*/ + +/** @brief EMF+ manual 2.2.2.42, Microsoft name: EmfPlusRegionNodePath Object */ +typedef struct { + int32_t Size; //!< Bytes in Data +/* variable part of object, not part of structure. + U_PMF_PATH Data; //!< Boundary of region node +*/ +} U_PMF_REGIONNODEPATH; + +/** @brief EMF+ manual 2.2.2.43, Microsoft name: EmfPlusSolidBrushData Object + For U_PMF_BRUSH data field (one type of brush) +*/ +typedef struct { + U_PMF_ARGB Color; //!< Color of brush +} U_PMF_SOLIDBRUSHDATA; + +/** U_PMF_STRINGFORMATDATA EMF+ manual 2.2.2.44, Microsoft name: EmfPlusStringFormatData Object + Both parts of this object are variable and optional, there is no corresponding struct + U_FLOAT TabStops[]; //!< Array of tabstop locations + U_PMF_CHARACTERRANGE CharRange[]; //!< Array of character ranges in the text +*/ + +/** @brief EMF+ manual 2.2.2.45, Microsoft name: EmfPlusTextureBrushData Object */ +typedef struct { + uint32_t Flags; //!< BrushData flags + int32_t WrapMode; //!< WrapMode enumeration +/* variable part of object, not part of structure. + U_PMF_TEXTUREBRUSHOPTIONALDATA data; //!< Optional texture data +*/ +} U_PMF_TEXTUREBRUSHDATA; + +/** U_PMF_TEXTUREBRUSHOPTIONALDATA EMF+ manual 2.2.2.46, Microsoft name: EmfPlusTextureBrushOptionalData Object + +Every part of this object is variable or optional, there is no corresponding struct + + U_PMF_TRANSFORMMATRIX Matrix; Transformation matrix, present if Flag BrushDataTransform is set. + U_PMF_IMAGE Image Image that contains the texture. Present if the PMR record that includes this object still has space + for an U_PMF_IMAGE after all the other variable and optional data + within it has been accounted for. +*/ + +/** U_PMF_TRANSFORMMATRIX EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object, defined above, before 2.2.2.25 */ + +/** common structure present at the beginning of all(*) EMF+ records */ +typedef struct { + uint16_t Type; //!< Recordtype enumeration (what this record is) + uint16_t Flags; //!< Flags (meaning varies by record type) + uint32_t Size; //!< Bytes in record, including this struct (will be a multiple of 4) + uint32_t DataSize; //!< Bytes of data that follow, may not be a multiple of 4. +} U_PMF_CMN_HDR; + +/** These are the Image Effect Objects 2.2.3.* They specify parameters for "filters" that may be applied to bitmaps. */ + +/** @brief EMF+ manual 2.2.3.1, Microsoft name: BlurEffect Object */ +typedef struct { + U_FLOAT Radius; //!< Blur radius in pixels + uint32_t ExpandEdge; //!< 1: expand bitmap by Radius; 0: bitmap size unchanged +} U_PMF_IE_BLUR; + + +/** @brief EMF+ manual 2.2.3.2, Microsoft name: BrightnessContrastEffect Object */ +typedef struct { + int32_t Brightness; //!< -255 to 255, 0 is unchanged, positive increases, negative decreases + int32_t Contrast; //!< -100 to 100, 0 is unchanged, positive increases, negative decreases +} U_PMF_IE_BRIGHTNESSCONTRAST; + +/** @brief EMF+ manual 2.2.3.3, Microsoft name: ColorBalanceEffect Object */ +typedef struct { + int32_t CyanRed; //!< -100 to 100, 0 is unchanged, positive increases Red & decreases Cyan, negative is opposite + int32_t MagentaGreen; //!< -100 to 100, 0 is unchanged, positive increases Green & decreases Magenta, negative is opposite + int32_t YellowBlue; //!< -100 to 100, 0 is unchanged, positive increases Blue & decreases Yellow, negative is opposite +} U_PMF_IE_COLORBALANCE; + +/** @brief EMF+ manual 2.2.3.4, Microsoft name: ColorCurveEffect Object + Adjust Range + Exposure -255 to 255, 0 is unchanged + Density -255 to 255, 0 is unchanged + Contrast -100 to 100, 0 is unchanged + Highlight -100 to 100, 0 is unchanged + Shadow -100 to 100, 0 is unchanged + WhiteSaturation 0 to 255 + BlackSaturation 0 to 255 +*/ +typedef struct { + uint32_t Adjust; //!< CurveAdjustment enumeration + uint32_t Channel; //!< CurveChannel enumeration + int32_t Intensity; //!< adjustment to apply. "Adjust" determines what field this is and range values. +} U_PMF_IE_COLORCURVE; + +/** @brief EMF+ manual 2.2.3.5, Microsoft name: ColorLookupTableEffect Object */ +typedef struct { + uint8_t BLUT[256]; //!< Blue color lookup table + uint8_t GLUT[256]; //!< Green color lookup table + uint8_t RLUT[256]; //!< Red color lookup table + uint8_t ALUT[256]; //!< Alpha color lookup table +} U_PMF_IE_COLORLOOKUPTABLE; + +/** @brief EMF+ manual 2.2.3.6, Microsoft name: ColorMatrixEffect Object */ +typedef struct { + U_FLOAT M[5][5]; //!< 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] +} U_PMF_IE_COLORMATRIX; + +/** @brief EMF+ manual 2.2.3.7, Microsoft name: HueSaturationLightnessEffect Object */ +typedef struct { + int32_t Hue; //!< -180 to 180, 0 is unchanged + int32_t Saturation; //!< -100 to 100, 0 is unchanged + int32_t Lightness; //!< -100 to 100, 0 is unchanged +} U_PMF_IE_HUESATURATIONLIGHTNESS; + +/** @brief EMF+ manual 2.2.3.8, Microsoft name: LevelsEffect Object */ +typedef struct { + int32_t Highlight; //!< 0 to 100, 100 is unchanged + int32_t Midtone; //!< -100 to 100, 0 is unchanged + int32_t Shadow; //!< 0 to 100, 0 is unchanged +} U_PMF_IE_LEVELS; + +/** @brief EMF+ manual 2.2.3.9, Microsoft name: RedEyeCorrectionEffect Object */ +typedef struct { + int32_t Elements; //!< Number of members in Rects +/* variable part of object, not included in structure + U_RECTL Rects[]; //!< Array of rectangular area(s) to apply red eye correction +*/ +} U_PMF_IE_REDEYECORRECTION; + +/** @brief EMF+ manual 2.2.3.10, Microsoft name: SharpenEffect Object */ +typedef struct { + U_FLOAT Radius; //!< Sharpening radius in pixels + int32_t Sharpen; //!< 0 to 100, 0 is unchanged +} U_PMF_IE_SHARPEN; + +/** @brief EMF+ manual 2.2.3.11, Microsoft name: TintEffect Object */ +typedef struct { + int32_t Hue; //!< -180 to 180, [positive==clockwise] rotation in degrees starting from blue + int32_t Amount; //!< -100 [add black] to 100[add white], 0 is unchanged. Change in hue on specified axis +} U_PMF_IE_TINT; + +/* ************************** EMF+ Records ******************************** */ + +/** @brief EMF+ manual 2.3.1.1, Microsoft name: EmfPlusOffsetClip Record, Index 0x35 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags) + U_FLOAT dX; //!< horizontal translation offset to apply to clipping region + U_FLOAT dY; //!< vertical translation offset to apply to clipping region +} U_PMF_OFFSETCLIP; + +/** @brief U_PMF_RESETCLIP EMF+ manual 2.3.1.2, Microsoft name: EmfPlusResetClip Record, Index 0x31 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags) +} U_PMF_RESETCLIP; + +/** @brief EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath Record, Index 0x33 + +flags (LITTLE endian here, manual uses BIG endian) + bits 8-11 CombineMode enumeration + bits 0-7 Index of an U_PMF_PATH object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETCLIPPATH; + +/** @brief EMF+ manual 2.3.1.4, Microsoft name: EmfPlusSetClipRect Record, Index 0x32 + +flags (LITTLE endian here, manual uses BIG endian) + bits 8-11 CombineMode enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_PMF_RECTF Rect; //!< Rectangle used with CombineMode enumeration from Header.Flags +} U_PMF_SETCLIPRECT; + +/** @brief EMF+ manual 2.3.1.5, Microsoft name: EmfPlusSetClipRegion Record, Index 0x34 + + flags (LITTLE endian here, manual uses BIG endian) + bits 12-15 CombineMode enumeration + bits 0-7 Index of an U_PMF_REGION object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETCLIPREGION; + +/** @brief EMF+ manual 2.3.2.1, Microsoft name: EmfPlusComment Record, Index 0x03 + + variable part of record, not included in structure + char data[]; //!< Private data, may be anything +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) +} U_PMF_COMMENT; + +/** @brief EMF+ manual 2.3.3.1, Microsoft name: EmfPlusEndOfFile Record, Index 0x02 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) +} U_PMF_ENDOFFILE; + +/** @brief EMF+ manual 2.3.3.2, Microsoft name: EmfPlusGetDC Record, Index 0x04 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) +} U_PMF_GETDC; + +/** @brief EMF+ manual 2.3.3.3, Microsoft name: EmfPlusHeader Record, Index 0x01 + + flags (LITTLE endian here, manual uses BIG endian) + bit 0 Set indicates "dual mode" EMF+ +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + U_PMF_GRAPHICSVERSION Version; //!< EmfPlusGraphicsVersion object + uint32_t EmfPlusFlags; //!< Reference device 0 bit: set = video device, clear= printer. Ignore all other bits. + uint32_t LogicalDpiX; //!< Horizontal resolution reference device in DPI + uint32_t LogicalDpiY; //!< Vertical resolution reference device in DPI +} U_PMF_HEADER; + +/** @brief EMF+ manual 2.3.4.1, Microsoft name: EmfPlusClear Record, Index 0x09 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + U_PMF_ARGB Color; //!< Erase everything preceding, set background ARGB color. +} U_PMF_CLEAR; + +/** @brief EMF+ manual 2.3.4.2, Microsoft name: EmfPlusDrawArc Record, Index 0x12 + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF + bits 0-7 Index of an U_PMF_PEN object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Start; //!< Start angle, >=0.0, degrees clockwise from 3:00 + U_FLOAT Sweep; //!< Sweep angle, -360<= angle <=360, degrees clockwise from Start +/* variable part of record, not included in structure + U_RECT or U_RECTF Rect; //!< Bounding box for elliptical arc being drawn. +*/ +} U_PMF_DRAWARC; + +/** @brief EMF+ manual 2.3.4.3, Microsoft name: EmfPlusDrawBeziers Record, Index 0x19 + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: int16_t coordinates; Clear: U_FLOAT coordinates (IGNORE if bit 4 is set) + bit 12 U_PPF_P Set: Coordinates are relative; Clear: they are absolute + bits 0-7 Index of an U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + + bit1 bit4 Type of Data + 1 0 U_EMF_POINT + 0 0 U_EMF_POINTF + 0 1 U_EMF_POINTR +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t Elements; //!< Number of members in the Points array +/* + variable part of record, not included in structure + (varies) Points; //!< Points, for type see table above +*/ +} U_PMF_DRAWBEZIERS; + +/** @brief EMF+ manual 2.3.4.4, Microsoft name: EmfPlusDrawClosedCurve Record, Index 0x17 + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: int16_t coordinates; Clear: U_FLOAT coordinates (IGNORE if bit 4 is set) + bit 12 U_PPF_P Set: Coordinates are relative; Clear: they are absolute + bits 0-7 Index of an U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + + bit1 bit4 Type of Data + 1 0 U_EMF_POINT + 0 0 U_EMF_POINTF + 0 1 U_EMF_POINTR + +Curve is a cardinal spline. +References sent by MS support: + +http://alvyray.com/Memos/CG/Pixar/spline77.pdf +http://msdn.microsoft.com/en-us/library/4cf6we5y(v=vs.110).aspx + +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Tension; //!< Controls splines, 0 is straight line, >0 is curved +/* + variable part of record, not included in structure + (varies) Points; //!< Points, for type see table above +*/ +} U_PMF_DRAWCLOSEDCURVE; + +/** @brief EMF+ manual 2.3.4.5, Microsoft name: EmfPlusDrawCurve Record, Index 0x18 + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: int16_t coordinates; Clear: U_FLOAT coordinates (IGNORE if bit 4 is set) + bits 0-7 Index of an U_PMF_PEN object in the EMF+ object table (0-63, inclusive) + + bit1 Type of Data + 1 U_EMF_POINT + 0 U_EMF_POINTF + +Curve is a cardinal spline, using doubled terminator points to generate curves for the terminal segments. +References sent by MS support: + +http://alvyray.com/Memos/CG/Pixar/spline77.pdf +http://msdn.microsoft.com/en-us/library/4cf6we5y(v=vs.110).aspx +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Tension; //!< Controls splines, 0 is straight line, >0 is curved + uint32_t Offset; //!< Element in Points that is the spline's starting point + uint32_t NSegs; //!< Number of segments + uint32_t Elements; //!< Number of members in Points array +/* + variable part of record, not included in structure + (varies) Points; //!< Points, for type see table above +*/ +} U_PMF_DRAWCURVE; + +/** @brief EMF+ manual 2.3.4.6, Microsoft name: EmfPlusDrawDriverString Record, Index 0x36 + + flags (LITTLE endian here, manual uses BIG endian) +. bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table + bits 0-7 Index of an U_PMF_FONT object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Tension; //!< Controls splines, 0 is straight line, >0 is curved + uint32_t BrushID; //!< Color or index to Brush object, depends on Flags bit0 + uint32_t DSOFlags; //!< DriverStringOptions flags + uint32_t HasMatrix; //!< If 1 record contains a TransformMatrix field, if 0 it does not. + uint32_t Elements; //!< Number of members in Glyphs and Positions array +/* + variable part of record, not included in structure + uint16_t Glyphs; //!< If U_DSO_CmapLookup is set in DSOFlags this is an array + of UTF16LE characters, otherwise, it is an array of indices into the U_PMF_FONT + object indexed by Object_ID in flags. + U_PMF_POINTF Positions; //!< Coordinates of each member of Glyphs. U_DSO_RealizedAdvance set in DSOFlags + Relative then positions are calculated relative to the first glyph which is stored + in Positions, otherwise, all glyph positions are stored in Positions. + U_PMF_TRANSFORMMATRIX Matrix; //!< Transformation to apply to Glyphs & Positions. Present if HasMatrix is 1 +*/ +} U_PMF_DRAWDRIVERSTRING; + +/** @brief EMF+ manual 2.3.4.7, Microsoft name: EmfPlusDrawEllipse Record, Index 0x0F + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF + bits 0-7 Index of an U_PMF_PEN object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +/* + variable part of record, not included in structure + (varies) Rect; //!< Bounding rectangle, data type set by bit1 of Header.Flags +*/ +} U_PMF_DRAWELLIPSE; + +/** @brief EMF+ manual 2.3.4.8, Microsoft name: EmfPlusDrawImage Record, Index 0x1A + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: DstRect is U_PMF_RECT; Clear: DstRect is U_PMF_RECTF + bits 0-7 Index of an U_PMF_Image object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t ImgAttrID; //!< EmfPlusImageAttributes object + int32_t SrcUnit; //!< UnitType enumeration + U_PMF_RECTF SrcRect; //!< Region of image +/* + variable part of record, not included in structure + (varies) DstRect; //!< Destination rectangle for image. Type controlled by bit1 of Header.Flags +*/ +} U_PMF_DRAWIMAGE; + +/** @brief EMF+ manual 2.3.4.9, Microsoft name: EmfPlusDrawImagePoints Record, Index 0x1B + + flags (LITTLE endian here, manual uses BIG endian) + bit 14 U_PPF_C Set: Points is U_PMF_POINT; Clear: Points is U_PMF_POINTF + bit 13 U_PPF_E Set: effect from previous U_PMF_SERIALIZABLEOBJECT record will be applied; Clear: no effect applied + bit 11 U_PPF_P Set: Points has relative coordinates; Clear: Points has absolute coordinates + bits 0-7 Index of an U_PMF_Image object in the EMF+ object table (0-63, inclusive) + + bit1 bit4 Type of Data + 1 0 U_EMF_POINT + 0 0 U_EMF_POINTF + 0 1 U_EMF_POINTR + + WARNING! Windows XP Preview does not show filter effects, whether or not U_PPF_E is set. They are visible if the EMF+ + file is inserted as an image into PowerPoint. +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t ImgAttrID; //!< EmfPlusImageAttributes object + int32_t SrcUnit; //!< UnitType enumeration + U_PMF_RECTF SrcRect; //!< Region of image + uint32_t Elements; //!< Number of members in Points, must be 3 +/* + variable part of record, not included in structure + (varies) Points; //!< 3 points of a parallelogram. Type from bit1 and bit4 of Header.Flags, see table above +*/ +} U_PMF_DRAWIMAGEPOINTS; + +/** @brief EMF+ manual 2.3.4.10, Microsoft name: EmfPlusDrawLines Record, Index 0x0D + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: Points is U_PMF_POINT; Clear: Points is U_PMF_POINTF + bit 10 U_PPF_D Set: close shape by connecting last point to first; Clear: leave path open + bit 12 U_PPF_P Set: Points has relative coordinates; Clear: Points has absolute coordinates + bits 0-7 Index of an U_PMF_Image object in the EMF+ object table (0-63, inclusive) + + bit1 bit4 Type of Data + 1 0 U_EMF_POINT + 0 0 U_EMF_POINTF + 0 1 U_EMF_POINTR +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t Elements; //!< Number of members in Points +/* + variable part of record, not included in structure + (varies) Points; //!< Sequence of points to connect with line segments. Type from bit1 and bit4 of Header.Flags, see table above +*/ +} U_PMF_DRAWLINES; + +/** @brief EMF+ manual 2.3.4.11, Microsoft name: EmfPlusDrawPath Record, Index 0x15 + + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 Index of an U_PMF_PATH object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t PenID; //!< U_PMF_PEN object in the EMF+ object table (0-63, inclusive) +} U_PMF_DRAWPATH; + +/** @brief EMF+ manual 2.3.4.12, Microsoft name: EmfPlusDrawPie Record, Index 0x0D + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF + bits 0-7 Index of an U_PMF_Pen object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Start; //!< Start angle, >=0.0, degrees clockwise from 3:00 + U_FLOAT Sweep; //!< Sweep angle, -360<= angle <=360, degrees clockwise from Start +/* + variable part of record, not included in structure + U_RECT or U_RECTF Rect; //!< Bounding box for elliptical pie segment being drawn. Type from bit1 of Header.Flags, see above +*/ +} U_PMF_DRAWPIE; + +/** @brief EMF+ manual 2.3.4.13, Microsoft name: EmfPlusDrawRects Record, Index 0x0B + + flags (LITTLE endian here, manual uses BIG endian) + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF + bits 0-7 Index of an U_PMF_Pen object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t Elements; //!< Number of members in Rects +/* + variable part of record, not included in structure + U_RECT or U_RECTF Rects; //!< Array of rectangles to draw. Type from bit1 of Header.Flags, see above +*/ +} U_PMF_DRAWRECTS; + +/** @brief EMF+ manual 2.3.4.14, Microsoft name: EmfPlusDrawString Record, Index 0x1C + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bits 0-7 Index of an U_PMF_FONT object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Flags bit0 + uint32_t FormatID; //!< U_PMF_STRINGFORMAT object in EMF+ Object Table. + uint32_t Length; //!< Number of characters in the string. + U_PMF_RECTF Rect; //!< String's bounding box. +/* + variable part of record, not included in structure + uint16_t String; //!< Array of UFT-16LE unicode characters. +*/ +} U_PMF_DRAWSTRING; + +/** @brief EMF+ manual 2.3.4.15, Microsoft name: EmfPlusFillClosedCurve Record, Index 0x16 + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bit 9 U_PPF_C Set: Points is U_PMF_POINT; Clear: Points is U_PMF_POINTF + bit 10 U_PPF_F Set: winding fill; Clear: alternate fill + bit 12 U_PPF_P Set: Points has relative coordinates; Clear: Points has absolute coordinates + + bit1 bit4 Type of Data + 1 0 U_EMF_POINT + 0 0 U_EMF_POINTF + 0 1 U_EMF_POINTR +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 + U_FLOAT Tension; //!< Controls splines, 0 is straight line, >0 is curved + uint32_t Elements; //!< Number of members in Points +/* + variable part of record, not included in structure + (varies) Points; //!< Sequence of points to connect. Type from bit1 and bit4 of Header.Flags, see table above +*/ +} U_PMF_FILLCLOSEDCURVE; + +/** @brief EMF+ manual 2.3.4.16, Microsoft name: EmfPlusFillEllipse Record, Index 0x0E + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 +/* + variable part of record, not included in structure + U_RECT or U_RECTF Rect; //!< Bounding box for elliptical pie segment being drawn. Type from bit1 of Header.Flags, see above +*/ +} U_PMF_FILLELLIPSE; + +/** @brief EMF+ manual 2.3.4.17, Microsoft name: EmfPlusFillPath Record, Index 0x14 +Note: U_PMF_FILLPATHOBJ is the object, U_PMF_FILLPATH is the file record + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bits 0-7 Index of an U_PMF_PATH object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 +} U_PMF_FILLPATH; + +/** @brief EMF+ manual 2.3.4.18, Microsoft name: EmfPlusFillPie Record, Index 0x10 + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 + U_FLOAT Start; //!< Start angle, >=0.0, degrees clockwise from 3:00 + U_FLOAT Sweep; //!< Sweep angle, -360<= angle <=360, degrees clockwise from Start +/* + variable part of record, not included in structure + U_RECT or U_RECTF Rect; //!< Bounding box for elliptical pie segment being filled. Type from bit1 of Header.Flags, see above +*/ +} U_PMF_FILLPIE; + +/** @brief EMF+ manual 2.3.4.19, Microsoft name: EmfPlusFillPolygon Record, Index 0x0C + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bit 9 U_PPF_C Set: Points is U_PMF_POINT; Clear: Points is U_PMF_POINTF + bit 12 U_PPF_P Set: Points has relative coordinates; Clear: Points has absolute coordinates + + bit1 bit4 Type of Data + 1 0 U_EMF_POINT + 0 0 U_EMF_POINTF + 0 1 U_EMF_POINTR +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 + uint32_t Elements; //!< Number of members in Points +/* + variable part of record, not included in structure + (varies) Points; //!< Sequence of points to connect with line segments. Type from bit1 and bit4 of Header.Flags, see table above +*/ +} U_PMF_FILLPOLYGON; + +/** @brief EMF+ manual 2.3.4.20, Microsoft name: EmfPlusFillRects Record, Index 0x0A + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bit 9 U_PPF_C Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 + uint32_t Elements; //!< Number of members in Rects +/* + variable part of record, not included in structure + U_RECT or U_RECTF Rects; //!< Array of rectangles to draw. Type from bit1 of Header.Flags, see above +*/ +} U_PMF_FILLRECTS; + +/** @brief EMF+ manual 2.3.4.21, Microsoft name: EmfPlusFillRegion Record, Index 0x13 + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_B Set: BrushID is an U_PFM_ARGB; Clear: is index of U_PMF_BRUSH object in EMF+ object table. + bits 0-7 Index of an U_PMF_REGION object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint32_t BrushID; //!< Color or index to Brush object, depends on Header.Flags bit0 +} U_PMF_FILLREGION; + +/** @brief EMF+ manual 2.3.5.1, Microsoft name: EmfPlusObject Record, Index 0x13 + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_N Set: object definition continues in next record; Clear: this is the final object definition record + bits 8-14 Type of object being created, ObjectType enumeration + bits 0-7 Index of an U_PMF_REGION object in the EMF+ object table (0-63, inclusive) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +/* + variable part of record, not included in structure + uint8_t Data; //!< Object's data. Type from bits1-7 and bits8-15 of Header.Flags, see above +*/ +} U_PMF_OBJECT; + +/** @brief EMF+ manual 2.3.5.2, Microsoft name: EmfPlusSerializableObject Record, Index 0x38 + + WARNING! Windows XP Preview does not show filter effects, whether or not U_PPF_E is set. They are visible if the EMF+ + file is inserted as an image into PowerPoint. + +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + uint8_t GUID[16]; //!< ImageEffects identifier. Composed of Data1[4]-Data2[2]-Data3[2]-Data4[8] + //!< Data1-Data3 are stored as little endian integers. Data4 is stored big endian (like a string) + uint32_t Size; //!< Bytes in Data. +/* + variable part of record, not included in structure + uint8_t Data; //!< "Serialized image effects parameter block". One of the ImageEffects objects. +*/ +} U_PMF_SERIALIZABLEOBJECT; + +/** @brief EMF+ manual 2.3.6.1, Microsoft name: EmfPlusSetAntiAliasMode Record, Index 0x1E + + flags (LITTLE endian here, manual uses BIG endian) + bits 7-1 SmoothingMode enumeration + bit 0 U_PPF_AA Set: anti-aliasing on; Clear: anti-aliasing off +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETANTIALIASMODE; + +/** @brief EMF+ manual 2.3.6.2, Microsoft name: EmfPlusSetCompositingMode Record, Index 0x23 + + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 CompositingMode enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETCOMPOSITINGMODE; + +/** @brief EMF+ manual 2.3.6.3, Microsoft name: EmfPlusSetCompositingQuality Record, Index 0x24 + + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 CompositingQuality enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETCOMPOSITINGQUALITY; + +/** @brief EMF+ manual 2.3.6.4, Microsoft name: EmfPlusSetInterpolationMode Record, Index 0x21 + + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 InterpolationMode enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETINTERPOLATIONMODE; + +/** @brief EMF+ manual 2.3.6.5, Microsoft name: EmfPlusSetPixelOffsetMode Record, Index 0x22 + + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 PixelOffsetMode enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETPIXELOFFSETMODE; + +/** @brief EMF+ manual 2.3.6.6, Microsoft name: EmfPlusSetRenderingOrigin Record, Index 0x1D */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + int32_t X; //!< X coordinate of rendering origin + int32_t Y; //!< Y coordinate of rendering origin +} U_PMF_SETRENDERINGORIGIN; + +/** @brief EMF+ manual 2.3.6.7, Microsoft name: EmfPlusSetTextContrast Record, Index 0x20 + + flags (LITTLE endian here, manual uses BIG endian) + bits 12-0 1000 x Gamma correction value. Range 1000-2200 = gamma 1.0-2.2 +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETTEXTCONTRAST; + +/** @brief EMF+ manual 2.3.6.8, Microsoft name: EmfPlusSetTextRenderingHint Record, Index 0x1F + + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 TextRenderingHint enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +} U_PMF_SETTEXTRENDERINGHINT; + +/** @brief EMF+ manual 2.3.7.1, Microsoft name: EmfPlusBeginContainer Record, Index 0x27 + + flags (LITTLE endian here, manual uses BIG endian) + bits 8-15 UnitType enumeration + bits 0-7 (all zero) +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_PMF_RECTF DstRect; //!< with SrcRect specifies a transformation + U_PMF_RECTF SrcRect; //!< with DstRect specifies a transformation + uint32_t Index; //!< Index to apply to this graphics container +} U_PMF_BEGINCONTAINER; + +/** @brief EMF+ manual 2.3.7.2, Microsoft name: EmfPlusBeginContainerNoParams Record, Index 0x28 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + uint32_t Index; //!< Index to apply to this graphics container +} U_PMF_BEGINCONTAINERNOPARAMS; + +/** @brief EMF+ manual 2.3.7.3, Microsoft name: EmfPlusEndContainer Record, Index 0x29 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + uint32_t Index; //!< Index of container being closed, from U_PMF_BEGINCONTAINERNOPARAMS or U_PMF_BEGINCONTAINER +} U_PMF_ENDCONTAINER; + +/** @brief EMF+ manual 2.3.7.4, Microsoft name: EmfPlusRestore Record, Index 0x26 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + uint32_t Index; //!< Index of Graphics State being restored, from U_PMF_SAVE +} U_PMF_RESTORE; + +/** @brief EMF+ manual 2.3.7.5, Microsoft name: EmfPlusSave Record, Index 0x25 */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + uint32_t Index; //!< Index of Graphics State being saved +} U_PMF_SAVE; + +/** @brief EMF+ manual 2.3.8.1, Microsoft name: EmfPlusSetTSClip Record, Index 0x3A + + flags (LITTLE endian here, manual uses BIG endian) + bit 15 U_PPF_K Set: Rect is U_PMF_RECT; Clear: Rect is U_PMF_RECTF + bits 14-0 Number of rectangles in Rects field +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header +/* + variable part of record, not included in structure + U_RECT or U_RECTF Rects; //!< Array of rectangles to draw. Type from bit0 of Header.Flags, see above +*/ +} U_PMF_SETTSCLIP; + +/** @brief EMF+ manual 2.3.8.2, Microsoft name: EmfPlusSetTSGraphics Record, Index 0x39 + + flags (LITTLE endian here, manual uses BIG endian) + bit 1 U_PPF_VGA Set: Palette is VGA basic colors; Clear: Palette is a U_PMF_PALETTE object. + bit 0 U_PPF_PP Set: Palette field is present; Clear: Palette field is absent +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + uint8_t AntiAliasMode; //!< SmoothingMode enumeration + uint8_t TextRenderHint; //!< TextRenderingHint enumeration + uint8_t CompositingMode; //!< CompositingMode enumeration + uint8_t CompositingQuality; //!< CompositingQuality enumeration + int16_t RenderOriginX; //!< Origin X for halftoning and dithering + int16_t RenderOriginY; //!< Origin Y for halftoning and dithering + uint16_t TextContrast; //!< Gamma correction, range 0 to 12 + uint8_t FilterType; //!< FilterType enumeraton + uint8_t PixelOffset; //!< PixelOffsetMode enumeration + U_PMF_TRANSFORMMATRIX WorldToDevice; //!< world to device transform +/* + optional part of record, not included in structure + U_PMF_PALETTE Palette; //!< Present if bit15 of Header.Flags is set +*/ +} U_PMF_SETTSGRAPHICS; + +/** @brief EMF+ manual 2.3.9.1, Microsoft name: EmfPlusMultiplyWorldTransform Record, Index 0x2C + + flags (LITTLE endian here, manual uses BIG endian) + bit 13 U_PPF_XM Set: Post multiply; Clear: Pre multiply +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_PMF_TRANSFORMMATRIX Matrix; //!< Transformation matrix +} U_PMF_MULTIPLYWORLDTRANSFORM; + +/** @brief EMF+ manual 2.3.9.2, Microsoft name: EmfPlusResetWorldTransform Record, Index 0x2B +Sets transformation matrix to identity matrix. +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) +} U_PMF_RESETWORLDTRANSFORM; + +/** @brief EMF+ manual 2.3.9.3, Microsoft name: EmfPlusRotateWorldTransform Record, Index 0x2F + Construct transformation matrix from Angle: + sin(Angle) cos(Angle) 0 + cos(Angle) -sin(Angle) 0 + Multiply this against current world space transform, result becomes new world space transform. + + flags (LITTLE endian here, manual uses BIG endian) + bit 13 U_PPF_XM Set: Post multiply; Clear: Pre multiply +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Angle; //!< Rotation angle, in degrees +} U_PMF_ROTATEWORLDTRANSFORM; + +/** @brief EMF+ manual 2.3.9.4, Microsoft name: EmfPlusScaleWorldTransform Record, Index 0x2E + Construct transformation matrix: + Sx 0 0 + 0 Sy 0 + Multiply this against current world space transform, result becomes new world space transform. + + flags (LITTLE endian here, manual uses BIG endian) + bit 13 U_PPF_XM Set: Post multiply; Clear: Pre multiply +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Sx; //!< X scale factor + U_FLOAT Sy; //!< Y scale factor +} U_PMF_SCALEWORLDTRANSFORM; + +/** @brief EMF+ manual 2.3.9.5, Microsoft name: EmfPlusSetPageTransform Record, Index 0x30 + flags (LITTLE endian here, manual uses BIG endian) + bits 0-7 UnitType enumeration +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Scale; //!< Scale factor to convert page space to device space +} U_PMF_SETPAGETRANSFORM; + + +/** @brief EMF+ manual 2.3.9.6, Microsoft name: EmfPlusSetWorldTransform Record, Index 0x2A */ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header (ignore flags and set to zero) + U_PMF_TRANSFORMMATRIX Matrix; //!< Transformation matrix +} U_PMF_SETWORLDTRANSFORM; + +/** @brief EMF+ manual 2.3.9.7, Microsoft name: EmfPlusTranslateWorldTransform Record, Index 0x2D + Construct transformation matrix: + 1 0 Dx + 0 1 Dy + Multiply this against current world space transform, result becomes new world space transform. + + flags (LITTLE endian here, manual uses BIG endian) + bit 13 U_PPF_XM Set: Post multiply; Clear: Pre multiply +*/ +typedef struct { + U_PMF_CMN_HDR Header; //!< Common header + U_FLOAT Dx; //!< X offset + U_FLOAT Dy; //!< Y offset +} U_PMF_TRANSLATEWORLDTRANSFORM; + +//! \cond + +/* EMF+ prototypes (helper functions) */ +void U_PMR_write(U_PSEUDO_OBJ *po, U_PSEUDO_OBJ *sum, EMFTRACK *et); +int U_PMR_drawline(uint32_t PenID, uint32_t PathID, U_PMF_POINTF Start, U_PMF_POINTF End, int Dashed, U_PSEUDO_OBJ *sum, EMFTRACK *et); +int U_PMR_drawstring( const char *string, int Vpos, uint32_t FontID, const U_PSEUDO_OBJ *BrushID, uint32_t FormatID, + U_PMF_STRINGFORMAT Sfs, const char *FontName, U_FLOAT Height, U_FontInfoParams *fip, uint32_t FontFlags, + U_FLOAT x, U_FLOAT y, U_PSEUDO_OBJ *sum, EMFTRACK *et); +U_PMF_POINT *POINTF_To_POINT16_LE(U_PMF_POINTF *points, int count); +int U_PMF_LEN_REL715(const char *contents, int Elements); +int U_PMF_LEN_FLOATDATA(const char *contents); +int U_PMF_LEN_BYTEDATA(const char *contents); +int U_PMF_LEN_PENDATA(const char *PenData); +int U_PMF_LEN_OPTPENDATA(const char *PenData, uint32_t Flags); +char *U_PMF_CURLYGUID_set(uint8_t *GUID); +int U_PMF_KNOWNCURLYGUID_set(const char *string); +void U_PMF_MEMCPY_SRCSHIFT(void *Dst, const char **Src, size_t Size); +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_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); +int U_OID_To_CLCDT(uint32_t OID); +int U_OID_To_IDT(uint32_t OID); +int U_OID_To_RNDT(uint32_t OID); +uint8_t *U_OID_To_GUID(uint32_t OID); +int U_OA_append(U_OBJ_ACCUM *oa, const char *data, int size, int Type, int Id); +int U_OA_clear(U_OBJ_ACCUM *oa); +int U_OA_release(U_OBJ_ACCUM *oa); +U_PSEUDO_OBJ *U_PO_create(char *Data, size_t Size, size_t Use, uint32_t Type); +U_PSEUDO_OBJ *U_PO_append(U_PSEUDO_OBJ *po, const char *Data, size_t Size); +U_PSEUDO_OBJ *U_PO_po_append(U_PSEUDO_OBJ *po, U_PSEUDO_OBJ *src, int StripE); +int U_PO_free(U_PSEUDO_OBJ **po); +U_DPSEUDO_OBJ *U_PATH_create(int Elements, const U_PMF_POINTF *Points, uint8_t First, uint8_t Others); +int U_DPO_free(U_DPSEUDO_OBJ **dpo); +int U_DPO_clear(U_DPSEUDO_OBJ *dpo); +int U_PATH_moveto(U_DPSEUDO_OBJ *path, U_PMF_POINTF Point, uint8_t Flags); +int U_PATH_lineto(U_DPSEUDO_OBJ *path, U_PMF_POINTF Point, uint8_t Flags); +int U_PATH_closepath(U_DPSEUDO_OBJ *path); +int U_PATH_polylineto(U_DPSEUDO_OBJ *path, uint32_t Elements, const U_PMF_POINTF *Points, uint8_t Flags, uint8_t StartSeg); +int U_PATH_polybezierto(U_DPSEUDO_OBJ *path, uint32_t Elements, const U_PMF_POINTF *Points, uint8_t Flags, uint8_t StartSeg); +int U_PATH_polygon(U_DPSEUDO_OBJ *Path, uint32_t Elements, const U_PMF_POINTF *Points, uint8_t Flags); +int U_PATH_arcto(U_DPSEUDO_OBJ *Path, U_FLOAT Start, U_FLOAT Sweep, U_FLOAT Rot, U_PMF_RECTF *Rect, uint8_t Flags, int StartSeg); +U_PMF_POINTF *pointfs_transform(U_PMF_POINTF *points, int count, U_XFORM xform); +U_PMF_RECTF *rectfs_transform(U_PMF_RECTF *rects, int count, U_XFORM xform); +U_PMF_TRANSFORMMATRIX tm_for_gradrect(U_FLOAT Angle, U_FLOAT w, U_FLOAT h, U_FLOAT x, U_FLOAT y, U_FLOAT Periods); +U_PSEUDO_OBJ *U_PMR_drawfill(uint32_t PathID, uint32_t PenID, const U_PSEUDO_OBJ *BrushID); + + +char *U_pmr_names(unsigned int idx); + +/* EMF+ prototypes (objects_set) */ + +U_PSEUDO_OBJ *U_PMF_BRUSH_set(uint32_t Version, const U_PSEUDO_OBJ *po); +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAP_set(uint32_t Version, const U_PSEUDO_OBJ *po); +U_PSEUDO_OBJ *U_PMF_FONT_set(uint32_t Version, U_FLOAT EmSize, uint32_t SizeUnit, + int32_t FSFlags, uint32_t Length, const uint16_t *Font); +U_PSEUDO_OBJ *U_PMF_IMAGE_set(uint32_t Version, const U_PSEUDO_OBJ *po); +U_PSEUDO_OBJ *U_PMF_IMAGEATTRIBUTES_set(uint32_t Version, uint32_t WrapMode, uint32_t ClampColor, uint32_t ObjectClamp); +U_PSEUDO_OBJ *U_PMF_PATH_set(uint32_t Version, const U_PSEUDO_OBJ *Points, const U_PSEUDO_OBJ *Types); +U_PSEUDO_OBJ *U_PMF_PATH_set2(uint32_t Version, const U_DPSEUDO_OBJ *Path); +U_PSEUDO_OBJ *U_PMF_PATH_set3(uint32_t Version, const U_DPSEUDO_OBJ *Path); +U_PSEUDO_OBJ *U_PMF_PEN_set(uint32_t Version, const U_PSEUDO_OBJ *PenData, const U_PSEUDO_OBJ *Brush); +U_PSEUDO_OBJ *U_PMF_REGION_set(uint32_t Version, uint32_t Count, const U_PSEUDO_OBJ *Nodes); +U_PSEUDO_OBJ *U_PMF_STRINGFORMAT_set(U_PMF_STRINGFORMAT *Sfs, const U_PSEUDO_OBJ *Sfd); +U_PSEUDO_OBJ *U_PMF_4NUM_set(uint32_t BrushID); +U_PSEUDO_OBJ *U_PMF_ARGB_set(uint8_t Alpha, uint8_t Red, uint8_t Green, uint8_t Blue); +U_PSEUDO_OBJ *U_PMF_ARGBN_set(uint32_t Count, U_PMF_ARGB *Colors); +U_PMF_ARGB U_PMF_ARGBOBJ_set(uint8_t Alpha, uint8_t Red, uint8_t Green, uint8_t Blue); +U_PSEUDO_OBJ *U_PMF_BITMAP_set(const U_PMF_BITMAP *Bs, const U_PSEUDO_OBJ *Bm); +U_PSEUDO_OBJ *U_PMF_BITMAPDATA_set( const U_PSEUDO_OBJ *Ps, int cbBm, const char *Bm); +U_PSEUDO_OBJ *U_PMF_BLENDCOLORS_set(uint32_t Elements, const U_FLOAT *Positions, const U_PSEUDO_OBJ *Colors); +U_PSEUDO_OBJ *U_PMF_BLENDCOLORS_linear_set(uint32_t Elements,U_PMF_ARGB StartColor, U_PMF_ARGB EndColor); +U_PSEUDO_OBJ *U_PMF_BLENDFACTORS_set(uint32_t Elements, const U_FLOAT *Positions, const U_FLOAT *Factors); +U_PSEUDO_OBJ *U_PMF_BLENDFACTORS_linear_set(uint32_t Elements, U_FLOAT StartFactor, U_FLOAT EndFactor); +U_PSEUDO_OBJ *U_PMF_BOUNDARYPATHDATA_set(const U_PSEUDO_OBJ *Path); +U_PSEUDO_OBJ *U_PMF_BOUNDARYPOINTDATA_set(uint32_t Elements, const U_PMF_POINTF *Points); +U_PSEUDO_OBJ *U_PMF_CHARACTERRANGE_set(int32_t First, int32_t Length); +U_PSEUDO_OBJ *U_PMF_COMPOUNDLINEDATA_set(int32_t Elements, const char *Widths); +U_PSEUDO_OBJ *U_PMF_COMPRESSEDIMAGE_set(int32_t cbImage, const char *Image); +U_PSEUDO_OBJ *U_PMF_CUSTOMENDCAPDATA_set(const U_PSEUDO_OBJ *Clc); +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAPARROWDATA_set(U_FLOAT Width, U_FLOAT Height, + U_FLOAT MiddleInset, uint32_t FillState, uint32_t StartCap, uint32_t EndCap, uint32_t Join, + U_FLOAT MiterLimit, U_FLOAT WidthScale); +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAPDATA_set(uint32_t Flags, uint32_t Cap, + U_FLOAT Inset, uint32_t StartCap, uint32_t EndCap, + uint32_t Join, U_FLOAT MiterLimit, U_FLOAT WidthScale, + const U_PSEUDO_OBJ *Clcod); +U_PSEUDO_OBJ *U_PMF_CUSTOMLINECAPOPTIONALDATA_set(const U_PSEUDO_OBJ *Fill, const U_PSEUDO_OBJ *Line); +U_PSEUDO_OBJ *U_PMF_CUSTOMSTARTCAPDATA_set(const U_PSEUDO_OBJ *Clc); +U_PSEUDO_OBJ *U_PMF_DASHEDLINEDATA_set(int32_t Elements, const U_FLOAT *Lengths); +U_PSEUDO_OBJ *U_PMF_DASHEDLINEDATA_set2(U_FLOAT Unit, int StdPat); +U_PSEUDO_OBJ *U_PMF_DASHEDLINEDATA_set3(U_FLOAT Unit, uint32_t BitPat); +U_PSEUDO_OBJ *U_PMF_FILLPATHOBJ_set(const U_PSEUDO_OBJ *Path); +U_PSEUDO_OBJ *U_PMF_FOCUSSCALEDATA_set(U_FLOAT ScaleX, U_FLOAT ScaleY); +U_PSEUDO_OBJ *U_PMF_GRAPHICSVERSION_set(int GrfVersion); +U_PMF_GRAPHICSVERSION U_PMF_GRAPHICSVERSIONOBJ_set(int GrfVersion); +U_PSEUDO_OBJ *U_PMF_HATCHBRUSHDATA_set(uint32_t Style, const U_PSEUDO_OBJ *Fg, const U_PSEUDO_OBJ *Bg); +U_PSEUDO_OBJ *U_PMF_INTEGER7_set(int value); +U_PSEUDO_OBJ *U_PMF_INTEGER15_set(int value); +U_PMF_LANGUAGEIDENTIFIER U_PMF_LANGUAGEIDENTIFIEROBJ_set(int SubLId, int PriLId); +U_PSEUDO_OBJ *U_PMF_LANGUAGEIDENTIFIER_set(U_PMF_LANGUAGEIDENTIFIER LId); +U_PSEUDO_OBJ *U_PMF_LINEARGRADIENTBRUSHDATA_set(const U_PMF_LINEARGRADIENTBRUSHDATA *Lgbd, const U_PSEUDO_OBJ *Lgbod); +U_PSEUDO_OBJ *U_PMF_LINEARGRADIENTBRUSHOPTIONALDATA_set(uint32_t *Flags, const U_PSEUDO_OBJ *Tm, const U_PSEUDO_OBJ *Bc, const U_PSEUDO_OBJ *BfH, const U_PSEUDO_OBJ *BfV); +U_PSEUDO_OBJ *U_PMF_LINEPATH_set(const U_PSEUDO_OBJ *Path); +U_PSEUDO_OBJ *U_PMF_METAFILE_set(void); +U_PSEUDO_OBJ *U_PMF_PALETTE_set(uint32_t Flags, uint32_t Elements, const U_PMF_ARGB *Pd); +U_PSEUDO_OBJ *U_PMF_PATHGRADIENTBRUSHDATA_set(uint32_t Flags, int32_t WrapMode, U_PMF_ARGB CenterColor, + U_PMF_POINTF Center, const U_PSEUDO_OBJ *Gradient, const U_PSEUDO_OBJ *Boundary, const U_PSEUDO_OBJ *Data); +U_PSEUDO_OBJ *U_PMF_PATHGRADIENTBRUSHOPTIONALDATA_set(uint32_t Flags, + const U_PSEUDO_OBJ *Tm, const U_PSEUDO_OBJ *Pd, const U_PSEUDO_OBJ *Fsd); +U_PSEUDO_OBJ *U_PMF_PATHPOINTTYPE_set(uint32_t Elements, const uint8_t *Ppt); +U_PSEUDO_OBJ *U_PMF_PATHPOINTTYPE_set2(uint32_t Elements, uint8_t Start, uint8_t Others); +U_PSEUDO_OBJ *U_PMF_PATHPOINTTYPERLE_set(uint32_t Elements, const uint8_t *Bz, const uint8_t *RL, const uint8_t *Ppte); +U_PSEUDO_OBJ *U_PMF_PENDATA_set(uint32_t Unit, U_FLOAT Width, const U_PSEUDO_OBJ *Pod); +U_PSEUDO_OBJ *U_PMF_PENOPTIONALDATA_set(uint32_t Flags, U_PSEUDO_OBJ *Tm, int32_t StartCap, int32_t EndCap, uint32_t Join, + U_FLOAT MiterLimit, int32_t Style, int32_t DLCap, U_FLOAT DLOffset, + U_PSEUDO_OBJ *DLData, int32_t PenAlignment, U_PSEUDO_OBJ *CmpndLineData, U_PSEUDO_OBJ *CSCapData, + U_PSEUDO_OBJ *CECapData); +U_PSEUDO_OBJ *U_PMF_POINT_set(uint32_t Elements, const U_PMF_POINT *Coords); +U_PSEUDO_OBJ *U_PMF_POINTF_set(uint32_t Elements, const U_PMF_POINTF *Coords); +U_PSEUDO_OBJ *U_PMF_POINTR_set(uint32_t Elements, const U_PMF_POINTF *Coords); +U_PSEUDO_OBJ *U_PMF_RECT4_set(int16_t X, int16_t Y, int16_t Width, int16_t Height); +U_PSEUDO_OBJ *U_PMF_RECT_set(U_PMF_RECT *Rect); +U_PSEUDO_OBJ *U_PMF_RECTN_set(uint32_t Elements, U_PMF_RECT *Rects); +U_PSEUDO_OBJ *U_PMF_RECTF4_set(U_FLOAT X, U_FLOAT Y, U_FLOAT Width, U_FLOAT Height); +U_PSEUDO_OBJ *U_PMF_RECTF_set(U_PMF_RECTF *Rect); +U_PSEUDO_OBJ *U_PMF_RECTFN_set(uint32_t Elements, U_PMF_RECTF *Rects); +U_PSEUDO_OBJ *U_PMF_REGIONNODE_set(int32_t Type, const U_PSEUDO_OBJ *Rnd); +U_PSEUDO_OBJ *U_PMF_REGIONNODECHILDNODES_set(const U_PSEUDO_OBJ *Left, const U_PSEUDO_OBJ *Right); +U_PSEUDO_OBJ *U_PMF_REGIONNODEPATH_set(const U_PSEUDO_OBJ *Path); +U_PSEUDO_OBJ *U_PMF_SOLIDBRUSHDATA_set(const U_PSEUDO_OBJ *Color); +U_PSEUDO_OBJ *U_PMF_STRINGFORMATDATA_set(uint32_t TabStopCount, U_FLOAT *TabStops, const U_PSEUDO_OBJ *Ranges); +U_PSEUDO_OBJ *U_PMF_TEXTUREBRUSHDATA_set(uint32_t Flags, uint32_t WrapMode, const U_PSEUDO_OBJ *Tbod); +U_PSEUDO_OBJ *U_PMF_TEXTUREBRUSHOPTIONALDATA_set(const U_PSEUDO_OBJ *Tm, const U_PSEUDO_OBJ *Image); +U_PSEUDO_OBJ *U_PMF_TRANSFORMMATRIX_set(U_PMF_TRANSFORMMATRIX *Tm); +U_PSEUDO_OBJ *U_PMF_IE_BLUR_set(U_FLOAT Radius, uint32_t ExpandEdge); +U_PSEUDO_OBJ *U_PMF_IE_BRIGHTNESSCONTRAST_set(int32_t Brightness, int32_t Contrast); +U_PSEUDO_OBJ *U_PMF_IE_COLORBALANCE_set(int32_t CyanRed, int32_t MagentaGreen, int32_t YellowBlue); +U_PSEUDO_OBJ *U_PMF_IE_COLORCURVE_set(uint32_t Adjust, uint32_t Channel, int32_t Intensity); +U_PSEUDO_OBJ *U_PMF_IE_COLORLOOKUPTABLE_set(const uint8_t *BLUT, const uint8_t *GLUT, const uint8_t *RLUT, const uint8_t *ALUT); +U_PSEUDO_OBJ *U_PMF_IE_COLORMATRIX_set(const U_FLOAT *Matrix); +U_PSEUDO_OBJ *U_PMF_IE_HUESATURATIONLIGHTNESS_set(int32_t Hue, int32_t Saturation, int32_t Lightness); +U_PSEUDO_OBJ *U_PMF_IE_LEVELS_set(int32_t Highlight, int32_t Midtone, int32_t Shadow); +U_PSEUDO_OBJ *U_PMF_IE_REDEYECORRECTION_set(uint32_t Elements, const U_RECTL *rects); +U_PSEUDO_OBJ *U_PMF_IE_SHARPEN_set(U_FLOAT Radius, int32_t Sharpen); +U_PSEUDO_OBJ *U_PMF_IE_TINT_set(int32_t Hue, int32_t Amount); +U_PSEUDO_OBJ *U_PMR_SERIALIZABLEOBJECT_set(const U_PSEUDO_OBJ *Siepb); + +/* EMF+ prototypes (records_set) */ + +U_PSEUDO_OBJ *U_PMR_OFFSETCLIP_set(U_FLOAT dX, U_FLOAT dY); +U_PSEUDO_OBJ *U_PMR_RESETCLIP_set(void); +U_PSEUDO_OBJ *U_PMR_SETCLIPPATH_set(uint32_t PathID, uint32_t CMenum); +U_PSEUDO_OBJ *U_PMR_SETCLIPRECT_set(uint32_t CMenum, const U_PSEUDO_OBJ *Rect); +U_PSEUDO_OBJ *U_PMR_SETCLIPREGION_set(uint32_t PathID, uint32_t CMenum); +U_PSEUDO_OBJ *U_PMR_COMMENT_set(size_t cbData, const void *Data); +U_PSEUDO_OBJ *U_PMR_ENDOFFILE_set(void); +U_PSEUDO_OBJ *U_PMR_GETDC_set(void); +U_PSEUDO_OBJ *U_PMR_HEADER_set(int IsDual, int IsVideo, const U_PSEUDO_OBJ *Version, + uint32_t LogicalDpiX, uint32_t LogicalDpiY); +U_PSEUDO_OBJ *U_PMR_CLEAR_set(const U_PSEUDO_OBJ *Color); +U_PSEUDO_OBJ *U_PMR_DRAWARC_set(uint32_t PenID, U_FLOAT Start, U_FLOAT Sweep, const U_PSEUDO_OBJ *Rect); +U_PSEUDO_OBJ *U_PMR_DRAWBEZIERS_set(uint32_t PenID, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_DRAWCLOSEDCURVE_set(uint32_t PenID, U_FLOAT Tension, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_DRAWCURVE_set(uint32_t PenID, U_FLOAT Tension,uint32_t Offset, uint32_t NSegs, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_DRAWDRIVERSTRING_set(uint32_t FontID, U_FLOAT Tension, const U_PSEUDO_OBJ *BrushID, + uint32_t DSOFlags, uint32_t HasMatrix, uint32_t GlyphCount, + const uint16_t *Glyphs, const U_PSEUDO_OBJ *Points, const U_PSEUDO_OBJ *Tm); +U_PSEUDO_OBJ *U_PMR_DRAWELLIPSE_set(uint32_t PenID, const U_PSEUDO_OBJ *Rect); +U_PSEUDO_OBJ *U_PMR_DRAWIMAGE_set(uint32_t ImgID, int32_t ImgAttrID, int32_t SrcUnit, const U_PSEUDO_OBJ *SrcRect, const U_PSEUDO_OBJ *DstRect); +U_PSEUDO_OBJ *U_PMR_DRAWIMAGEPOINTS_set(uint32_t ImgID, int etype, int32_t ImgAttrID, int32_t SrcUnit, const U_PSEUDO_OBJ *SrcRect, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_DRAWLINES_set(uint32_t PenID, int dtype, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_DRAWPATH_set(uint32_t PathID, uint32_t PenID); +U_PSEUDO_OBJ *U_PMR_DRAWPIE_set(uint32_t PenID, U_FLOAT Start, U_FLOAT Sweep, const U_PSEUDO_OBJ *Rect); +U_PSEUDO_OBJ *U_PMR_DRAWRECTS_set(uint32_t PenID, const U_PSEUDO_OBJ *Rects); +U_PSEUDO_OBJ *U_PMR_DRAWSTRING_set(uint32_t FontID, const U_PSEUDO_OBJ *BrushID, + uint32_t FormatID, uint32_t Length, const U_PSEUDO_OBJ *Rect, const uint16_t *Text); +U_PSEUDO_OBJ *U_PMR_FILLCLOSEDCURVE_set(int ftype, U_FLOAT Tension, const U_PSEUDO_OBJ * BrushID, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_FILLELLIPSE_set(const U_PSEUDO_OBJ * BrushID, const U_PSEUDO_OBJ *Rect); +U_PSEUDO_OBJ *U_PMR_FILLPATH_set(uint32_t PathID, const U_PSEUDO_OBJ * BrushID); +U_PSEUDO_OBJ *U_PMR_FILLPIE_set(U_FLOAT Start, U_FLOAT Sweep, const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Rect); +U_PSEUDO_OBJ *U_PMR_FILLPOLYGON_set(const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Points); +U_PSEUDO_OBJ *U_PMR_FILLRECTS_set(const U_PSEUDO_OBJ *BrushID, const U_PSEUDO_OBJ *Rects); +U_PSEUDO_OBJ *U_PMR_FILLREGION_set(uint32_t RgnID, const U_PSEUDO_OBJ *BrushID); +U_PSEUDO_OBJ *U_PMR_OBJECT_PO_set(uint32_t ObjID, U_PSEUDO_OBJ *Po); +U_PSEUDO_OBJ *U_PMR_OBJECT_set(uint32_t ObjID, int otype, int ntype, uint32_t TSize, size_t cbData, const char *Data); +U_PSEUDO_OBJ *U_PMR_SETANTIALIASMODE_set(int SMenum, int aatype); +U_PSEUDO_OBJ *U_PMR_SETCOMPOSITINGMODE_set(int CMenum); +U_PSEUDO_OBJ *U_PMR_SETCOMPOSITINGQUALITY_set(int CQenum); +U_PSEUDO_OBJ *U_PMR_SETINTERPOLATIONMODE_set(int IMenum); +U_PSEUDO_OBJ *U_PMR_SETPIXELOFFSETMODE_set(int POMenum); +U_PSEUDO_OBJ *U_PMR_SETRENDERINGORIGIN_set(int32_t X, int32_t Y); +U_PSEUDO_OBJ *U_PMR_SETTEXTCONTRAST_set(int GC); +U_PSEUDO_OBJ *U_PMR_SETTEXTRENDERINGHINT_set(int TRHenum); +U_PSEUDO_OBJ *U_PMR_BEGINCONTAINER_set(int UTenum, U_PSEUDO_OBJ *DstRect, U_PSEUDO_OBJ *SrcRect, uint32_t StackID); +U_PSEUDO_OBJ *U_PMR_BEGINCONTAINERNOPARAMS_set(int StackID); +U_PSEUDO_OBJ *U_PMR_ENDCONTAINER_set(int StackID); +U_PSEUDO_OBJ *U_PMR_RESTORE_set(int StackID); +U_PSEUDO_OBJ *U_PMR_SAVE_set(int StackID); +U_PSEUDO_OBJ *U_PMR_SETTSCLIP_set(U_PSEUDO_OBJ *Rects); +U_PSEUDO_OBJ *U_PMR_SETTSGRAPHICS_set(int vgatype, U_PMF_SETTSGRAPHICS *Tsg, U_PSEUDO_OBJ *Palette); +U_PSEUDO_OBJ *U_PMR_MULTIPLYWORLDTRANSFORM_set(int xmtype, U_PSEUDO_OBJ *Tm); +U_PSEUDO_OBJ *U_PMR_RESETWORLDTRANSFORM_set(void); +U_PSEUDO_OBJ *U_PMR_ROTATEWORLDTRANSFORM_set(int xmtype, U_FLOAT Angle); +U_PSEUDO_OBJ *U_PMR_SCALEWORLDTRANSFORM_set(int xmtype, U_FLOAT X, U_FLOAT Y); +U_PSEUDO_OBJ *U_PMR_SETPAGETRANSFORM_set(int PUenum, U_FLOAT Sale); +U_PSEUDO_OBJ *U_PMR_SETWORLDTRANSFORM_set(U_PSEUDO_OBJ *Tm); +U_PSEUDO_OBJ *U_PMR_TRANSLATEWORLDTRANSFORM_set(int xmtype, U_FLOAT Dx, U_FLOAT Dy); +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_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_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); +/* 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_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); +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); + +/* EMF+ prototypes (records_get) */ + +int U_PMR_OFFSETCLIP_get(const char *contents, U_PMF_CMN_HDR *Header, U_FLOAT *dX, U_FLOAT *dY); +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); +int U_PMR_SETCLIPRECT_get(const char *contents, U_PMF_CMN_HDR *Header, int *CMenum, U_PMF_RECTF *Rect); +int U_PMR_SETCLIPREGION_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PathID, int *CMenum); +int U_PMR_COMMENT_get(const char *contents, U_PMF_CMN_HDR *Header, const char **Data); +int U_PMR_ENDOFFILE_get(const char *contents, U_PMF_CMN_HDR *Header); +int U_PMR_GETDC_get(const char *contents, U_PMF_CMN_HDR *Header); +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); +int U_PMR_CLEAR_get(const char *contents, U_PMF_CMN_HDR *Header, U_PMF_ARGB *Color); +int U_PMR_DRAWARC_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, U_FLOAT *Start, U_FLOAT *Sweep, U_PMF_RECTF *Rect); +int U_PMR_DRAWBEZIERS_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, int *RelAbs, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_DRAWCLOSEDCURVE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, int *RelAbs, U_FLOAT *Tension, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_DRAWCURVE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, U_FLOAT *Tension, uint32_t *Offset, uint32_t *NSegs, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_DRAWDRIVERSTRING_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *FontID, int *btype, U_FLOAT *Tension, uint32_t *BrushID, uint32_t *DSOFlags, uint32_t *HasMatrix, uint32_t *Elements, uint16_t **Glyphs, U_PMF_POINTF **Points, U_PMF_TRANSFORMMATRIX **Matrix); +int U_PMR_DRAWELLIPSE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, U_PMF_RECTF *Rect); +int U_PMR_DRAWIMAGE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *ImgID, int *ctype, uint32_t *ImgAttrID, int32_t *SrcUnit, U_PMF_RECTF *SrcRect, U_PMF_RECTF *DstRect); +int U_PMR_DRAWIMAGEPOINTS_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *ImgID, int *ctype, int *etype, int *RelAbs, uint32_t *ImgAttrID, int32_t *SrcUnit, U_PMF_RECTF *SrcRect, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_DRAWLINES_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, int *dtype, int *RelAbs, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_DRAWPATH_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PathID, uint32_t *PenID); +int U_PMR_DRAWPIE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, U_FLOAT *Start, U_FLOAT *Sweep, U_PMF_RECTF *Rect); +int U_PMR_DRAWRECTS_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PenID, int *ctype, uint32_t *Elements, U_PMF_RECTF **Rects); +int U_PMR_DRAWSTRING_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *FontID, int *btype, uint32_t *BrushID, uint32_t *FormatID, uint32_t *Elements, U_PMF_RECTF *Rect, uint16_t **String); +int U_PMR_FILLCLOSEDCURVE_get(const char *contents, U_PMF_CMN_HDR *Header, int *btype, int *ctype, int *ftype, int *RelAbs, uint32_t *BrushID, U_FLOAT *Tension, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_FILLELLIPSE_get(const char *contents, U_PMF_CMN_HDR *Header, int *btype, int *ctype, uint32_t *BrushID, U_PMF_RECTF *Rect); +int U_PMR_FILLPATH_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *PathID, int *btype, uint32_t *BrushID); +int U_PMR_FILLPIE_get(const char *contents, U_PMF_CMN_HDR *Header, int *btype, int *ctype, uint32_t *BrushID, U_FLOAT *Start, U_FLOAT *Sweep, U_PMF_RECTF *Rect); +int U_PMR_FILLPOLYGON_get(const char *contents, U_PMF_CMN_HDR *Header, int *btype, int *ctype, int *RelAbs, uint32_t *BrushID, uint32_t *Elements, U_PMF_POINTF **Points); +int U_PMR_FILLRECTS_get(const char *contents, U_PMF_CMN_HDR *Header, int *btype, int *ctype, uint32_t *BrushID, uint32_t *Elements, U_PMF_RECTF **Rects); +int U_PMR_FILLREGION_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *RgnID, int *btype, int *ctype, uint32_t *BrushID); +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); +int U_PMR_SERIALIZABLEOBJECT_get(const char *contents, U_PMF_CMN_HDR *Header, uint8_t *GUID, uint32_t *Size, const char **Data); +int U_PMR_SETANTIALIASMODE_get(const char *contents, U_PMF_CMN_HDR *Header, int *SMenum, int *aatype); +int U_PMR_SETCOMPOSITINGMODE_get(const char *contents, U_PMF_CMN_HDR *Header, int *CMenum); +int U_PMR_SETCOMPOSITINGQUALITY_get(const char *contents, U_PMF_CMN_HDR *Header, int *CQenum); +int U_PMR_SETINTERPOLATIONMODE_get(const char *contents, U_PMF_CMN_HDR *Header, int *IMenum); +int U_PMR_SETPIXELOFFSETMODE_get(const char *contents, U_PMF_CMN_HDR *Header, int *POMenum); +int U_PMR_SETRENDERINGORIGIN_get(const char *contents, U_PMF_CMN_HDR *Header, int32_t *X, int32_t *Y); +int U_PMR_SETTEXTCONTRAST_get(const char *contents, U_PMF_CMN_HDR *Header, int *TGC); +int U_PMR_SETTEXTRENDERINGHINT_get(const char *contents, U_PMF_CMN_HDR *Header, int *TRHenum); +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); +int U_PMR_BEGINCONTAINERNOPARAMS_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID); +int U_PMR_ENDCONTAINER_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID); +int U_PMR_RESTORE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID); +int U_PMR_SAVE_get(const char *contents, U_PMF_CMN_HDR *Header, uint32_t *StackID); +int U_PMR_SETTSCLIP_get(const char *contents, U_PMF_CMN_HDR *Header, int *ctype, uint32_t *Elements, U_PMF_RECTF **Rects); +int U_PMR_SETTSGRAPHICS_get(const char *contents, U_PMF_CMN_HDR *Header, int *vgatype, int *pptype, uint8_t *AntiAliasMode, uint8_t *TextRenderHint, uint8_t *CompositingMode, uint8_t *CompositingQuality, int16_t *RenderOriginX, int16_t *RenderOriginY, uint16_t *TextContrast, uint8_t *FilterType, uint8_t *PixelOffset, U_PMF_TRANSFORMMATRIX *WorldToDevice, const char **Data); +int U_PMR_MULTIPLYWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, int *xmtype, U_PMF_TRANSFORMMATRIX *Matrix); +int U_PMR_RESETWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header); +int U_PMR_ROTATEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, int *xmtype, U_FLOAT *Angle); +int U_PMR_SCALEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, int *xmtype, U_FLOAT *Sx, U_FLOAT *Sy); +int U_PMR_SETPAGETRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, int *PUenum, U_FLOAT *Scale); +int U_PMR_SETWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, U_PMF_TRANSFORMMATRIX *Matrix); +int U_PMR_TRANSLATEWORLDTRANSFORM_get(const char *contents, U_PMF_CMN_HDR *Header, int *xmtype, U_FLOAT *Dx, U_FLOAT *Dy); +int U_PMR_STROKEFILLPATH_get(const char *contents, U_PMF_CMN_HDR *Header); +int U_PMR_MULTIFORMATSTART_get(const char *contents, U_PMF_CMN_HDR *Header); +int U_PMR_MULTIFORMATSECTION_get(const char *contents, U_PMF_CMN_HDR *Header); +int U_PMR_MULTIFORMATEND_get(const char *contents, U_PMF_CMN_HDR *Header); +//! \endcond + + +#ifdef __cplusplus +} +#endif + +#endif /* _UPMF_ */ diff --git a/src/libuemf/upmf_print.c b/src/libuemf/upmf_print.c new file mode 100644 index 000000000..f446d6caf --- /dev/null +++ b/src/libuemf/upmf_print.c @@ -0,0 +1,3138 @@ +/** + @file upmf_print.c + + @brief Functions for printing EMF records +*/ + +/* +File: upmf_print.c +Version: 0.0.2 +Date: 17-OCT-2013 +Author: David Mathog, Biology Division, Caltech +email: mathog@caltech.edu +Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +*/ + +/* compiler options: + +-DNOBRUSH causes brush objects to be treated as pen objects. PowerPoint 2003 and 2010 define pen objects +as brush objects, and this is one way to see their structure even though they are misidentified. +This option should only be used for tiny test files, consisting of just line objects. +*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include /* for offsetof() macro */ +#include +#include "upmf_print.h" +#include "uemf_print.h" + + +//! \cond + +#define UNUSED(x) (void)(x) //! Please ignore - Doxygen simply insisted on including this + +/* + this function is not visible in the API. Print "data" for one of the many records that has none. +*/ +int U_PMR_NODATAREC_print(const char *contents){ + U_PMF_CMN_HDR Header; + int status = U_PMR_RESETCLIP_get(contents,&Header); /* One of many possibilities */ + if(status)status = Header.Size; + return(status); +} + +/* + 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){ + unsigned int i; + U_FLOAT Xpos, Ypos; + + if( Flags & U_PPF_P){ printf(" + Points(Relative):"); } + else if(Flags & U_PPF_C){ printf(" + Points(Int16):"); } + else { printf(" + Points(Float):"); } + for(Xpos = Ypos = i = 0; i U_PMR_MAX)return(-1); /* unknown EMF+ record type */ + status = U_PMF_CMN_HDR_print(Header, recnum, off); /* EMF+ part */ + + /* Buggy EMF+ can set the continue bit and then do something else. In that case, force out the pending + Object. Side effect - clears the pending object. */ + if((type != U_PMR_OBJECT) && (ObjCont.used > 0)){ + U_PMR_OBJECT_print(contents, blimit, &ObjCont, 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; + } + return(status); +} + +/** + \brief Print data from a U_PMF_CMN_HDR object + \return number of bytes in record, 0 on error + \param Header Header of the record + \param precnum EMF+ record number in file. + \param off Offset in file to the start of this EMF+ record. + common structure present at the beginning of all(*) EMF+ records +*/ +int U_PMF_CMN_HDR_print(U_PMF_CMN_HDR Header, int precnum, int off){ + printf(" %-29srec+:%5d type:%X offset:%8d rsize:%8u dsize:%8u flags:%4.4X\n", + U_pmr_names(Header.Type &U_PMR_TYPE_MASK),precnum, Header.Type,off,Header.Size,Header.DataSize,Header.Flags); + return((int) Header.Size); +} + +/** + \brief Print data from a an array of uint8_t values + \return 1 + \param Start Text to lead array data + \param Array uint8_t array of data passed as char * + \param Elements Number of elements in Array + \param End Text to follow array data +*/ +int U_PMF_UINT8_ARRAY_print(const char *Start, const uint8_t *Array, int Elements, char *End){ + if(Start)printf("%s",Start); + for(; Elements--; Array++){ printf(" %u", *Array); } + if(End)printf("%s",End); + return(1); +} + +/** + \brief Print value of an BrushType Enumeration + \returns record 1 on sucess, 0 on error + \param otype Value to print. + EMF+ manual 2.1.1.3, Microsoft name: BrushType Enumeration +*/ +int U_PMF_BRUSHTYPEENUMERATION_print(int otype){ + int status=1; + switch(otype){ + case U_BT_SolidColor: printf("SolidColor"); break; + case U_BT_HatchFill: printf("HatchFill"); break; + case U_BT_TextureFill: printf("TextureFill"); break; + case U_BT_PathGradient: printf("PathGradient"); break; + case U_BT_LinearGradient: printf("LinearGradient"); break; + default: status=0; printf("INVALID(%d)",otype); break; + } + return(status); +} + +/** + \brief Print value of an BrushType Enumeration + \returns record 1 on sucess, 0 on error + \param otype Value to print. + EMF+ manual 2.1.1.4, Microsoft name: BrushType Enumeration +*/ +int U_PMF_COMBINEMODEENUMERATION_print(int otype){ + int status=1; + switch(otype){ + case U_CM_Replace: printf("Replace" ); break; + case U_CM_Intersect: printf("Intersect" ); break; + case U_CM_Union: printf("Union" ); break; + case U_CM_XOR: printf("XOR" ); break; + case U_CM_Exclude: printf("Exclude" ); break; + case U_CM_Complement: printf("Complement"); break; + default: status=0; printf("INVALID(%d)",otype); break; + } + return(status); +} + +/** + \brief Print value of a HatchStyle Enumeration + \returns record 1 on sucess, 0 on error + \param hstype Value to print. + EMF+ manual 2.1.1.13, Microsoft name: HatchStyle Enumeration +*/ +int U_PMF_HATCHSTYLEENUMERATION_print(int hstype){ + int status=1; + switch(hstype){ + case U_HSP_Horizontal: printf("Horizontal"); break; + case U_HSP_Vertical: printf("Vertical"); break; + case U_HSP_ForwardDiagonal: printf("ForwardDiagonal"); break; + case U_HSP_BackwardDiagonal: printf("BackwardDiagonal"); break; + case U_HSP_LargeGrid: printf("LargeGrid"); break; + case U_HSP_DiagonalCross: printf("DiagonalCross"); break; + case U_HSP_05Percent: printf("05Percent"); break; + case U_HSP_10Percent: printf("10Percent"); break; + case U_HSP_20Percent: printf("20Percent"); break; + case U_HSP_25Percent: printf("25Percent"); break; + case U_HSP_30Percent: printf("30Percent"); break; + case U_HSP_40Percent: printf("40Percent"); break; + case U_HSP_50Percent: printf("50Percent"); break; + case U_HSP_60Percent: printf("60Percent"); break; + case U_HSP_70Percent: printf("70Percent"); break; + case U_HSP_75Percent: printf("75Percent"); break; + case U_HSP_80Percent: printf("80Percent"); break; + case U_HSP_90Percent: printf("90Percent"); break; + case U_HSP_LightDownwardDiagonal: printf("LightDownwardDiagonal"); break; + case U_HSP_LightUpwardDiagonal: printf("LightUpwardDiagonal"); break; + case U_HSP_DarkDownwardDiagonal: printf("DarkDownwardDiagonal"); break; + case U_HSP_DarkUpwardDiagonal: printf("DarkUpwardDiagonal"); break; + case U_HSP_WideDownwardDiagonal: printf("WideDownwardDiagonal"); break; + case U_HSP_WideUpwardDiagonal: printf("WideUpwardDiagonal"); break; + case U_HSP_LightVertical: printf("LightVertical"); break; + case U_HSP_LightHorizontal: printf("LightHorizontal"); break; + case U_HSP_NarrowVertical: printf("NarrowVertical"); break; + case U_HSP_NarrowHorizontal: printf("NarrowHorizontal"); break; + case U_HSP_DarkVertical: printf("DarkVertical"); break; + case U_HSP_DarkHorizontal: printf("DarkHorizontal"); break; + case U_HSP_DashedDownwardDiagonal: printf("DashedDownwardDiagonal"); break; + case U_HSP_DashedUpwardDiagonal: printf("DashedUpwardDiagonal"); break; + case U_HSP_DashedHorizontal: printf("DashedHorizontal"); break; + case U_HSP_DashedVertical: printf("DashedVertical"); break; + case U_HSP_SmallConfetti: printf("SmallConfetti"); break; + case U_HSP_LargeConfetti: printf("LargeConfetti"); break; + case U_HSP_ZigZag: printf("ZigZag"); break; + case U_HSP_Wave: printf("Wave"); break; + case U_HSP_DiagonalBrick: printf("DiagonalBrick"); break; + case U_HSP_HorizontalBrick: printf("HorizontalBrick"); break; + case U_HSP_Weave: printf("Weave"); break; + case U_HSP_Plaid: printf("Plaid"); break; + case U_HSP_Divot: printf("Divot"); break; + case U_HSP_DottedGrid: printf("DottedGrid"); break; + case U_HSP_DottedDiamond: printf("DottedDiamond"); break; + case U_HSP_Shingle: printf("Shingle"); break; + case U_HSP_Trellis: printf("Trellis"); break; + case U_HSP_Sphere: printf("Sphere"); break; + case U_HSP_SmallGrid: printf("SmallGrid"); break; + case U_HSP_SmallCheckerBoard: printf("SmallCheckerBoard"); break; + case U_HSP_LargeCheckerBoard: printf("LargeCheckerBoard"); break; + case U_HSP_OutlinedDiamond: printf("OutlinedDiamond"); break; + case U_HSP_SolidDiamond: printf("SolidDiamond"); break; + default: status=0; printf("INVALID(%d)",hstype); break; + } + return(status); +} + +/** + \brief Print value of an ObjectType Enumeration + \returns record 1 on sucess, 0 on error + \param otype Value to print. + EMF+ manual 2.1.1.22, Microsoft name: ObjectType Enumeration +*/ +int U_PMF_OBJECTTYPEENUMERATION_print(int otype){ + int status=1; + switch(otype){ + case U_OT_Invalid: printf("Invalid"); break; + case U_OT_Brush: printf("Brush"); break; + case U_OT_Pen: printf("Pen"); break; + case U_OT_Path: printf("Path"); break; + case U_OT_Region: printf("Region"); break; + case U_OT_Image: printf("Image"); break; + case U_OT_Font: printf("Font"); break; + case U_OT_StringFormat: printf("StringFormat"); break; + case U_OT_ImageAttributes: printf("ImageAttributes"); break; + case U_OT_CustomLineCap: printf("CustomLineCap"); break; + default: + status=0; printf("INVALID(%d)",otype); break; + } + return(status); +} + +/** + \brief Print value of a U_PMF_PATHPOINTTYPE_ENUM object + \return 1 + \param Type Value to print + EMF+ manual 2.1.1.23, Microsoft name: PathPointType Enumeration +*/ +int U_PMF_PATHPOINTTYPE_ENUM_print(int Type){ + switch(Type & U_PPT_MASK){ + case U_PPT_Start : printf("Start"); break; + case U_PPT_Line : printf("Line"); break; + case U_PPT_Bezier: printf("Bezier"); break; + default: printf("INVALID(%d)",Type); break; + } + return(1); +} + +/** + \brief Print data from a PixelFormat Enumeration value + \return 1 always + \param pfe A PixelFormat Enumeration value + EMF+ manual 2.1.1.25, Microsoft name: PixelFormat Enumeration (U_PF_*) +*/ +int U_PMF_PX_FMT_ENUM_print(int pfe){ + uint8_t idx; + printf(" + PxFmtEnum: "); + printf(" 32Bit:%c", (pfe & 1<< 9 ? 'Y' : 'N')); + printf(" 16Bit:%c", (pfe & 1<<10 ? 'Y' : 'N')); + printf(" PreAlpha:%c", (pfe & 1<<11 ? 'Y' : 'N')); + printf(" Alpha:%c", (pfe & 1<<12 ? 'Y' : 'N')); + printf(" GDI:%c", (pfe & 1<<13 ? 'Y' : 'N')); + printf(" LUT:%c", (pfe & 1<<14 ? 'Y' : 'N')); + printf(" BitsPerPx:%u", (pfe >> 16) & 0xFF); + idx = pfe >> 24; + printf(" Type:%u(",idx); + switch(idx){ + case 0: printf("undefined"); break; + case 1: printf("monochrome with LUT"); break; + case 2: printf("4 bit with LUT"); break; + case 3: printf("8 bit with LUT"); break; + case 4: printf("16 bits grey values"); break; + case 5: printf("16 bit RGB values (5,5,5,(1 ignored))"); break; + case 6: printf("16 bit RGB values (5,6,5)"); break; + case 7: printf("16 bit ARGB values (1 alpha, 5,5,5 colors)"); break; + case 8: printf("24 bit RGB values (8,8.8)"); break; + case 9: printf("32 bit RGB value (8,8,8,(8 ignored))"); break; + case 10: printf("32 bit ARGB values (8 alpha,8,8,8)"); break; + case 11: printf("32 bit PARGB values (8,8,8,8, but RGB already multiplied by A)"); break; + case 12: printf("48 bit RGB (16,16,16)"); break; + case 13: printf("64 bit ARGB (16 alpha, 16,16,16)"); break; + case 14: printf("64 bit PARGB (16,16,16,16, but RGB already multiplied by A)"); break; + default: printf("INVALID(%d)",idx); break; + } + printf(")"); + return(1); +} + +/** + \brief Print as text a RegionNodeDataType Enumeration + \return 1 + \param Type RegionNodeDataType Enumeration + EMF+ manual 2.1.1.27, Microsoft name: RegionNodeDataType Enumeration (U_RNDT_*) +*/ +int U_PMF_NODETYPE_print(int Type){ + if( Type == U_RNDT_And ){ printf("And" ); } + else if(Type == U_RNDT_Or ){ printf("Or" ); } + else if(Type == U_RNDT_Xor ){ printf("Xor" ); } + else if(Type == U_RNDT_Exclude ){ printf("Exclude" ); } + else if(Type == U_RNDT_Complement){ printf("Complement"); } + else if(Type == U_RNDT_Rect ){ printf("Rect" ); } + else if(Type == U_RNDT_Path ){ printf("Path" ); } + else if(Type == U_RNDT_Empty ){ printf("Empty" ); } + else if(Type == U_RNDT_Infinite ){ printf("Infinite" ); } + else { printf("Undefined" ); return(0); } + return(1); +} + +/** + \brief Print data from a U_PMF_BRUSH object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.1.1, Microsoft name: EmfPlusBrush Object +*/ +int U_PMF_BRUSH_print(const char *contents){ + uint32_t Version, Type; + const char *Data; + int status = U_PMF_BRUSH_get(contents, &Version, &Type, &Data); + if(status){ + printf(" + Brush:"); + (void) U_PMF_GRAPHICSVERSION_print((char *)&Version); + printf(" Type:%X(",Type); + (void) U_PMF_BRUSHTYPEENUMERATION_print(Type); + printf(")"); + switch(Type){ + case U_BT_SolidColor: + status = U_PMF_ARGB_print(Data); + break; + case U_BT_HatchFill: + printf("\n"); + status = U_PMF_HATCHBRUSHDATA_print(Data); + break; + case U_BT_TextureFill: + printf("\n"); + status = U_PMF_TEXTUREBRUSHDATA_print(Data); + break; + case U_BT_PathGradient: + printf("\n"); + status = U_PMF_PATHGRADIENTBRUSHDATA_print(Data); + break; + case U_BT_LinearGradient: + printf("\n"); + status = U_PMF_LINEARGRADIENTBRUSHDATA_print(Data); + break; + default: + status = 0; + } + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMF_CUSTOMLINECAP object + \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". + EMF+ manual 2.2.1.2, Microsoft name: EmfPlusCustomLineCap Object +*/ +int U_PMF_CUSTOMLINECAP_print(const char *contents, const char *Which){ + uint32_t Version, Type; + const char *Data; + int status = U_PMF_CUSTOMLINECAP_get(contents, &Version, &Type, &Data); + + if(status){ + printf(" + %sLineCap:",Which); + (void) U_PMF_GRAPHICSVERSION_print((char *)&Version); + printf(", Type %X\n",Type); + switch(Type){ + case U_CLCDT_Default: + status = U_PMF_CUSTOMLINECAPDATA_print(Data); + break; + case U_CLCDT_AdjustableArrow: + status = U_PMF_CUSTOMLINECAPARROWDATA_print(Data); + break; + default: + status = 0; + } + } + return(status); +} + +/** + \brief Print data from a U_PMF_FONT object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.1.3, Microsoft name: EmfPlusFont Object +*/ +int U_PMF_FONT_print(const char *contents){ + 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); + if(status){ + printf(" + Font:"); + (void) U_PMF_GRAPHICSVERSION_print((char *)&Version); + printf(" EmSize:%f ", EmSize ); + printf(" SizeUnit:%d ",SizeUnit); + printf(" FSFlags:%d ", FSFlags ); + printf(" Length:%d", Length ); + string = U_Utf16leToUtf8((uint16_t *)Data, Length, NULL); + if(string){ + printf(" Family:<%s>\n",string); + free(string); + } + else { + printf(" Family:<>\n"); + } + } + return(status); +} + + +/** + \brief Print data from a U_PMF_IMAGE object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.1.4, Microsoft name: EmfPlusImage Object +*/ +int U_PMF_IMAGE_print(const char *contents){ + uint32_t Version, Type; + const char *Data; + int status = U_PMF_IMAGE_get(contents, &Version, &Type, &Data); + if(status){ + printf(" + Image:"); + (void) U_PMF_GRAPHICSVERSION_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); + break; + case U_IDT_Metafile: + status = U_PMF_METAFILE_print(Data); + break; + default: + status = 0; + } + } + return(status); +} + + +/** + \brief Print data from a U_PMF_IMAGEATTRIBUTES object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.1.5, Microsoft name: EmfPlusImageAttributes Object +*/ +int U_PMF_IMAGEATTRIBUTES_print(const char *contents){ + uint32_t Version, WrapMode, ClampColor, ObjectClamp; + int status = U_PMF_IMAGEATTRIBUTES_get(contents, &Version, &WrapMode, &ClampColor, &ObjectClamp); + + if(status){ + printf(" + Image Attributes: "); + (void) U_PMF_GRAPHICSVERSION_print((char *)&Version); + printf(" WrapMode:%X", WrapMode); + printf(" ClampColor:%X", ClampColor); + printf(" ObjectClamp:%X\n", ObjectClamp); + } + return(status); +} + + + +/** + \brief Print data from a U_PMF_PATH object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.1.6, Microsoft name: EmfPlusPath Object +*/ +int U_PMF_PATH_print(const char *contents){ + 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); + if(status){ + printf(" + Path: Version:%X Count:%d Flags:%X\n",Version, Count, Flags); + + /* Points part */ + U_PMF_VARPOINTS_print(&Points, Flags, Count); + + /* Types part */ + printf(" + Types:"); + pos = 0; + for(i=0; iX, Point->Y); + return(1); +} + +/** + \brief Print data from a U_PMF_POINTF object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object +*/ +int U_PMF_POINTF_print(const char **contents){ + U_FLOAT X, Y; + int status = U_PMF_POINTF_get(contents, &X, &Y); + if(status){ + printf("{%f,%f}", X, Y); + } + return(status); +} + +/** + \brief Print data from a U_PMF_POINTF Structure + \return 1 on success, 0 on error + \param Point U_PMF_POINTF Structure to print + EMF+ manual 2.2.2.36, Microsoft name: EmfPlusPointF Object +*/ +int U_PMF_POINTF_S_print(U_PMF_POINTF *Point){ + if(!Point){ return(0); } + printf("{%f,%f}", Point->X, Point->Y); + return(1); +} + +/** + \brief Print data from a U_PMF_POINTR object + \return bytes traversed on success, 0 on error + \param contents Pointer to next data to print + \param Xpos X coordinate for current point + \param Ypos Y coordinate for current point + + On each call the next relative offset is extracted, the current + coordinates are modified with that offset, and the pointer is + advanced to the next data 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){ + U_FLOAT X, Y; + int status = U_PMF_POINTR_get(contents, &X, &Y); + *Xpos += X; + *Ypos += Y; + if(status){ + printf("{%f,%f(%f,%f)}", *Xpos, *Ypos, X, Y); + } + return(status); +} + +/** + \brief Print data from a U_PMF_RECT object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.2.38, Microsoft name: EmfPlusRect Object +*/ +int U_PMF_RECT_print(const char **contents){ + int16_t X, Y, Width, Height; + int status = U_PMF_RECT_get(contents, &X, &Y, &Width, &Height); + if(status){ + printf("{UL{%d,%d},WH{%d,%d}}", X, Y, Width, Height); + } + return(status); +} + +/** + \brief Print data from a U_PMF_RECT Structure + \return 1 on success, 0 on error + \param Rect U_PMF_RECT structure + EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object +*/ +int U_PMF_RECT_S_print(U_PMF_RECT *Rect){ + printf("{UL{%d,%d},WH{%d,%d}}", Rect->X, Rect->Y, Rect->Width, Rect->Height); + return(1); +} + +/** + \brief Print data from a U_PMF_RECTF object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object +*/ +int U_PMF_RECTF_print(const char **contents){ + U_FLOAT X, Y, Width, Height; + int status = U_PMF_RECTF_get(contents, &X, &Y, &Width, &Height); + if(status){ + printf("{UL{%f,%f},WH{%f,%f}}", X, Y, Width, Height); + } + return(status); +} + +/** + \brief Print data from a U_PMF_RECTF Structure + \return 1 on success, 0 on error + \param Rect U_PMF_RECTF Structure + EMF+ manual 2.2.2.39, Microsoft name: EmfPlusRectF Object +*/ +int U_PMF_RECTF_S_print(U_PMF_RECTF *Rect){ + printf("{UL{%f,%f},WH{%f,%f}}", Rect->X, Rect->Y, Rect->Width, Rect->Height); + return(1); +} + +/** + \brief Print data from a U_PMF_REGIONNODE object + \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. + EMF+ manual 2.2.2.40, Microsoft name: EmfPlusRegionNode Object +*/ +int U_PMF_REGIONNODE_print(const char *contents, int Level){ + int len=4; /* Type will always be present */ + uint32_t Type; + const char *Data; + int status = U_PMF_REGIONNODE_get(contents, &Type, &Data); + 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); + } + else if(Type == U_RNDT_Rect){ + len += sizeof(U_PMF_RECTF); + (void) U_PMF_RECTF_print(&Data); + printf("\n"); + } + else if(Type == U_RNDT_Path){ + len += U_PMF_REGIONNODEPATH_print(Data); + } + /* U_RNDT_Empty and U_RNDT_Infinite do not change the length */ + else if(Type == U_RNDT_Empty ){ printf(" Empty" ); } + else if(Type == U_RNDT_Infinite ){ printf(" Infinite" ); } + printf(" + RegionNode(Level:%d) }",Level); + status = len; /* length of data + length of type */ + } + printf("\n"); + return(status); +} + +/** + \brief Print data from a U_PMF_REGIONNODECHILDNODES object + \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. + EMF+ manual 2.2.2.41, Microsoft name: EmfPlusRegionNodeChildNodes Object +*/ +int U_PMF_REGIONNODECHILDNODES_print(const char *contents, int Level){ + uint32_t size,rsize; + printf(" RegionNodeChildNodes:\n"); + printf(" + RNCN__Left(Level:%d) {", Level); + size = U_PMF_REGIONNODE_print(contents, Level); + printf(" + RNCN__Left(Level:%d) },\n", Level); + if(size){ + contents += size; + printf(" + RNCN_Right(Level:%d) {", Level); + rsize = U_PMF_REGIONNODE_print(contents, Level); + size += rsize; + printf(" + RNCN_Right(Level:%d) },\n",Level); + } + return(size); +} + +/** + \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 + EMF+ manual 2.2.2.42, Microsoft name: EmfPlusRegionNodePath Object +*/ +int U_PMF_REGIONNODEPATH_print(const char *contents){ + int32_t Size; + const char *Data; + int status = U_PMF_REGIONNODEPATH_get(contents, &Size, &Data); + if(status){ + printf(" RegionNodePath: \n"); + (void) U_PMF_PATH_print(Data); + status = Size + 4; /* data sizee + the 4 bytes encoding the size */ + } + return(status); +} + + +/** + \brief Print data from a U_PMF_SOLIDBRUSHDATA object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.2.43, Microsoft name: EmfPlusSolidBrushData Object +*/ +int U_PMF_SOLIDBRUSHDATA_print(const char *contents){ + U_PMF_ARGB Color; + int status = U_PMF_SOLIDBRUSHDATA_get(contents, &Color); + if(status){ + printf(" SolidBrushData: "); + (void) U_PMF_ARGB_print((char *) &Color); + } + return(status); +} + +/** + \brief Print data from a U_PMF_STRINGFORMATDATA object + \return 1 on success, 0 on error + \param contents Record from which to print data + \param TabStopCount Entries in TabStop array + \param RangeCount Entries in CharRange array + EMF+ manual 2.2.2.44, Microsoft name: EmfPlusStringFormatData Object +*/ +int U_PMF_STRINGFORMATDATA_print(const char *contents, uint32_t TabStopCount, uint32_t RangeCount){ + const U_FLOAT *TabStops; + const U_PMF_CHARACTERRANGE *CharRange; + int status = U_PMF_STRINGFORMATDATA_get(contents, TabStopCount, RangeCount, &TabStops, &CharRange); + if(status){ + printf(" SFdata: TabStopCount:%u RangeCount:%u\n", TabStopCount, RangeCount); + + printf(" Tabstops:"); + for(; TabStopCount; TabStopCount--,TabStops++){ printf(" %f",*TabStops); } + printf("\n"); + + printf(" CharRange:"); + for(; RangeCount; RangeCount--,CharRange++){ printf(" {%d,%d}",CharRange->First,CharRange->Length); } + printf("\n"); + + } + return(status); +} + +/** + \brief Print data from a U_PMF_TEXTUREBRUSHDATA object + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.2.2.45, Microsoft name: EmfPlusTextureBrushData Object +*/ +int U_PMF_TEXTUREBRUSHDATA_print(const char *contents){ + uint32_t Flags; + int32_t WrapMode; + const char *Data; + int status = U_PMF_TEXTUREBRUSHDATA_get(contents, &Flags, &WrapMode, &Data); + if(status){ + printf(" + TBdata: Flags:%X WrapMode:%d", Flags, WrapMode); + } + return(status); +} + +/** + \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 HasImage True if the record contains an image. + + EMF+ manual 2.2.2.46, Microsoft name: EmfPlusTextureBrushOptionalData Object +*/ +int U_PMF_TEXTUREBRUSHOPTIONALDATA_print(const char *contents, int HasImage){ + U_PMF_TRANSFORMMATRIX Matrix; + const char *Image; + int status = U_PMF_TEXTUREBRUSHOPTIONALDATA_get(contents, HasImage, &Matrix, &Image); + if(status){ + printf(" + TBOptdata: Image:%c", (HasImage ? 'Y' : 'N')); + (void) U_PMF_TRANSFORMMATRIX2_print(&Matrix); + (void) U_PMF_IMAGE_print(Image); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object +*/ +int U_PMF_TRANSFORMMATRIX_print(const char *contents){ + U_PMF_TRANSFORMMATRIX Tm; + int status = U_PMF_TRANSFORMMATRIX_get(contents, &Tm); + if(status){ + U_PMF_TRANSFORMMATRIX2_print(&Tm); + } + return(status); +} + +/** + \brief Print data from a U_PMF_TRANSFORMMATRIX structure + \return 1 on success, 0 on error + \param Tm U_PMF_TRANSFORMMATRIX structure + EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object +*/ +int U_PMF_TRANSFORMMATRIX2_print(U_PMF_TRANSFORMMATRIX *Tm){ + printf(" Matrix:{%f,%f,%f,%f,%f,%f}", Tm->m11, Tm->m12, Tm->m21, Tm->m22, Tm->dX, Tm->dY); + return(1); +} + +/** + \brief Print data from a U_PMF_ROTMATRIX object + \return 1 on success, 0 on error + \param Rm U_PMF_ROTMATRIX object + NOT DOCUMENTED, like EMF+ manual 2.2.2.47, Microsoft name: EmfPlusTransformMatrix Object, but missing offset values +*/ +int U_PMF_ROTMATRIX2_print(U_PMF_ROTMATRIX *Rm){ + printf(" Matrix:{%f,%f,%f,%f}", Rm->m11, Rm->m12, Rm->m21, Rm->m22); + return(1); +} + +/** + \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 + EMF+ manual 2.2.3.1, Microsoft name: BlurEffect Object +*/ +int U_PMF_IE_BLUR_print(const char *contents){ + U_FLOAT Radius; + uint32_t ExpandEdge; + int status = U_PMF_IE_BLUR_get(contents, &Radius, &ExpandEdge); + if(status){ + printf("BlurEffect Radius:%f ExpandEdge:%u\n", Radius, ExpandEdge); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.2, Microsoft name: BrightnessContrastEffect Object +*/ +int U_PMF_IE_BRIGHTNESSCONTRAST_print(const char *contents){ + int32_t Brightness, Contrast; + int status = U_PMF_IE_BRIGHTNESSCONTRAST_get(contents, &Brightness, &Contrast); + if(status){ + printf("BrightnessContrastEffect Brightness:%d Contrast:%d\n", Brightness, Contrast); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.3, Microsoft name: ColorBalanceEffect Object +*/ +int U_PMF_IE_COLORBALANCE_print(const char *contents){ + int32_t CyanRed, MagentaGreen, YellowBlue; + int status = U_PMF_IE_COLORBALANCE_get(contents, &CyanRed, &MagentaGreen, &YellowBlue); + if(status){ + printf("ColorBalanceEffect CyanRed:%d MagentaGreen:%d YellowBlue:%d\n", CyanRed, MagentaGreen, YellowBlue); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.4, Microsoft name: ColorCurveEffect Object +*/ +int U_PMF_IE_COLORCURVE_print(const char *contents){ + uint32_t Adjust, Channel; + int32_t Intensity; + int status = U_PMF_IE_COLORCURVE_get(contents, &Adjust, &Channel, &Intensity); + if(status){ + printf("ColorBalanceEffect Adjust:%u Channel:%u Intensity:%d\n", Adjust, Channel, Intensity); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.5, Microsoft name: ColorLookupTableEffect Object +*/ +int U_PMF_IE_COLORLOOKUPTABLE_print(const char *contents){ + const uint8_t *BLUT, *GLUT, *RLUT, *ALUT; + int status = U_PMF_IE_COLORLOOKUPTABLE_get(contents, &BLUT, &GLUT, &RLUT, &ALUT); + if(status){ + printf("ColorLookupTableEffect \n"); + U_PMF_UINT8_ARRAY_print(" BLUT:", BLUT, 256, "\n"); + U_PMF_UINT8_ARRAY_print(" GLUT:", GLUT, 256, "\n"); + U_PMF_UINT8_ARRAY_print(" RLUT:", RLUT, 256, "\n"); + U_PMF_UINT8_ARRAY_print(" ALUT:", ALUT, 256, "\n"); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.6, Microsoft name: ColorMatrixEffect Object +*/ +int U_PMF_IE_COLORMATRIX_print(const char *contents){ + U_PMF_IE_COLORMATRIX Matrix; + int i,j; + int status = U_PMF_IE_COLORMATRIX_get(contents, &Matrix); + if(status){ + printf("ColorMatrixEffect\n"); + for(i=0;i<5;i++){ + printf(" {"); + for(j=0;j<4;i++){ printf("%f,",Matrix.M[i][j]); } + printf("%f}",Matrix.M[i][j]); + } + printf("\n"); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.7, Microsoft name: HueSaturationLightnessEffect Object +*/ +int U_PMF_IE_HUESATURATIONLIGHTNESS_print(const char *contents){ + int32_t Hue, Saturation, Lightness; + int status = U_PMF_IE_HUESATURATIONLIGHTNESS_get(contents, &Hue, &Saturation, &Lightness); + if(status){ + printf("HueSaturationLightnessEffect Hue:%d Saturation:%d Lightness:%d\n", Hue, Saturation, Lightness); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.8, Microsoft name: LevelsEffect Object +*/ +int U_PMF_IE_LEVELS_print(const char *contents){ + int32_t Highlight, Midtone, Shadow; + int status = U_PMF_IE_LEVELS_get(contents, &Highlight, &Midtone, &Shadow); + if(status){ + printf("LevelEffect Highlight:%d Midtone:%d Shadow:%d\n", Highlight, Midtone, Shadow); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.9, Microsoft name: RedEyeCorrectionEffect Object +*/ +int U_PMF_IE_REDEYECORRECTION_print(const char *contents){ + int32_t Elements; + U_RECTL *Rects; + int status = U_PMF_IE_REDEYECORRECTION_get(contents, &Elements, &Rects); + if(status){ + printf("RedEyeCorrectionEffect Elements:%u", Elements); + for(; Elements; Elements--, Rects++){ + printf(" "); + rectl_print(*Rects); + } + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMF_IE_SHARPEN object + \return 1 on success, 0 on error + \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){ + U_FLOAT Radius; + int32_t Sharpen; + int status = U_PMF_IE_SHARPEN_get(contents, &Radius, &Sharpen); + if(status){ + printf("SharpenEffect Radius:%f Sharpen:%u\n", Radius, Sharpen); + } + return(status); +} + +/** + \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 + EMF+ manual 2.2.3.11, Microsoft name: TintEffect Object +*/ +int U_PMF_IE_TINT_print(const char *contents){ + int32_t Hue, Amount; + int status = U_PMF_IE_TINT_get(contents, &Hue, &Amount); + if(status){ + printf("TintEffect Hue:%d Amount:%d\n", Hue, Amount); + } + return(status); +} + +/* ***************************************************************************************** */ +/* EMF+ records, the EMF+ record header is printed separately, these print the contents only */ +/* ***************************************************************************************** */ + + +/** + \brief Print data from a U_PMR_OFFSETCLIP record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.1.1, Microsoft name: EmfPlusOffsetClip Record, Index 0x35 +*/ +int U_PMR_OFFSETCLIP_print(const char *contents){ + U_PMF_CMN_HDR Header; + U_FLOAT dX,dY; + int status = U_PMR_OFFSETCLIP_get(contents, &Header, &dX, &dY); + if(status){ + printf(" + dx:%f dy:%f\n",dX,dY); + } + return(status); +} + +/** + \brief Print data from a U_PMR_OFFSETCLIP record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.1.2, Microsoft name: EmfPlusResetClip Record, Index 0x31 +*/ +int U_PMR_RESETCLIP_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_SETCLIPPATH record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.1.3, Microsoft name: EmfPlusSetClipPath Record, Index 0x33 +*/ +int U_PMR_SETCLIPPATH_print(const char *contents){ + int CMenum; + uint32_t PathID; + int status = U_PMR_SETCLIPPATH_get(contents, NULL, &PathID, &CMenum); + if(status){ + printf(" + PathID:%u CMenum:%d\n",PathID,CMenum); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETCLIPRECT record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.1.4, Microsoft name: EmfPlusSetClipRect Record, Index 0x32 +*/ +int U_PMR_SETCLIPRECT_print(const char *contents){ + int CMenum; + U_PMF_RECTF Rect; + int status = U_PMR_SETCLIPRECT_get(contents, NULL, &CMenum, &Rect); + if(status){ + printf(" + CMenum:%d(", CMenum); + U_PMF_COMBINEMODEENUMERATION_print(CMenum); + printf(") Rect:"); + U_PMF_RECTF_S_print(&Rect); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETCLIPREGION record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.1.5, Microsoft name: EmfPlusSetClipRegion Record, Index 0x34 +*/ +int U_PMR_SETCLIPREGION_print(const char *contents){ + int CMenum; + uint32_t PathID; + int status = U_PMR_SETCLIPREGION_get(contents, NULL, &PathID, &CMenum); + if(status){ + printf(" + PathID:%u CMenum:%d(",PathID, CMenum); + U_PMF_COMBINEMODEENUMERATION_print(CMenum); + printf(")\n"); + } + return(status); +} + + +/** + \brief Print data from a U_PMR_COMMENT record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.2.1, Microsoft name: EmfPlusComment Record, Index 0x03 +*/ +int U_PMR_COMMENT_print(const char *contents){ + U_PMF_CMN_HDR Header; + const char *Data; + unsigned int i=0; + int status = U_PMR_COMMENT_get(contents, &Header, &Data); + if(status){ + /* try to print it, but only ASCII, bail on anything that is not ASCII */ + printf(" + Data:"); + for(i=0; i< Header.DataSize; i++,Data++){ + if(!*Data)break; + if(*(unsigned const char *)Data <128){ printf("%c",*Data); } + else { break; } + } + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_ENDOFFILE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.3.1, Microsoft name: EmfPlusEndOfFile Record, Index 0x02 +*/ +int U_PMR_ENDOFFILE_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_ENDOFFILE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.3.2, Microsoft name: EmfPlusGetDC Record, Index 0x04 +*/ +int U_PMR_GETDC_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_HEADER record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.3.3, Microsoft name: EmfPlusHeader Record, Index 0x01 +*/ +int U_PMR_HEADER_print(const char *contents){ + U_PMF_GRAPHICSVERSION Version; + int IsDual, IsVideo; + uint32_t LogicalDpiX, LogicalDpiY; + int status = U_PMR_HEADER_get(contents, NULL, &Version, &IsDual, &IsVideo, &LogicalDpiX, &LogicalDpiY); + if(status){ + /* try to print it, but only ASCII, bail on anything that is not ASCII */ + printf(" + "); + (void) U_PMF_GRAPHICSVERSION_print((char *) &Version); + printf(" IsDual:%c IsVideo:%d LogicalDpiX,y:{%u,%u}\n",(IsDual ? 'Y' : 'N'),IsVideo,LogicalDpiX, LogicalDpiY); + } + return(status); +} + +/** + \brief Print data from a U_PMR_CLEAR record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.1, Microsoft name: EmfPlusClear Record, Index 0x09 +*/ +int U_PMR_CLEAR_print(const char *contents){ + U_PMF_ARGB Color; + int status = U_PMR_CLEAR_get(contents, NULL, &Color); + if(status){ + /* try to print it, but only ASCII, bail on anything that is not ASCII */ + printf(" + Color:"); + (void) U_PMF_ARGB_print((char *) &Color); + } + return(status); +} + +/** + \brief Print data from a U_PMR_DRAWARC record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.2, Microsoft name: EmfPlusDrawArc Record, Index 0x12 +*/ +int U_PMR_DRAWARC_print(const char *contents){ + uint32_t PenID; + int ctype; + U_FLOAT Start, Sweep; + U_PMF_RECTF Rect; + int status = U_PMR_DRAWARC_get(contents, NULL, &PenID, &ctype, &Start, &Sweep, &Rect); + if(status){ + printf(" + PenID:%u ctype:%d Start:%f Sweep:%f Rect:", PenID,ctype,Start,Sweep); + (void) U_PMF_VARRECTF_S_print(&Rect, 1); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_DRAWBEZIERS record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.3, Microsoft name: EmfPlusDrawBeziers Record, Index 0x19 +*/ +int U_PMR_DRAWBEZIERS_print(const char *contents){ + uint32_t PenID; + int ctype, RelAbs; + uint32_t Elements; + U_PMF_POINTF *Points; + int status = U_PMR_DRAWBEZIERS_get(contents, NULL, &PenID, &ctype, &RelAbs, &Elements, &Points); + if(status){ + printf(" + PenIdx:%u ctype:%d RelAbs:%d Elements:%u\n", PenID, ctype, RelAbs, Elements); + U_PMF_VARPOINTF_S_print(Points, Elements); + free(Points); + } + return(status); +} + +/** + \brief Print data from a U_PMR_DRAWCLOSEDCURVE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + + Curve is a cardinal spline. + References sent by MS support: + http://alvyray.com/Memos/CG/Pixar/spline77.pdf + http://msdn.microsoft.com/en-us/library/4cf6we5y(v=vs.110).aspx + + EMF+ manual 2.3.4.4, Microsoft name: EmfPlusDrawClosedCurve Record, Index 0x17 +*/ +int U_PMR_DRAWCLOSEDCURVE_print(const char *contents){ + uint32_t PenID; + int ctype, RelAbs; + U_FLOAT Tension; + uint32_t Elements; + U_PMF_POINTF *Points; + int status = U_PMR_DRAWCLOSEDCURVE_get(contents, NULL, &PenID, &ctype, &RelAbs, &Tension, &Elements, &Points); + if(status){ + printf(" + PenID:%u ctype:%d RelAbs:%d Tension:%f\n", PenID, ctype, RelAbs, Tension); + U_PMF_VARPOINTF_S_print(Points, Elements); + free(Points); + } + return(status); +} + +/** + \brief Print data from a U_PMR_DRAWCURVE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + + Curve is a cardinal spline, using doubled terminator points to generate curves for the terminal segments. + References sent by MS support: + http://alvyray.com/Memos/CG/Pixar/spline77.pdf + http://msdn.microsoft.com/en-us/library/4cf6we5y(v=vs.110).aspx + + EMF+ manual 2.3.4.5, Microsoft name: EmfPlusDrawCurve Record, Index 0x18 +*/ +int U_PMR_DRAWCURVE_print(const char *contents){ + uint32_t PenID; + int ctype; + U_FLOAT Tension; + uint32_t Offset, NSegs, Elements; + U_PMF_POINTF *Points; + int status = U_PMR_DRAWCURVE_get(contents, NULL, &PenID, &ctype, &Tension, &Offset, &NSegs, &Elements, &Points); + if(status){ + printf(" + PenID:%u ctype:%d Tension:%f Offset:%u NSegs:%u Elements:%u\n", PenID, ctype, Tension, Offset, NSegs, Elements); + U_PMF_VARPOINTF_S_print(Points, Elements); + free(Points); + } + return(status); +} + +/** + \brief Print data from a U_PMR_DRAWDRIVERSTRING record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.6, Microsoft name: EmfPlusDrawDriverString Record, Index 0x36 +*/ +int U_PMR_DRAWDRIVERSTRING_print(const char *contents){ + unsigned int i; + uint32_t FontID; + int btype; + U_FLOAT Tension; + uint32_t BrushID, DSOFlags, HasMatrix, Elements; + uint16_t *Glyphs; + U_PMF_POINTF *Points; + U_PMF_TRANSFORMMATRIX *Matrix; + int status = U_PMR_DRAWDRIVERSTRING_get(contents, NULL, &FontID, &btype, + &Tension, &BrushID, &DSOFlags, &HasMatrix, &Elements,&Glyphs, &Points, &Matrix); + if(status){ + printf(" + FontID:%u btype:%d Tension:%f BrushID:%u DSOFlags:%X Elements:%u\n", FontID,btype,Tension, BrushID, DSOFlags, Elements); + + printf(" + Glyphs:"); + if(*Glyphs){ + for(i=0; i= blimit)return(0); + printf(" + PenID:%u ctype:%d Elements:%u Rect:", PenID,ctype,Elements); + (void) U_PMF_VARRECTF_S_print(Rects, Elements); + printf("\n"); + } + if(Rects)free(Rects); + return(status); +} + +/** + \brief Print data from a U_PMR_DRAWSTRING record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.14, Microsoft name: EmfPlusDrawString Record, Index 0x1C +*/ +int U_PMR_DRAWSTRING_print(const char *contents){ + char *String8=NULL; + uint32_t FontID, BrushID, FormatID, Length; + int btype; + U_PMF_RECTF Rect; + uint16_t *String16; + int status = U_PMR_DRAWSTRING_get(contents, NULL, &FontID, &btype, + &BrushID, &FormatID, &Length, &Rect, &String16); + if(status){ + printf(" + FontID:%u StringFormatID:%u btype:%d Length:%u Rect:", FontID, FormatID, btype, Length); + (void) U_PMF_RECTF_S_print(&Rect); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + if(String16){ + String8 = U_Utf16leToUtf8(String16, Length, NULL); + free(String16); + if(String8){ + printf(" String(as_UTF8):<%s>\n",String8); + free(String8); + } + } + else { + printf(" String(as_UTF8):(none)\n"); + } + } + return(status); +} + +/** + \brief Print data from a U_PMR_FILLCLOSEDCURVE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.15, Microsoft name: EmfPlusFillClosedCurve Record, Index 0x16 +*/ +int U_PMR_FILLCLOSEDCURVE_print(const char *contents){ + uint32_t BrushID; + int btype, ctype, ftype, RelAbs; + U_FLOAT Tension; + uint32_t Elements; + U_PMF_POINTF *Points; + int status = U_PMR_FILLCLOSEDCURVE_get(contents, NULL, &btype, &ctype, &ftype, &RelAbs, + &BrushID, &Tension, &Elements, &Points); + if(status){ + printf(" + btype:%d ctype:%d ftype:%d RelAbs:%d Elements:%u", + btype, ctype, ftype, RelAbs, Elements); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + printf("\n"); + U_PMF_VARPOINTF_S_print(Points, Elements); + free(Points); + } + return(status); +} + + +/** + \brief Print data from a U_PMR_FILLELLIPSE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.16, Microsoft name: EmfPlusFillEllipse Record, Index 0x0E +*/ +int U_PMR_FILLELLIPSE_print(const char *contents){ + int btype, ctype; + uint32_t BrushID; + U_PMF_RECTF Rect; + int status = U_PMR_FILLELLIPSE_get(contents, NULL, &btype, &ctype, &BrushID, &Rect); + if(status){ + printf(" + btype:%d ctype:%d",btype,ctype); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + (void) U_PMF_VARRECTF_S_print(&Rect, 1); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_FILLPATH record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.17, Microsoft name: EmfPlusFillPath Record, Index 0x14 +*/ +int U_PMR_FILLPATH_print(const char *contents){ + int btype; + uint32_t PathID, BrushID; + int status = U_PMR_FILLPATH_get(contents, NULL, &PathID, &btype, &BrushID); + if(status){ + printf(" + PathID:%u btype:%d",PathID, btype); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_FILLPIE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.18, Microsoft name: EmfPlusFillPie Record, Index 0x10 +*/ +int U_PMR_FILLPIE_print(const char *contents){ + int btype, ctype; + U_FLOAT Start, Sweep; + uint32_t BrushID; + U_PMF_RECTF Rect; + int status = U_PMR_FILLPIE_get(contents, NULL, &btype, &ctype, &BrushID, &Start, &Sweep, &Rect); + if(status){ + printf(" + btype:%d ctype:%d",btype,ctype); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + (void) U_PMF_VARRECTF_S_print(&Rect, 1); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_FILLPOLYGON record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.19, Microsoft name: EmfPlusFillPolygon Record, Index 0x0C +*/ +int U_PMR_FILLPOLYGON_print(const char *contents){ + int btype, ctype, RelAbs; + uint32_t BrushID, Elements; + U_PMF_POINTF *Points; + int status = U_PMR_FILLPOLYGON_get(contents, NULL, &btype, &ctype, &RelAbs, &BrushID, &Elements, &Points); + if(status){ + printf(" + btype:%d ctype:%d RelAbs:%d Elements:%u",btype,ctype,RelAbs,Elements); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + printf("\n"); + U_PMF_VARPOINTF_S_print(Points, Elements); + free(Points); + } + return(status); +} + +/** + \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 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"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_FILLREGION record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.4.21, Microsoft name: EmfPlusFillRegion Record, Index 0x13 +*/ +int U_PMR_FILLREGION_print(const char *contents){ + uint32_t RgnID, BrushID; + int btype, ctype; + int status = U_PMR_FILLREGION_get(contents, NULL, &RgnID, &btype, &ctype, &BrushID); + if(status){ + printf(" + RgnID:%u btype:%d ctype:%d", RgnID, btype, ctype); + (void) U_PMF_VARBRUSHID_print(btype, BrushID); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_OBJECT 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. + \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 +*/ +int U_PMR_OBJECT_print(const char *contents, const char *blimit, U_OBJ_ACCUM *ObjCont, int term){ + U_PMF_CMN_HDR Header; + uint32_t ObjID; + int otype, ntype; + uint32_t TSize; + const char *Data; + int ttype,status; + +//int k; const char *cptr; for(cptr=contents, k=0; k<608;k++,cptr++){ printf("%3.3d %2.2X\n",k,*(uint8_t*)cptr); }; fflush(stdout); + + /* Continued records are a pain. Each contains the total size of the continued object in the first 4 bytes + of data. When the total hits that then then the record is complete, even though the continuation bit will + still be set on that last record. Check for this and then print the terminated continued series. + */ + + if(term){ /* mode for handling unexpected end of accumulated object */ + if(ObjCont->used == 0)return(0); /* no continued object pending */ + printf(" + START Forced Termination of Accumulating object Bytes:%u ObjID:%u DeclaredType:%d(", + ObjCont->used, ObjCont->Id, ObjCont->Type); + U_PMF_OBJECTTYPEENUMERATION_print(ObjCont->Type); + ttype = ObjCont->Type & 0x3F; + printf(")\n"); + status = 1; + } + else { + status = U_PMR_OBJECT_get(contents, &Header, &ObjID, &otype, &ntype, &TSize, &Data); + /* 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((ObjCont->used > 0) && (U_OA_append(ObjCont, NULL, 0, otype, ObjID) < 0)){ + U_PMR_OBJECT_print(contents, blimit, ObjCont, 1); + } + printf(" + ObjID:%u ObjType:%d(", ObjID, otype); + U_PMF_OBJECTTYPEENUMERATION_print(otype); + printf(") ntype:%d", ntype); + printf(" ContinueD:%c",( ObjCont->used ? 'Y' : 'N')); + printf(" ContinueB:%c",( ntype ? 'Y' : 'N')); + if(ntype){ + U_OA_append(ObjCont, Data, Header.DataSize - 4, otype, ObjID); // The total byte count is not added to the object + printf(" TotalSize:%u",TSize); + printf(" Accumulated:%u",ObjCont->used); + } + else { + U_OA_append(ObjCont, Data, Header.DataSize, otype, ObjID); // The total byte count is not added to the object + } + printf("\n"); + if(ntype && ObjCont->used < TSize)return(status); + /* preceding terminates any continued series for >= accumulated bytes */ + ttype = otype; + } + if(status){ + 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_Invalid: + default: + printf("INVALID OBJECT TYPE!!!!\n"); + break; + } + U_OA_clear(ObjCont); + } + if(term)printf(" + END Forced Termination of Accumulating object\n"); + return(status); +} + +/** + \brief Print data from a U_PMR_SERIALIZABLEOBJECT record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.5.2, Microsoft name: EmfPlusSerializableObject Record, Index 0x38 +*/ +int U_PMR_SERIALIZABLEOBJECT_print(const char *contents){ + uint8_t GUID[16]; + uint32_t Size; + const char *Data; + char *string=NULL; + int iee; + int status = U_PMR_SERIALIZABLEOBJECT_get(contents, NULL, &GUID[0], &Size, &Data); + if(status){ + string = U_PMF_CURLYGUID_set(&GUID[0]); + if(string){ + printf(" + GUID:%s Size:%u",string,Size); + iee = U_PMF_KNOWNCURLYGUID_set(string); /* overwrites string with short text form */ + 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; + } + } + else { + printf(" + GUID:ERROR Size:%u\n",Size); + } + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETANTIALIASMODE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.1, Microsoft name: EmfPlusSetAntiAliasMode Record, Index 0x1E +*/ +int U_PMR_SETANTIALIASMODE_print(const char *contents){ + int SMenum, aatype; + int status = U_PMR_SETANTIALIASMODE_get(contents, NULL, &SMenum, &aatype); + if(status){ + printf(" + SMenum:%d AntiAlias:%c\n",SMenum,(aatype ? 'Y' : 'N')); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETCOMPOSITINGMODE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.2, Microsoft name: EmfPlusSetCompositingMode Record, Index 0x23 +*/ +int U_PMR_SETCOMPOSITINGMODE_print(const char *contents){ + int CMenum; + int status = U_PMR_SETCOMPOSITINGMODE_get(contents, NULL, &CMenum); + if(status){ + printf(" + CMenum:%d\n",CMenum); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETCOMPOSITINGQUALITY record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.3, Microsoft name: EmfPlusSetCompositingQuality Record, Index 0x24 +*/ +int U_PMR_SETCOMPOSITINGQUALITY_print(const char *contents){ + int CQenum; + int status = U_PMR_SETCOMPOSITINGQUALITY_get(contents, NULL, &CQenum); + if(status){ + printf(" + CQenum:%d\n",CQenum); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETINTERPOLATIONMODE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.4, Microsoft name: EmfPlusSetInterpolationMode Record, Index 0x21 +*/ +int U_PMR_SETINTERPOLATIONMODE_print(const char *contents){ + int IMenum; + int status = U_PMR_SETINTERPOLATIONMODE_get(contents, NULL, &IMenum); + if(status){ + printf(" + IMenum:%d\n",IMenum); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETPIXELOFFSETMODE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.5, Microsoft name: EmfPlusSetPixelOffsetMode Record, Index 0x22 +*/ +int U_PMR_SETPIXELOFFSETMODE_print(const char *contents){ + int POMenum; + int status = U_PMR_SETPIXELOFFSETMODE_get(contents, NULL, &POMenum); + if(status){ + printf(" + POMenum:%d\n",POMenum); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETRENDERINGORIGIN record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.6, Microsoft name: EmfPlusSetRenderingOrigin Record, Index 0x1D +*/ +int U_PMR_SETRENDERINGORIGIN_print(const char *contents){ + int32_t X, Y; + int status = U_PMR_SETRENDERINGORIGIN_get(contents, NULL, &X, &Y); + if(status){ + printf(" + X:%d Y:%d\n", X, Y); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETTEXTCONTRAST record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.7, Microsoft name: EmfPlusSetTextContrast Record, Index 0x20 +*/ +int U_PMR_SETTEXTCONTRAST_print(const char *contents){ + int GC; + int status = U_PMR_SETTEXTCONTRAST_get(contents, NULL, &GC); + if(status){ + printf(" + GC:%d\n", GC); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETTEXTRENDERINGHINT record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.6.8, Microsoft name: EmfPlusSetTextRenderingHint Record, Index 0x1F +*/ +int U_PMR_SETTEXTRENDERINGHINT_print(const char *contents){ + int TRHenum; + int status = U_PMR_SETTEXTRENDERINGHINT_get(contents, NULL, &TRHenum); + if(status){ + printf(" + TRHenum:%d\n",TRHenum); + } + return(status); +} + +/** + \brief Print data from a U_PMR_BEGINCONTAINER record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.7.1, Microsoft name: EmfPlusBeginContainer Record, Index 0x27 +*/ +int U_PMR_BEGINCONTAINER_print(const char *contents){ + int UTenum; + U_PMF_RECTF DstRect, SrcRect; + uint32_t StackID; + int status = U_PMR_BEGINCONTAINER_get(contents, NULL, &UTenum, &DstRect, &SrcRect, &StackID); + if(status){ + printf(" + UTenum:%d",UTenum); + printf(" DstRect:"); (void) U_PMF_RECTF_S_print(&DstRect); + printf(" SrcRect:"); (void) U_PMF_RECTF_S_print(&SrcRect); + printf(" StackID:%u\n", StackID); + } + return(status); +} + +/** + \brief Print data from a U_PMR_BEGINCONTAINERNOPARAMS record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.7.2, Microsoft name: EmfPlusBeginContainerNoParams Record, Index 0x28 +*/ +int U_PMR_BEGINCONTAINERNOPARAMS_print(const char *contents){ + uint32_t StackID; + int status = U_PMR_BEGINCONTAINERNOPARAMS_get(contents, NULL, &StackID); + if(status){ + printf(" + StackID:%u\n", StackID); + } + return(status); +} + +/** + \brief Print data from a U_PMR_ENDCONTAINER record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.7.3, Microsoft name: EmfPlusEndContainer Record, Index 0x29 +*/ +int U_PMR_ENDCONTAINER_print(const char *contents){ + uint32_t StackID; + int status = U_PMR_ENDCONTAINER_get(contents, NULL, &StackID); + if(status){ + printf(" + StackID:%u\n", StackID); + } + return(status); +} + +/** + \brief Print data from a U_PMR_RESTORE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.7.4, Microsoft name: EmfPlusRestore Record, Index 0x26 +*/ +int U_PMR_RESTORE_print(const char *contents){ + uint32_t StackID; + int status = U_PMR_RESTORE_get(contents, NULL, &StackID); + if(status){ + printf(" + StackID:%u\n", StackID); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SAVE record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.7.5, Microsoft name: EmfPlusSave Record, Index 0x25 +*/ +int U_PMR_SAVE_print(const char *contents){ + uint32_t StackID; + int status = U_PMR_SAVE_get(contents, NULL, &StackID); + if(status){ + printf(" + StackID:%u\n", StackID); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETTSCLIP record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.8.1, Microsoft name: EmfPlusSetTSClip Record, Index 0x3A +*/ +int U_PMR_SETTSCLIP_print(const char *contents){ + int ctype; + uint32_t Elements; + U_PMF_RECTF *Rects; + int status = U_PMR_SETTSCLIP_get(contents, NULL, &ctype, &Elements, &Rects); + if(status){ + printf(" + ctype:%d Elements:%u",ctype,Elements); + (void) U_PMF_VARRECTF_S_print(Rects, Elements); + free(Rects); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETTSGRAPHICS record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.8.2, Microsoft name: EmfPlusSetTSGraphics Record, Index 0x39 +*/ +int U_PMR_SETTSGRAPHICS_print(const char *contents){ + int vgatype, pptype; + uint8_t AntiAliasMode, TextRenderHint, CompositingMode, CompositingQuality, FilterType, PixelOffset; + int16_t RenderOriginX, RenderOriginY; + uint16_t TextContrast; + U_PMF_TRANSFORMMATRIX WorldToDevice; + const char *Data; + int status = U_PMR_SETTSGRAPHICS_get(contents, NULL, + &vgatype, &pptype, + &AntiAliasMode, &TextRenderHint, &CompositingMode, &CompositingQuality, + &RenderOriginX, &RenderOriginY, &TextContrast, &FilterType, + &PixelOffset, &WorldToDevice, &Data); + if(status){ + printf(" + vgatype:%d pptype:%u",vgatype,pptype); + printf(" AntiAliasMode:%u TextRenderHint:%u CompositingMode:%u CompositingQuality:%u", + AntiAliasMode, TextRenderHint, CompositingMode, CompositingQuality); + printf(" RenderOriginX:%d RenderOriginY:%d",RenderOriginX, RenderOriginY); + printf(" TextContrast:%u",TextContrast); + printf(" WorldToDevice:"); + U_PMF_TRANSFORMMATRIX2_print(&WorldToDevice); + if(pptype){ (void) U_PMF_PALETTE_print(Data); } + printf("\n"); + } + return(status); +} + + +/** + \brief Print data from a U_PMR_MULTIPLYWORLDTRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.1, Microsoft name: EmfPlusMultiplyWorldTransform Record, Index 0x2C +*/ +int U_PMR_MULTIPLYWORLDTRANSFORM_print(const char *contents){ + int xmtype; + U_PMF_TRANSFORMMATRIX Matrix; + int status = U_PMR_MULTIPLYWORLDTRANSFORM_get(contents, NULL, &xmtype, &Matrix); + if(status){ + printf(" + xmtype:%d Multiply:%s",xmtype,(xmtype ? "Post" : "Pre")); + U_PMF_TRANSFORMMATRIX2_print(&Matrix); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_RESETWORLDTRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.2, Microsoft name: EmfPlusResetWorldTransform Record, Index 0x2B +*/ +int U_PMR_RESETWORLDTRANSFORM_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_ROTATEWORLDTRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.3, Microsoft name: EmfPlusRotateWorldTransform Record, Index 0x2F +*/ +int U_PMR_ROTATEWORLDTRANSFORM_print(const char *contents){ + int xmtype; + U_FLOAT Angle; + int status = U_PMR_ROTATEWORLDTRANSFORM_get(contents, NULL, &xmtype, &Angle); + if(status){ + printf(" + xmtype:%d Multiply:%s Angle:%f\n",xmtype,(xmtype ? "Post" : "Pre"), Angle); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SCALEWORLDTRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.4, Microsoft name: EmfPlusScaleWorldTransform Record, Index 0x2E +*/ +int U_PMR_SCALEWORLDTRANSFORM_print(const char *contents){ + int xmtype; + U_FLOAT Sx, Sy; + int status = U_PMR_SCALEWORLDTRANSFORM_get(contents, NULL, &xmtype, &Sx, &Sy); + if(status){ + printf(" + xmtype:%d Multiply:%s ScaleX:%f ScaleY:%f\n",xmtype,(xmtype ? "Post" : "Pre"), Sx, Sy); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETPAGETRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.5, Microsoft name: EmfPlusSetPageTransform Record, Index 0x30 +*/ +int U_PMR_SETPAGETRANSFORM_print(const char *contents){ + int UTenum; + U_FLOAT Scale; + int status = U_PMR_SETPAGETRANSFORM_get(contents, NULL, &UTenum, &Scale); + if(status){ + printf(" + UTenum:%d Scale:%f\n",UTenum, Scale); + } + return(status); +} + +/** + \brief Print data from a U_PMR_SETWORLDTRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.6, Microsoft name: EmfPlusSetWorldTransform Record, Index 0x2A +*/ +int U_PMR_SETWORLDTRANSFORM_print(const char *contents){ + U_PMF_TRANSFORMMATRIX Matrix; + int status = U_PMR_SETWORLDTRANSFORM_get(contents, NULL, &Matrix); + if(status){ + printf(" + "); + U_PMF_TRANSFORMMATRIX2_print(&Matrix); + printf("\n"); + } + return(status); +} + +/** + \brief Print data from a U_PMR_TRANSLATEWORLDTRANSFORM record + \return size of record in bytes on success, 0 on error + \param contents Record from which to print data + EMF+ manual 2.3.9.7, Microsoft name: EmfPlusTranslateWorldTransform Record, Index 0x2D +*/ +int U_PMR_TRANSLATEWORLDTRANSFORM_print(const char *contents){ + int xmtype; + U_FLOAT Dx, Dy; + int status = U_PMR_TRANSLATEWORLDTRANSFORM_get(contents, NULL, &xmtype, &Dx, &Dy); + if(status){ + printf(" + xmtype:%d Multiply:%s TranslateX:%f TranlateY:%f\n",xmtype,(xmtype ? "Post" : "Pre"), Dx, Dy); + } + return(status); +} + + +/** + \brief Print data from a U_PMR_STROKEFILLPATH record + \return 1 on success, 0 on error + \param contents Record from which to print data +*/ +int U_PMR_STROKEFILLPATH_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_MULTIFORMATSTART record + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual mentioned in 2.1.1.1, reserved, not otherwise documented, Microsoft name: EmfPlusMultiFormatStart Record, Index 0x05 +*/ +int U_PMR_MULTIFORMATSTART_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_MULTIFORMATSECTION record + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual mentioned in 2.1.1.1, reserved, not otherwise documented, Microsoft name: EmfPlusMultiFormatSection Record, Index 0x06 +*/ +int U_PMR_MULTIFORMATSECTION_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + +/** + \brief Print data from a U_PMR_MULTIFORMATEND record + \return 1 on success, 0 on error + \param contents Record from which to print data + EMF+ manual mentioned in 2.1.1.1, reserved, not otherwise documented, Microsoft name: EmfPlusMultiFormatEnd Record, Index 0x06 +*/ +int U_PMR_MULTIFORMATEND_print(const char *contents){ + return(U_PMR_NODATAREC_print(contents)); +} + + + +#ifdef __cplusplus +} +#endif diff --git a/src/libuemf/upmf_print.h b/src/libuemf/upmf_print.h new file mode 100644 index 000000000..3ba6694eb --- /dev/null +++ b/src/libuemf/upmf_print.h @@ -0,0 +1,180 @@ +/** + @file upmf_print.h + + @brief Prototypes for functions for printing records from EMF files. +*/ + +/* +File: upmf_print.h +Version: 0.0.2 +Date: 17-OCT-2013 +Author: David Mathog, Biology Division, Caltech +email: mathog@caltech.edu +Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +*/ + +#ifndef _UPMF_PRINT_ +#define _UPMF_PRINT_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "upmf.h" /* includes uemf.h */ + +/* prototypes for simple types and enums used in PMR records */ +int U_PMF_CMN_HDR_print(U_PMF_CMN_HDR Header, int precnum, int off); +int U_PMF_UINT8_ARRAY_print(const char *Start, const uint8_t *Array, int Elements, char *End); +int U_PMF_BRUSHTYPEENUMERATION_print(int otype); +int U_PMF_HATCHSTYLEENUMERATION_print(int hstype); +int U_PMF_OBJECTTYPEENUMERATION_print(int otype); +int U_PMF_PATHPOINTTYPE_ENUM_print(int Type); +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_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_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_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_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_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); + +/* prototypes for PMR records */ +int U_PMR_OFFSETCLIP_print(const char *contents); +int U_PMR_RESETCLIP_print(const char *contents); +int U_PMR_SETCLIPPATH_print(const char *contents); +int U_PMR_SETCLIPRECT_print(const char *contents); +int U_PMR_SETCLIPREGION_print(const char *contents); +int U_PMR_COMMENT_print(const char *contents); +int U_PMR_ENDOFFILE_print(const char *contents); +int U_PMR_GETDC_print(const char *contents); +int U_PMR_HEADER_print(const char *contents); +int U_PMR_CLEAR_print(const char *contents); +int U_PMR_DRAWARC_print(const char *contents); +int U_PMR_DRAWBEZIERS_print(const char *contents); +int U_PMR_DRAWCLOSEDCURVE_print(const char *contents); +int U_PMR_DRAWCURVE_print(const char *contents); +int U_PMR_DRAWDRIVERSTRING_print(const char *contents); +int U_PMR_DRAWELLIPSE_print(const char *contents); +int U_PMR_DRAWIMAGE_print(const char *contents); +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_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_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); +int U_PMR_SETANTIALIASMODE_print(const char *contents); +int U_PMR_SETCOMPOSITINGMODE_print(const char *contents); +int U_PMR_SETCOMPOSITINGQUALITY_print(const char *contents); +int U_PMR_SETINTERPOLATIONMODE_print(const char *contents); +int U_PMR_SETPIXELOFFSETMODE_print(const char *contents); +int U_PMR_SETRENDERINGORIGIN_print(const char *contents); +int U_PMR_SETTEXTCONTRAST_print(const char *contents); +int U_PMR_SETTEXTRENDERINGHINT_print(const char *contents); +int U_PMR_BEGINCONTAINER_print(const char *contents); +int U_PMR_BEGINCONTAINERNOPARAMS_print(const char *contents); +int U_PMR_ENDCONTAINER_print(const char *contents); +int U_PMR_RESTORE_print(const char *contents); +int U_PMR_SAVE_print(const char *contents); +int U_PMR_SETTSCLIP_print(const char *contents); +int U_PMR_SETTSGRAPHICS_print(const char *contents); +int U_PMR_MULTIPLYWORLDTRANSFORM_print(const char *contents); +int U_PMR_RESETWORLDTRANSFORM_print(const char *contents); +int U_PMR_ROTATEWORLDTRANSFORM_print(const char *contents); +int U_PMR_SCALEWORLDTRANSFORM_print(const char *contents); +int U_PMR_SETPAGETRANSFORM_print(const char *contents); +int U_PMR_SETWORLDTRANSFORM_print(const char *contents); +int U_PMR_TRANSLATEWORLDTRANSFORM_print(const char *contents); +int U_PMR_STROKEFILLPATH_print(const char *contents); /* not documented */ +int U_PMR_MULTIFORMATSTART_print(const char *contents); /* last of reserved but not used */ +int U_PMR_MULTIFORMATSECTION_print(const char *contents); /* last of reserved but not used */ +int U_PMR_MULTIFORMATEND_print(const char *contents); /* last of reserved but not used */ + +int U_pmf_onerec_print(const char *contents, const char *blimit, int recnum, int off); + + + + + + + +#ifdef __cplusplus +} +#endif + +#endif /* _UPMF_PRINT_ */ diff --git a/src/libuemf/uwmf.c b/src/libuemf/uwmf.c index 9d916ecee..a6ac963cb 100644 --- a/src/libuemf/uwmf.c +++ b/src/libuemf/uwmf.c @@ -1,5 +1,7 @@ /** - @file uwmf.c Functions for manipulating WMF files and structures. + @file uwmf.c + + @brief Functions for manipulating WMF files and structures. [U_WMR*]_set all take data and return a pointer to memory holding the constructed record. If something goes wrong a NULL pointer is returned. @@ -17,8 +19,8 @@ /* File: uwmf.c -Version: 0.0.11 -Date: 19-MAR-2013 +Version: 0.0.12 +Date: 25-NOV-2013 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu Copyright: 2013 David Mathog and California Institute of Technology (Caltech) @@ -665,17 +667,19 @@ char *U_wmr_escnames(int idx){ return(name); } +//! \cond /* 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); +//! \endcond /** \brief Derive from bounding box and start and end arc, for WMF arc, chord, or pie records, the center, start, and end points, and the bounding rectangle. \return 0 on success, other values on errors. - \param rclBox Bounding box of Arc - \param ArcStart Coordinates for Start of Arc - \param ArcEnd Coordinates for End of Arc + \param rclBox16 Bounding box of Arc + \param ArcStart16 Coordinates for Start of Arc + \param ArcEnd16 Coordinates for End of Arc \param f1 1 if rotation angle >= 180, else 0 \param f2 Rotation direction, 1 if counter clockwise, else 0 \param center Center coordinates @@ -689,10 +693,10 @@ int wmr_arc_points( U_POINT16 ArcEnd16, int *f1, int f2, - PU_PAIRF center, - PU_PAIRF start, - PU_PAIRF end, - PU_PAIRF size + U_PAIRF *center, + U_PAIRF *start, + U_PAIRF *end, + U_PAIRF *size ){ U_RECTL rclBox; U_POINTL ArcStart,ArcEnd; @@ -737,6 +741,7 @@ uint32_t U_wmr_size(const U_METARECORD *record){ return(2*Size16); } +//! \cond should never be called directly #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_BITMAPINFO, but NOT from its size field, go figure*/ \ @@ -745,7 +750,7 @@ uint32_t U_wmr_size(const U_METARECORD *record){ E = U_SIZE_BITMAPINFOHEADER + 4 * get_real_color_count((char *)&(B->bmiHeader)); /* bmiheader + colortable*/ \ }\ else { C = 0; D = 0; E=0; } - +//! \endcond /** \brief Create and return a U_FONT structure. @@ -765,7 +770,7 @@ uint32_t U_wmr_size(const U_METARECORD *record){ \param PitchAndFamily LF_PitchAndFamily Enumeration \param FaceName Name of font. ANSI Latin1, null terminated. */ -PU_FONT U_FONT_set( +U_FONT *U_FONT_set( int16_t Height, //!< Height in Logical units int16_t Width, //!< Average Width in Logical units int16_t Escapement, //!< Angle in 0.1 degrees betweem escapement vector and X axis @@ -781,10 +786,10 @@ PU_FONT U_FONT_set( uint8_t PitchAndFamily, //!< LF_PitchAndFamily Enumeration char *FaceName //!< Name of font. ANSI Latin1, null terminated. ){ - PU_FONT font; + U_FONT *font; int slen = 1 + strlen(FaceName); /* include terminator */ if(slen & 1)slen++; /* storage length even */ - font = (PU_FONT) calloc(1,slen + U_SIZE_FONT_CORE); /* use calloc to auto fill in terminating '\0'*/ + font = (U_FONT *) calloc(1,slen + U_SIZE_FONT_CORE); /* use calloc to auto fill in terminating '\0'*/ if(font){ font->Height = Height; font->Width = Width; @@ -825,12 +830,12 @@ U_PLTNTRY U_PLTNTRY_set(U_COLORREF Color){ \param NumEntries Number of U_LOGPLTNTRY objects \param PalEntries Pointer to array of PaletteEntry Objects */ -PU_PALETTE U_PLTENTRY_set( +U_PALETTE *U_PLTENTRY_set( uint16_t Start, //!< Either 0x0300 or an offset into the Palette table uint16_t NumEntries, //!< Number of U_LOGPLTNTRY objects - PU_PLTNTRY PalEntries //!< Pointer to array of PaletteEntry Objects + U_PLTNTRY *PalEntries //!< Pointer to array of PaletteEntry Objects ){ - PU_PALETTE Palette = NULL; + U_PALETTE *Palette = NULL; if(NumEntries){ Palette = malloc(4 + 4*NumEntries); if(Palette){ @@ -892,7 +897,7 @@ U_RECT16 U_RECT16_set( \param BitsPixel number of adjacent color bits on each plane (R bits + G bits + B bits ????) \param Bits bitmap pixel data. Bytes contained = (((Width * BitsPixel + 15) >> 4) << 1) * Height */ -PU_BITMAP16 U_BITMAP16_set( +U_BITMAP16 *U_BITMAP16_set( const int16_t Type, const int16_t Width, const int16_t Height, @@ -900,11 +905,11 @@ PU_BITMAP16 U_BITMAP16_set( const uint8_t BitsPixel, const char *Bits ){ - PU_BITMAP16 bm16; - uint32_t irecsize; - int cbBits,iHeight; - int usedbytes; - int16_t WidthBytes; // total bytes per scan line (used and padding). + U_BITMAP16 *bm16; + uint32_t irecsize; + int cbBits,iHeight; + int usedbytes; + int16_t WidthBytes; // total bytes per scan line (used and padding). usedbytes = (Width * BitsPixel + 7)/8; // width of line in fully and partially occupied bytes WidthBytes = (LineN * ((usedbytes + (LineN - 1) ) / LineN)); // Account for padding required by line alignment in the pixel array @@ -913,7 +918,7 @@ PU_BITMAP16 U_BITMAP16_set( cbBits = WidthBytes * iHeight; if(!Bits || cbBits<=0)return(NULL); irecsize = U_SIZE_BITMAP16 + cbBits; - bm16 = (PU_BITMAP16) malloc(irecsize); + bm16 = (U_BITMAP16 *) malloc(irecsize); if(bm16){ bm16->Type = Type; bm16->Width = Width; @@ -934,13 +939,13 @@ PU_BITMAP16 U_BITMAP16_set( \param bottom Y coordinate of the bottom scanline \param ScanLines Array of 16 bit left/right pairs, array has 2*count entries */ -PU_SCAN U_SCAN_set( +U_SCAN *U_SCAN_set( uint16_t count, //!< Number of entries in the ScanLines array uint16_t top, //!< Y coordinate of the top scanline uint16_t bottom, //!< Y coordinate of the bottom scanline uint16_t *ScanLines //!< Array of 16 bit left/right pairs, array has 2*count entries ){ - PU_SCAN scan=NULL; + U_SCAN *scan=NULL; int size = 6 + count*4; scan = malloc(size); if(scan){ @@ -961,19 +966,19 @@ PU_SCAN U_SCAN_set( \param sRect bounding rectangle \param aScans series of U_SCAN objects to append. This is also an array of uint16_t, but should be handled as a bunch of U_SCAN objects tightly packed into the buffer. */ -PU_REGION U_REGION_set( +U_REGION *U_REGION_set( int16_t Size, //!< aScans in bytes + regions size in bytes (size of this header plus all U_SCAN objects?) int16_t sCount, //!< number of scan objects in region (docs say scanlines, but then no way to add sizes) int16_t sMax, //!< largest number of points in any scan U_RECT16 sRect, //!< bounding rectangle uint16_t *aScans //!< series of U_SCAN objects to append. This is also an array of uint16_t, but should be handled as a bunch of U_SCAN objects tightly packed into the buffer. ){ - PU_REGION region=NULL; + U_REGION *region=NULL; char *psc; int scansize,i,off; psc = (char *)aScans; for(scansize=i=0; icount); + off = 6 + 4*(((U_SCAN *)psc)->count); scansize += off; psc += off; } @@ -1021,11 +1026,11 @@ U_WLOGBRUSH U_WLOGBRUSH_set( \param x x value \param y y value */ -PU_PAIRF U_PAIRF_set( +U_PAIRF *U_PAIRF_set( float x, //!< x value float y //!< y value ){ - PU_PAIRF pf=malloc(U_SIZE_PAIRF); + U_PAIRF *pf=malloc(U_SIZE_PAIRF); if(pf){ pf->x = x; pf->y = y; @@ -1496,7 +1501,7 @@ int wmf_finish( // Set the header fields which were unknown up until this point - if(((PU_WMRPLACEABLE) wt->buf)->Key == 0x9AC6CDD7){ off = U_SIZE_WMRPLACEABLE; } + if(((U_WMRPLACEABLE *) wt->buf)->Key == 0x9AC6CDD7){ off = U_SIZE_WMRPLACEABLE; } else { off = 0; } record = (wt->buf + off); @@ -1617,14 +1622,14 @@ int wmf_append( \param freerec If true, free rec after append */ int wmf_header_append( - PU_METARECORD rec, + U_METARECORD *rec, WMFTRACK *wt, int freerec ){ size_t deficit; unsigned int hsize; - hsize = (((PU_WMRPLACEABLE) rec)->Key == 0x9AC6CDD7 ? U_SIZE_WMRHEADER + U_SIZE_WMRPLACEABLE: U_SIZE_WMRHEADER); + hsize = (((U_WMRPLACEABLE *) rec)->Key == 0x9AC6CDD7 ? U_SIZE_WMRHEADER + U_SIZE_WMRPLACEABLE: U_SIZE_WMRHEADER); #ifdef U_VALGRIND printf("\nbefore \n"); @@ -1764,7 +1769,7 @@ These functions create standard structures used in the WMR records. *********************************************************************************************** */ // hide these from Doxygen -//! @cond +//! \cond /* ********************************************************************************************** These functions contain shared code used by various U_WMR*_print 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. @@ -1789,8 +1794,8 @@ void U_WMRCORE_SETRECHEAD(char *record, uint32_t irecsize, int iType){ uint32_t Size16; Size16 = irecsize/2; memcpy(record,&Size16,4); /*Size16_4 is at offset 0 in the record */ - ((PU_METARECORD) record)->iType = iType; - ((PU_METARECORD) record)->xb = U_WMR_XB_FROM_TYPE(iType); + ((U_METARECORD *) record)->iType = iType; + ((U_METARECORD *) record)->xb = U_WMR_XB_FROM_TYPE(iType); } /* records that have no arguments */ @@ -1832,7 +1837,7 @@ char *U_WMRCORE_1U16_CRF_2U16_set( return(record); } -/* records that have a single uint16_t argument like PU_WMRSETMAPMODE +/* records that have a single uint16_t argument like U_WMRSETMAPMODE May also be used with int16_t with appropriate casts */ char *U_WMRCORE_1U16_set( int iType, @@ -2016,7 +2021,7 @@ char *U_WMRCORE_2U16_N16_set( May also be used with int16_t with appropriate casts */ char *U_WMRCORE_PALETTE_set( int iType, - PU_PALETTE Palette + const U_PALETTE *Palette ){ char *record=NULL; uint32_t irecsize, off, nPE; @@ -2034,7 +2039,7 @@ char *U_WMRCORE_PALETTE_set( return(record); } -//! @endcond +//! \endcond /* ********************************************************************************************** These functions are simpler or more convenient ways to generate the specified types of WMR records. @@ -2141,7 +2146,7 @@ char *wcreatedibpatternbrush_srcdib_set( uint32_t *ihBrush, WMFHANDLES *wht, const uint32_t iUsage, - PU_BITMAPINFO Bmi, + const U_BITMAPINFO *Bmi, const uint32_t cbPx, const char *Px @@ -2164,7 +2169,7 @@ char *wcreatedibpatternbrush_srcbm16_set( uint32_t *ihBrush, WMFHANDLES *wht, const uint32_t iUsage, - PU_BITMAP16 Bm16 + const U_BITMAP16 *Bm16 ){ if(wmf_htable_insert(ihBrush, wht))return(NULL); *ihBrush -= 1; /* 1->N+1 --> 0->N */ @@ -2184,7 +2189,7 @@ char *wcreatedibpatternbrush_srcbm16_set( char *wcreatepatternbrush_set( uint32_t *ihBrush, WMFHANDLES *wht, - PU_BITMAP16 Bm16, + U_BITMAP16 *Bm16, char *Pattern ){ if(wmf_htable_insert(ihBrush, wht))return(NULL); @@ -2199,12 +2204,12 @@ char *wcreatepatternbrush_set( \return pointer to the U_WMRCREATEFONTINDIRECT record, or NULL on error. \param ihFont Font handle, will be created and returned \param wht Pointer to structure holding all WMF handles - \param uf Pointer to Font parameters as PU_FONT + \param uf Pointer to Font parameters as U_FONT * */ char *wcreatefontindirect_set( uint32_t *ihFont, WMFHANDLES *wht, - PU_FONT uf + U_FONT *uf ){ if(wmf_htable_insert(ihFont, wht))return(NULL); *ihFont -= 1; /* 1->N+1 --> 0->N */ @@ -2223,7 +2228,7 @@ char *wcreatefontindirect_set( char *wcreatepalette_set( uint32_t *ihPal, WMFHANDLES *wht, - PU_PALETTE up + U_PALETTE *up ){ if(wmf_htable_insert(ihPal, wht))return(NULL); *ihPal -= 1; /* 1->N+1 --> 0->N */ @@ -2242,7 +2247,7 @@ char *wcreatepalette_set( char *wsetpaletteentries_set( uint32_t *ihPal, WMFHANDLES *wht, - const PU_PALETTE Palettes + const U_PALETTE *Palettes ){ if(wmf_htable_insert(ihPal, wht))return(NULL); *ihPal -= 1; /* 1->N+1 --> 0->N */ @@ -2261,7 +2266,7 @@ char *wsetpaletteentries_set( char *wcreateregion_set( uint32_t *ihReg, WMFHANDLES *wht, - const PU_REGION Region + const U_REGION *Region ){ if(wmf_htable_insert(ihReg, wht))return(NULL); *ihReg -= 1; /* 1->N+1 --> 0->N */ @@ -2349,7 +2354,7 @@ They are listed in order by the corresponding U_WMR_* index number. \param dpi Logical units/inch. If 0 defaults to 1440. */ char *U_WMRHEADER_set( - PU_PAIRF size, + U_PAIRF *size, unsigned int dpi ){ char *record=NULL; @@ -2370,20 +2375,20 @@ char *U_WMRHEADER_set( } xm16 = xmax; ym16 = ymax; - ((PU_WMRPLACEABLE) record)->Key = 0x9AC6CDD7; - ((PU_WMRPLACEABLE) record)->HWmf = 0; /* Manual says number of 16 bit words in record, but all WMF examples had it as 0 */ - ((PU_WMRPLACEABLE) record)->Dst.left = 0; - ((PU_WMRPLACEABLE) record)->Dst.top = 0; - ((PU_WMRPLACEABLE) record)->Dst.right = xm16; - ((PU_WMRPLACEABLE) record)->Dst.bottom = ym16; - ((PU_WMRPLACEABLE) record)->Inch = dpi; - ((PU_WMRPLACEABLE) record)->Reserved = 0; - ((PU_WMRPLACEABLE) record)->Checksum = U_16_checksum((int16_t *)record,10); + ((U_WMRPLACEABLE *) record)->Key = 0x9AC6CDD7; + ((U_WMRPLACEABLE *) record)->HWmf = 0; /* Manual says number of 16 bit words in record, but all WMF examples had it as 0 */ + ((U_WMRPLACEABLE *) record)->Dst.left = 0; + ((U_WMRPLACEABLE *) record)->Dst.top = 0; + ((U_WMRPLACEABLE *) record)->Dst.right = xm16; + ((U_WMRPLACEABLE *) record)->Dst.bottom = ym16; + ((U_WMRPLACEABLE *) record)->Inch = dpi; + ((U_WMRPLACEABLE *) record)->Reserved = 0; + ((U_WMRPLACEABLE *) record)->Checksum = U_16_checksum((int16_t *)record,10); off = U_SIZE_WMRPLACEABLE; } - ((PU_WMRHEADER) (record + off))->iType = 1; - ((PU_WMRHEADER) (record + off))->version = U_METAVERSION300; - ((PU_WMRHEADER) (record + off))->Size16w = U_SIZE_WMRHEADER/2; + ((U_WMRHEADER *) (record + off))->iType = 1; + ((U_WMRHEADER *) (record + off))->version = U_METAVERSION300; + ((U_WMRHEADER *) (record + off))->Size16w = U_SIZE_WMRHEADER/2; } return(record); } @@ -2731,13 +2736,13 @@ char *U_WMRPATBLT_set( ){ char *record=NULL; uint32_t irecsize; - PU_WMRPATBLT pmr; + U_WMRPATBLT *pmr; irecsize = U_SIZE_WMRPATBLT; record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_PATBLT); - pmr = (PU_WMRPATBLT) record; + pmr = (U_WMRPATBLT *) record; memcpy(pmr->rop3w, &dwRop3, 4); pmr->Height = cwh.y; pmr->Width = cwh.x; @@ -2755,16 +2760,27 @@ char *U_WMRSAVEDC_set(void){ return U_WMRCORE_NOARGS_set(U_WMR_SAVEDC); } -char *U_WMRSETPIXEL_set(U_COLORREF Color, U_POINT16 coord){ +/** + \brief Allocate and construct a U_WMRSETPIXEL record + \return pointer to the U_WMRSETPIXEL record, or NULL on error. + \param Color U_COLORREF color of the pixel + \param Coord U_POINT16 coordinates of the pixel +*/ +char *U_WMRSETPIXEL_set(U_COLORREF Color, U_POINT16 Coord){ return U_WMRCORE_1U16_CRF_2U16_set( U_WMR_SETPIXEL, NULL, Color, - U_P16(coord.y), - U_P16(coord.x) + U_P16(Coord.y), + U_P16(Coord.x) ); } +/** + \brief Allocate and construct a U_WMROFFSETCLIPRGN record + \return pointer to the U_WMROFFSETCLIPRGN record, or NULL on error. + \param offset U_POINT16 x,y offset to apply to the clipping region. +*/ char *U_WMROFFSETCLIPRGN_set(U_POINT16 offset){ return U_WMRCORE_2U16_set(U_WMR_OFFSETCLIPRGN, U_U16(offset.y), U_U16(offset.x)); } @@ -2815,13 +2831,13 @@ char *U_WMRBITBLT_set( U_POINT16 cwh, U_POINT16 Src, uint32_t dwRop3, - const PU_BITMAP16 Bm16 + const U_BITMAP16 *Bm16 ){ char *record=NULL; uint32_t irecsize; int cbBm16,cbBm164,off; - PU_WMRBITBLT_PX pmr_px; - PU_WMRBITBLT_NOPX pmr_nopx; + U_WMRBITBLT_PX *pmr_px; + U_WMRBITBLT_NOPX *pmr_nopx; if(Bm16){ cbBm16 = U_SIZE_BITMAP16 + (((Bm16->Width * Bm16->BitsPixel + 15) >> 4) << 1) * Bm16->Height; @@ -2830,7 +2846,7 @@ char *U_WMRBITBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_BITBLT); - pmr_px = (PU_WMRBITBLT_PX) record; + pmr_px = (U_WMRBITBLT_PX *) record; memcpy(pmr_px->rop3w, &dwRop3, 4); pmr_px->ySrc = Src.y; pmr_px->xSrc = Src.x; @@ -2848,7 +2864,7 @@ char *U_WMRBITBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_BITBLT); - pmr_nopx = (PU_WMRBITBLT_NOPX) record; + pmr_nopx = (U_WMRBITBLT_NOPX *) record; memcpy(pmr_nopx->rop3w, &dwRop3, 4); pmr_nopx->ySrc = Src.y; pmr_nopx->xSrc = Src.x; @@ -2878,13 +2894,13 @@ char *U_WMRSTRETCHBLT_set( U_POINT16 Src, U_POINT16 cSrc, uint32_t dwRop3, - const PU_BITMAP16 Bm16 + const U_BITMAP16 *Bm16 ){ char *record=NULL; uint32_t irecsize; int cbBm16,cbBm164,off; - PU_WMRSTRETCHBLT_PX pmr_px; - PU_WMRSTRETCHBLT_NOPX pmr_nopx; + U_WMRSTRETCHBLT_PX *pmr_px; + U_WMRSTRETCHBLT_NOPX *pmr_nopx; if(Bm16){ cbBm16 = U_SIZE_BITMAP16 + (((Bm16->Width * Bm16->BitsPixel + 15) >> 4) << 1) * Bm16->Height; @@ -2893,7 +2909,7 @@ char *U_WMRSTRETCHBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_STRETCHBLT); - pmr_px = (PU_WMRSTRETCHBLT_PX) record; + pmr_px = (U_WMRSTRETCHBLT_PX *) record; memcpy(pmr_px->rop3w, &dwRop3, 4); pmr_px->hSrc = cSrc.y; pmr_px->wSrc = cSrc.x; @@ -2913,7 +2929,7 @@ char *U_WMRSTRETCHBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_STRETCHBLT); - pmr_nopx = (PU_WMRSTRETCHBLT_NOPX) record; + pmr_nopx = (U_WMRSTRETCHBLT_NOPX *) record; memcpy(pmr_nopx->rop3w, &dwRop3, 4); pmr_nopx->hSrc = cSrc.y; pmr_nopx->wSrc = cSrc.x; @@ -2935,7 +2951,7 @@ char *U_WMRSTRETCHBLT_set( \param Length Number of points in the Polygon \param Data Array of Length points */ -char *U_WMRPOLYGON_set(uint16_t Length, const PU_POINT16 Data){ +char *U_WMRPOLYGON_set(uint16_t Length, const U_POINT16 *Data){ return U_WMRCORE_2U16_N16_set(U_WMR_POLYGON, NULL, &Length, 2*Length, Data); } @@ -2945,7 +2961,7 @@ char *U_WMRPOLYGON_set(uint16_t Length, const PU_POINT16 Data){ \param Length Number of points in the Polyline \param Data Array of Length points */ -char *U_WMRPOLYLINE_set(uint16_t Length, const PU_POINT16 Data){ +char *U_WMRPOLYLINE_set(uint16_t Length, const U_POINT16 *Data){ return U_WMRCORE_2U16_N16_set(U_WMR_POLYLINE, NULL, &Length, 2*Length, Data); } @@ -3042,8 +3058,9 @@ char *U_WMRSETTEXTALIGN_set(uint16_t Mode){ return U_WMRCORE_2U16_set(U_WMR_SETTEXTALIGN, Mode, 0); } -/* in Wine, not in WMF PDF. */ - char *U_WMRDRAWTEXT_set(void){ /* in Wine, not in WMF PDF. */ +/** in GDI and Wine, not in WMF manual.. +*/ + char *U_WMRDRAWTEXT_set(void){ return U_WMRCORENONE_set("U_WMRDRAWTEXT"); } @@ -3155,7 +3172,7 @@ char *U_WMRREALIZEPALETTE_set(void){ \return pointer to the U_WMRSETPALENTRIES record, or NULL on error. \param Palette Redefines a set of RGB values for the current active Palette. */ -char *U_WMRANIMATEPALETTE_set(PU_PALETTE Palette){ +char *U_WMRANIMATEPALETTE_set(U_PALETTE *Palette){ return U_WMRCORE_PALETTE_set(U_WMR_ANIMATEPALETTE, Palette); } @@ -3164,7 +3181,7 @@ char *U_WMRANIMATEPALETTE_set(PU_PALETTE Palette){ \return pointer to the U_WMRSETPALENTRIES record, or NULL on error. \param Palette Defines a set of RGB values for the current active Palette. */ -char *U_WMRSETPALENTRIES_set(PU_PALETTE Palette){ +char *U_WMRSETPALENTRIES_set(const U_PALETTE *Palette){ return U_WMRCORE_PALETTE_set(U_WMR_SETPALENTRIES, Palette); } @@ -3178,7 +3195,7 @@ char *U_WMRSETPALENTRIES_set(PU_PALETTE Palette){ char *U_WMRPOLYPOLYGON_set( const uint16_t nPolys, const uint16_t *aPolyCounts, - const PU_POINT16 Points + const U_POINT16 *Points ){ char *record; uint32_t irecsize; @@ -3210,6 +3227,7 @@ char *U_WMRRESIZEPALETTE_set(uint16_t Palette){ return U_WMRCORE_1U16_set(U_WMR_RESIZEPALETTE, Palette); } +//! \cond char *U_WMR3A_set(void){ return U_WMRCORENONE_set("U_WMR3A"); } @@ -3233,6 +3251,7 @@ char *U_WMR3E_set(void){ char *U_WMR3F_set(void){ return U_WMRCORENONE_set("U_WMR3F"); } +//! \endcond // U_WMRDIBBITBLT_set /** @@ -3251,15 +3270,15 @@ char *U_WMRDIBBITBLT_set( U_POINT16 cwh, U_POINT16 Src, uint32_t dwRop3, - const PU_BITMAPINFO Bmi, + const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px ){ char *record=NULL; uint32_t irecsize; int cbImage,cbImage4,cbBmi,off; - PU_WMRDIBBITBLT_PX pmr_px; - PU_WMRDIBBITBLT_NOPX pmr_nopx; + U_WMRDIBBITBLT_PX *pmr_px; + U_WMRDIBBITBLT_NOPX *pmr_nopx; if(Px && Bmi){ @@ -3268,7 +3287,7 @@ char *U_WMRDIBBITBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_DIBBITBLT); - pmr_px = (PU_WMRDIBBITBLT_PX) record; + pmr_px = (U_WMRDIBBITBLT_PX *) record; memcpy(pmr_px->rop3w, &dwRop3, 4); pmr_px->ySrc = Src.y; pmr_px->xSrc = Src.x; @@ -3287,7 +3306,7 @@ char *U_WMRDIBBITBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_DIBBITBLT); - pmr_nopx = (PU_WMRDIBBITBLT_NOPX) record; + pmr_nopx = (U_WMRDIBBITBLT_NOPX *) record; memcpy(pmr_nopx->rop3w, &dwRop3, 4); pmr_nopx->ySrc = Src.y; pmr_nopx->xSrc = Src.x; @@ -3319,22 +3338,22 @@ char *U_WMRDIBSTRETCHBLT_set( U_POINT16 Src, U_POINT16 cSrc, uint32_t dwRop3, - const PU_BITMAPINFO Bmi, + const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px ){ char *record=NULL; uint32_t irecsize; int cbImage,cbImage4,cbBmi,off; - PU_WMRDIBSTRETCHBLT_PX pmr_px; - PU_WMRDIBSTRETCHBLT_NOPX pmr_nopx; + U_WMRDIBSTRETCHBLT_PX *pmr_px; + U_WMRDIBSTRETCHBLT_NOPX *pmr_nopx; if(Px && Bmi){ SET_CB_FROM_PXBMI(Px,Bmi,cbImage,cbImage4,cbBmi,cbPx); irecsize = U_SIZE_WMRDIBSTRETCHBLT_PX + cbBmi + cbImage4; record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_DIBSTRETCHBLT); - pmr_px = (PU_WMRDIBSTRETCHBLT_PX) record; + pmr_px = (U_WMRDIBSTRETCHBLT_PX *) record; memcpy(pmr_px->rop3w, &dwRop3, 4); pmr_px->hSrc = cSrc.y; pmr_px->wSrc = cSrc.x; @@ -3355,7 +3374,7 @@ char *U_WMRDIBSTRETCHBLT_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_DIBSTRETCHBLT); - pmr_nopx = (PU_WMRDIBSTRETCHBLT_NOPX) record; + pmr_nopx = (U_WMRDIBSTRETCHBLT_NOPX *) record; memcpy(pmr_nopx->rop3w, &dwRop3, 4); pmr_nopx->hSrc = cSrc.y; pmr_nopx->wSrc = cSrc.x; @@ -3385,10 +3404,10 @@ char *U_WMRDIBSTRETCHBLT_set( char *U_WMRDIBCREATEPATTERNBRUSH_set( const uint16_t Style, const uint16_t iUsage, - PU_BITMAPINFO Bmi, + const U_BITMAPINFO *Bmi, const uint32_t cbPx, const char *Px, - PU_BITMAP16 Bm16 + const U_BITMAP16 *Bm16 ){ char *record=NULL; uint32_t irecsize; @@ -3445,14 +3464,14 @@ char *U_WMRSTRETCHDIB_set( U_POINT16 cSrc, uint16_t cUsage, uint32_t dwRop3, - const PU_BITMAPINFO Bmi, + const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px ){ char *record; uint32_t irecsize; int cbImage,cbImage4,cbBmi,off; - PU_WMRSTRETCHDIB pmr; + U_WMRSTRETCHDIB *pmr; SET_CB_FROM_PXBMI(Px,Bmi,cbImage,cbImage4,cbBmi,cbPx); @@ -3460,7 +3479,7 @@ char *U_WMRSTRETCHDIB_set( record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_STRETCHDIB); - pmr = (PU_WMRSTRETCHDIB) record; + pmr = (U_WMRSTRETCHDIB *) record; memcpy(pmr->rop3w, &dwRop3, 4); pmr->cUsage = cUsage; pmr->hSrc = cSrc.y; @@ -3481,6 +3500,7 @@ char *U_WMRSTRETCHDIB_set( return(record); } +//! \cond char *U_WMR44_set(void){ return U_WMRCORENONE_set("U_WMR44"); } @@ -3496,6 +3516,7 @@ char *U_WMR46_set(void){ char *U_WMR47_set(void){ return U_WMRCORENONE_set("U_WMR47"); } +//! \endcond /** \brief Create and return a U_WMREXTFLOODFILL record @@ -3514,6 +3535,7 @@ char *U_WMREXTFLOODFILL_set(uint16_t Mode, U_COLORREF Color, U_POINT16 coord){ ); } +//! \cond char *U_WMR49_set(void){ return U_WMRCORENONE_set("U_WMR49"); } @@ -4181,6 +4203,7 @@ char *U_WMREE_set(void){ char *U_WMREF_set(void){ return U_WMRCORENONE_set("U_WMREF"); } +//! \endcond /** \brief Create and return a U_WMRDELETEOBJECT record @@ -4191,6 +4214,7 @@ char *U_WMRDELETEOBJECT_set(uint16_t object){ return U_WMRCORE_1U16_set(U_WMR_DELETEOBJECT, object); } +//! \cond char *U_WMRF1_set(void){ return U_WMRCORENONE_set("U_WMRF1"); } @@ -4214,19 +4238,22 @@ char *U_WMRF5_set(void){ char *U_WMRF6_set(void){ return U_WMRCORENONE_set("U_WMRF6"); } +//! \endcond /** \brief Create and return a U_WMRCREATEPALETTE record \return pointer to the U_WMRCREATEPALETTE record, or NULL on error \param Palette Create a Palette object. */ -char *U_WMRCREATEPALETTE_set(PU_PALETTE Palette){ +char *U_WMRCREATEPALETTE_set(U_PALETTE *Palette){ return U_WMRCORE_PALETTE_set(U_WMR_CREATEPALETTE, Palette); } +//! \cond char *U_WMRF8_set(void){ return U_WMRCORENONE_set("U_WMRF8"); } +//! \endcond /** \brief Allocate and construct a U_WMRCREATEPATTERNBRUSH record. @@ -4236,7 +4263,7 @@ char *U_WMRF8_set(void){ \param Pattern byte array pattern, described by Bm16, for brush */ char *U_WMRCREATEPATTERNBRUSH_set( - PU_BITMAP16 Bm16, + U_BITMAP16 *Bm16, char *Pattern ){ char *record; @@ -4271,7 +4298,7 @@ char *U_WMRCREATEPENINDIRECT_set(U_PEN pen){ \return pointer to the U_WMRCREATEFONTINDIRECT record, or NULL on error. \param font Parameters of the font object to create. */ -char *U_WMRCREATEFONTINDIRECT_set(PU_FONT font){ +char *U_WMRCREATEFONTINDIRECT_set(U_FONT *font){ char *record=NULL; uint32_t irecsize,off,flen; flen = 1 + strlen((char *)font->FaceName); /* include the null terminator in the count */ @@ -4295,12 +4322,14 @@ char *U_WMRCREATEBRUSHINDIRECT_set(U_WLOGBRUSH brush){ return U_WMRCORE_2U16_N16_set(U_WMR_CREATEBRUSHINDIRECT, NULL, NULL, U_SIZE_WLOGBRUSH/2, &brush); } - /* in Wine, not in WMF PDF */ - char *U_WMRCREATEBITMAPINDIRECT_set(void){ +/** in GDI and Wine, not in WMF manual. +*/ +char *U_WMRCREATEBITMAPINDIRECT_set(void){ return U_WMRCORENONE_set("U_WMRCREATEBITMAPINDIRECT"); } - /* in Wine, not in WMF PDF */ +/** in GDI and Wine, not in WMF manual. +*/ char *U_WMRCREATEBITMAP_set(void){ return U_WMRCORENONE_set("U_WMRCREATEBITMAP"); } @@ -4310,7 +4339,7 @@ char *U_WMRCREATEBRUSHINDIRECT_set(U_WLOGBRUSH brush){ \return pointer to the U_WMRCREATEREGION record, or NULL on error. \param region Parameters of the region object to create. */ -char *U_WMRCREATEREGION_set(PU_REGION region){ +char *U_WMRCREATEREGION_set(const U_REGION *region){ char *record=NULL; uint32_t irecsize,off; irecsize = U_SIZE_METARECORD + region->Size; @@ -4391,7 +4420,7 @@ These functions create standard structures used in the WMR records. *********************************************************************************************** */ // hide these from Doxygen -//! @cond +//! \cond /* ********************************************************************************************** These functions contain shared code used by various U_WMR*_get 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. @@ -4424,7 +4453,7 @@ int U_WMRCORE_1U16_CRF_2U16_get( const char *contents, int minsize, uint16_t *arg1, - PU_COLORREF Color, + U_COLORREF *Color, uint16_t *arg2, uint16_t *arg3 ){ @@ -4442,7 +4471,7 @@ int U_WMRCORE_1U16_CRF_2U16_get( return(size); } -/* records that have a single uint16_t argument like PU_WMRSETMAPMODE +/* records that have a single uint16_t argument like U_WMRSETMAPMODE May also be used with int16_t with appropriate casts */ int U_WMRCORE_1U16_get( const char *contents, @@ -4596,7 +4625,7 @@ int U_WMRCORE_2U16_N16_get( int U_WMRCORE_PALETTE_get( const char *contents, int minsize, - PU_PALETTE Palette, + U_PALETTE *Palette, const char **PalEntries ){ int size = U_WMRCORE_RECSAFE_get(contents, minsize); @@ -4608,14 +4637,14 @@ int U_WMRCORE_PALETTE_get( return(size); } -//! @endcond +//! \endcond /** \brief Return parameters from a bitmapcoreheader. All are returned as 32 bit integers, regardless of their internal representation. \param BmiCh char * pointer to a U_BITMAPCOREHEADER. Note, data may not be properly aligned. - \param Size_4 size of the coreheader in bytes + \param Size size of the coreheader in bytes \param Width; Width of pixel array \param Height; Height of pixel array \param BitCount Pixel Format (BitCount Enumeration) @@ -4731,7 +4760,7 @@ int wget_DIB_params( if(bic == U_BI_RGB){ *numCt = get_real_color_count(dib); if(*numCt){ - *ct = (PU_RGBQUAD) (dib + U_SIZE_BITMAPINFOHEADER); + *ct = (U_RGBQUAD *) (dib + U_SIZE_BITMAPINFOHEADER); *px += U_SIZE_COLORREF * (*numCt); } else { *ct = NULL; } @@ -4767,8 +4796,8 @@ They are listed in order by the corresponding U_WMR_* index number. int wmfheader_get( const char *contents, const char *blimit, - PU_WMRPLACEABLE Placeable, - PU_WMRHEADER Header + U_WMRPLACEABLE *Placeable, + U_WMRHEADER *Header ){ uint32_t Key; int size=0; @@ -4810,7 +4839,7 @@ int U_WMREOF_get( */ int U_WMRSETBKCOLOR_get( const char *contents, - PU_COLORREF Color + U_COLORREF *Color ){ int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRSETBKCOLOR)); if(!size)return(0); @@ -4915,7 +4944,7 @@ int U_WMRSETTEXTCHAREXTRA_get( */ int U_WMRSETTEXTCOLOR_get( const char *contents, - PU_COLORREF Color + U_COLORREF *Color ){ int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRSETTEXTCOLOR)); if(!size)return(0); @@ -4946,7 +4975,7 @@ int U_WMRSETTEXTJUSTIFICATION_get( */ int U_WMRSETWINDOWORG_get( const char *contents, - PU_POINT16 coord + U_POINT16 * coord ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMRSETWINDOWORG), U_P16(coord->y), U_P16(coord->x))); } @@ -4959,7 +4988,7 @@ int U_WMRSETWINDOWORG_get( */ int U_WMRSETWINDOWEXT_get( const char *contents, - PU_POINT16 extent + U_POINT16 * extent ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMRSETWINDOWEXT), U_P16(extent->y), U_P16(extent->x))); } @@ -4972,7 +5001,7 @@ int U_WMRSETWINDOWEXT_get( */ int U_WMRSETVIEWPORTORG_get( const char *contents, - PU_POINT16 coord + U_POINT16 * coord ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMRSETVIEWPORTORG), U_P16(coord->y), U_P16(coord->x))); @@ -4986,7 +5015,7 @@ int U_WMRSETVIEWPORTORG_get( */ int U_WMRSETVIEWPORTEXT_get( const char *contents, - PU_POINT16 extent + U_POINT16 * extent ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMRSETVIEWPORTEXT), U_P16(extent->y), U_P16(extent->x))); } @@ -4999,7 +5028,7 @@ int U_WMRSETVIEWPORTEXT_get( */ int U_WMROFFSETWINDOWORG_get( const char *contents, - PU_POINT16 offset + U_POINT16 * offset ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMROFFSETWINDOWORG), U_P16(offset->y), U_P16(offset->x))); } @@ -5013,8 +5042,8 @@ int U_WMROFFSETWINDOWORG_get( */ int U_WMRSCALEWINDOWEXT_get( const char *contents, - PU_POINT16 Denom, - PU_POINT16 Num + U_POINT16 * Denom, + U_POINT16 * Num ){ return(U_WMRCORE_4U16_get(contents, (U_SIZE_WMRSCALEWINDOWEXT), U_P16(Denom->y), U_P16(Denom->x), U_P16(Num->y), U_P16(Num->x))); } @@ -5027,7 +5056,7 @@ int U_WMRSCALEWINDOWEXT_get( */ int U_WMROFFSETVIEWPORTORG_get( const char *contents, - PU_POINT16 offset + U_POINT16 * offset ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMROFFSETVIEWPORTORG), U_P16(offset->y), U_P16(offset->x))); } @@ -5041,8 +5070,8 @@ int U_WMROFFSETVIEWPORTORG_get( */ int U_WMRSCALEVIEWPORTEXT_get( const char *contents, - PU_POINT16 Denom, - PU_POINT16 Num + U_POINT16 * Denom, + U_POINT16 * Num ){ return(U_WMRCORE_4U16_get(contents, (U_SIZE_WMRSCALEVIEWPORTEXT), U_P16(Denom->y), U_P16(Denom->x), U_P16(Num->y), U_P16(Num->x))); } @@ -5055,7 +5084,7 @@ int U_WMRSCALEVIEWPORTEXT_get( */ int U_WMRLINETO_get( const char *contents, - PU_POINT16 coord + U_POINT16 * coord ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMRLINETO), U_P16(coord->y), U_P16(coord->x))); } @@ -5068,7 +5097,7 @@ int U_WMRLINETO_get( */ int U_WMRMOVETO_get( const char *contents, - PU_POINT16 coord + U_POINT16 * coord ){ return(U_WMRCORE_2U16_get(contents, (U_SIZE_WMRMOVETO), U_P16(coord->y), U_P16(coord->x))); } @@ -5081,7 +5110,7 @@ int U_WMRMOVETO_get( */ int U_WMREXCLUDECLIPRECT_get( const char *contents, - PU_RECT16 rect + U_RECT16 *rect ){ return(U_WMRCORE_4U16_get(contents, (U_SIZE_WMREXCLUDECLIPRECT), U_P16(rect->bottom), U_P16(rect->right), U_P16(rect->top), U_P16(rect->left))); } @@ -5094,7 +5123,7 @@ int U_WMREXCLUDECLIPRECT_get( */ int U_WMRINTERSECTCLIPRECT_get( const char *contents, - PU_RECT16 rect + U_RECT16 *rect ){ return(U_WMRCORE_4U16_get(contents, (U_SIZE_WMRINTERSECTCLIPRECT), U_P16(rect->bottom), U_P16(rect->right), U_P16(rect->top), U_P16(rect->left))); } @@ -5109,9 +5138,9 @@ int U_WMRINTERSECTCLIPRECT_get( */ int U_WMRARC_get( const char *contents, - PU_POINT16 StartArc, - PU_POINT16 EndArc, - PU_RECT16 rect + U_POINT16 *StartArc, + U_POINT16 *EndArc, + U_RECT16 *rect ){ return U_WMRCORE_8U16_get( contents, @@ -5135,7 +5164,7 @@ int U_WMRARC_get( */ int U_WMRELLIPSE_get( const char *contents, - PU_RECT16 rect + U_RECT16 *rect ){ return U_WMRCORE_4U16_get( contents, @@ -5158,8 +5187,8 @@ int U_WMRELLIPSE_get( int U_WMRFLOODFILL_get( const char *contents, uint16_t *Mode, - PU_COLORREF Color, - PU_POINT16 coord + U_COLORREF *Color, + U_POINT16 *coord ){ return U_WMRCORE_1U16_CRF_2U16_get( contents, @@ -5181,9 +5210,9 @@ int U_WMRFLOODFILL_get( */ int U_WMRPIE_get( const char *contents, - PU_POINT16 Radial1, - PU_POINT16 Radial2, - PU_RECT16 rect + U_POINT16 *Radial1, + U_POINT16 *Radial2, + U_RECT16 *rect ){ return U_WMRCORE_8U16_get( contents, @@ -5207,7 +5236,7 @@ int U_WMRPIE_get( */ int U_WMRRECTANGLE_get( const char *contents, - PU_RECT16 rect + U_RECT16 *rect ){ return U_WMRCORE_4U16_get( contents, @@ -5231,7 +5260,7 @@ int U_WMRROUNDRECT_get( const char *contents, int16_t *Width, int16_t *Height, - PU_RECT16 rect + U_RECT16 *rect ){ return U_WMRCORE_6U16_get( contents, @@ -5255,8 +5284,8 @@ int U_WMRROUNDRECT_get( */ int U_WMRPATBLT_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cwh, + U_POINT16 * Dst, + U_POINT16 * cwh, uint32_t *dwRop3 ){ int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRPATBLT)); @@ -5280,23 +5309,36 @@ int U_WMRSAVEDC_get( return(U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRSAVEDC))); } +/** + \brief Get data from a U_WMRSETPIXEL record + \return length of the U_WMRSETPIXEL record in bytes, or 0 on error + \param contents record to extract data from + \param Color pointer to a U_COLORREF variable where the color will be stored. + \param Coord pointer to a U_POINT16 variable where the coordinates will be stored. +*/ int U_WMRSETPIXEL_get( const char *contents, - PU_COLORREF Color, - PU_POINT16 coord){ + U_COLORREF *Color, + U_POINT16 *Coord){ return U_WMRCORE_1U16_CRF_2U16_get( contents, (U_SIZE_WMRSETPIXEL), NULL, Color, - U_P16(coord->y), - U_P16(coord->x) + U_P16(Coord->y), + U_P16(Coord->x) ); } +/** + \brief Get data from a U_WMROFFSETCLIPRGN record + \return length of the U_WMROFFSETCLIPRGN record in bytes, or 0 on error + \param contents record to extract data from + \param offset pointer to a U_POINT16 variable where the x,y offsets will be stored. +*/ int U_WMROFFSETCLIPRGN_get( const char *contents, - PU_POINT16 offset + U_POINT16 *offset ){ return U_WMRCORE_2U16_get(contents, (U_SIZE_WMROFFSETCLIPRGN), U_P16(offset->y), U_P16(offset->x)); } @@ -5311,7 +5353,7 @@ int U_WMROFFSETCLIPRGN_get( */ int U_WMRTEXTOUT_get( const char *contents, - PU_POINT16 Dst, + U_POINT16 * Dst, int16_t *Length, const char **string ){ @@ -5344,11 +5386,11 @@ int U_WMRTEXTOUT_get( */ int U_WMRBITBLT_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cwh, - PU_POINT16 Src, + U_POINT16 * Dst, + U_POINT16 * cwh, + U_POINT16 * Src, uint32_t *dwRop3, - PU_BITMAP16 Bm16, + U_BITMAP16 *Bm16, const char **px ){ uint8_t xb; @@ -5394,12 +5436,12 @@ int U_WMRBITBLT_get( */ int U_WMRSTRETCHBLT_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cDst, - PU_POINT16 Src, - PU_POINT16 cSrc, + U_POINT16 * Dst, + U_POINT16 * cDst, + U_POINT16 * Src, + U_POINT16 * cSrc, uint32_t *dwRop3, - PU_BITMAP16 Bm16, + U_BITMAP16 *Bm16, const char **px ){ uint8_t xb; @@ -5601,7 +5643,8 @@ int U_WMRSETTEXTALIGN_get( return U_WMRCORE_1U16_get(contents, (U_SIZE_WMRSETTEXTALIGN), Mode); } -/* in Wine, not in WMF PDF. */ +/** in GDI and Wine, not in WMF manual. +*/ int U_WMRDRAWTEXT_get(void){ /* in Wine, not in WMF PDF. */ return U_WMRCORENONE_get("U_WMRDRAWTEXT"); } @@ -5616,9 +5659,9 @@ int U_WMRDRAWTEXT_get(void){ /* in Wine, not in WMF PDF. */ */ int U_WMRCHORD_get( const char *contents, - PU_POINT16 Radial1, - PU_POINT16 Radial2, - PU_RECT16 rect + U_POINT16 *Radial1, + U_POINT16 *Radial2, + U_RECT16 *rect ){ return U_WMRCORE_8U16_get( contents, @@ -5663,12 +5706,12 @@ int U_WMRSETMAPPERFLAGS_get( */ int U_WMREXTTEXTOUT_get( const char *contents, - PU_POINT16 Dst, + U_POINT16 * Dst, int16_t *Length, uint16_t *Opts, const char **string, const int16_t **dx, - PU_RECT16 rect + U_RECT16 *rect ){ int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMREXTTEXTOUT)); int off = U_SIZE_METARECORD; @@ -5701,9 +5744,9 @@ int U_WMREXTTEXTOUT_get( */ int U_WMRSETDIBTODEV_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cwh, - PU_POINT16 Src, + U_POINT16 * Dst, + U_POINT16 * cwh, + U_POINT16 * Src, uint16_t *cUsage, uint16_t *ScanCount, uint16_t *StartScan, @@ -5757,7 +5800,7 @@ int U_WMRREALIZEPALETTE_get( */ int U_WMRANIMATEPALETTE_get( const char *contents, - PU_PALETTE Palette, + U_PALETTE *Palette, const char **PalEntries ){ return U_WMRCORE_PALETTE_get(contents, (U_SIZE_WMRANIMATEPALETTE), Palette, PalEntries); @@ -5772,7 +5815,7 @@ int U_WMRANIMATEPALETTE_get( */ int U_WMRSETPALENTRIES_get( const char *contents, - PU_PALETTE Palette, + U_PALETTE *Palette, const char **PalEntries ){ return U_WMRCORE_PALETTE_get(contents, (U_SIZE_WMRSETPALENTRIES), Palette, PalEntries); @@ -5814,6 +5857,7 @@ int U_WMRRESIZEPALETTE_get( return U_WMRCORE_1U16_get(contents, (U_SIZE_WMRRESIZEPALETTE), Palette); } +//! \cond int U_WMR3A_get(void){ return U_WMRCORENONE_get("U_WMR3A"); } @@ -5837,6 +5881,7 @@ int U_WMR3E_get(void){ int U_WMR3F_get(void){ return U_WMRCORENONE_get("U_WMR3F"); } +//! \endcond // U_WMRDIBBITBLT_get /** @@ -5851,9 +5896,9 @@ int U_WMR3F_get(void){ */ int U_WMRDIBBITBLT_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cwh, - PU_POINT16 Src, + U_POINT16 * Dst, + U_POINT16 * cwh, + U_POINT16 * Src, uint32_t *dwRop3, const char **dib ){ @@ -5897,10 +5942,10 @@ int U_WMRDIBBITBLT_get( */ int U_WMRDIBSTRETCHBLT_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cDst, - PU_POINT16 Src, - PU_POINT16 cSrc, + U_POINT16 * Dst, + U_POINT16 * cDst, + U_POINT16 * Src, + U_POINT16 * cSrc, uint32_t *dwRop3, const char **dib ){ @@ -5993,10 +6038,10 @@ int U_WMRDIBCREATEPATTERNBRUSH_get( */ int U_WMRSTRETCHDIB_get( const char *contents, - PU_POINT16 Dst, - PU_POINT16 cDst, - PU_POINT16 Src, - PU_POINT16 cSrc, + U_POINT16 * Dst, + U_POINT16 * cDst, + U_POINT16 * Src, + U_POINT16 * cSrc, uint16_t *cUsage, uint32_t *dwRop3, const char **dib @@ -6018,6 +6063,7 @@ int U_WMRSTRETCHDIB_get( return(size); } +//! \cond int U_WMR44_get(void){ return U_WMRCORENONE_get("U_WMR44"); } @@ -6033,6 +6079,7 @@ int U_WMR46_get(void){ int U_WMR47_get(void){ return U_WMRCORENONE_get("U_WMR47"); } +//! \endcond /** \brief Retrieve values from a U_WMREXTFLOODFILL record @@ -6045,8 +6092,8 @@ int U_WMR47_get(void){ int U_WMREXTFLOODFILL_get( const char *contents, uint16_t *Mode, - PU_COLORREF Color, - PU_POINT16 coord + U_COLORREF *Color, + U_POINT16 * coord ){ return U_WMRCORE_1U16_CRF_2U16_get( contents, @@ -6058,6 +6105,7 @@ int U_WMREXTFLOODFILL_get( ); } +//! \cond int U_WMR49_get(void){ return U_WMRCORENONE_get("U_WMR49"); } @@ -6725,6 +6773,7 @@ int U_WMREE_get(void){ int U_WMREF_get(void){ return U_WMRCORENONE_get("U_WMREF"); } +//! \endcond /** \brief Get data from a U_WMRDELETEOBJECT record. @@ -6739,6 +6788,7 @@ int U_WMRDELETEOBJECT_get( return U_WMRCORE_1U16_get(contents, (U_SIZE_WMRDELETEOBJECT), Object); } +//! \cond int U_WMRF1_get(void){ return U_WMRCORENONE_get("U_WMRF1"); } @@ -6762,6 +6812,7 @@ int U_WMRF5_get(void){ int U_WMRF6_get(void){ return U_WMRCORENONE_get("U_WMRF6"); } +//! \endcond /** \brief Retrieve values from a U_WMRCREATEPALETTE record @@ -6772,15 +6823,17 @@ int U_WMRF6_get(void){ */ int U_WMRCREATEPALETTE_get( const char *contents, - PU_PALETTE Palette, + U_PALETTE *Palette, const char **PalEntries ){ return U_WMRCORE_PALETTE_get(contents, (U_SIZE_WMRCREATEPALETTE), Palette, PalEntries); } +//! \cond int U_WMRF8_get(void){ return U_WMRCORENONE_get("U_WMRF8"); } +//! \endcond /** \brief Get data from a U_WMRCREATEPATTERNBRUSH record. @@ -6793,7 +6846,7 @@ int U_WMRF8_get(void){ */ int U_WMRCREATEPATTERNBRUSH_get( const char *contents, - PU_BITMAP16 Bm16, + U_BITMAP16 *Bm16, int *pasize, const char **Pattern ){ @@ -6816,7 +6869,7 @@ int U_WMRCREATEPATTERNBRUSH_get( */ int U_WMRCREATEPENINDIRECT_get( const char *contents, - PU_PEN pen + U_PEN *pen ){ int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRCREATEPENINDIRECT)); if(!size)return(0); @@ -6850,12 +6903,14 @@ int U_WMRCREATEBRUSHINDIRECT_get( return U_WMRCORE_2U16_N16_get(contents, (U_SIZE_WMRCREATEBRUSHINDIRECT), NULL, NULL, brush); } - /* in Wine, not in WMF PDF */ +/** in GDI and Wine, not in WMF manual. +*/ int U_WMRCREATEBITMAPINDIRECT_get(void){ return U_WMRCORENONE_get("U_WMRCREATEBITMAPINDIRECT"); } - /* in Wine, not in WMF PDF */ +/** in GDI and Wine, not in WMF manual. +*/ int U_WMRCREATEBITMAP_get(void){ return U_WMRCORENONE_get("U_WMRCREATEBITMAP"); } diff --git a/src/libuemf/uwmf.h b/src/libuemf/uwmf.h index a97648eb1..65424cad1 100644 --- a/src/libuemf/uwmf.h +++ b/src/libuemf/uwmf.h @@ -1,10 +1,12 @@ /** - @file uwmf.h Structures and functions prototypes for WMF files. + @file uwmf.h + + @brief Structures, definitions, and function prototypes for WMF files. WMF file Record structure information has been derived from Mingw and Wine header files, and from Microsoft's WMF Information pdf, release date July 5,2012, link from here: - http://msdn2.microsoft.com/en-us/library/250370.aspx + http://msdn2.microsoft.com/en-us/library/cc250370.aspx If the direct link fails the document may be found by searching for: "[MS-WMF]: Windows Metafile Format" @@ -62,11 +64,11 @@ extern "C" { // *********************************************************************************** -// Value enumerations and other predefined constants, alphabetical order by group +// Value Enumerations and other predefined constants, alphabetical order by group -/** RecordType Enumeration WMF PDF 2.1.1.1 - \defgroup U_WMR_RecordTypes WMR Record types - @{ +/* RecordType Enumeration WMF manual 2.1.1.1 */ +/** WMF manual 2.1.1.1 + \brief WMR Record types */ enum U_WMR_TYPES{ U_WMR_EOF, //!< 0x0000 U_WMREOF record @@ -326,20 +328,19 @@ enum U_WMR_TYPES{ U_WMR_CREATEBITMAP, //!< 0x06FE U_WMRCREATEBITMAP record U_WMR_CREATEREGION, //!< 0x06FF U_WMRCREATEREGION record }; -/** @} */ #define U_WMR_MIN 0 //!< Minimum U_WMR_ value. #define U_WMR_MAX 255 //!< Maximum U_WMR_ value. #define U_WMR_MASK 0xFF //!< Mask for enumerator (lower) byte -#define U_WMR_INVALID 0xFFFFFFFF //!< Not any valid U_EMF_ valuee +#define U_WMR_INVALID 0xFFFFFFFF //!< Indicates "Not a valid U_WMR_* value" -/** BinaryRasterOperation Enumeration WMF PDF 2.1.1.2 +/** BinaryRasterOperation Enumeration WMF manual 2.1.1.2 - Same as U_EMRSETROP2 in uemf.h + Same as U_EMF_EMRSETROP2 in uemf.h */ -/** BitCount Enumeration WMF PDF 2.1.1.3 - \defgroup AltBitCount_Qualifiers Alternate names for the values under U_BITMAPINFOHEADER_biBitCount_Qualifiers in uemf.h +/** BitCount Enumeration WMF manual 2.1.1.3 + \defgroup U_WMF_AltBitCount_Qualifiers WMF Alternate names for the values under EMF Bitcount Enumeration in uemf.h @{ */ #define BI_BITCOUNT_0 U_BCBM_EXPLICIT //!< Derived from JPG or PNG compressed image or ? @@ -351,26 +352,27 @@ enum U_WMR_TYPES{ #define BI_BITCOUNT_6 U_BCBM_COLOR32 //!< 2^32 colors. bmiColors is not used. Pixels are U_RGBQUAD. /** @} */ -/** BrushStyle Enumeration WMF PDF 2.1.1.4 - Same as "LB_Style Enumeration" in uemf.h +/* BrushStyle Enumeration WMF manual 2.1.1.4 + Same as "EMF LB_Style Enumeration" in uemf.h */ -/** CharacterSet Enumeration WMF PDF 2.1.1.5 - Same as "LF_CharSet Enumeration" in uemf.h +/* CharacterSet Enumeration WMF manual 2.1.1.5 + Same as "EMF LF_CharSet Enumeration" in uemf.h */ -/** ColorUsage Enumeration WMF PDF 2.1.1.6 - Same as "DIBColors Enumeration" in uemf.h, with one addition - \defgroup Extra_iUsageSrc_Qualifiers Extra DIBColors Enumeration +/** ColorUsage Enumeration WMF manual 2.1.1.6 For cUsage fields in various DIB related records. + \defgroup U_WMF_Extra_iUsageSrc_Qualifiers WMF Extra DIBColors Enumeration + WMF is the same as "EMF DIBColors Enumeration" in uemf.h, except it also supports + this one extra value. @{ */ #define U_DIB_PAL_INDICES 2 //!< No color table, pixels are logical palette indices. /** @} */ -/** Compression Enumeration WMF PDF 2.1.1.7 - Same as "BI_Compression Enumeration" in uemf.h with these additions - \defgroup ExtraU_BITMAPINFOHEADER_biCompression_Qualifiers Extra BI_Compression Enumeration, none are implemented +/** Compression Enumeration WMF manual 2.1.1.7 + Same as "EMF BI_Compression Enumeration" in uemf.h with these additions + \defgroup U_WMF_EXTRA_BITMAPINFOHEADER_biCompression_Qualifiers WMF Extra BI_Compression Enumerations, none are implemented @{ */ #define U_BI_CMYK 0x000B //!< CMYK uncompressed @@ -378,49 +380,51 @@ enum U_WMR_TYPES{ #define U_BI_CMYKRLE4 = 0x000D //!< CMYK RLE4 compression /** @} */ -/** FamilyFont enumeration WMF PDF 2.1.1.8 +/* FamilyFont Enumeration WMF manual 2.1.1.8 Only used in a PitchAndFamily object, defined there */ -/** Floodfill enumeration WMF PDF 2.1.1.9 - Same as "FloodFill Enumeration" in uemf.h +/* FloodFill Enumeration WMF manual 2.1.1.9 + Same as "EMF FloodFill Enumeration" in uemf.h */ -/** FontQuality enumeration WMF PDF 2.1.1.10 - Same as "LF_Quality Enumeration" in uemf.h +/* FontQuality Enumeration WMF manual 2.1.1.10 + Same as "EMF LF_Quality Enumeration" in uemf.h */ -/** GamutMappingIntent enumeration WMF PDF 2.1.1.11 - Same as "LCS_Intent Enumeration" in uemf.h +/* GamutMappingIntent Enumeration WMF manual 2.1.1.11 + Same as "EMF LCS_Intent Enumeration" in uemf.h */ -/** HatchStyle enumeration WMF PDF 2.1.1.12 - Same as "HatchStyle Enumeration" in uemf.h +/* HatchStyle Enumeration WMF manual 2.1.1.12 + Same as "EMF HatchStyle Enumeration" in uemf.h */ -/** Layout enumeration WMF PDF 2.1.1.13 - Same as "Mirroring Enumeration" in uemf.h +/* Layout Enumeration WMF manual 2.1.1.13 + Same as "EMF Mirroring Enumeration" in uemf.h */ -/** LogicalColorSpace Enumeration WMF PDF 2.1.1.14 +/** LogicalColorSpace Enumeration WMF manual 2.1.1.14 Not used presently, applies in BitmapV4Header @{ */ -//!< #define U_LCS_CALIBRATED_RGB 0x00000000 calibrated RGB -#define U_LCS_sRGB 0x73524742 //!< ASCII for "sRGB" -#define U_LCS_WINDOWS_COLOR_SPACE 0x57696E20 //!< ASCII for "Win " +/* U_LCS_CALIBRATED_RGB is defined in uemf.h under LCS_CSType Enumeration, WMF manual also defines it, but do not replicate define. +#define U_LCS_CALIBRATED_RGB 0x00000000 //!< calibrated RGB +*/ +#define U_LCS_sRGB 0x73524742 //!< ASCII for "sRGB" +#define U_LCS_WINDOWS_COLOR_SPACE 0x57696E20 //!< ASCII for "Win " /** @} */ -/** LogicalColorSpaceV5 Enumeration WMF PDF 2.1.1.15 - Same as "Profile Enumeration" in uemf.h +/* LogicalColorSpaceV5 Enumeration WMF manual 2.1.1.15 + Same as "EMF Profile Enumeration" in uemf.h */ -/** MapMode Enumeration WMF PDF 2.1.1.16 - Same as "MapMode Enumeration" in uemf.h +/* MapMode Enumeration WMF manual 2.1.1.16 + Same as "EMF MapMode Enumeration" in uemf.h */ -/** MetaFilesEscape Enumeration WMF PDF 2.1.1.17 - \defgroup MFEscape_Qualifiers Metafile Escape record types +/** MetaFilesEscape Enumeration WMF manual 2.1.1.17 + \defgroup U_WMF_MFEscape_Qualifiers WMF Metafile Escape record types For U_WMRESCAPE eFunc field @{ */ @@ -486,14 +490,14 @@ enum U_WMR_TYPES{ #define U_MFE_SPCLPASSTHROUGH2 0x11D8 //!< SPCLPASSTHROUGH2 escape type /** @} */ -/** MetafileType Enumeration WMF PDF 2.1.1.18 +/** MetafileType Enumeration WMF manual 2.1.1.18 @{ */ #define U_MEMORYMETAFILE 0x0001 //!< memory metafile (never used by libUWMF) #define U_DISKMETAFILE 0x0002 //!< disk metafile (always used by libUWMF) /** @} */ -/** MetafileVersion Enumeration WMF PDF 2.1.1.19 +/** MetafileVersion Enumeration WMF manual 2.1.1.19 @{ */ @@ -501,15 +505,15 @@ enum U_WMR_TYPES{ #define U_METAVERSION300 0x0300 //!< DIBs allowed /** @} */ -/** MixMode Enumeration WMF PDF 2.1.1.20 - Same as "BackgroundMode Enumeration" in uemf.h +/* MixMode Enumeration WMF manual 2.1.1.20 + Same as "EMF BackgroundMode Enumeration" in uemf.h */ -/** OutPrecision Enumeration WMF PDF 2.1.1.21 - Same as "LF_OutPrecision Enumeration" in uemf.h +/* OutPrecision Enumeration WMF manual 2.1.1.21 + Same as "EMF LF_OutPrecision Enumeration" in uemf.h */ -/** PaletteEntryFlag Enumeration WMF PDF 2.1.1.22 +/** PaletteEntryFlag Enumeration WMF manual 2.1.1.22 @{ */ #define U_PC_RESERVED 0x01 //!< used for animation @@ -517,8 +521,8 @@ enum U_WMR_TYPES{ #define U_PC_NOCOLLAPSE 0x04 //!< store as new color in palette, do not match to existing color /** @} */ -/** PenStyle Enumeration WMF PDF 2.1.1.23 - Same as "PenStyle Enumeration" in uemf.h +/** PenStyle Enumeration WMF manual 2.1.1.23 + Same as "EMF PenStyle Enumeration" in uemf.h, EXCEPT no values >0xFFFF are used, in particular there is no U_PS_GEOMETRIC (ie, all are U_PS_COSMETIC). Apparently because there is no U_PS_GEOMETRIC, U_PS_JOIN* and U_PS_ENDCAP* are also ignored by XP SP3 Preview (which defaults to a rounded cap) and PowerPoint 2003 (which defaults to square cap). The behavior @@ -526,16 +530,16 @@ enum U_WMR_TYPES{ to be very hit and miss from application to application. */ -/** PitchFont Enumeration WMF PDF 2.1.1.24 +/* PitchFont Enumeration WMF manual 2.1.1.24 These are only used in PitchAndFamily object, defined there. */ -/** PolyFillMode Enumeration WMF PDF 2.1.1.25 - These are the first twp emtries in "PolygonFillMode Enumeration" in uemf.h +/* PolyFillMode Enumeration WMF manual 2.1.1.25 + These are the first two emtries in "EMF PolygonFillMode Enumeration" in uemf.h */ -/** PostScriptCap Enumeration WMF PDF 2.1.1.26 +/** PostScriptCap Enumeration WMF manual 2.1.1.26 These are used in Escape Cap @{ */ @@ -545,13 +549,13 @@ enum U_WMR_TYPES{ #define U_WPS_CAP_SQUARE 2 /** @} */ -/** PostScriptClipping Enumeration WMF PDF 2.1.1.27 - PostFeatureSetting Enumeration WMF PDF 2.1.1.28 +/* PostScriptClipping Enumeration WMF manual 2.1.1.27 + PostFeatureSetting Enumeration WMF manual 2.1.1.28 These are used by postscript drivers, not supported by libUWEMF. */ -/** PostScrioptJoin Enumeration WMF PDF 2.1.1.29 +/** PostScrioptJoin Enumeration WMF manual 2.1.1.29 These are used in Escape Cap @{ */ @@ -561,170 +565,182 @@ enum U_WMR_TYPES{ #define U_WPS_JOIN_BEVEL 2 /** @} */ -/** StretchMode Enumeration WMF PDF 2.1.1.30 - Same as "StretchMode Enumeration" in uemf.h +/* StretchMode Enumeration WMF manual 2.1.1.30 + Same as "EMF StretchMode Enumeration" in uemf.h */ -/** TernaryRasterOperation Enumeration WMF PDF 2.1.1.31 - Same as "Ternary Raster Operation Enumeration" in uemf.h +/* TernaryRasterOperation Enumeration WMF manual 2.1.1.31 + Same as "EMF Ternary Raster Operation Enumeration" in uemf.h Only partially supported in libUWMF.h */ -/** ClipPrecision Flags WMF PDF 2.1.2.1 - Same as "LF_ClipPrecision Enumeration" in uemf.h +/* ClipPrecision Flags WMF manual 2.1.2.1 + Same as "EMF LF_ClipPrecision Enumeration" in uemf.h */ -/** ExtTextOutOptions Flags WMF PDF 2.1.2.2 - These are a subset of "ExtTextOutOptions Enumeration" in uemf.h +/* ExtTextOutOptions Flags WMF manual 2.1.2.2 + These are a subset of "EMF ExtTextOutOptions Enumeration" in uemf.h + Not defined for WMF: U_ETO_NONE, U_ETO_GRAYED, U_ETO_NORECT, U_ETO_SMALL_CHARS,U_ETO_IGNORELANGUAGE,U_ETO_REVERSE_INDEX_MAP + Defined for WMF: U_ETO_OPAQUE, U_ETO_CLIPPED, U_ETO_GLYPH_INDEX, U_ETO_RTLREADING,_ETO_NUMERICSLOCAL,U_ETO_NUMERICSLATIN, U_ETO_PDY */ -/** TextAlignment Enumeration WMF PDF 2.1.2.3 - VertialTextAlignment Enumeration WMF PDF 2.1.2.4 - These are both in "TextAlignment Enumeration" in uemf.h +/* TextAlignment Enumeration WMF manual 2.1.2.3 + VertialTextAlignment Enumeration WMF manual 2.1.2.4 + These are both in "EMF TextAlignment Enumeration" in uemf.h */ // *************************************************************************** // Miscellaneous Values -/** TextAlignmentMode Flags WMF PDF 2.1.2.3 - VerticalTextAlignmentMode Flags WMF PDF 2.1.2.4 - Same as "TextAlignment Enumeration" in uemf.h +/* TextAlignmentMode Flags WMF manual 2.1.2.3 + VerticalTextAlignmentMode Flags WMF manual 2.1.2.4 + Same as "EMF TextAlignment Enumeration" in uemf.h */ -/** \defgroup MinimumRecord_sizes Size in bytes of core record of each type. - These are USUALLY not the same - as the corresponding struct, so in general it is unsafe to use sizeof() with this code. +/** \defgroup U_WMF_MinimumRecord_sizes WMF Size in bytes of core record types. + + The size of the object/record is USUALLY not the same + as the sizeof() of the corresponding struct, so in general it is unsafe to use sizeof() with this code. + Always use the U_SIZE_x instead!!!! - Note that some records may actually be much, much longer than their minimum as they include strings, + + Note that some records may actually be much, much longer than their minimum size as they include strings, bitmaps, and such. + + Documentation for each value is: + + = same as struct size + or + X = different from struct size + followed by + Number (sizeof(struct) == size of the struct in bytes.) + @{ */ -/* Record sizeof (+ same, X differs) */ -#define U_SIZE_PAIRF 8 /* + 8 this might be different on 64 bit platform */ -#define U_SIZE_COLORREF 4 /* + 4 */ -#define U_SIZE_BRUSH 8 /* + 8 */ -#define U_SIZE_FONT 19 /* + 20 */ -#define U_SIZE_FONT_CORE 18 /* Minus the FaceName part */ -#define U_SIZE_PLTNTRY 4 /* + 4 */ -#define U_SIZE_PALETTE 8 /* + 8 */ -#define U_SIZE_PEN 10 /* + 10 */ -#define U_SIZE_POINT16 4 /* + 4 */ -#define U_SIZE_RECT16 8 /* + 8 */ -#define U_SIZE_REGION 20 /* X 22 20 is minums the variable part */ -#define U_SIZE_BITMAP16 10 /* + 10 */ -#define U_SIZE_BITMAPCOREHEADER 12 /* + 12 */ -#define U_SIZE_BITMAPINFOHEADER 40 /* + 40 */ -#define U_SIZE_BITMAPV4HEADER 108 /* ? 108 not tested */ -#define U_SIZE_BITMAPV5HEADER 124 /* ? 124 not tested */ -#define U_SIZE_WLOGBRUSH 8 /* + 8 */ -#define U_SIZE_POLYPOLYGON 4 /* + 4 */ -#define U_SIZE_SCAN 8 /* + 8 */ -#define U_SIZE_METARECORD 6 /* X 8 */ -#define U_SIZE_WMRPLACEABLE 22 /* X 24 */ -#define U_SIZE_WMRHEADER 18 /* X 20 */ -#define U_SIZE_WMREOF 6 /* X 8 */ -#define U_SIZE_WMRSETRELABS 6 /* X 8 */ -#define U_SIZE_WMRSAVEDC 6 /* X 8 */ -#define U_SIZE_WMRRESTOREDC 8 /* * 8 */ -#define U_SIZE_WMRREALIZEPALETTE 6 /* X 8 */ -#define U_SIZE_WMRSETBKCOLOR 10 /* X 12 */ -#define U_SIZE_WMRSETTEXTCOLOR 10 /* X 12 */ -#define U_SIZE_WMRSETBKMODE 8 /* X 12 last 2 bytes are optional */ -#define U_SIZE_WMRSETROP2 8 /* X 12 last 2 bytes are optional */ -#define U_SIZE_WMRSETPOLYFILLMODE 8 /* X 12 last 2 bytes are optional */ -#define U_SIZE_WMRSETSTRETCHBLTMODE 8 /* X 12 last 2 bytes are optional */ -#define U_SIZE_WMRSETTEXTALIGN 8 /* X 12 last 2 bytes are optional */ -#define U_SIZE_WMRSETMAPMODE 8 /* + 8 */ -#define U_SIZE_WMRSETTEXTCHAREXTRA 8 /* + 8 */ -#define U_SIZE_WMRSETTEXTJUSTIFICATION 10 /* X 12 */ -#define U_SIZE_WMRSETWINDOWORG 10 /* X 12 */ -#define U_SIZE_WMRSETWINDOWEXT 10 /* X 12 */ -#define U_SIZE_WMRSETVIEWPORTORG 10 /* X 12 */ -#define U_SIZE_WMRSETVIEWPORTEXT 10 /* X 12 */ -#define U_SIZE_WMROFFSETWINDOWORG 10 /* X 12 */ -#define U_SIZE_WMROFFSETVIEWPORTORG 10 /* X 12 */ -#define U_SIZE_WMRLINETO 10 /* X 12 */ -#define U_SIZE_WMRMOVETO 10 /* X 12 */ -#define U_SIZE_WMROFFSETCLIPRGN 10 /* X 12 */ -#define U_SIZE_WMRSCALEWINDOWEXT 14 /* X 16 */ -#define U_SIZE_WMRSCALEVIEWPORTEXT 14 /* X 16 */ -#define U_SIZE_WMREXCLUDECLIPRECT 14 /* X 16 */ -#define U_SIZE_WMRINTERSECTCLIPRECT 14 /* X 16 */ -#define U_SIZE_WMRARC 22 /* X 24 */ -#define U_SIZE_WMRELLIPSE 14 /* X 16 */ -#define U_SIZE_WMRRECTANGLE 14 /* X 16 */ -#define U_SIZE_WMRFLOODFILL 16 /* + 16 */ -#define U_SIZE_WMREXTFLOODFILL 16 /* + 16 */ -#define U_SIZE_WMRSETPIXEL 14 /* X 16 */ -#define U_SIZE_WMRPIE 22 /* X 24 */ -#define U_SIZE_WMRCHORD 22 /* X 24 */ -#define U_SIZE_WMRROUNDRECT 18 /* X 20 */ -#define U_SIZE_WMRPATBLT 18 /* X 20 */ -#define U_SIZE_WMRTEXTOUT 8 /* X 12 (not including String,y,x) */ -#define U_SIZE_WMRBITBLT_NOPX 24 /* + 24 */ -#define U_SIZE_WMRBITBLT_PX 22 /* X 32 */ -#define U_SIZE_WMRSTRETCHBLT_NOPX 28 /* + 28 */ -#define U_SIZE_WMRSTRETCHBLT_PX 26 /* X 36 */ -#define U_SIZE_WMRPOLYGON 10 /* X 12 */ -#define U_SIZE_WMRPOLYLINE 10 /* X 12 */ -#define U_SIZE_WMRESCAPE 10 /* X 12 Data field could be completely absent */ -#define U_SIZE_WMRFILLREGION 10 /* X 12 */ -#define U_SIZE_WMRFRAMEREGION 14 /* X 16 */ -#define U_SIZE_WMRINVERTREGION 8 /* + 8 */ -#define U_SIZE_WMRPAINTREGION 8 /* + 8 */ -#define U_SIZE_WMRSELECTCLIPREGION 8 /* + 8 */ -#define U_SIZE_WMRSELECTOBJECT 8 /* + 8 */ -#define U_SIZE_WMRSELECTPALETTE 8 /* + 8 */ -#define U_SIZE_WMRRESIZEPALETTE 8 /* + 8 */ -#define U_SIZE_WMRDELETEOBJECT 8 /* + 8 */ -#define U_SIZE_WMRDRAWTEXT 6 /* X 8 */ -#define U_SIZE_WMRCREATEBITMAPINDIRECT 6 /* X 8 */ -#define U_SIZE_WMRCREATEBITMAP 6 /* X 8 */ -#define U_SIZE_WMRSETMAPPERFLAGS 10 /* X 12 */ -#define U_SIZE_WMREXTTEXTOUT 14 /* X 16 */ -#define U_SIZE_WMRSETDIBTODEV 22 /* X 28 */ -#define U_SIZE_WMRANIMATEPALETTE 14 /* X 16 */ -#define U_SIZE_WMRSETPALENTRIES 14 /* X 16 */ -#define U_SIZE_WMRCREATEPALETTE 14 /* X 16 */ -#define U_SIZE_WMRPOLYPOLYGON 10 /* X 12 */ -#define U_SIZE_WMRDIBBITBLT_NOPX 24 /* + 24 */ -#define U_SIZE_WMRDIBBITBLT_PX 22 /* X 24 */ -#define U_SIZE_WMRDIBSTRETCHBLT_NOPX 28 /* + 28 */ -#define U_SIZE_WMRDIBSTRETCHBLT_PX 26 /* X 28 */ -#define U_SIZE_WMRDIBCREATEPATTERNBRUSH 10 /* X 12 */ -#define U_SIZE_WMRSTRETCHDIB 28 /* X 32 */ -#define U_SIZE_WMRCREATEPATTERNBRUSH 6 /* X 8 */ -#define U_SIZE_WMRCREATEPENINDIRECT 16 /* + 16 */ -#define U_SIZE_WMRCREATEFONTINDIRECT 26 /* X 28 */ -#define U_SIZE_WMRCREATEBRUSHINDIRECT 14 /* X 16 */ -#define U_SIZE_WMRCREATEREGION 26 /* X 28 */ +#define U_SIZE_PAIRF 8 /**< + 8 this might be different on 64 bit platform */ +#define U_SIZE_COLORREF 4 /**< + 4 */ +#define U_SIZE_BRUSH 8 /**< + 8 */ +#define U_SIZE_FONT 19 /**< X 20 */ +#define U_SIZE_FONT_CORE 18 /**< X 20 Like U_FONT, but minus the FaceName part */ +#define U_SIZE_PLTNTRY 4 /**< + 4 */ +#define U_SIZE_PALETTE 8 /**< + 8 */ +#define U_SIZE_PEN 10 /**< + 10 */ +#define U_SIZE_POINT16 4 /**< + 4 */ +#define U_SIZE_RECT16 8 /**< + 8 */ +#define U_SIZE_REGION 20 /**< X 22 20 is minums the variable part */ +#define U_SIZE_BITMAP16 10 /**< + 10 */ +#define U_SIZE_BITMAPCOREHEADER 12 /**< + 12 */ +#define U_SIZE_BITMAPINFOHEADER 40 /**< + 40 */ +#define U_SIZE_BITMAPV4HEADER 108 /**< ? 108 not tested */ +#define U_SIZE_BITMAPV5HEADER 124 /**< ? 124 not tested */ +#define U_SIZE_WLOGBRUSH 8 /**< + 8 */ +#define U_SIZE_POLYPOLYGON 4 /**< + 4 */ +#define U_SIZE_SCAN 8 /**< + 8 */ +#define U_SIZE_METARECORD 6 /**< X 8 */ +#define U_SIZE_WMRPLACEABLE 22 /**< X 24 */ +#define U_SIZE_WMRHEADER 18 /**< X 20 */ +#define U_SIZE_WMREOF 6 /**< X 8 */ +#define U_SIZE_WMRSETRELABS 6 /**< X 8 */ +#define U_SIZE_WMRSAVEDC 6 /**< X 8 */ +#define U_SIZE_WMRRESTOREDC 8 /**< * 8 */ +#define U_SIZE_WMRREALIZEPALETTE 6 /**< X 8 */ +#define U_SIZE_WMRSETBKCOLOR 10 /**< X 12 */ +#define U_SIZE_WMRSETTEXTCOLOR 10 /**< X 12 */ +#define U_SIZE_WMRSETBKMODE 8 /**< X 12 last 2 bytes are optional */ +#define U_SIZE_WMRSETROP2 8 /**< X 12 last 2 bytes are optional */ +#define U_SIZE_WMRSETPOLYFILLMODE 8 /**< X 12 last 2 bytes are optional */ +#define U_SIZE_WMRSETSTRETCHBLTMODE 8 /**< X 12 last 2 bytes are optional */ +#define U_SIZE_WMRSETTEXTALIGN 8 /**< X 12 last 2 bytes are optional */ +#define U_SIZE_WMRSETMAPMODE 8 /**< + 8 */ +#define U_SIZE_WMRSETTEXTCHAREXTRA 8 /**< + 8 */ +#define U_SIZE_WMRSETTEXTJUSTIFICATION 10 /**< X 12 */ +#define U_SIZE_WMRSETWINDOWORG 10 /**< X 12 */ +#define U_SIZE_WMRSETWINDOWEXT 10 /**< X 12 */ +#define U_SIZE_WMRSETVIEWPORTORG 10 /**< X 12 */ +#define U_SIZE_WMRSETVIEWPORTEXT 10 /**< X 12 */ +#define U_SIZE_WMROFFSETWINDOWORG 10 /**< X 12 */ +#define U_SIZE_WMROFFSETVIEWPORTORG 10 /**< X 12 */ +#define U_SIZE_WMRLINETO 10 /**< X 12 */ +#define U_SIZE_WMRMOVETO 10 /**< X 12 */ +#define U_SIZE_WMROFFSETCLIPRGN 10 /**< X 12 */ +#define U_SIZE_WMRSCALEWINDOWEXT 14 /**< X 16 */ +#define U_SIZE_WMRSCALEVIEWPORTEXT 14 /**< X 16 */ +#define U_SIZE_WMREXCLUDECLIPRECT 14 /**< X 16 */ +#define U_SIZE_WMRINTERSECTCLIPRECT 14 /**< X 16 */ +#define U_SIZE_WMRARC 22 /**< X 24 */ +#define U_SIZE_WMRELLIPSE 14 /**< X 16 */ +#define U_SIZE_WMRRECTANGLE 14 /**< X 16 */ +#define U_SIZE_WMRFLOODFILL 16 /**< + 16 */ +#define U_SIZE_WMREXTFLOODFILL 16 /**< + 16 */ +#define U_SIZE_WMRSETPIXEL 14 /**< X 16 */ +#define U_SIZE_WMRPIE 22 /**< X 24 */ +#define U_SIZE_WMRCHORD 22 /**< X 24 */ +#define U_SIZE_WMRROUNDRECT 18 /**< X 20 */ +#define U_SIZE_WMRPATBLT 18 /**< X 20 */ +#define U_SIZE_WMRTEXTOUT 8 /**< X 12 (not including String,y,x) */ +#define U_SIZE_WMRBITBLT_NOPX 24 /**< + 24 */ +#define U_SIZE_WMRBITBLT_PX 22 /**< X 32 */ +#define U_SIZE_WMRSTRETCHBLT_NOPX 28 /**< + 28 */ +#define U_SIZE_WMRSTRETCHBLT_PX 26 /**< X 36 */ +#define U_SIZE_WMRPOLYGON 10 /**< X 12 */ +#define U_SIZE_WMRPOLYLINE 10 /**< X 12 */ +#define U_SIZE_WMRESCAPE 10 /**< X 12 Data field could be completely absent */ +#define U_SIZE_WMRFILLREGION 10 /**< X 12 */ +#define U_SIZE_WMRFRAMEREGION 14 /**< X 16 */ +#define U_SIZE_WMRINVERTREGION 8 /**< + 8 */ +#define U_SIZE_WMRPAINTREGION 8 /**< + 8 */ +#define U_SIZE_WMRSELECTCLIPREGION 8 /**< + 8 */ +#define U_SIZE_WMRSELECTOBJECT 8 /**< + 8 */ +#define U_SIZE_WMRSELECTPALETTE 8 /**< + 8 */ +#define U_SIZE_WMRRESIZEPALETTE 8 /**< + 8 */ +#define U_SIZE_WMRDELETEOBJECT 8 /**< + 8 */ +#define U_SIZE_WMRDRAWTEXT 6 /**< X 8 */ +#define U_SIZE_WMRCREATEBITMAPINDIRECT 6 /**< X 8 */ +#define U_SIZE_WMRCREATEBITMAP 6 /**< X 8 */ +#define U_SIZE_WMRSETMAPPERFLAGS 10 /**< X 12 */ +#define U_SIZE_WMREXTTEXTOUT 14 /**< X 16 */ +#define U_SIZE_WMRSETDIBTODEV 22 /**< X 28 */ +#define U_SIZE_WMRANIMATEPALETTE 14 /**< X 16 */ +#define U_SIZE_WMRSETPALENTRIES 14 /**< X 16 */ +#define U_SIZE_WMRCREATEPALETTE 14 /**< X 16 */ +#define U_SIZE_WMRPOLYPOLYGON 10 /**< X 12 */ +#define U_SIZE_WMRDIBBITBLT_NOPX 24 /**< + 24 */ +#define U_SIZE_WMRDIBBITBLT_PX 22 /**< X 24 */ +#define U_SIZE_WMRDIBSTRETCHBLT_NOPX 28 /**< + 28 */ +#define U_SIZE_WMRDIBSTRETCHBLT_PX 26 /**< X 28 */ +#define U_SIZE_WMRDIBCREATEPATTERNBRUSH 10 /**< X 12 */ +#define U_SIZE_WMRSTRETCHDIB 28 /**< X 32 */ +#define U_SIZE_WMRCREATEPATTERNBRUSH 6 /**< X 8 */ +#define U_SIZE_WMRCREATEPENINDIRECT 16 /**< + 16 */ +#define U_SIZE_WMRCREATEFONTINDIRECT 26 /**< X 28 */ +#define U_SIZE_WMRCREATEBRUSHINDIRECT 14 /**< X 16 */ +#define U_SIZE_WMRCREATEREGION 26 /**< X 28 */ /** @} */ // *************************************************************************** // Macros -/** \defgroup Common_macros Common Macros +/** \defgroup U_WMF_Common_macros WMF Common Macros +Because Size16_4 may not be aligned no tests should dereference it directly from a pointer. +in NOPX tests cast causes uint8_t to promote to uint32_t, without it c++ compiler complains about +comparison of int with unsigned int @{ */ -/* Because Size16_4 may not be aligned no tests should dereference it directly from a pointer. -in NOPX tests cast causes uint8_t to promote to uint32_t, without it c++ compiler complains about -comparison of int with unsigned int */ -#define U_TEST_NOPX2(A,B) (A == (uint32_t) (B + 3)) /* A is Size16_4 (extracted and aligned), B = xb true if no bitmap associated with the structure, used with some BLT records*/ -#define U_TEST_NOPXB(A,B) (A/2 == (uint32_t) (B + 3)) /* A is Size16_4(extracted and aligned)*2, B - xb, true if no bitmap associated with the structure, used with some BLT records*/ -#define U_WMRTYPE(A) (((PU_METARECORD)A)->iType) //!< Get iType from U_WMR* record -#define U_WMRXB(A) (((PU_METARECORD)A)->xb) //!< Get xb from U_WMR* record -#define U_WMR_XB_FROM_TYPE(A) ((uint8_t) (U_wmr_values(A)>>8)) //!< Get xb from type value -#define U_U16(A) (*(uint16_t *)&A) /* interpret a 16 bit type as uint16_t */ -#define U_P16(A) ( (uint16_t *)&A) /* pass any 16 bit type as a pointer to a uint16_t */ -#define U_PP16(A) ( (uint16_t *) A) /* pass any pointer to a 16 bit type as a pointer to a uint16_t */ +#define U_TEST_NOPX2(A,B) (A == (uint32_t) (B + 3)) //!< A is Size16_4 (extracted and aligned), B = xb true if no bitmap associated with the structure, used with some BLT records. +#define U_TEST_NOPXB(A,B) (A/2 == (uint32_t) (B + 3)) //!< A is Size16_4 (extracted and aligned)*2, B = xb, true if no bitmap associated with the structure, used with some BLT records. +#define U_WMRTYPE(A) (((U_METARECORD *)A)->iType) //!< Get iType from U_WMR* record. +#define U_WMRXB(A) (((U_METARECORD *)A)->xb) //!< Get xb from U_WMR* record. +#define U_WMR_XB_FROM_TYPE(A) ((uint8_t) (U_wmr_values(A)>>8)) //!< Get xb from type value. +#define U_U16(A) (*(uint16_t *)&A) //!< interpret a 16 bit type as uint16_t. +#define U_P16(A) ( (uint16_t *)&A) //!< pass any 16 bit type as a pointer to a uint16_t. +#define U_PP16(A) ( (uint16_t *) A) //!< pass any pointer to a 16 bit type as a pointer to a uint16_t. /** @} */ @@ -732,28 +748,27 @@ comparison of int with unsigned int */ WMF structures OTHER than those corresponding to complete U_WMR_* records ************************************************************ */ -/** Brush Object WMF PDF 2.2.1.1 +/** Brush Object WMF manual 2.2.1.1 Documentation is muddy, bColor and bHatch fields have different meanings depending on the value of bStyle. Unclear if bHatch bytes are present in some cases from the documentation. - style Color Data - U_BS_SOLID ColorRef Object Not used (bytes present???) - U_BS_NULL ignored ignored (bytes present???). - U_BS_PATTERN ignored Bitmap16 object holding patern - U_BS_DIBPATTERNPT ColorUsage Enum DIB object - U_BS_HATCHED ColorRef Object HatchStyle Enumeration + style Color Data + U_BS_SOLID ColorRef Object Not used (bytes present???) + U_BS_NULL ignored ignored (bytes present???). + U_BS_PATTERN ignored Bitmap16 object holding patern + U_BS_DIBPATTERNPT ColorUsage Enum DIB object + U_BS_HATCHED ColorRef Object HatchStyle Enumeration */ - typedef struct { - uint16_t Style; //!< BrushStyle enumeration + uint16_t Style; //!< BrushStyle Enumeration U_COLORREF Color; //!< Brush Color value, 32 bit value is not aligned. uint8_t Data[1]; //!< Brush pattern information, variable size and format -} U_BRUSH, *PU_BRUSH; +} U_BRUSH; -/** Font Object WMF PDF 2.2.1.2 +/** Font Object WMF manual 2.2.1.2 Warning, only pass by pointer, passing by value will will truncate in Facename! */ typedef struct { @@ -771,9 +786,9 @@ typedef struct { uint8_t Quality; //!< LF_Quality Enumeration uint8_t PitchAndFamily; //!< LF_PitchAndFamily Enumeration uint8_t FaceName[1]; //!< Name of font. ANSI Latin1, null terminated. -} U_FONT, *PU_FONT; +} U_FONT; -/** PaletteEntry Object WMF PDF 2.2.2.13 +/** PaletteEntry Object WMF manual 2.2.2.13 Note, NOT compatiable with U_LOGPLTNTRY Out of PDF order because needed for next struture. */ @@ -782,10 +797,10 @@ typedef struct { uint8_t Blue; //!< Palette entry Blue Intensity uint8_t Green; //!< Palette entry Green Intensity uint8_t Red; //!< Palette entry Red Intensity -} U_PLTNTRY, *PU_PLTNTRY; +} U_PLTNTRY; -/** Palette Object WMF PDF 2.2.1.3 - NOT same as "LogPalette Object" in uemf.h because Palette Entries have reversed colors. +/** Palette Object WMF manual 2.2.1.3 + NOT Same as "EMF LogPalette Object" in uemf.h because Palette Entries have reversed colors. Values for palVersion are expanded Start must be 0x0300 (as for EMF) with U_WMRCREATEPALETTE but is an offset @@ -795,17 +810,17 @@ typedef struct { uint16_t Start; //!< Either 0x0300 or an offset into the Palette table uint16_t NumEntries; //!< Number of U_LOGPLTNTRY objects U_PLTNTRY PalEntries[1]; //!< Array of PaletteEntry Objects -} U_PALETTE, *PU_PALETTE; +} U_PALETTE; -/** Pen Object WMF PDF 2.2.1.4 +/** Pen Object WMF manual 2.2.1.4 */ typedef struct { uint16_t Style; //!< PenStyle Enumeration uint16_t Widthw[2]; //!< reassemble/store the Pen Width in object dimensions using Widthw, the 32 bit value is not aligned U_COLORREF Color; //!< Pen Color, the 32 bit value is not aligned. -} U_PEN, *PU_PEN; +} U_PEN; -/** Rect Object WMF PDF 2.2.2.18 +/** Rect Object WMF manual 2.2.2.18 \brief Coordinates of the upper left, lower right corner. Note that the coordinate system is 0,0 in the upper left corner of the screen an N,M in the lower right corner. @@ -818,11 +833,11 @@ typedef struct { int16_t top; //!< top coordinate int16_t right; //!< right coordinate int16_t bottom; //!< bottom coordinate -} U_RECT16, *PU_RECT16; +} U_RECT16; #define U_RCL16_DEF (U_RECT16){0,0,-1,-1} //!< Use this when no bounds are needed. -/** Region Object WMF PDF 2.2.1.5 +/** Region Object WMF manual 2.2.1.5 */ typedef struct { uint16_t ignore1; //!< unused value @@ -833,13 +848,13 @@ typedef struct { int16_t sMax; //!< largest number of points in any scan U_RECT16 sRect; //!< bounding rectangle uint16_t aScans[1]; //!< series of appended U_SCAN objects -} U_REGION, *PU_REGION; +} U_REGION; -/** Bitmap16 Object WMF PDF 2.2.2.1 +/** Bitmap16 Object WMF manual 2.2.2.1 - The U_BITMAP16 core is always followed by - uint8_t Bits[1]; //!< bitmap pixel data. Bytes contained = (((Width * BitsPixel + 15) >> 4) << 1) * Height - Note that in U_WMRCREATEPATTERNBRUSH Bits is always [4]. + The U_BITMAP16 core is always followed by + uint8_t Bits[1]; //!< bitmap pixel data. Bytes contained = (((Width * BitsPixel + 15) >> 4) << 1) * Height + Note that in U_WMRCREATEPATTERNBRUSH Bits is always [4]. */ typedef struct { @@ -849,9 +864,9 @@ typedef struct { int16_t WidthBytes; //!< bytes per scan line. uint8_t Planes; //!< must be 1. uint8_t BitsPixel; //!< number of adjacent color bits on each plane (R bits + G bits + B bits ????) -} U_BITMAP16, *PU_BITMAP16; +} U_BITMAP16; -/** BitmapCoreHeader Object WMF PDF 2.2.2.2 +/** BitmapCoreHeader Object WMF manual 2.2.2.2 */ typedef struct { uint16_t Size_4[2]; //!< size of U_BITMAPCOREHEADER in bytes. @@ -859,15 +874,16 @@ typedef struct { uint16_t Height; //!< DIB height in pixels. uint16_t Planes; //!< must be 1 uint16_t BitCount; //!< Pixel Format (BitCount Enumeration) -} U_BITMAPCOREHEADER, *PU_BITMAPCOREHEADER; +} U_BITMAPCOREHEADER; -/** BitmapInfoHeader Object WMF PDF 2.2.2.3 - same as "BITMAPINFOHEADER Object" in uemf.h +/** BitmapInfoHeader Object WMF manual 2.2.2.3 + Same as "EMF BITMAPINFOHEADER Object" in uemf.h use U_BITMAPINFOHEADER */ -/** BitmapV4Header Object WMF PDF 2.2.2.4 +//! \cond +/** BitmapV4Header Object WMF manual 2.2.2.4 */ typedef struct { uint32_t bV4Size; @@ -890,10 +906,10 @@ typedef struct { uint32_t bV4GammaRed; uint32_t bV4GammaGreen; uint32_t bV4GammaBlue; -} U_BITMAPV4HEADER, *PU_BITMAPV4HEADER; //!< For ? +} U_BITMAPV4HEADER; //!< For ? -/** BitmapV5Header Object WMF PDF 2.2.2.5 +/** BitmapV5Header Object WMF manual 2.2.2.5 */ typedef struct { uint32_t bV5Size; @@ -920,129 +936,138 @@ typedef struct { uint32_t bV5ProfileData; uint32_t bV5ProfileSize; uint32_t bV5Reserved; -} U_BITMAPV5HEADER, *PU_BITMAPV5HEADER; //!< For ? +} U_BITMAPV5HEADER; //!< For ? +//! \endcond -/** CIEXYZ Object WMF PDF 2.2.2.6 - Same as "CIEXYZ Object" in uemf.h +/** CIEXYZ Object WMF manual 2.2.2.6 + Same as "EMF CIEXYZ Object" in uemf.h */ -/** CIEXYZTriple Object WMF PDF 2.2.2.7 - Same as "CIEXYZTRIPLE Object" in uemf.h +/** CIEXYZTriple Object WMF manual 2.2.2.7 + Same as "EMF CIEXYZTRIPLE Object" in uemf.h */ -/** ColorRef Object WMF PDF 2.2.2.8 - Same as "COLORREF Object" in uemf.h +/** ColorRef Object WMF manual 2.2.2.8 + Same as "EMF COLORREF Object" in uemf.h */ -/** DeviceIndependentBitmap Object WMF PDF 2.2.2.9 +/** DeviceIndependentBitmap Object WMF manual 2.2.2.9 This "object" has an organization, but not one that can be easily expressed with a C struct. It consists of three parts, all of which have variable size: - DIBHeaderInfo BitmapCoreHeader or BitmapInfoHeader Object - Colors Array of RGBQuad Objects or uint16_t that make a color table, as determined from the DIBHeaderInfo field. - BitMapBuffer Array of bytes containing the image. + DIBHeaderInfo BitmapCoreHeader or BitmapInfoHeader Object + Colors Array of RGBQuad Objects or uint16_t that make a color table, as determined from the DIBHeaderInfo field. + BitMapBuffer Array of bytes containing the image. */ -/** WLogBrush Object WMF PDF 2.2.2.10 +/** WLogBrush Object WMF manual 2.2.2.10 Not compatible with EMF LogBrush object! - style Color Hatch - U_BS_SOLID ColorRef Object Not used (bytes present???) - U_BS_NULL ignored ignored (bytes present???). - U_BS_PATTERN ignored not used (Action is not strictly defined) - U_BS_DIBPATTERN ignored not used (Action is not strictly defined) - U_BS_DIBPATTERNPT ignored not used (Action is not strictly defined) - U_BS_HATCHED ColorRef Object HatchStyle Enumeration + style Color Hatch + U_BS_SOLID ColorRef Object Not used (bytes present???) + U_BS_NULL ignored ignored (bytes present???). + U_BS_PATTERN ignored not used (Action is not strictly defined) + U_BS_DIBPATTERN ignored not used (Action is not strictly defined) + U_BS_DIBPATTERNPT ignored not used (Action is not strictly defined) + U_BS_HATCHED ColorRef Object HatchStyle Enumeration */ typedef struct { uint16_t Style; //!< BrushStyle Enumeration U_COLORREF Color; //!< Brush Color value, 32 bit value is not aligned. uint16_t Hatch; //!< HatchStyle Enumeration -} U_WLOGBRUSH, *PU_WLOGBRUSH; +} U_WLOGBRUSH; -/** LogColorSpace Object WMF PDF 2.2.2.11 - Same as "LOGCOLORSPACEA Object" in uemf.h +/* LogColorSpace Object WMF manual 2.2.2.11 + Same as "EMF LOGCOLORSPACEA Object" in uemf.h use U_LOGCOLORSPACEA */ -/** LogColorSpaceW Object WMF PDF 2.2.2.12 - Same as "LOGCOLORSPACEW Object" in uemf.h +/* LogColorSpaceW Object WMF manual 2.2.2.12 + Same as "EMF LOGCOLORSPACEW Object" in uemf.h use U_LOGCOLORSPACEW */ -/** PaletteEntry Object WMF PDF 2.2.2.13 +/* PaletteEntry Object WMF manual 2.2.2.13 moved up before Palette Object */ -/** PitchAndFamily Enumerations WMF PDF 2.2.2.14 - Same as "LF_PitchAndFamily Enumeration" in uemf.h +/* PitchAndFamily Enumerations WMF manual 2.2.2.14 + Same as "EMF LF_PitchAndFamily Enumeration" in uemf.h */ -/** PointL Object WMF PDF 2.2.2.15 - Same as "Point Object" in uemf.h +/* PointL Object WMF manual 2.2.2.15 + Same as "EMF Point Object" in uemf.h */ -/** PointS Object WMF PDF 2.2.2.16 - Same as "POINTS Object" in uemf.h +/* PointS Object WMF manual 2.2.2.16 + Same as "EMF POINTS Object" in uemf.h */ -/** PolyPolygon Object WMF PDF 2.2.2.17 +/* PolyPolygon Object WMF manual 2.2.2.17 */ +/** WMF manual 2.2.2.17 + There is an array "aPoints" of uint16_t after aPolyCounts that holds the coordinates. + Presumably it is in order [x1,y1],[x2,y2],etc. The documentation does not say, it might have y then x. + aPoints starts at aPolyCounts[nPolys] */ typedef struct { uint16_t nPolys; //!< Number of polygons uint16_t aPolyCounts[1]; //!< Number of points in each polygon (sequential) -} U_POLYPOLYGON, *PU_POLYPOLYGON; +} U_POLYPOLYGON; -/** Rect Object WMF PDF 2.2.2.18 +/* Rect Object WMF manual 2.2.2.18 This one is out of order, had to be created much earlier than this */ -/** RectL Object WMF PDF 2.2.2.19 - Same as "RECT Object" in uemf.h +/* RectL Object WMF manual 2.2.2.19 + Same as "EMF RECT Object" in uemf.h */ -/** RGBQuad Object WMF PDF 2.2.2.20 - Same as "RGBQUAD Object" in uemf.h +/* RGBQuad Object WMF manual 2.2.2.20 + Same as "EMF RGBQUAD Object" in uemf.h */ -/** Scan Object WMF PDF 2.2.2.21 - Field "count2" must follow ScanLines, but it cannot be placed into the struct. It is - an uint16_t value which must be the same as count. +/** Scan Object WMF manual 2.2.2.21 */ +/** WMF manual 2.2.2.21 + + Mandatory field "count2" must follow ScanLines, but it cannot be placed into the struct because + ScanLines has variable size. "count2" is + an uint16_t value which must have the same value as count. */ typedef struct { uint16_t count; //!< Number of entries in the ScanLines array uint16_t top; //!< Y coordinate of the top scanline uint16_t bottom; //!< Y coordinate of the bottom scanline uint16_t ScanLines[1]; //!< Array of 16 bit left/right pairs -} U_SCAN, *PU_SCAN; +} U_SCAN; -/** SizeL Object WMF PDF 2.2.2.22 - Same as "SIZEL Object" in uemf.h +/** SizeL Object WMF manual 2.2.2.22 + Same as "EMF SIZEL Object" in uemf.h */ /** First three fields of MOST WMF records (not WMR_HEADER and WMR_PLACEABLE!) - Should only used for accessing size and type fields. - NOT used as a prefix like U_EMR in uemf.h because it may cause alignment issues. + + This Sshould only used for accessing size and type fields. + It is NOT used as a prefix like U_EMR in uemf.h because it may cause alignment issues. Microsoft name: WMF Object */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type -} U_METARECORD, *PU_METARECORD; +} U_METARECORD; -/** WMF PDF 2.3.2.3 META_PLACEABLE - If present this must immediately precede the header. - It is not enumerated as an WMR record type. - This only ever occurs at the start of a WMF file, so the two uint32_t values will always be aligned. +/** WMF manual 2.3.2.3 META_PLACEABLE + If present this must immediately precede the header. + It is not enumerated as an WMR record type. + This only ever occurs at the start of a WMF file, so the two uint32_t values will always be aligned. */ typedef struct { uint32_t Key; //!< MUST be 0x9AC6CDD7 @@ -1051,146 +1076,172 @@ typedef struct { uint16_t Inch; //!< Logical units/inch (convention if not specified: 1440 logical units/inch) uint32_t Reserved; //!< must be 0 uint16_t Checksum; //!< Checksum of preceding 10 16 bit values -} U_WMRPLACEABLE, *PU_WMRPLACEABLE; +} U_WMRPLACEABLE; -/** WMF PDF 2.3.2.2 META_HEADER +/** WMF manual 2.3.2.2 META_HEADER */ typedef struct { - uint8_t iType; //!< RecordType enumeration, must be 1 + uint8_t iType; //!< RecordType Enumeration, must be 1 uint8_t xb; //!< Extra high order byte associated with record type uint16_t Size16w; //!< Total number of 16bit words in record - uint16_t version; //!< Metafile version enumeration + uint16_t version; //!< Metafile version Enumeration uint16_t Sizew[2]; //!< reassemble/store the Size (16 bit words in entire file) using Sizew, the 32 bit value is not aligned uint16_t nObjects; //!< Total number of brushes, pens, and other graphics objects defined in this file uint32_t maxSize; //!< Largest record in file, in number of 16bit words (This uint32_t is aligned) uint16_t nMembers; //!< Unused, should be 0 -} U_WMRHEADER, *PU_WMRHEADER; +} U_WMRHEADER; // *********************************************************************************** // The following structures correspond to U_WMR_# records -/* Index 00 U_WMREOF WMF PDF 2.3.2.1 META_EOF */ +/* Index 00 U_WMREOF WMF manual 2.3.2.1 META_EOF */ +/** WMF manual 2.3.2.1 META_EOF +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type -} U_WMREOF, *PU_WMREOF, - U_WMRSETRELABS, *PU_WMRSETRELABS, - U_WMRSAVEDC, *PU_WMRSAVEDC, - U_WMRREALIZEPALETTE, *PU_WMRREALIZEPALETTE; +} U_WMREOF, + U_WMRSETRELABS, //!< WMF manual 2.3.5.21 + U_WMRSAVEDC, //!< WMF manual 2.3.5.11 + U_WMRREALIZEPALETTE; //!< WMF manual 2.3.5.8 -/* Index 01 U_WMRSETBKCOLOR WMF PDF 2.3.5.14 */ +/* Index 01 U_WMRSETBKCOLOR WMF manual 2.3.5.14 */ +/** WMF manual 2.3.5.14 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_COLORREF Color; //!< Color value, the 32 bit value is not aligned. -} U_WMRSETBKCOLOR, *PU_WMRSETBKCOLOR, - U_WMRSETTEXTCOLOR, *PU_WMRSETTEXTCOLOR; +} U_WMRSETBKCOLOR, + U_WMRSETTEXTCOLOR; //!< WMF manual 2.3.5.26 -/* Index 02 U_WMRSETBKMODE WMF PDF 2.3.5.15 */ +/* Index 02 U_WMRSETBKMODE WMF manual 2.3.5.15 */ +/** WMF manual 2.3.5.15 +mode = MixMode Enumeration. +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t Mode; //!< Various Enumeraton. uint16_t Reserved; //!< Ignore (ALSO OPTIONAL - FIELD MAY NOT BE PRESENT!!!!) -} U_WMRSETBKMODE, *PU_WMRSETBKMODE, //!< MixMode Enumeration. - U_WMRSETROP2, *PU_WMRSETROP2, //!< Binary Raster Operation Enumeration. - U_WMRSETPOLYFILLMODE, *PU_WMRSETPOLYFILLMODE, //!< PolyFillMode Enumeration. - U_WMRSETSTRETCHBLTMODE, *PU_WMRSETSTRETCHBLTMODE, //!< StretchMode Enumeration - U_WMRSETTEXTALIGN, *PU_WMRSETTEXTALIGN; //!< TextAlignment Enumeration. +} U_WMRSETBKMODE, + U_WMRSETPOLYFILLMODE, //!< WMF manual 2.3.5.20 Mode = PolyFillMode Enumeration. + U_WMRSETROP2, //!< WMF manual 2.3.5.22 Binary Raster Operation Enumeration. + U_WMRSETSTRETCHBLTMODE, //!< WMF manual 2.3.5.23 Mode = StretchMode Enumeration + U_WMRSETTEXTALIGN; //!< WMF manual 2.3.5.24 Mode = TextAlignment Enumeration. -/* Index 03 U_WMRSETMAPMODE WMF PDF 2.3.5.17 */ +/* Index 03 U_WMRSETMAPMODE WMF manual 2.3.5.17 */ +/** WMF manual 2.3.5.17 +Mode = MapMode Enumeration. +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t Mode; //!< Various Enumeraton and other -} U_WMRSETMAPMODE, *PU_WMRSETMAPMODE, //!< MapMode Enumeration. - U_WMRSETTEXTCHAREXTRA, *PU_WMRSETTEXTCHAREXTRA; //!< Extra space in logical units to add to each character +} U_WMRSETMAPMODE, + U_WMRSETTEXTCHAREXTRA; //!< WMF manual 2.3.5.25, Mode = Extra space in logical units to add to each character -/* Index 04 U_WMRSETROP2 WMF PDF 2.3.5.22 See Index 02 */ +/* Index 04 U_WMRSETROP2 WMF manual 2.3.5.22 See Index 02 */ -/* Index 05 U_WMRSETRELABS WMF PDF 2.3.5.21 See Index 00*/ +/* Index 05 U_WMRSETRELABS WMF manual 2.3.5.21 See Index 00*/ -/* Index 06 U_WMRSETPOLYFILLMODE WMF PDF 2.3.5.20 See Index 02 - Index 07 U_WMRSETSTRETCHBLTMODE WMF PDF 2.3.5.23 */ +/* Index 06 U_WMRSETPOLYFILLMODE WMF manual 2.3.5.20 See Index 02 + Index 07 U_WMRSETSTRETCHBLTMODE WMF manual 2.3.5.23 */ -/* Index 08 U_WMRSETTEXTCHAREXTRA WMF PDF 2.3.5.25 See Index 03*/ +/* Index 08 U_WMRSETTEXTCHAREXTRA WMF manual 2.3.5.25 See Index 03*/ -/* Index 09 U_WMRSETTEXTCOLOR WMF PDF 2.3.5.26 see Index 01 */ +/* Index 09 U_WMRSETTEXTCOLOR WMF manual 2.3.5.26 see Index 01 */ -/* Index 0A U_WMRSETTEXTJUSTIFICATION WMF PDF 2.3.5.27 */ +/* Index 0A U_WMRSETTEXTJUSTIFICATION WMF manual 2.3.5.27 */ +/** WMF manual 2.3.5.27 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t Count; //!< Number of space characters in the line uint16_t Extra; //!< Number of extra space characters to add to the line -} U_WMRSETTEXTJUSTIFICATION, *PU_WMRSETTEXTJUSTIFICATION; +} U_WMRSETTEXTJUSTIFICATION; -/* Index 0B U_WMRSETWINDOWORG WMF PDF 2.3.5.31 - Index 0C U_WMRSETWINDOWEXT WMF PDF 2.3.5.30 - Index 0D U_WMRSETVIEWPORTORG WMF PDF 2.3.5.29 - Index 0E U_WMRSETVIEWPORTEXT WMF PDF 2.3.5.28 - Index 0F U_WMROFFSETWINDOWORG WMF PDF 2.3.5.7 - Index 13 U_WMRLINETO WMF PDF 2.3.3.10 - Index 14 U_WMRMOVETO WMF PDF 2.3.3.4 +/* Index 0B U_WMRSETWINDOWORG WMF manual 2.3.5.31 + Index 0C U_WMRSETWINDOWEXT WMF manual 2.3.5.30 + Index 0D U_WMRSETVIEWPORTORG WMF manual 2.3.5.29 + Index 0E U_WMRSETVIEWPORTEXT WMF manual 2.3.5.28 + Index 0F U_WMROFFSETWINDOWORG WMF manual 2.3.5.7 + Index 0F U_WMROFFSETVIEWPORTORG WMF manual 2.3.5.6 + Index 13 U_WMRLINETO WMF manual 2.3.3.10 + Index 14 U_WMRMOVETO WMF manual 2.3.3.4 + Index 20 U_WMROFFSETCLIPRGN WMF manual 2.3.5.5 +*/ +/** WMF manual 2.3.5.31 +Window X,Y origin */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t y; //!< Y value (note order!) int16_t x; //!< X value -} U_WMRSETWINDOWORG, *PU_WMRSETWINDOWORG, //!< Window X,Y origin - U_WMRSETWINDOWEXT, *PU_WMRSETWINDOWEXT, //!< Window X,Y extent - U_WMRSETVIEWPORTORG, *PU_WMRSETVIEWPORTORG, //!< Viewport X,Y origin - U_WMRSETVIEWPORTEXT, *PU_WMRSETVIEWPORTEXT, //!< Viewport X,Y extent - U_WMROFFSETWINDOWORG, *PU_WMROFFSETWINDOWORG, //!< Window X,Y offset in device units - U_WMROFFSETVIEWPORTORG, *PU_WMROFFSETVIEWPORTORG, //!< Viewport X,Y offset in device units - U_WMRLINETO, *PU_WMRLINETO, //!< Endpoint X,Y in logical units - U_WMRMOVETO, *PU_WMRMOVETO, //!< Destination X,Y in logical units - U_WMROFFSETCLIPRGN, *PU_WMROFFSETCLIPRGN; //!< ClipRegion X,Y offset in logical units - -/* Index 10 U_WMRSCALEWINDOWEXT WMF PDF 2.3.5.13 */ +} U_WMRSETWINDOWORG, + U_WMRSETWINDOWEXT, //!< WMF manual 2.3.5.30, Window X,Y extent + U_WMRSETVIEWPORTORG, //!< WMF manual 2.3.5.29, Viewport X,Y origin + U_WMRSETVIEWPORTEXT, //!< WMF manual 2.3.5.28, Viewport X,Y extent + U_WMROFFSETWINDOWORG, //!< WMF manual 2.3.5.7, Window X,Y offset in device units + U_WMROFFSETVIEWPORTORG, //!< WMF manual 2.3.5.6, Viewport X,Y offset in device units + U_WMRLINETO, //!< WMF manual 2.3.3.10, Endpoint X,Y in logical units + U_WMRMOVETO, //!< WMF manual 2.3.3.4, Destination X,Y in logical units + U_WMROFFSETCLIPRGN; //!< WMF manual 2.3.5.5, Y offset in logical units + +/* Index 10 U_WMRSCALEWINDOWEXT WMF manual 2.3.5.13 + Index 12 U_WMRSCALEVIEWPORTEXT WMF manual 2.3.5.12 +*/ +/** WMF manual 2.3.5.13 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t yDenom; //!< Y denominator int16_t yNum; //!< Y numerator int16_t xDenom; //!< X denominator int16_t xNum; //!< X numerator -} U_WMRSCALEWINDOWEXT, *PU_WMRSCALEWINDOWEXT, - U_WMRSCALEVIEWPORTEXT, *PU_WMRSCALEVIEWPORTEXT; +} U_WMRSCALEWINDOWEXT, + U_WMRSCALEVIEWPORTEXT; //!< WMF manual 2.3.5.12 -/* Index 11 U_WMROFFSETVIEWPORTORG WMF PDF 2.3.5.6 see Index 0B */ +/* Index 11 U_WMROFFSETVIEWPORTORG WMF manual 2.3.5.6 see Index 0B */ -/* Index 12 U_WMRSCALEVIEWPORTEXT WMF PDF 2.3.5.12 see Index 10 */ +/* Index 12 U_WMRSCALEVIEWPORTEXT WMF manual 2.3.5.12 see Index 10 */ -/* Index 13 U_WMRLINETO WMF PDF 2.3.3.10 see index 0B - Index 14 U_WMRMOVETO WMF PDF 2.3.5.4 */ +/* Index 13 U_WMRLINETO WMF manual 2.3.3.10 see index 0B + Index 14 U_WMRMOVETO WMF manual 2.3.5.4 */ -/* Index 15 U_WMREXCLUDECLIPRECT WMF PDF 2.3.5.2 - Index 16 U_WMRINTERSECTCLIPRECT WMF PDF 2.3.5.3 */ +/* Index 15 U_WMREXCLUDECLIPRECT WMF manual 2.3.5.2 + Index 16 U_WMRINTERSECTCLIPRECT WMF manual 2.3.5.3 +*/ +/** WMF manual 2.3.5.2 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t Bottom; //!< Coordinates in logical units int16_t Right; //!< Coordinates in logical units int16_t Top; //!< Coordinates in logical units int16_t Left; //!< Coordinates in logical units -} U_WMREXCLUDECLIPRECT, *PU_WMREXCLUDECLIPRECT, - U_WMRINTERSECTCLIPRECT, *PU_WMRINTERSECTCLIPRECT; +} U_WMREXCLUDECLIPRECT, + U_WMRINTERSECTCLIPRECT; //!< WMF manual 2.3.5.3 -/* Index 17 U_WMRARC WMF PDF 2.3.3.1 */ +/* Index 17 U_WMRARC WMF manual 2.3.3.1 */ +/** WMF manual 2.3.3.1 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t yEndArc; //!< Coordinates in logical units int16_t xEndArc; //!< Coordinates in logical units @@ -1200,36 +1251,48 @@ typedef struct { int16_t Right; //!< Coordinates in logical units int16_t Top; //!< Coordinates in logical units int16_t Left; //!< Coordinates in logical units -} U_WMRARC, *PU_WMRARC; +} U_WMRARC; -/* Index 18 U_WMRELLIPSE WMF PDF 2.3.3.3 */ +/* Index 18 U_WMRELLIPSE WMF manual 2.3.3.3 + Index 1B U_WMRRECTANGLE WMF manual 2.3.3.17 +*/ +/** WMF manual 2.3.3.3 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t Bottom; //!< Coordinates in logical units int16_t Right; //!< Coordinates in logical units int16_t Top; //!< Coordinates in logical units int16_t Left; //!< Coordinates in logical units -} U_WMRELLIPSE, *PU_WMRELLIPSE, - U_WMRRECTANGLE, *PU_WMRRECTANGLE; +} U_WMRELLIPSE, + U_WMRRECTANGLE; //!< WMF manual 2.3.3.17 -/* Index 19 U_WMRFLOODFILL WMF PDF 2.3.3.7 */ +/* Index 19 U_WMRFLOODFILL WMF manual 2.3.3.7 + Index 48 U_WMREXTFLOODFILL WMF manual 2.3.3.4 +*/ +/** WMF manual 2.3.3.7 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t Mode; //!< FloodFill Enumeration U_COLORREF Color; //!< Color int16_t y; //!< Y int16_t x; //!< X -} U_WMRFLOODFILL, *PU_WMRFLOODFILL, - U_WMREXTFLOODFILL, *PU_WMREXTFLOODFILL; +} U_WMRFLOODFILL, + U_WMREXTFLOODFILL; //!< WMF manual 2.3.3.7 -/* Index 1A U_WMRPIE WMF PDF 2.3.3.13 */ +/* Index 1A U_WMRPIE WMF manual 2.3.3.13 + Index 30 U_WMRCHORD WMF manual 2.3.3.2 +*/ +/** WMF manual 2.3.3.13 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t yRadial2; //!< in logical units int16_t xRadial2; //!< in logical units @@ -1239,15 +1302,17 @@ typedef struct { int16_t Right; //!< in logical units int16_t Top; //!< in logical units int16_t Left; //!< in logical units -} U_WMRPIE, *PU_WMRPIE, - U_WMRCHORD, *PU_WMRCHORD; +} U_WMRPIE, + U_WMRCHORD; //!< WMF manual 2.3.3.2 -/* Index 1B U_WMRRECTANGLE WMF PDF 2.3.3.17 See Index 18 */ +/* Index 1B U_WMRRECTANGLE WMF manual 2.3.3.17 See Index 18 */ -/* Index 1C U_WMRROUNDRECT WMF PDF 2.3.3.18 */ +/* Index 1C U_WMRROUNDRECT WMF manual 2.3.3.18 */ +/** WMF manual 2.3.3.18 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t Height; //!< in logical units (rounded corner) int16_t Width; //!< in logical units (rounded corner) @@ -1255,50 +1320,61 @@ typedef struct { int16_t Right; //!< in logical units int16_t Top; //!< in logical units int16_t Left; //!< in logical units -} U_WMRROUNDRECT, *PU_WMRROUNDRECT; +} U_WMRROUNDRECT; -/* Index 1D U_WMRPATBLT WMF PDF 2.3.3.12 +/* Index 1D U_WMRPATBLT WMF manual 2.3.3.12 +*/ +/** WMF manual 2.3.3.12 */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the rop3 Ternary raster operation using rop3w, as the 32 bit value is not aligned int16_t Height; //!< in logical units (of Rect to Fill) int16_t Width; //!< in logical units (of Rect to Fill) int16_t yDst; //!< in logical units (UL corner to fill) int16_t xDst; //!< in logical units (UL corner to fill) -} U_WMRPATBLT, *PU_WMRPATBLT; +} U_WMRPATBLT; -/* Index 1E U_WMRSAVEDC WMF PDF 2.3.5.11 See Index 00*/ +/* Index 1E U_WMRSAVEDC WMF manual 2.3.5.11 See Index 00*/ -/* Index 1F U_WMRSETPIXEL WMF PDF 2.3.3.19 */ +/* Index 1F U_WMRSETPIXEL WMF manual 2.3.3.19 */ +/** WMF manual 2.3.3.19 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_COLORREF Color; //!< Color int16_t y; //!< Y int16_t x; //!< X -} U_WMRSETPIXEL, *PU_WMRSETPIXEL; +} U_WMRSETPIXEL; -/* Index 20 U_WMROFFSETCLIPRGN WMF PDF 2.3.5.5 See Index 0B*/ +/* Index 20 U_WMROFFSETCLIPRGN WMF manual 2.3.5.5 See Index 0B*/ -/* Index 21 U_WMRTEXTOUT WMF PDF 2.3.3.20 - Also part of the record, but at variable positions - int16_t y; start position - int16_t x; start position +/* Index 21 U_WMRTEXTOUT WMF manual 2.3.3.20 +*/ +/** WMF manual 2.3.3.20 +Also part of the record, following String, and so at variable positions: + +int16_t y; start position + +int16_t x; start position */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t Length; //!< Stringlength in bytes uint8_t String; //!< String to write, storage area must be 2n bytes. -} U_WMRTEXTOUT, *PU_WMRTEXTOUT; +} U_WMRTEXTOUT; + +/* Index 22 U_WMRBITBLT WMF manual 2.3.1.1 +*/ +/** WMF manual 2.3.1.1 -/* Index 22 U_WMRBITBLT WMF PDF 2.3.1.1 - This is a variable structure the core, invariant part extends to xSrc. + This is a variable structure the core/invariant part extends to xSrc. if RecordSize == ((xb) + 3) then there is no bitmap and use the _NOPX form, otherwise use the _PX form Use Macro U_TEST_NOPX2 @@ -1306,7 +1382,7 @@ typedef struct { */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t ySrc; //!< in logical units (UL corner of Src rect) @@ -1316,11 +1392,19 @@ typedef struct { int16_t Width; //!< in logical units (of Src and Dst rects) int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) -} U_WMRBITBLT_NOPX, *PU_WMRBITBLT_NOPX; +} U_WMRBITBLT_NOPX; + +/** WMF manual 2.3.1.1 + This is a variable structure the core/invariant part extends to xSrc. + + if RecordSize == ((xb) + 3) then there is no bitmap and use the _NOPX form, otherwise use the _PX form + Use Macro U_TEST_NOPX2 + +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t ySrc; //!< in logical units (UL corner of Src rect) @@ -1330,18 +1414,21 @@ typedef struct { int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) U_BITMAP16 bitmap; //!< Src bitmap -} U_WMRBITBLT_PX, *PU_WMRBITBLT_PX; +} U_WMRBITBLT_PX; + +/* Index 23 U_WMRSTRETCHBLT WMF manual 2.3.1.5 */ +/** WMF manual 2.3.1.5 -/* Index 23 U_WMRSTRETCHBLT WMF PDF 2.3.1.5 - This is a variable structure the core, invariant part extends to xSrc. + This is a variable structure the core/invariant part extends to xSrc. if RecordSize == ((xb) + 3) then there is no bitmap and use the _NOPX form, otherwise use the _PX form Use Macro U_TEST_NOPX2. */ + typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t hSrc; //!< Height in logical units of Src rect @@ -1353,11 +1440,20 @@ typedef struct { int16_t wDst; //!< Wdith in logical units of Dst rect int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) -} U_WMRSTRETCHBLT_NOPX, *PU_WMRSTRETCHBLT_NOPX; +} U_WMRSTRETCHBLT_NOPX; + + +/* Index 23 U_WMRSTRETCHBLT WMF manual 2.3.1.5 */ +/** WMF manual 2.3.1.5 + This is a variable structure the core/invariant part extends to xSrc. + + if RecordSize == ((xb) + 3) then there is no bitmap and use the _NOPX form, otherwise use the _PX form + Use Macro U_TEST_NOPX2. +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t hSrc; //!< Height in logical units of Src rect @@ -1369,124 +1465,153 @@ typedef struct { int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) U_BITMAP16 bitmap; //!< Src bitmap -} U_WMRSTRETCHBLT_PX, *PU_WMRSTRETCHBLT_PX; +} U_WMRSTRETCHBLT_PX; -/* Index 24 U_WMRPOLYGON WMF PDF 2.3.3.15 - Index 25 U_WMRPOLYLINE WMF PDF 2.3.3.14 */ +/* Index 24 U_WMRPOLYGON WMF manual 2.3.3.15 + Index 25 U_WMRPOLYLINE WMF manual 2.3.3.14 +*/ +/** WMF manual 2.3.3.15 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t nPoints; //!< Number of points in aPoints U_POINT16 aPoints[1]; //!< Array of points -} U_WMRPOLYGON, *PU_WMRPOLYGON, - U_WMRPOLYLINE, *PU_WMRPOLYLINE; +} U_WMRPOLYGON, + U_WMRPOLYLINE; //!< WMF manual 2.3.3.14 -/* Index 26 U_WMRESCAPE WMF PDF 2.3.6.1 */ +/* Index 26 U_WMRESCAPE WMF manual 2.3.6.1 */ +/** WMF manual 2.3.6.1 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t eFunc; //!< Escape function uint16_t nBytes; //!< bytes in the data array uint8_t Data[1]; //!< data array -} U_WMRESCAPE, *PU_WMRESCAPE; +} U_WMRESCAPE; -/* Index 27 U_WMRRESTOREDC WMF PDF 2.3.5.10*/ +/* Index 27 U_WMRRESTOREDC WMF manual 2.3.5.10 */ +/** WMF manual 2.3.5.10 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t DC; //!< DC to restore (negative is relative to current, positive is absolute) -} U_WMRRESTOREDC, *PU_WMRRESTOREDC; +} U_WMRRESTOREDC; -/* Index 28 U_WMRFILLREGION WMF PDF 2.3.3.6 */ +/* Index 28 U_WMRFILLREGION WMF manual 2.3.3.6 */ +/** WMF manual 2.3.3.6 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t Region; //!< Index of region to fill in object table uint16_t Brush; //!< Index of brush to use in object table -} U_WMRFILLREGION, *PU_WMRFILLREGION; +} U_WMRFILLREGION; -/* Index 29 U_WMRFRAMEREGION WMF PDF 2.3.3.8 */ +/* Index 29 U_WMRFRAMEREGION WMF manual 2.3.3.8 */ +/** WMF manual 2.3.3.8 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t Region; //!< Index of region to frame in object table uint16_t Brush; //!< Index of brush to use in frame in object table int16_t Height; //!< in logical units (of frame) int16_t Width; //!< in logical units (of frame) -} U_WMRFRAMEREGION, *PU_WMRFRAMEREGION; +} U_WMRFRAMEREGION; -/* Index 2A U_WMRINVERTREGION WMF PDF 2.3.3.9 - Index 2B U_WMRPAINTREGION WMF PDF 2.3.3.11 - Index 2C U_WMRSELECTCLIPREGION WMF PDF 2.3.4.9 - Index 2D U_WMRSELECTOBJECT WMF PDF 2.3.4.10 */ +/* Index 2A U_WMRINVERTREGION WMF manual 2.3.3.9 + Index 2B U_WMRPAINTREGION WMF manual 2.3.3.11 + Index 2C U_WMRSELECTCLIPREGION WMF manual 2.3.4.9 + Index 2D U_WMRSELECTOBJECT WMF manual 2.3.4.10 + Index 34 U_WMRSELECTPALETTE WMF manual 2.3.4.11 + Index 39 U_WMRRESIZEPALETTE WMF manual 2.3.5.9 + Index F0 U_WMRDELETEOBJECT WMF manual 2.3.4.7 +*/ +/** WMF manual 2.3.3.9 +invert region +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t index; //!< (usually) index of region/object in object table -} U_WMRINVERTREGION, *PU_WMRINVERTREGION, //!< invert region - U_WMRPAINTREGION, *PU_WMRPAINTREGION, //!< paint region - U_WMRSELECTCLIPREGION, *PU_WMRSELECTCLIPREGION, //!< select as clip region - U_WMRSELECTOBJECT, *PU_WMRSELECTOBJECT, //!< select object - U_WMRSELECTPALETTE, *PU_WMRSELECTPALETTE, //!< select palette object - U_WMRRESIZEPALETTE, *PU_WMRRESIZEPALETTE, //!< resize the system palette to "index" - U_WMRDELETEOBJECT, *PU_WMRDELETEOBJECT; //!< delete object - -/* Index 2E U_WMRSETTEXTALIGN WMF PDF 2.3.5.24 See Index 02 */ - -/* Index 2F U_WMRDRAWTEXT in Wine, not in WMF PDF. - no documentation found, this part must be correct */ +} U_WMRINVERTREGION, + U_WMRPAINTREGION, //!< WMF manual 2.3.3.11, paint region + U_WMRSELECTCLIPREGION, //!< WMF manual 2.3.4.9, select as clip region + U_WMRSELECTOBJECT, //!< WMF manual 2.3.4.10, select object + U_WMRSELECTPALETTE, //!< WMF manual 2.3.4.11, select palette object + U_WMRRESIZEPALETTE, //!< WMF manual 2.3.5.9, resize the system palette to "index" + U_WMRDELETEOBJECT; //!< WMF manual 2.3.4.7, delete object + +/* Index 2E U_WMRSETTEXTALIGN WMF manual 2.3.5.24 See Index 02 */ + +/* Index 2F U_WMRDRAWTEXT in GDI and Wine, not documented in WMF manual. + Index FE U_WMRCREATEBITMAP in GDI and Wine, not documented in WMF manual. + Index FD U_WMRCREATEBITMAPINDIRECT in GDI and Wine, not documented in WMF manual. + + no documentation found, this part of these records, at least, must be correct */ +/** in GDI and Wine, not documented in WMF manual. +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type -} U_WMRDRAWTEXT, *PU_WMRDRAWTEXT, - U_WMRCREATEBITMAPINDIRECT, *PU_WMRCREATEBITMAPINDIRECT, - U_WMRCREATEBITMAP, *PU_WMRCREATEBITMAP; +} U_WMRDRAWTEXT, + U_WMRCREATEBITMAPINDIRECT, //!< in GDI and Wine, not documented in WMF manual. + U_WMRCREATEBITMAP; //!< in GDI and Wine, not documented in WMF manual. -/* Index 30 U_WMRCHORD WMF PDF 2.3.3.2 See Index 1A */ +/* Index 30 U_WMRCHORD WMF manual 2.3.3.2 See Index 1A */ -/* Index 31 U_WMRSETMAPPERFLAGS WMF PDF 2.3.5.18 */ +/* Index 31 U_WMRSETMAPPERFLAGS WMF manual 2.3.5.18 */ +/** WMF manual 2.3.5.18 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t valuew[2]; //!< if 1 bit set font mapper selects only matching aspect fonts. reassemble/store the value using valuew, the 32 bit value is not aligned. -} U_WMRSETMAPPERFLAGS, *PU_WMRSETMAPPERFLAGS; +} U_WMRSETMAPPERFLAGS; -/* Index 32 U_WMREXTTEXTOUT WMF PDF 2.3.3.5 - Variable size structure. Common part is shown. +/* Index 32 U_WMREXTTEXTOUT WMF manual 2.3.3.5 +*/ +/** WMF manual 2.3.3.5 + + Variable size record. Optional fields which follow the struct fields are: - U_RECT16 Rect; Only present when U_ETO_OPAQUE or U_ETO_CLIPPED bits are set in Opts - uint8_t String; String to write, storage area must be 2n bytes. - int16_t Dx; Kerning information. Must have same number of entries as Length. - Dx is present when - 2*Size16_4[2] -14 - 2*((Length + 1)/2)) - 8*(Opts & (U_ETO_OPAQUE | U_ETO_CLIPPED)) == 2*Length + U_RECT16 Rect; Only present when U_ETO_OPAQUE or U_ETO_CLIPPED bits are set in Opts + uint8_t String; String to write, storage area must be 2n bytes. + int16_t Dx; Kerning information. Must have same number of entries as Length. + Dx is present when + 2*Size16_4[2] -14 - 2*((Length + 1)/2)) - 8*(Opts & (U_ETO_OPAQUE | U_ETO_CLIPPED)) == 2*Length */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type int16_t y; //!< in logical units (draw point) int16_t x; //!< in logical units (draw point) int16_t Length; //!< Stringlength in bytes uint16_t Opts; //!< ExtTextOutOptions Flags -} U_WMREXTTEXTOUT, *PU_WMREXTTEXTOUT; +} U_WMREXTTEXTOUT; + +/* Index 33 U_WMRSETDIBTODEV WMF manual 2.3.1.4 */ +/** WMF manual 2.3.1.4 -/* Index 33 U_WMRSETDIBTODEV WMF PDF 2.3.1.4 - Constant part of record is showon. It is followed by a - DeviceIndependentBitmap Object + Constant part of record is shown. It is followed by a DeviceIndependentBitmap Object */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type - uint16_t cUsage; //!< ColorUsage enumeration + uint16_t cUsage; //!< ColorUsage Enumeration uint16_t ScanCount; //!< Number of scan lines in Src uint16_t StartScan; //!< First Scan line in Src int16_t ySrc; //!< in logical units (UL corner of Src rect) @@ -1496,35 +1621,44 @@ typedef struct { int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) uint8_t dib[1]; //!< DeviceIndependentBitmap object -} U_WMRSETDIBTODEV, *PU_WMRSETDIBTODEV; +} U_WMRSETDIBTODEV; -/* Index 34 U_WMRSELECTPALETTE WMF PDF 2.3.4.11 See Index 2A */ +/* Index 34 U_WMRSELECTPALETTE WMF manual 2.3.4.11 See Index 2A */ -/* Index 35 U_WMRREALIZEPALETTE WMF PDF 2.3.5.8 See Index 00 */ +/* Index 35 U_WMRREALIZEPALETTE WMF manual 2.3.5.8 See Index 00 */ -/* Index 36 U_WMRANIMATEPALETTE WMF PDF 2.3.5.1 - Index 37 U_WMRSETPALENTRIES WMF PDF 2.3.5.19 */ +/* Index 36 U_WMRANIMATEPALETTE WMF manual 2.3.5.1 + Index 37 U_WMRSETPALENTRIES WMF manual 2.3.5.19 + Index F7 U_WMRCREATEPALETTE WMF manual 2.3.4.3 +*/ +/** WMF manual 2.3.5.1 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_PALETTE Palette; //!< Palette object -} U_WMRANIMATEPALETTE, *PU_WMRANIMATEPALETTE, - U_WMRSETPALENTRIES, *PU_WMRSETPALENTRIES, - U_WMRCREATEPALETTE, *PU_WMRCREATEPALETTE; +} U_WMRANIMATEPALETTE, + U_WMRSETPALENTRIES, //!< WMF manual 2.3.5.19 + U_WMRCREATEPALETTE; //!< WMF manual 2.3.4.3 -/* Index 38 U_WMRPOLYPOLYGON WMF PDF 2.3.3.16 */ +/* Index 38 U_WMRPOLYPOLYGON WMF manual 2.3.3.16 */ +/** WMF manual 2.3.3.16 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_POLYPOLYGON PPolygon; //!< PolyPolygon object (size is variable!) -} U_WMRPOLYPOLYGON, *PU_WMRPOLYPOLYGON; +} U_WMRPOLYPOLYGON; -/* Index 39 U_WMRRESIZEPALETTE WMF PDF 2.3.5.9 See Index 2A */ +/* Index 39 U_WMRRESIZEPALETTE WMF manual 2.3.5.9 See Index 2A */ -/* Index 40 U_WMRDIBBITBLT WMF PDF 2.3.1.2 - The PX form is a variable structure the core, invariant part extends to xDst, and that is +/* Index 40 U_WMRDIBBITBLT WMF manual 2.3.1.2 +*/ +/** WMF manual 2.3.1.2 + + The PX form is a variable structure the core/invariant part extends to xDst, and that is followed by a DeviceInvariantBitmap object which starts at "dib". The NOPX form is a constant structure. @@ -1533,7 +1667,7 @@ typedef struct { */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t ySrc; //!< in logical units (UL corner of Src rect) @@ -1543,11 +1677,20 @@ typedef struct { int16_t Width; //!< in logical units (of Src and Dst) int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) -} U_WMRDIBBITBLT_NOPX, *PU_WMRDIBBITBLT_NOPX; +} U_WMRDIBBITBLT_NOPX; + +/** WMF manual 2.3.1.2 + The PX form is a variable structure the core/invariant part extends to xDst, and that is + followed by a DeviceInvariantBitmap object which starts at "dib". + The NOPX form is a constant structure. + + if RecordSize == ((xb) + 3) then there is no bitmap and use the _NOPX form, otherwise use the _PX form + Use Macro U_TEST_NOPX2. +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t ySrc; //!< in logical units (UL corner of Src rect) @@ -1557,10 +1700,12 @@ typedef struct { int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) uint8_t dib[1]; //!< DeviceIndependentBitmap object -} U_WMRDIBBITBLT_PX, *PU_WMRDIBBITBLT_PX; +} U_WMRDIBBITBLT_PX; + +/* Index 41 U_WMRDIBSTRETCHBLT WMF manual 2.3.1.3 */ +/** WMF manual 2.3.1.3 -/* Index 41 U_WMRDIBSTRETCHBLT WMF PDF 2.3.1.3 - The PX form is a variable structure the core, invariant part extends to xDst, and that is + The PX form is a variable structure the core/invariant part extends to xDst, and that is followed by a DeviceInvariantBitmap object which starts at "dib". The NOPX form is a constant structure. @@ -1569,7 +1714,7 @@ typedef struct { */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t hSrc; //!< in logical units (of Src) @@ -1581,11 +1726,20 @@ typedef struct { int16_t wDst; //!< in logical units (of Dst) int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) -} U_WMRDIBSTRETCHBLT_NOPX, *PU_WMRDIBSTRETCHBLT_NOPX; +} U_WMRDIBSTRETCHBLT_NOPX; +/** WMF manual 2.3.1.3 + + The PX form is a variable structure the core/invariant part extends to xDst, and that is + followed by a DeviceInvariantBitmap object which starts at "dib". + The NOPX form is a constant structure. + + if RecordSize == ((xb) + 3) then there is no bitmap and use the _NOPX form, otherwise use the _PX form + Use Macro U_TEST_NOPX2. +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. int16_t hSrc; //!< in logical units (of Src) @@ -1597,34 +1751,38 @@ typedef struct { int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) uint8_t dib[1]; //!< DeviceIndependentBitmap object -} U_WMRDIBSTRETCHBLT_PX, *PU_WMRDIBSTRETCHBLT_PX; +} U_WMRDIBSTRETCHBLT_PX; -/* Index 42 U_WMRDIBCREATEPATTERNBRUSH WMF PDF 2.3.4.8 +/* Index 42 U_WMRDIBCREATEPATTERNBRUSH WMF manual 2.3.4.8 +*/ +/** WMF manual 2.3.4.8 - style cUsage Brush created - U_BS_SOLID like U_BS_DIBPATTERNPT - U_BS_NULL like U_BS_DIBPATTERNPT - U_BS_HATCHED like U_BS_DIBPATTERNPT - U_BS_DIBPATTERNPT ColorUsage enumer. U_BS_DIBPATTERNPT brush from DIB in Src - U_BS_PATTERN ColorUsage enumer. U_BS_PATTERN brush from Bitmap16 object in Src + style cUsage Brush created + U_BS_SOLID like U_BS_DIBPATTERNPT + U_BS_NULL like U_BS_DIBPATTERNPT + U_BS_HATCHED like U_BS_DIBPATTERNPT + U_BS_DIBPATTERNPT ColorUsage enumer. U_BS_DIBPATTERNPT brush from DIB in Src + U_BS_PATTERN ColorUsage enumer. U_BS_PATTERN brush from Bitmap16 object in Src */ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t Style; //!< BrushStyle Enumeration uint16_t cUsage; //!< See table above uint8_t Src[1]; //!< DeviceIndependentBitmap or Bitmap16 object -} U_WMRDIBCREATEPATTERNBRUSH, *PU_WMRDIBCREATEPATTERNBRUSH; +} U_WMRDIBCREATEPATTERNBRUSH; -/* Index 43 U_WMRSTRETCHDIB WMF PDF 2.3.1.6 */ +/* Index 43 U_WMRSTRETCHDIB WMF manual 2.3.1.6 */ +/** WMF manual 2.3.1.6 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type uint16_t rop3w[2]; //!< reassemble/store the Ternary raster operation rop3 value using rop3w, the 32 bit value is not aligned. - uint16_t cUsage; //!< ColorUsage enumeration + uint16_t cUsage; //!< ColorUsage Enumeration int16_t hSrc; //!< in logical units (of Src) int16_t wSrc; //!< in logical units (of Src) int16_t ySrc; //!< in logical units (UL corner of Src rect) @@ -1634,9 +1792,9 @@ typedef struct { int16_t yDst; //!< in logical units (UL corner of Dst rect) int16_t xDst; //!< in logical units (UL corner of Dst rect) uint8_t dib[1]; //!< DeviceIndependentBitmap object -} U_WMRSTRETCHDIB, *PU_WMRSTRETCHDIB; +} U_WMRSTRETCHDIB; -/* Index 48 U_WMREXTFLOODFILL WMF PDF 2.3.3.4 See Index 19*/ +/* Index 48 U_WMREXTFLOODFILL WMF manual 2.3.3.4 See Index 19*/ /* Index 4C U_WMR4C */ /* Index 4D U_WMR4D */ /* Index 4F U_WMR4F */ @@ -1788,78 +1946,90 @@ typedef struct { /* Index ED U_WMRED */ /* Index EE U_WMREE */ /* Index EF U_WMREF */ -/* Index F0 U_WMRDELETEOBJECT WMF PDF 2.3.4.7 See Index 2A */ +/* Index F0 U_WMRDELETEOBJECT WMF manual 2.3.4.7 See Index 2A */ /* Index F1 U_WMRF1 */ /* Index F2 U_WMRF2 */ /* Index F3 U_WMRF3 */ /* Index F4 U_WMRF4 */ /* Index F5 U_WMRF5 */ -/* Index F7 U_WMRCREATEPALETTE WMF PDF 2.3.4.3 See Index 36*/ +/* Index F7 U_WMRCREATEPALETTE WMF manual 2.3.4.3 See Index 36*/ /* Index F8 U_WMRF8 */ -/* Index F9 U_WMRCREATEPATTERNBRUSH WMF PDF 2.3.4.4 +/* Index F9 U_WMRCREATEPATTERNBRUSH WMF manual 2.3.4.4 */ +/** WMF manual 2.3.4.4 - This one is peculiar... + This record is peculiar... After the core structure there is: - 1. A truncated U_BITMAP16. Only the first 14 bytes are present, and the last 4 bytes (bits section) are ignored.\ - 2. 18 zero bytes (reserved) - 3. A pattern. The pattern is a byte array whose size is set by the fields in the U_BITMAP16 structure as follows: + A truncated U_BITMAP16. Only the first 14 bytes are present, and the last 4 bytes (bits section) are ignored. + 18 zero bytes (reserved) + A pattern. The pattern is a byte array whose size is set by the fields in the U_BITMAP16 structure as follows: - (((Width * BitsPixel + 15) >> 4) << 1) * Height - - brush created is BS_PATTERN + (((Width * BitsPixel + 15) >> 4) << 1) * Height + + brush created has style U_BS_PATTERN. -*/ +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type -} U_WMRCREATEPATTERNBRUSH, *PU_WMRCREATEPATTERNBRUSH; +} U_WMRCREATEPATTERNBRUSH; -/* Index FA U_WMRCREATEPENINDIRECT WMF PDF 2.3.4.5 */ +/* Index FA U_WMRCREATEPENINDIRECT WMF manual 2.3.4.5 */ +/** WMF manual 2.3.4.5 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_PEN pen; //!< Pen Object -} U_WMRCREATEPENINDIRECT, *PU_WMRCREATEPENINDIRECT; +} U_WMRCREATEPENINDIRECT; -/* Index FB U_WMRCREATEFONTINDIRECT WMF PDF 2.3.4.2 */ +/* Index FB U_WMRCREATEFONTINDIRECT WMF manual 2.3.4.2 */ +/** WMF manual 2.3.4.2 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_FONT font; //!< Font Object -} U_WMRCREATEFONTINDIRECT, *PU_WMRCREATEFONTINDIRECT; +} U_WMRCREATEFONTINDIRECT; -/* Index FC U_WMRCREATEBRUSHINDIRECT WMF PDF 2.3.4.1 */ +/* Index FC U_WMRCREATEBRUSHINDIRECT WMF manual 2.3.4.1 */ +/** WMF manual 2.3.4.1 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_WLOGBRUSH brush; //!< WLogBrush Object -} U_WMRCREATEBRUSHINDIRECT, *PU_WMRCREATEBRUSHINDIRECT; +} U_WMRCREATEBRUSHINDIRECT; -/* Index FD U_WMRCREATEBITMAPINDIRECT in Wine, not in WMF PDF see index 2F */ +/* Index FD U_WMRCREATEBITMAPINDIRECT in GDI and Wine, not in WMF manual, see index 2F */ -/* Index FE U_WMRCREATEBITMAP in Wine, not in WMF PDF see index 2F */ +/* Index FE U_WMRCREATEBITMAP in GDI and Wine, not in WMF manual, see index 2F */ -/* Index FF U_WMRCREATEREGION WMF PDF 2.3.4.6 */ +/* Index FF U_WMRCREATEREGION WMF manual 2.3.4.6 */ +/** WMF manual 2.3.4.6 +*/ typedef struct { uint16_t Size16_4[2]; //!< Total number of 16bit words in record - uint8_t iType; //!< RecordType enumeration + uint8_t iType; //!< RecordType Enumeration uint8_t xb; //!< Extra high order byte associated with record type U_REGION region; //!< Region Object -} U_WMRCREATEREGION, *PU_WMRCREATEREGION; +} U_WMRCREATEREGION; // ************************************************************************************************ // Utility function structures +/** + Storage for keeping track of properties of the growing WMF file as records are added. +*/ typedef struct { FILE *fp; //!< Open file size_t allocated; //!< Size of the buffer @@ -1891,14 +2061,15 @@ typedef struct { uint32_t peak; //!< Highest table slot occupied (ever) } WMFHANDLES; +//! \cond // ************************************************************************************************ // Prototypes (_set first, then _get) char *wmr_dup(const char *wmr); int wmf_start(const char *name, uint32_t initsize, uint32_t chunksize, WMFTRACK **wt); int wmf_free(WMFTRACK **wt); int wmf_finish(WMFTRACK *wt); -int wmf_append(PU_METARECORD rec, WMFTRACK *wt, int freerec); -int wmf_header_append(PU_METARECORD rec,WMFTRACK *et, int freerec); +int wmf_append(U_METARECORD *rec, WMFTRACK *wt, int freerec); +int wmf_header_append(U_METARECORD *rec,WMFTRACK *et, int freerec); int wmf_readdata(const char *filename, char **contents, size_t*length); #define wmf_fopen emf_fopen int wmf_htable_create(uint32_t initsize, uint32_t chunksize, WMFHANDLES **wht); @@ -1917,34 +2088,34 @@ char *U_wmr_escnames(int idx); void U_sanerect16(U_RECT16 rc, double *left, double *top, double *right, double *bottom); -PU_FONT U_FONT_set(int16_t Height, int16_t Width, int16_t Escapement, int16_t Orientation, +U_FONT *U_FONT_set(int16_t Height, int16_t Width, int16_t Escapement, int16_t Orientation, int16_t Weight, uint8_t Italic, uint8_t Underline, uint8_t StrikeOut, uint8_t CharSet, uint8_t OutPrecision, uint8_t ClipPrecision, uint8_t Quality, uint8_t PitchAndFamily, char *FaceName); U_PLTNTRY U_PLTNTRY_set(U_COLORREF Color); -PU_PALETTE U_PLTENTRY_set(uint16_t Start, uint16_t NumEntries, PU_PLTNTRY Entries); +U_PALETTE *U_PLTENTRY_set(uint16_t Start, uint16_t NumEntries, U_PLTNTRY *Entries); U_PEN U_PEN_set(uint16_t Style, uint16_t Width, U_COLORREF Color); U_RECT16 U_RECT16_set(U_POINT16 ul,U_POINT16 lr); -PU_BITMAP16 U_BITMAP16_set(const int16_t Type, const int16_t Width, const int16_t Height, +U_BITMAP16 *U_BITMAP16_set(const int16_t Type, const int16_t Width, const int16_t Height, const int16_t LineN, const uint8_t BitsPixel, const char *Bits); -PU_SCAN U_SCAN_set(uint16_t count, uint16_t top, uint16_t bottom, uint16_t *ScanLines); -PU_REGION U_REGION_set(int16_t Size, int16_t sCount, int16_t sMax, U_RECT16 sRect, uint16_t *aScans); +U_SCAN *U_SCAN_set(uint16_t count, uint16_t top, uint16_t bottom, uint16_t *ScanLines); +U_REGION *U_REGION_set(int16_t Size, int16_t sCount, int16_t sMax, U_RECT16 sRect, uint16_t *aScans); U_WLOGBRUSH U_WLOGBRUSH_set(uint16_t Style, U_COLORREF Color, uint16_t Hatch); -PU_PAIRF U_PAIRF_set(float x, float y); +U_PAIRF *U_PAIRF_set(float x, float y); char *wdeleteobject_set(uint32_t *ihObject, WMFHANDLES *wht); char *wselectobject_set(uint32_t ihObject, WMFHANDLES *wht ); char *wcreatepenindirect_set(uint32_t *ihPen, WMFHANDLES *wht, U_PEN pen); char *wcreatebrushindirect_set(uint32_t *ihBrush, WMFHANDLES *wht, U_WLOGBRUSH lb); char *wcreatedibpatternbrush_srcdib_set(uint32_t *ihBrush, WMFHANDLES *wht, - uint32_t iUsage, const PU_BITMAPINFO Bmi, uint32_t cbPx, const char *Px); + uint32_t iUsage, const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px); char *wcreatedibpatternbrush_srcbm16_set(uint32_t *ihBrush, WMFHANDLES *wht, - uint32_t iUsage, const PU_BITMAP16 Bm16); -char *wcreatepatternbrush_set(uint32_t *ihBrush, WMFHANDLES *wht, PU_BITMAP16 Bm16, char *Pattern); -char *wcreatefontindirect_set(uint32_t *ihFont, WMFHANDLES *wht, PU_FONT uf); -char *wcreatepalette_set(uint32_t *ihPal, WMFHANDLES *wht, PU_PALETTE up); -char *wsetpaletteentries_set(uint32_t *ihPal, WMFHANDLES *wht, const PU_PALETTE Palletes); -char *wcreateregion_set(uint32_t *ihReg, WMFHANDLES *wht, const PU_REGION Region); + uint32_t iUsage, const U_BITMAP16 *Bm16); +char *wcreatepatternbrush_set(uint32_t *ihBrush, WMFHANDLES *wht, U_BITMAP16 *Bm16, char *Pattern); +char *wcreatefontindirect_set(uint32_t *ihFont, WMFHANDLES *wht, U_FONT *uf); +char *wcreatepalette_set(uint32_t *ihPal, WMFHANDLES *wht, U_PALETTE *up); +char *wsetpaletteentries_set(uint32_t *ihPal, WMFHANDLES *wht, const U_PALETTE *Palletes); +char *wcreateregion_set(uint32_t *ihReg, WMFHANDLES *wht, const U_REGION *Region); char *wbegin_path_set(void); char *wend_path_set(void); char *wlinecap_set(int32_t Type); @@ -1952,7 +2123,7 @@ char *wlinejoin_set(int32_t Type); char *wmiterlimit_set(int32_t limit); -char *U_WMRHEADER_set(PU_PAIRF size,unsigned int dpi); +char *U_WMRHEADER_set(U_PAIRF *size,unsigned int dpi); char *U_WMREOF_set(void); char *U_WMRSETBKCOLOR_set(U_COLORREF Color); char *U_WMRSETBKMODE_set(uint16_t Mode); @@ -1988,11 +2159,11 @@ char *U_WMRSETPIXEL_set(U_COLORREF Color, U_POINT16 coord); char *U_WMROFFSETCLIPRGN_set(U_POINT16 offset); char *U_WMRTEXTOUT_set(U_POINT16 Dst, char *string); char *U_WMRBITBLT_set(U_POINT16 Dst, U_POINT16 cwh, U_POINT16 Src, - uint32_t dwRop3, const PU_BITMAP16 Bm16); + uint32_t dwRop3, const U_BITMAP16 *Bm16); char *U_WMRSTRETCHBLT_set(U_POINT16 Dst, U_POINT16 cDst, U_POINT16 Src, - U_POINT16 cSrc, uint32_t dwRop3, const PU_BITMAP16 Bm16); -char *U_WMRPOLYGON_set(uint16_t Length, const PU_POINT16 Data); -char *U_WMRPOLYLINE_set(uint16_t Length, const PU_POINT16 Data); + U_POINT16 cSrc, uint32_t dwRop3, const U_BITMAP16 *Bm16); +char *U_WMRPOLYGON_set(uint16_t Length, const U_POINT16 * Data); +char *U_WMRPOLYLINE_set(uint16_t Length, const U_POINT16 * Data); char *U_WMRESCAPE_set(uint16_t Escape, uint16_t Length, const void *Data); char *U_WMRRESTOREDC_set(int16_t DC); char *U_WMRFILLREGION_set(uint16_t Region, uint16_t Brush); @@ -2002,16 +2173,16 @@ char *U_WMRPAINTREGION_set(uint16_t Region); char *U_WMRSELECTCLIPREGION_set(uint16_t Region); char *U_WMRSELECTOBJECT_set(uint16_t object); char *U_WMRSETTEXTALIGN_set(uint16_t Mode); -char *U_WMRDRAWTEXT_set(void); /* in Wine, not in WMF PDF. */ +char *U_WMRDRAWTEXT_set(void); /* in GDI and Wine, not in WMF manual. */ char *U_WMRCHORD_set(U_POINT16 Radial1, U_POINT16 Radial2, U_RECT16 rect); char *U_WMRSETMAPPERFLAGS_set(uint32_t Mode); char *U_WMREXTTEXTOUT_set(U_POINT16 Dst, int16_t Length, uint16_t Opts, const char *string, int16_t *dx, U_RECT16 rect); char *U_WMRSETDIBTODEV_set(void); char *U_WMRSELECTPALETTE_set(uint16_t Palette); char *U_WMRREALIZEPALETTE_set(void); -char *U_WMRANIMATEPALETTE_set(PU_PALETTE Palette); -char *U_WMRSETPALENTRIES_set(PU_PALETTE Palette); -char *U_WMRPOLYPOLYGON_set(const uint16_t, const uint16_t *aPolyCounts, const PU_POINT16 points); +char *U_WMRANIMATEPALETTE_set(U_PALETTE *Palette); +char *U_WMRSETPALENTRIES_set(const U_PALETTE *Palette); +char *U_WMRPOLYPOLYGON_set(const uint16_t, const uint16_t *aPolyCounts, const U_POINT16 * points); char *U_WMRRESIZEPALETTE_set(uint16_t Palette); char *U_WMR3A_set(void); char *U_WMR3B_set(void); @@ -2020,13 +2191,13 @@ char *U_WMR3D_set(void); char *U_WMR3E_set(void); char *U_WMR3F_set(void); char *U_WMRDIBBITBLT_set(U_POINT16 Dst, U_POINT16 cwh, U_POINT16 Src, - uint32_t dwRop3, const PU_BITMAPINFO Bmi, uint32_t cbPx, const char *Px); + uint32_t dwRop3, const U_BITMAPINFO * Bmi, uint32_t cbPx, const char *Px); char *U_WMRDIBSTRETCHBLT_set(U_POINT16 Dst, U_POINT16 cDst, U_POINT16 Src, - U_POINT16 cSrc, uint32_t dwRop3, const PU_BITMAPINFO Bmi, uint32_t cbPx, const char *Px); + U_POINT16 cSrc, uint32_t dwRop3, const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px); char *U_WMRDIBCREATEPATTERNBRUSH_set(const uint16_t Style, const uint16_t iUsage, - PU_BITMAPINFO Bmi, uint32_t cbPx, const char *Px, PU_BITMAP16 Bm16); + const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px, const U_BITMAP16 *Bm16); char *U_WMRSTRETCHDIB_set(U_POINT16 Dest, U_POINT16 cDest, U_POINT16 Src, U_POINT16 cSrc, - const uint16_t cUsage, uint32_t dwRop3, const PU_BITMAPINFO Bmi, uint32_t cbPx, const char *Px); + const uint16_t cUsage, uint32_t dwRop3, const U_BITMAPINFO *Bmi, uint32_t cbPx, const char *Px); char *U_WMR44_set(void); char *U_WMR45_set(void); char *U_WMR46_set(void); @@ -2206,21 +2377,21 @@ char *U_WMRF3_set(void); char *U_WMRF4_set(void); char *U_WMRF5_set(void); char *U_WMRF6_set(void); -char *U_WMRCREATEPALETTE_set(PU_PALETTE Palette); +char *U_WMRCREATEPALETTE_set(U_PALETTE *Palette); char *U_WMRF8_set(void); -char *U_WMRCREATEPATTERNBRUSH_set(PU_BITMAP16 Bm16, char *Pattern); +char *U_WMRCREATEPATTERNBRUSH_set(U_BITMAP16 *Bm16, char *Pattern); char *U_WMRCREATEPENINDIRECT_set(U_PEN pen); -char *U_WMRCREATEFONTINDIRECT_set(PU_FONT font); +char *U_WMRCREATEFONTINDIRECT_set(U_FONT *font); char *U_WMRCREATEBRUSHINDIRECT_set(U_WLOGBRUSH brush); -char *U_WMRCREATEBITMAPINDIRECT_set(void); /* in Wine, not in WMF PDF*/ -char *U_WMRCREATEBITMAP_set(void); /* in Wine, not in WMF PDF */ -char *U_WMRCREATEREGION_set(PU_REGION region); +char *U_WMRCREATEBITMAPINDIRECT_set(void); /* in GDI and Wine, not in WMF manual. */ +char *U_WMRCREATEBITMAP_set(void); /* in GDI and Wine, not in WMF manual. */ +char *U_WMRCREATEREGION_set(const U_REGION *region); int16_t *dx16_get( int32_t height, uint32_t weight, uint32_t members); size_t U_WMRRECSAFE_get(const char *contents, const char *blimit); -int wmfheader_get(const char *contents, const char *blimit, PU_WMRPLACEABLE Placeable, PU_WMRHEADER Header); +int wmfheader_get(const char *contents, const char *blimit, U_WMRPLACEABLE *Placeable, U_WMRHEADER *Header); int wmr_arc_points(U_RECT16 rclBox, U_POINT16 ArcStart, U_POINT16 ArcEnd, - int *f1, int f2, PU_PAIRF center, PU_PAIRF start, PU_PAIRF end, PU_PAIRF size ); + int *f1, int f2, U_PAIRF *center, U_PAIRF *start, U_PAIRF *end, U_PAIRF *size ); void U_BITMAPINFOHEADER_get(const char *Bmih, uint32_t *Size, int32_t *Width, int32_t *Height, uint32_t *Planes, uint32_t *BitCount, uint32_t *Compression, uint32_t *SizeImage, int32_t *XPelsPerMeter, int32_t *YPelsPerMeter, uint32_t *ClrUsed, uint32_t *ClrImportant); @@ -2228,7 +2399,7 @@ void U_BITMAPCOREHEADER_get(const char *BmiCh, int32_t *Size, int32_t *W int wget_DIB_params(const char *dib, const char **px, const U_RGBQUAD **ct, int32_t *numCt, int32_t *width, int32_t *height, int32_t *colortype, int32_t *invert); int U_WMREOF_get(const char *contents); -int U_WMRSETBKCOLOR_get(const char *contents, PU_COLORREF Color); +int U_WMRSETBKCOLOR_get(const char *contents, U_COLORREF *Color); int U_WMRSETBKMODE_get(const char *contents, uint16_t *Mode); int U_WMRSETMAPMODE_get(const char *contents, uint16_t *Mode); int U_WMRSETROP2_get(const char *contents, uint16_t *Mode); @@ -2236,33 +2407,33 @@ int U_WMRSETRELABS_get(const char *contents); int U_WMRSETPOLYFILLMODE_get(const char *contents, uint16_t *Mode); int U_WMRSETSTRETCHBLTMODE_get(const char *contents, uint16_t *Mode); int U_WMRSETTEXTCHAREXTRA_get(const char *contents, uint16_t *Mode); -int U_WMRSETTEXTCOLOR_get(const char *contents, PU_COLORREF Color); +int U_WMRSETTEXTCOLOR_get(const char *contents, U_COLORREF *Color); int U_WMRSETTEXTJUSTIFICATION_get(const char *contents, uint16_t *Count, uint16_t *Extra); -int U_WMRSETWINDOWORG_get(const char *contents, PU_POINT16 coord); -int U_WMRSETWINDOWEXT_get(const char *contents, PU_POINT16 extent); -int U_WMRSETVIEWPORTORG_get(const char *contents, PU_POINT16 coord); -int U_WMRSETVIEWPORTEXT_get(const char *contents, PU_POINT16 extent); -int U_WMROFFSETWINDOWORG_get(const char *contents, PU_POINT16 offset); -int U_WMRSCALEWINDOWEXT_get(const char *contents, PU_POINT16 Denom, PU_POINT16 Num); -int U_WMROFFSETVIEWPORTORG_get(const char *contents, PU_POINT16 offset); -int U_WMRSCALEVIEWPORTEXT_get(const char *contents, PU_POINT16 Denom, PU_POINT16 Num); -int U_WMRLINETO_get(const char *contents, PU_POINT16 coord); -int U_WMRMOVETO_get(const char *contents, PU_POINT16 coord); -int U_WMREXCLUDECLIPRECT_get(const char *contents, PU_RECT16 rect); -int U_WMRINTERSECTCLIPRECT_get(const char *contents, PU_RECT16 rect); -int U_WMRARC_get(const char *contents, PU_POINT16 StartArc, PU_POINT16 EndArc, PU_RECT16 rect); -int U_WMRELLIPSE_get(const char *contents, PU_RECT16 rect); -int U_WMRFLOODFILL_get(const char *contents, uint16_t *Mode, PU_COLORREF Color, PU_POINT16 coord); -int U_WMRPIE_get(const char *contents, PU_POINT16 Radial1, PU_POINT16 Radial2, PU_RECT16 rect); -int U_WMRRECTANGLE_get(const char *contents, PU_RECT16 rect); -int U_WMRROUNDRECT_get(const char *contents, int16_t *Width, int16_t *Height, PU_RECT16 rect); -int U_WMRPATBLT_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cwh, uint32_t *dwRop3); +int U_WMRSETWINDOWORG_get(const char *contents, U_POINT16 * coord); +int U_WMRSETWINDOWEXT_get(const char *contents, U_POINT16 * extent); +int U_WMRSETVIEWPORTORG_get(const char *contents, U_POINT16 * coord); +int U_WMRSETVIEWPORTEXT_get(const char *contents, U_POINT16 * extent); +int U_WMROFFSETWINDOWORG_get(const char *contents, U_POINT16 * offset); +int U_WMRSCALEWINDOWEXT_get(const char *contents, U_POINT16 * Denom, U_POINT16 * Num); +int U_WMROFFSETVIEWPORTORG_get(const char *contents, U_POINT16 * offset); +int U_WMRSCALEVIEWPORTEXT_get(const char *contents, U_POINT16 * Denom, U_POINT16 * Num); +int U_WMRLINETO_get(const char *contents, U_POINT16 * coord); +int U_WMRMOVETO_get(const char *contents, U_POINT16 * coord); +int U_WMREXCLUDECLIPRECT_get(const char *contents, U_RECT16 * rect); +int U_WMRINTERSECTCLIPRECT_get(const char *contents, U_RECT16 * rect); +int U_WMRARC_get(const char *contents, U_POINT16 * StartArc, U_POINT16 * EndArc, U_RECT16 * rect); +int U_WMRELLIPSE_get(const char *contents, U_RECT16 * rect); +int U_WMRFLOODFILL_get(const char *contents, uint16_t *Mode, U_COLORREF *Color, U_POINT16 * coord); +int U_WMRPIE_get(const char *contents, U_POINT16 * Radial1, U_POINT16 * Radial2, U_RECT16 * rect); +int U_WMRRECTANGLE_get(const char *contents, U_RECT16 * rect); +int U_WMRROUNDRECT_get(const char *contents, int16_t *Width, int16_t *Height, U_RECT16 * rect); +int U_WMRPATBLT_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cwh, uint32_t *dwRop3); int U_WMRSAVEDC_get(const char *contents); -int U_WMRSETPIXEL_get(const char *contents, PU_COLORREF Color, PU_POINT16 coord); -int U_WMROFFSETCLIPRGN_get(const char *contents, PU_POINT16 offset); -int U_WMRTEXTOUT_get(const char *contents, PU_POINT16 Dst, int16_t *Length, const char **string); -int U_WMRBITBLT_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cwh, PU_POINT16 Src, uint32_t *dwRop3, PU_BITMAP16 Bm16, const char **px); -int U_WMRSTRETCHBLT_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cDst, PU_POINT16 Src, PU_POINT16 cSrc, uint32_t *dwRop3, PU_BITMAP16 Bm16, const char **px); +int U_WMRSETPIXEL_get(const char *contents, U_COLORREF *Color, U_POINT16 * coord); +int U_WMROFFSETCLIPRGN_get(const char *contents, U_POINT16 * offset); +int U_WMRTEXTOUT_get(const char *contents, U_POINT16 * Dst, int16_t *Length, const char **string); +int U_WMRBITBLT_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cwh, U_POINT16 * Src, uint32_t *dwRop3, U_BITMAP16 *Bm16, const char **px); +int U_WMRSTRETCHBLT_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cDst, U_POINT16 * Src, U_POINT16 * cSrc, uint32_t *dwRop3, U_BITMAP16 *Bm16, const char **px); int U_WMRPOLYGON_get(const char *contents, uint16_t *Length, const char **Data); int U_WMRPOLYLINE_get(const char *contents, uint16_t *Length, const char **Data); int U_WMRESCAPE_get(const char *contents, uint16_t *Escape, uint16_t *Length, const char **Data); @@ -2274,15 +2445,15 @@ int U_WMRPAINTREGION_get(const char *contents, uint16_t *Region); int U_WMRSELECTCLIPREGION_get(const char *contents, uint16_t *Region); int U_WMRSELECTOBJECT_get(const char *contents, uint16_t *Object); int U_WMRSETTEXTALIGN_get(const char *contents, uint16_t *Mode); -int U_WMRDRAWTEXT_get(void); /* in Wine, not in WMF PDF. */ -int U_WMRCHORD_get(const char *contents, PU_POINT16 Radial1, PU_POINT16 Radial2, PU_RECT16 rect); +int U_WMRDRAWTEXT_get(void); /* in GDI and Wine, not in WMF manual. */ +int U_WMRCHORD_get(const char *contents, U_POINT16 * Radial1, U_POINT16 * Radial2, U_RECT16 * rect); int U_WMRSETMAPPERFLAGS_get(const char *contents, uint32_t *Mode); -int U_WMREXTTEXTOUT_get(const char *contents, PU_POINT16 Dst, int16_t *Length, uint16_t *Opts, const char **string, const int16_t **dx, PU_RECT16 rect); -int U_WMRSETDIBTODEV_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cwh, PU_POINT16 Src, uint16_t *cUsage, uint16_t *ScanCount, uint16_t *StartScan, const char **dib); +int U_WMREXTTEXTOUT_get(const char *contents, U_POINT16 * Dst, int16_t *Length, uint16_t *Opts, const char **string, const int16_t **dx, U_RECT16 * rect); +int U_WMRSETDIBTODEV_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cwh, U_POINT16 * Src, uint16_t *cUsage, uint16_t *ScanCount, uint16_t *StartScan, const char **dib); int U_WMRSELECTPALETTE_get(const char *contents, uint16_t *Palette); int U_WMRREALIZEPALETTE_get(const char *contents); -int U_WMRANIMATEPALETTE_get(const char *contents, PU_PALETTE Palette, const char **PalEntries); -int U_WMRSETPALENTRIES_get(const char *contents, PU_PALETTE Palette, const char **PalEntries); +int U_WMRANIMATEPALETTE_get(const char *contents, U_PALETTE *Palette, const char **PalEntries); +int U_WMRSETPALENTRIES_get(const char *contents, U_PALETTE *Palette, const char **PalEntries); int U_WMRPOLYPOLYGON_get(const char *contents, uint16_t *nPolys, const uint16_t **aPolyCounts, const char **Points); int U_WMRRESIZEPALETTE_get(const char *contents, uint16_t *Palette); int U_WMR3A_get(void); @@ -2291,15 +2462,15 @@ int U_WMR3C_get(void); int U_WMR3D_get(void); int U_WMR3E_get(void); int U_WMR3F_get(void); -int U_WMRDIBBITBLT_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cwh, PU_POINT16 Src, uint32_t *dwRop3, const char **dib); -int U_WMRDIBSTRETCHBLT_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cDst, PU_POINT16 Src, PU_POINT16 cSrc, uint32_t *dwRop3, const char **dib); +int U_WMRDIBBITBLT_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cwh, U_POINT16 * Src, uint32_t *dwRop3, const char **dib); +int U_WMRDIBSTRETCHBLT_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cDst, U_POINT16 * Src, U_POINT16 * cSrc, uint32_t *dwRop3, const char **dib); int U_WMRDIBCREATEPATTERNBRUSH_get(const char *contents, uint16_t *Style, uint16_t *cUsage, const char **Bm16, const char **dib); -int U_WMRSTRETCHDIB_get(const char *contents, PU_POINT16 Dst, PU_POINT16 cDst, PU_POINT16 Src, PU_POINT16 cSrc, uint16_t *cUsage, uint32_t *dwRop3, const char **dib); +int U_WMRSTRETCHDIB_get(const char *contents, U_POINT16 * Dst, U_POINT16 * cDst, U_POINT16 * Src, U_POINT16 * cSrc, uint16_t *cUsage, uint32_t *dwRop3, const char **dib); int U_WMR44_get(void); int U_WMR45_get(void); int U_WMR46_get(void); int U_WMR47_get(void); -int U_WMREXTFLOODFILL_get(const char *contents, uint16_t *Mode, PU_COLORREF Color, PU_POINT16 coord); +int U_WMREXTFLOODFILL_get(const char *contents, uint16_t *Mode, U_COLORREF *Color, U_POINT16 * coord); int U_WMR49_get(void); int U_WMR4A_get(void); int U_WMR4B_get(void); @@ -2474,15 +2645,16 @@ int U_WMRF3_get(void); int U_WMRF4_get(void); int U_WMRF5_get(void); int U_WMRF6_get(void); -int U_WMRCREATEPALETTE_get(const char *contents, PU_PALETTE Palette, const char **PalEntries); +int U_WMRCREATEPALETTE_get(const char *contents, U_PALETTE *Palette, const char **PalEntries); int U_WMRF8_get(void); -int U_WMRCREATEPATTERNBRUSH_get(const char *contents, PU_BITMAP16 Bm16, int *pasize, const char **Pattern); -int U_WMRCREATEPENINDIRECT_get(const char *contents, PU_PEN pen); +int U_WMRCREATEPATTERNBRUSH_get(const char *contents, U_BITMAP16 *Bm16, int *pasize, const char **Pattern); +int U_WMRCREATEPENINDIRECT_get(const char *contents, U_PEN *pen); int U_WMRCREATEFONTINDIRECT_get(const char *contents, const char **font); int U_WMRCREATEBRUSHINDIRECT_get(const char *contents, const char **brush); int U_WMRCREATEBITMAPINDIRECT_get(void); int U_WMRCREATEBITMAP_get(void); int U_WMRCREATEREGION_get(const char *contents, const char **Region); +//! \endcond #ifdef __cplusplus diff --git a/src/libuemf/uwmf_endian.c b/src/libuemf/uwmf_endian.c index e14c7aa77..6caa24d8f 100644 --- a/src/libuemf/uwmf_endian.c +++ b/src/libuemf/uwmf_endian.c @@ -1,5 +1,7 @@ /** - @file uwmf_endian.c Functions for Swaping WMF records + @file uwmf_endian.c + + @brief Functions for converting WMF records between Big Endian and Little Endian byte orders. */ /* @@ -23,7 +25,7 @@ extern "C" { #include "uwmf_endian.h" // hide almost everything in this file from Doxygen -//! @cond +//! \cond /* Prototypes for functions used here and defined in uemf_endian.c, but which are not supposed to be used in end user code. */ @@ -273,8 +275,6 @@ int wmfheader_swap( -// hide these from Doxygen -//! @cond /* ********************************************************************************************** These functions contain shared code used by various U_WMR*_Swap 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. @@ -327,9 +327,6 @@ void U_WMRCORE_U16_CR_2U16_swap(char *record, int torev){ U_swap2(record+off, 2); } - -//! @endcond - /* ********************************************************************************************** These are the core WMR functions, each creates a particular type of record. All return these records via a char* pointer, which is NULL if the call failed. @@ -1465,7 +1462,7 @@ void U_WMRCREATEREGION_swap(char *record, int torev){ U_WMRCORE_SIZE16_swap(record, torev); region_swap(record + offsetof(U_WMRCREATEREGION,region), torev); } -//! @endcond +//! \endcond /** \brief Convert an entire WMF in memory from Big Endian to Little Endian (or vice versa). diff --git a/src/libuemf/uwmf_endian.h b/src/libuemf/uwmf_endian.h index dc01c0d07..57fd4ae44 100644 --- a/src/libuemf/uwmf_endian.h +++ b/src/libuemf/uwmf_endian.h @@ -1,11 +1,13 @@ /** - @file uemf_endian.h Prototype for function for converting EMF records between Big Endian and Little Endian + @file uwmf_endian.h + + @brief Prototypes for functions for converting WMF records between Big Endian and Little Endian */ /* File: uwmf_endian.h -Version: 0.0.1 -Date: 10-JAN-2013 +Version: 0.0.2 +Date: 26-NOV-2013 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu Copyright: 2013 David Mathog and California Institute of Technology (Caltech) @@ -20,17 +22,10 @@ extern "C" { #include "uemf_endian.h" -/* There is no way for the preprocessor, in general, to figure out endianness. So the command line must define - WORDS_BIGENDIAN for a big endian machine. Otherwise we assume is is little endian. If it is something - else this code won't work in any case. */ -#ifdef WORDS_BIGENDIAN -#define U_BYTE_SWAP 1 -#else -#define U_BYTE_SWAP 0 -#endif - +//! \cond // prototypes int U_wmf_endian(char *contents, size_t length, int torev); +//! \endcond #ifdef __cplusplus } diff --git a/src/libuemf/uwmf_print.c b/src/libuemf/uwmf_print.c index d044cf9b6..d120a2da0 100644 --- a/src/libuemf/uwmf_print.c +++ b/src/libuemf/uwmf_print.c @@ -1,11 +1,13 @@ /** - @file uwmf_print.c Functions for printing WMF records + @file uwmf_print.c + + @brief Functions for printing WMF records */ /* File: uwmf_print.c -Version: 0.0.2 -Date: 18-FEB-2013 +Version: 0.0.3 +Date: 17-OCT-2013 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu Copyright: 2012 David Mathog and California Institute of Technology (Caltech) @@ -21,6 +23,10 @@ extern "C" { #include #include "uwmf_print.h" +//! \cond + +#define UNUSED(x) (void)(x) + /* ********************************************************************************************** These functions print standard objects used in the WMR records. The low level ones do not append EOL. @@ -112,7 +118,7 @@ void pltntry_print( \param PalEntries Array of Palette Entries */ void palette_print( - const PU_PALETTE p, + const U_PALETTE *p, const char *PalEntries ){ int i; @@ -374,8 +380,6 @@ int wmfheader_print( -// hide these from Doxygen -//! @cond /* ********************************************************************************************** These functions contain shared code used by various U_WMR*_print 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. @@ -395,8 +399,6 @@ void wcore_points_print(uint16_t nPoints, const char *aPoints){ -//! @endcond - /* ********************************************************************************************** These are the core WMR functions, each creates a particular type of record. All return these records via a char* pointer, which is NULL if the call failed. @@ -408,12 +410,12 @@ They are listed in order by the corresponding U_WMR_* index number. \param contents pointer to a buffer holding a WMR record */ void U_WMRNOTIMPLEMENTED_print(const char *contents){ - (void) contents; + UNUSED(contents); printf(" Not Implemented!\n"); } void U_WMREOF_print(const char *contents){ - (void) contents; + UNUSED(contents); } void U_WMRSETBKCOLOR_print(const char *contents){ @@ -449,7 +451,7 @@ void U_WMRSETROP2_print(const char *contents){ } void U_WMRSETRELABS_print(const char *contents){ - (void) contents; + UNUSED(contents); /* This record type has only the common 6 bytes, so nothing (else) to print */ } @@ -685,7 +687,7 @@ void U_WMRPATBLT_print(const char *contents){ } void U_WMRSAVEDC_print(const char *contents){ - (void) contents; + UNUSED(contents); /* This record type has only the common 6 bytes, so nothing (else) to print */ } @@ -790,7 +792,7 @@ void U_WMRESCAPE_print(const char *contents){ } void U_WMRRESTOREDC_print(const char *contents){ - (void) contents; + UNUSED(contents); /* This record type has only the common 6 bytes, so nothing (else) to print */ } @@ -933,7 +935,7 @@ void U_WMRSELECTPALETTE_print(const char *contents){ } void U_WMRREALIZEPALETTE_print(const char *contents){ - (void) contents; + UNUSED(contents); /* This record type has only the common 6 bytes, so nothing (else) to print */ } @@ -1324,6 +1326,8 @@ void U_WMRCREATEREGION_print(const char *contents){ } } +//! \endcond + /** \brief Print any record in a wmf \returns record length for a normal record, 0 for WMREOF, -1 for a bad record @@ -1347,11 +1351,11 @@ int U_wmf_onerec_print(const char *contents, const char *blimit, int recnum, siz iType = *(uint8_t *)(contents + offsetof(U_METARECORD, iType ) ); -#if 1 /* show record checksums, this is NOT portable, result changes with endian type, useful for debugging */ - printf("%-30srecord:%5d type:%3u offset:%8d size:%8u\n", +#if 1 + printf("%-30srecord:%5d type:%-4u offset:%8d rsize:%8u\n", U_wmr_names(iType), recnum, iType, (int) off, (int) size); -#else - printf("%-30srecord:%5d type:%3u offset:%8d size:%8u recchecksum:%u\n", +#else /* show record checksums, this is NOT portable, result changes with endian type, useful for debugging */ + printf("%-30srecord:%5d type:%-4u offset:%8d size:%8u recchecksum:%u\n", U_wmr_names(iType), recnum, iType, (int) off, (int) size, U_16_checksum((int16_t *)contents, size)); #endif diff --git a/src/libuemf/uwmf_print.h b/src/libuemf/uwmf_print.h index 31a8df5dc..8daee0feb 100644 --- a/src/libuemf/uwmf_print.h +++ b/src/libuemf/uwmf_print.h @@ -1,5 +1,7 @@ /** - @file uwmf_print.h Functions for printing records from WMF files. + @file uwmf_print.h + + @brief Prototypes for functions for printing records from WMF files. */ /* @@ -20,11 +22,12 @@ extern "C" { #include "uwmf.h" #include "uemf_print.h" +//! \cond /* prototypes for objects used in WMR records (other than those defined in uemf_print.h) */ void brush_print(U_BRUSH b); void font_print(const char *font); void pltntry_print(U_PLTNTRY pny); -void palette_print(const PU_PALETTE p, const char *PalEntries); +void palette_print(const U_PALETTE *p, const char *PalEntries); void pen_print(U_PEN p); void rect16_ltrb_print(U_RECT16 rect); void rect16_brtl_print(U_RECT16 rect); @@ -40,6 +43,7 @@ void dibheader_print(const void *dh); int wmfheader_print(const char *contents, const char *blimit); void U_WMRNOTIMPLEMENTED_print(const char *contents); int U_wmf_onerec_print(const char *contents, const char *blimit, int recnum, size_t off); +//! \endcond #ifdef __cplusplus } -- cgit v1.2.3 From 8ce1d4c9f4cad86fb0b1f63c6b25838c8c6d640d Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Fri, 17 Jan 2014 23:51:59 -0500 Subject: Fix missing embeded image condition, kindly caught by suv in bug #1270334 Fixed bugs: - https://launchpad.net/bugs/1270334 (bzr r12954) --- src/sp-image.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sp-image.cpp b/src/sp-image.cpp index f4995ce31..b08d6f9b0 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -340,13 +340,18 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { this->getRepr()->attribute("sodipodi:absref"), doc->getBase()); - if(filename && g_str_has_suffix(filename, ".svg")) { + Inkscape::Pixbuf::create_from_data_uri(filename); + if (strncmp (filename,"data:", 5) == 0) { + filename += 5; + pixbuf = Inkscape::Pixbuf::create_from_data_uri(filename); + } else if(filename && g_str_has_suffix(filename, ".svg")) { // TODO: We want to deal with svg images properly. This // space allows us to do so later. g_warning("Including svg images tags is not yet supported."); } else if (filename) { pixbuf = Inkscape::Pixbuf::create_from_file(filename); - } else { + } + if(!pixbuf) { /* Nope: We do not find any valid pixmap file :-( */ pixbuf = new Inkscape::Pixbuf( gdk_pixbuf_new_from_xpm_data((const gchar **) brokenimage_xpm)); @@ -671,7 +676,7 @@ gchar const *sp_image_repr_read_filename(gchar const *href, gchar const *absref, filename = g_filename_from_uri(filename, NULL, NULL); } else if (strncmp (filename,"data:",5) == 0) { /* data URI - embedded image */ - filename += 5; + return filename; } else if (!g_path_is_absolute (filename)) { /* try to load from relative pos combined with document base*/ const gchar *docbase = base; -- cgit v1.2.3 From eac3c11251e65774a2f4f610f2799592978487d8 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Sun, 19 Jan 2014 00:38:09 -0500 Subject: Try another fix for the undo when dragging bug #168695 Fixed bugs: - https://launchpad.net/bugs/168695 (bzr r12955) --- src/document-undo.cpp | 2 +- src/ui/tools/tool-base.cpp | 14 +++++++++++--- src/ui/tools/tool-base.h | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/document-undo.cpp b/src/document-undo.cpp index 312ccb7f8..bad4d6c81 100644 --- a/src/document-undo.cpp +++ b/src/document-undo.cpp @@ -242,7 +242,7 @@ gboolean Inkscape::DocumentUndo::undo(SPDocument *doc) g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_assert (doc->priv->sensitive); + g_return_val_if_fail (doc->priv->sensitive, FALSE); doc->priv->sensitive = FALSE; doc->priv->seeking = true; diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index 6c7867633..f8868ec0e 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -57,6 +57,7 @@ #include "shape-editor.h" #include "sp-guide.h" #include "color.h" +#include "document-undo.h" // globals for temporary switching to selector by space static bool selector_toggled = FALSE; @@ -977,9 +978,16 @@ gint sp_event_context_root_handler(ToolBase * event_context, gint sp_event_context_virtual_root_handler(ToolBase * event_context, GdkEvent * event) { gint ret = false; - if (event_context) { // If no event-context is available then do nothing, otherwise Inkscape would crash - // (see the comment in SPDesktop::set_event_context, and bug LP #622350) - //ret = (SP_EVENT_CONTEXT_CLASS(G_OBJECT_GET_CLASS(event_context)))->root_handler(event_context, event); + if (event_context) { + // We want to disable undo while we drag anything + SPDocument *document = sp_desktop_document(event_context->desktop); + if (event->type == GDK_BUTTON_PRESS) { + event_context->undo_sensitive = DocumentUndo::getUndoSensitive(document); + DocumentUndo::setUndoSensitive(document, false); + } else if (event->type == GDK_BUTTON_RELEASE) { + DocumentUndo::setUndoSensitive(document, event_context->undo_sensitive); + } + ret = event_context->root_handler(event); set_event_location(event_context->desktop, event); diff --git a/src/ui/tools/tool-base.h b/src/ui/tools/tool-base.h index 7ed5875b1..068bc6402 100644 --- a/src/ui/tools/tool-base.h +++ b/src/ui/tools/tool-base.h @@ -119,6 +119,7 @@ public: gint xp, yp; ///< where drag started gint tolerance; bool within_tolerance; ///< are we still within tolerance of origin + bool undo_sensitive; /// Was undo previously sensitive before drag SPItem *item_to_select; ///< the item where mouse_press occurred, to ///< be selected if this is a click not drag -- cgit v1.2.3 From e5feb4b17ce16b17ee7ff19188072c25c736bf90 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sun, 19 Jan 2014 07:43:14 -0500 Subject: fix scaling crash caused by negative stroke (Bug 1270464) Fixed bugs: - https://launchpad.net/bugs/1270464 (bzr r12956) --- src/sp-item-transform.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp index 9dbe412d7..854fb9cd7 100644 --- a/src/sp-item-transform.cpp +++ b/src/sp-item-transform.cpp @@ -110,6 +110,9 @@ Geom::Affine get_scale_transform_for_uniform_stroke(Geom::Rect const &bbox_visua // -> The width and height of the geometric bounding box will therefore be (w0 - 2*0.5*r0) and (h0 - 2*0.5*r0) // 4) If preserve transforms is true, then stroke_x != stroke_y, since these are the apparent stroke widths, after transforming + if ((stroke_x == Geom::infinity()) || (fabs(stroke_x) < 1e-6)) stroke_x = 0; + if ((stroke_y == Geom::infinity()) || (fabs(stroke_y) < 1e-6)) stroke_y = 0; + gdouble w0 = bbox_visual.width(); // will return a value >= 0, as required further down the road gdouble h0 = bbox_visual.height(); gdouble r0 = sqrt(stroke_x*stroke_y); // r0 is redundant, used only for those cases where stroke_x = stroke_y -- cgit v1.2.3 From 5b1689d145435a515d0affcd3b6f3b3ae0e18111 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 19 Jan 2014 16:25:49 +0100 Subject: LPE strings consistency fix. (bzr r12957) --- po/inkscape.pot | 90 ++++++++++++++++----------------- src/live_effects/lpe-angle_bisector.cpp | 2 +- src/live_effects/lpe-perp_bisector.cpp | 4 +- 3 files changed, 47 insertions(+), 49 deletions(-) diff --git a/po/inkscape.pot b/po/inkscape.pot index babc68422..2ed60009b 100644 --- a/po/inkscape.pot +++ b/po/inkscape.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-17 20:14+0100\n" +"POT-Creation-Date: 2014-01-19 16:23+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -6329,8 +6329,8 @@ msgstr "" #: ../src/extension/internal/cairo-ps-out.cpp:333 #: ../src/extension/internal/cairo-ps-out.cpp:372 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250 -#: ../src/extension/internal/emf-inout.cpp:3551 -#: ../src/extension/internal/wmf-inout.cpp:3236 +#: ../src/extension/internal/emf-inout.cpp:3520 +#: ../src/extension/internal/wmf-inout.cpp:3088 msgid "Convert texts to paths" msgstr "" @@ -6498,70 +6498,74 @@ msgstr "" msgid "Open presentation exchange files saved in Corel DRAW" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3535 +#: ../src/extension/internal/emf-inout.cpp:3504 msgid "EMF Input" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3540 +#: ../src/extension/internal/emf-inout.cpp:3509 msgid "Enhanced Metafiles (*.emf)" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3541 +#: ../src/extension/internal/emf-inout.cpp:3510 msgid "Enhanced Metafiles" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3549 +#: ../src/extension/internal/emf-inout.cpp:3518 msgid "EMF Output" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3552 -#: ../src/extension/internal/wmf-inout.cpp:3237 +#: ../src/extension/internal/emf-inout.cpp:3521 +#: ../src/extension/internal/wmf-inout.cpp:3089 msgid "Map Unicode to Symbol font" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3553 -#: ../src/extension/internal/wmf-inout.cpp:3238 +#: ../src/extension/internal/emf-inout.cpp:3522 +#: ../src/extension/internal/wmf-inout.cpp:3090 msgid "Map Unicode to Wingdings" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3554 -#: ../src/extension/internal/wmf-inout.cpp:3239 +#: ../src/extension/internal/emf-inout.cpp:3523 +#: ../src/extension/internal/wmf-inout.cpp:3091 msgid "Map Unicode to Zapf Dingbats" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3555 -#: ../src/extension/internal/wmf-inout.cpp:3240 +#: ../src/extension/internal/emf-inout.cpp:3524 +#: ../src/extension/internal/wmf-inout.cpp:3092 msgid "Use MS Unicode PUA (0xF020-0xF0FF) for converted characters" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3556 -#: ../src/extension/internal/wmf-inout.cpp:3241 +#: ../src/extension/internal/emf-inout.cpp:3525 +#: ../src/extension/internal/wmf-inout.cpp:3093 msgid "Compensate for PPT font bug" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3557 -#: ../src/extension/internal/wmf-inout.cpp:3242 +#: ../src/extension/internal/emf-inout.cpp:3526 +#: ../src/extension/internal/wmf-inout.cpp:3094 msgid "Convert dashed/dotted lines to single lines" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3558 -#: ../src/extension/internal/wmf-inout.cpp:3243 +#: ../src/extension/internal/emf-inout.cpp:3527 +#: ../src/extension/internal/wmf-inout.cpp:3095 msgid "Convert gradients to colored polygon series" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3559 +#: ../src/extension/internal/emf-inout.cpp:3528 +msgid "Use native rectangular linear gradients" +msgstr "" + +#: ../src/extension/internal/emf-inout.cpp:3529 msgid "Map all fill patterns to standard EMF hatches" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3560 +#: ../src/extension/internal/emf-inout.cpp:3530 msgid "Ignore image rotations" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3564 +#: ../src/extension/internal/emf-inout.cpp:3534 msgid "Enhanced Metafile (*.emf)" msgstr "" -#: ../src/extension/internal/emf-inout.cpp:3565 +#: ../src/extension/internal/emf-inout.cpp:3535 msgid "Enhanced Metafile" msgstr "" @@ -7072,7 +7076,7 @@ msgstr "" #: ../src/extension/internal/filter/bumps.h:322 #: ../src/extension/internal/filter/transparency.h:57 -#: ../src/filter-enums.cpp:29 ../src/sp-image.cpp:632 +#: ../src/filter-enums.cpp:29 ../src/sp-image.cpp:637 msgid "Image" msgstr "" @@ -8758,33 +8762,33 @@ msgstr "" msgid "Microsoft Visio 2013 drawing (*.vsdx)" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3220 +#: ../src/extension/internal/wmf-inout.cpp:3072 msgid "WMF Input" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3225 +#: ../src/extension/internal/wmf-inout.cpp:3077 msgid "Windows Metafiles (*.wmf)" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3226 +#: ../src/extension/internal/wmf-inout.cpp:3078 msgid "Windows Metafiles" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3234 +#: ../src/extension/internal/wmf-inout.cpp:3086 msgid "WMF Output" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3244 +#: ../src/extension/internal/wmf-inout.cpp:3096 msgid "Map all fill patterns to standard WMF hatches" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3248 +#: ../src/extension/internal/wmf-inout.cpp:3100 #: ../share/extensions/wmf_input.inx.h:2 #: ../share/extensions/wmf_output.inx.h:2 msgid "Windows Metafile (*.wmf)" msgstr "" -#: ../src/extension/internal/wmf-inout.cpp:3249 +#: ../src/extension/internal/wmf-inout.cpp:3101 msgid "Windows Metafile" msgstr "" @@ -10124,11 +10128,13 @@ msgid "Specifies the right end of the bisector" msgstr "" #: ../src/live_effects/lpe-angle_bisector.cpp:86 +#: ../src/live_effects/lpe-perp_bisector.cpp:159 msgid "Adjust the \"left\" end of the bisector" msgstr "" #: ../src/live_effects/lpe-angle_bisector.cpp:92 -msgid "Adjust the \"right\" of the bisector" +#: ../src/live_effects/lpe-perp_bisector.cpp:165 +msgid "Adjust the \"right\" end of the bisector" msgstr "" #: ../src/live_effects/lpe-bendpath.cpp:53 @@ -10938,14 +10944,6 @@ msgstr "" msgid "Fuse ends closer than this number. 0 means don't fuse." msgstr "" -#: ../src/live_effects/lpe-perp_bisector.cpp:159 -msgid "Adjust the bisector's \"left\" end" -msgstr "" - -#: ../src/live_effects/lpe-perp_bisector.cpp:165 -msgid "Adjust the bisector's \"right\" end" -msgstr "" - #. initialise your parameters here: #: ../src/live_effects/lpe-perspective_path.cpp:47 msgid "Scale x" @@ -13171,16 +13169,16 @@ msgstr "" msgid "at %d degrees, through (%s,%s)" msgstr "" -#: ../src/sp-image.cpp:640 +#: ../src/sp-image.cpp:645 msgid "embedded" msgstr "" -#: ../src/sp-image.cpp:648 +#: ../src/sp-image.cpp:653 #, c-format msgid "[bad reference]: %s" msgstr "" -#: ../src/sp-image.cpp:649 +#: ../src/sp-image.cpp:654 #, c-format msgid "%d × %d: %s" msgstr "" @@ -22752,7 +22750,7 @@ msgstr[1] "" msgid "Type text" msgstr "" -#: ../src/ui/tools/tool-base.cpp:697 +#: ../src/ui/tools/tool-base.cpp:698 msgid "Space+mouse move to pan canvas" msgstr "" diff --git a/src/live_effects/lpe-angle_bisector.cpp b/src/live_effects/lpe-angle_bisector.cpp index 2f57b710b..1acf9605f 100644 --- a/src/live_effects/lpe-angle_bisector.cpp +++ b/src/live_effects/lpe-angle_bisector.cpp @@ -89,7 +89,7 @@ LPEAngleBisector::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *deskt { KnotHolderEntity *e = new AB::KnotHolderEntityRightEnd(this); e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, - _("Adjust the \"right\" of the bisector") ); + _("Adjust the \"right\" end of the bisector") ); knotholder->add(e); } }; diff --git a/src/live_effects/lpe-perp_bisector.cpp b/src/live_effects/lpe-perp_bisector.cpp index c2a25a187..feed55b26 100644 --- a/src/live_effects/lpe-perp_bisector.cpp +++ b/src/live_effects/lpe-perp_bisector.cpp @@ -156,13 +156,13 @@ LPEPerpBisector::addKnotHolderEntities(KnotHolder *knotholder, SPDesktop *deskto { KnotHolderEntity *e = new PB::KnotHolderEntityLeftEnd(this); e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, - _("Adjust the bisector's \"left\" end") ); + _("Adjust the \"left\" end of the bisector") ); knotholder->add(e); } { KnotHolderEntity *e = new PB::KnotHolderEntityRightEnd(this); e->create( desktop, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, - _("Adjust the bisector's \"right\" end") ); + _("Adjust the \"right\" end of the bisector") ); knotholder->add(e); } }; -- cgit v1.2.3 From 367d97e047f3b1e1fe544efb7f15061d1e83fbf0 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 19 Jan 2014 16:48:47 +0100 Subject: i18n. No need to translate strings with one single space. (bzr r12958) --- po/inkscape.pot | 6 +----- src/ui/dialog/template-widget.cpp | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/po/inkscape.pot b/po/inkscape.pot index 2ed60009b..e80e0622b 100644 --- a/po/inkscape.pot +++ b/po/inkscape.pot @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-19 16:23+0100\n" +"POT-Creation-Date: 2014-01-19 16:41+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20981,10 +20981,6 @@ msgstr "" msgid "More info" msgstr "" -#: ../src/ui/dialog/template-widget.cpp:37 -msgid " " -msgstr "" - #: ../src/ui/dialog/template-widget.cpp:38 msgid "no template selected" msgstr "" diff --git a/src/ui/dialog/template-widget.cpp b/src/ui/dialog/template-widget.cpp index d1697244e..d8e6f9b4f 100644 --- a/src/ui/dialog/template-widget.cpp +++ b/src/ui/dialog/template-widget.cpp @@ -34,7 +34,7 @@ namespace UI { TemplateWidget::TemplateWidget() : _more_info_button(_("More info")) - , _short_description_label(_(" ")) + , _short_description_label(" ") , _template_name_label(_("no template selected")) , _effect_prefs(NULL) { -- cgit v1.2.3 From 9f50a2b092e521634ceec0a9b06369d6a04708b2 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Sun, 19 Jan 2014 16:18:27 -0500 Subject: Allow undo methods to survive a non-sensitive call. (bzr r12959) --- src/document-undo.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/document-undo.cpp b/src/document-undo.cpp index bad4d6c81..4a4156a70 100644 --- a/src/document-undo.cpp +++ b/src/document-undo.cpp @@ -155,7 +155,7 @@ void Inkscape::DocumentUndo::maybeDone(SPDocument *doc, const gchar *key, const { g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_assert (doc->priv->sensitive); + g_return_if_fail(doc->priv->sensitive); if ( key && !*key ) { g_warning("Blank undo key specified."); } @@ -204,7 +204,7 @@ void Inkscape::DocumentUndo::cancel(SPDocument *doc) { g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_assert (doc->priv->sensitive); + g_return_if_fail(doc->priv->sensitive); sp_repr_rollback (doc->rdoc); @@ -287,7 +287,7 @@ gboolean Inkscape::DocumentUndo::redo(SPDocument *doc) g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_assert (doc->priv->sensitive); + g_return_val_if_fail(doc->priv->sensitive, FALSE); doc->priv->sensitive = FALSE; doc->priv->seeking = true; -- cgit v1.2.3 From cca2c219973a60fb6535836559aa42ec2b9cb630 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Sun, 19 Jan 2014 20:30:15 -0500 Subject: Revert changes from r12959 and r12955, impliment new stratedgy to fix bug #168695 Fixed bugs: - https://launchpad.net/bugs/168695 (bzr r12960) --- src/document-undo.cpp | 8 ++++---- src/selection-chemistry.cpp | 6 ++++++ src/ui/tools/tool-base.cpp | 16 ++++++---------- src/ui/tools/tool-base.h | 3 ++- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/document-undo.cpp b/src/document-undo.cpp index 4a4156a70..39c8a04a0 100644 --- a/src/document-undo.cpp +++ b/src/document-undo.cpp @@ -155,7 +155,7 @@ void Inkscape::DocumentUndo::maybeDone(SPDocument *doc, const gchar *key, const { g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_return_if_fail(doc->priv->sensitive); + g_assert (doc->priv->sensitive); if ( key && !*key ) { g_warning("Blank undo key specified."); } @@ -204,7 +204,7 @@ void Inkscape::DocumentUndo::cancel(SPDocument *doc) { g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_return_if_fail(doc->priv->sensitive); + g_assert (doc->priv->sensitive); sp_repr_rollback (doc->rdoc); @@ -242,7 +242,7 @@ gboolean Inkscape::DocumentUndo::undo(SPDocument *doc) g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_return_val_if_fail (doc->priv->sensitive, FALSE); + g_assert (doc->priv->sensitive); doc->priv->sensitive = FALSE; doc->priv->seeking = true; @@ -287,7 +287,7 @@ gboolean Inkscape::DocumentUndo::redo(SPDocument *doc) g_assert (doc != NULL); g_assert (doc->priv != NULL); - g_return_val_if_fail(doc->priv->sensitive, FALSE); + g_assert (doc->priv->sensitive); doc->priv->sensitive = FALSE; doc->priv->seeking = true; diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index f9649d62f..1957b9297 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1083,6 +1083,9 @@ void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *des void sp_undo(SPDesktop *desktop, SPDocument *) { + // No re/undo while dragging, too dangerous. + if(desktop->getEventContext()->is_dragging) return; + if (!DocumentUndo::undo(sp_desktop_document(desktop))) { desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to undo.")); } @@ -1091,6 +1094,9 @@ sp_undo(SPDesktop *desktop, SPDocument *) void sp_redo(SPDesktop *desktop, SPDocument *) { + // No re/undo while dragging, too dangerous. + if(desktop->getEventContext()->is_dragging) return; + if (!DocumentUndo::redo(sp_desktop_document(desktop))) { desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to redo.")); } diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index f8868ec0e..3b51147e0 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -57,7 +57,6 @@ #include "shape-editor.h" #include "sp-guide.h" #include "color.h" -#include "document-undo.h" // globals for temporary switching to selector by space static bool selector_toggled = FALSE; @@ -99,6 +98,7 @@ ToolBase::ToolBase() { this->hot_x = 0; this->yp = 0; this->within_tolerance = false; + this->is_dragging = false; this->tolerance = 0; //this->key = 0; this->item_to_select = 0; @@ -979,18 +979,14 @@ gint sp_event_context_root_handler(ToolBase * event_context, gint sp_event_context_virtual_root_handler(ToolBase * event_context, GdkEvent * event) { gint ret = false; if (event_context) { - // We want to disable undo while we drag anything - SPDocument *document = sp_desktop_document(event_context->desktop); - if (event->type == GDK_BUTTON_PRESS) { - event_context->undo_sensitive = DocumentUndo::getUndoSensitive(document); - DocumentUndo::setUndoSensitive(document, false); - } else if (event->type == GDK_BUTTON_RELEASE) { - DocumentUndo::setUndoSensitive(document, event_context->undo_sensitive); - } + if(event->type == GDK_BUTTON_PRESS) + event_context->is_dragging = true; ret = event_context->root_handler(event); - set_event_location(event_context->desktop, event); + + if(event->type == GDK_BUTTON_RELEASE) + event_context->is_dragging = false; } return ret; } diff --git a/src/ui/tools/tool-base.h b/src/ui/tools/tool-base.h index 068bc6402..ab8bd8caa 100644 --- a/src/ui/tools/tool-base.h +++ b/src/ui/tools/tool-base.h @@ -118,8 +118,9 @@ public: gint xp, yp; ///< where drag started gint tolerance; + bool is_dragging; // Is a tool currently dragging something + bool within_tolerance; ///< are we still within tolerance of origin - bool undo_sensitive; /// Was undo previously sensitive before drag SPItem *item_to_select; ///< the item where mouse_press occurred, to ///< be selected if this is a click not drag -- cgit v1.2.3 From 73317394a0079e3602e6c596f8d2a249d5b4a114 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Mon, 20 Jan 2014 19:06:46 +0100 Subject: Fix for bug #1270287 (The toolbox buttons toggle between being pressed and released). Fixed bugs: - https://launchpad.net/bugs/1270287 (bzr r12961) --- src/desktop.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/desktop.cpp b/src/desktop.cpp index bf3b70d43..364b5e930 100644 --- a/src/desktop.cpp +++ b/src/desktop.cpp @@ -668,6 +668,7 @@ void SPDesktop::set_event_context2(const std::string& toolName) old_tool->finish(); delete old_tool; } else { + _event_context_changed_signal.emit(this, event_context); return; } } -- cgit v1.2.3 From 2b7b25b3fa3c3ea0addb283a38f3c0a0fb45e8df Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Mon, 20 Jan 2014 20:56:14 +0100 Subject: Dutch translation update (bzr r12962) --- po/nl.po | 4860 +++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 3397 insertions(+), 1463 deletions(-) diff --git a/po/nl.po b/po/nl.po index 103c5ad86..9bcb5d711 100644 --- a/po/nl.po +++ b/po/nl.po @@ -7,7 +7,7 @@ # Foppe Benedictus , 2007-2009. # Myckel Habets , 2008 # Benno Schulenberg , 2008. -# Kris De Gussem , 2008-2013. +# Kris De Gussem , 2008-2014. # # *** Stuur een mailtje naar # *** voordat je met dit bestand aan de slag gaat, @@ -49,6 +49,7 @@ # saturation - verzadiging # stroke - lijn, omlijning # swatch - palet +# template - sjabloon # tile - tegel # to tweak / tweak context - retoucheren # Tool Controls bar - Gereedschapsdetailsbalk @@ -57,8 +58,8 @@ msgid "" msgstr "" "Project-Id-Version: inkscape 0.49\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2014-01-07 16:33+0100\n" -"PO-Revision-Date: 2014-01-09 22:49+0100\n" +"POT-Creation-Date: 2014-01-19 16:41+0100\n" +"PO-Revision-Date: 2014-01-19 22:01+0100\n" "Last-Translator: Kris De Gussem \n" "Language-Team: Dutch\n" "MIME-Version: 1.0\n" @@ -83,7 +84,7 @@ msgstr "Inkscape vector tekenpakket" #: ../inkscape.desktop.in.h:4 msgid "Create and edit Scalable Vector Graphics images" -msgstr "SVG-afbeeldingen (Scalable Vector Graphics) maken en bewerken" +msgstr "Scalable Vector Graphics-afbeeldingen maken en bewerken" #: ../inkscape.desktop.in.h:5 msgid "New Drawing" @@ -288,7 +289,7 @@ msgstr "Olieverfschilderij" #: ../src/extension/internal/filter/paint.h:877 #: ../src/extension/internal/filter/paint.h:981 msgid "Image Paint and Draw" -msgstr "Afbeelding verven en tekenen" +msgstr "Verven en tekenen" #: ../share/filters/filters.svg.h:1 msgid "Simulate oil painting style" @@ -824,7 +825,7 @@ msgstr "Verdwijnend" #: ../share/filters/filters.svg.h:1 msgid "Blur the contents of objects, preserving the outline and adding progressive transparency at edges" -msgstr "De inhoud van objecten vervagen met behoud van contouren en toevoeging van toenemende transparantie aan de randen" +msgstr "Objectinhoud vervagen met behoud van contouren en met toenemende transparantie aan de randen" #: ../share/filters/filters.svg.h:1 msgid "Chalk and Sponge" @@ -1026,13 +1027,13 @@ msgstr "Zwart licht" #: ../src/ui/dialog/clonetiler.cpp:832 #: ../src/ui/dialog/clonetiler.cpp:983 #: ../src/ui/dialog/document-properties.cpp:154 -#: ../share/extensions/color_HSL_adjust.inx.h:20 #: ../share/extensions/color_blackandwhite.inx.h:2 #: ../share/extensions/color_brighter.inx.h:2 #: ../share/extensions/color_custom.inx.h:15 #: ../share/extensions/color_darker.inx.h:2 #: ../share/extensions/color_desaturate.inx.h:2 #: ../share/extensions/color_grayscale.inx.h:2 +#: ../share/extensions/color_HSL_adjust.inx.h:20 #: ../share/extensions/color_lesshue.inx.h:2 #: ../share/extensions/color_lesslight.inx.h:2 #: ../share/extensions/color_lesssaturation.inx.h:2 @@ -3256,262 +3257,2187 @@ msgstr "Kledij (bitmap)" msgid "Old paint (bitmap)" msgstr "Olieverfschilderij (bitmap)" -#. 3D box -#: ../src/box3d.cpp:259 -#: ../src/box3d.cpp:1329 -#: ../src/ui/dialog/inkscape-preferences.cpp:398 -msgid "3D Box" -msgstr "3D-kubus" +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:2 +msgctxt "Symbol" +msgid "AIGA Symbol Signs" +msgstr "AIGA symbolen" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:3 +#: ../share/symbols/symbols.h:4 +msgctxt "Symbol" +msgid "Telephone" +msgstr "Telefoon" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:5 +#: ../share/symbols/symbols.h:6 +msgctxt "Symbol" +msgid "Mail" +msgstr "Post" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:7 +#: ../share/symbols/symbols.h:8 +msgctxt "Symbol" +msgid "Currency Exchange" +msgstr "Wisselkantoor" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:9 +#: ../share/symbols/symbols.h:10 +msgctxt "Symbol" +msgid "Currency Exchange - Euro" +msgstr "Wisselkantoor - Euro" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:11 +#: ../share/symbols/symbols.h:12 +msgctxt "Symbol" +msgid "Cashier" +msgstr "Kassa" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:13 +#: ../share/symbols/symbols.h:14 +msgctxt "Symbol" +msgid "First Aid" +msgstr "Eerste hulp" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:15 +#: ../share/symbols/symbols.h:16 +msgctxt "Symbol" +msgid "Lost and Found" +msgstr "Verloren voorwerpen" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:17 +#: ../share/symbols/symbols.h:18 +msgctxt "Symbol" +msgid "Coat Check" +msgstr "Vestiaire" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:19 +#: ../share/symbols/symbols.h:20 +msgctxt "Symbol" +msgid "Bagage Lockers" +msgstr "Lockers" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:21 +#: ../share/symbols/symbols.h:22 +msgctxt "Symbol" +msgid "Escalator" +msgstr "Roltrap" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:23 +#: ../share/symbols/symbols.h:24 +msgctxt "Symbol" +msgid "Escalator Down" +msgstr "Roltrap omlaag" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:25 +#: ../share/symbols/symbols.h:26 +msgctxt "Symbol" +msgid "Escalator Up" +msgstr "Roltrap omhoog" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:27 +#: ../share/symbols/symbols.h:28 +msgctxt "Symbol" +msgid "Stairs" +msgstr "Trappen" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:29 +#: ../share/symbols/symbols.h:30 +msgctxt "Symbol" +msgid "Stairs Down" +msgstr "Trappen omlaag" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:31 +#: ../share/symbols/symbols.h:32 +msgctxt "Symbol" +msgid "Stairs Up" +msgstr "Trappen omhoog" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:33 +#: ../share/symbols/symbols.h:34 +msgctxt "Symbol" +msgid "Elevator" +msgstr "Lift" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:35 +#: ../share/symbols/symbols.h:36 +msgctxt "Symbol" +msgid "Toilets - Men" +msgstr "WC - mannen" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:37 +#: ../share/symbols/symbols.h:38 +msgctxt "Symbol" +msgid "Toilets - Women" +msgstr "WC - vrouwen" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:39 +#: ../share/symbols/symbols.h:40 +msgctxt "Symbol" +msgid "Toilets" +msgstr "WC" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:41 +#: ../share/symbols/symbols.h:42 +#: ../share/symbols/symbols.h:217 +msgctxt "Symbol" +msgid "Nursery" +msgstr "Kinderruimte" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:43 +#: ../share/symbols/symbols.h:44 +msgctxt "Symbol" +msgid "Drinking Fountain" +msgstr "Drinkwaterfontein" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:45 +#: ../share/symbols/symbols.h:46 +msgctxt "Symbol" +msgid "Waiting Room" +msgstr "Wachtzaal" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:47 +#: ../share/symbols/symbols.h:48 +msgctxt "Symbol" +msgid "Information" +msgstr "Informatie" -#: ../src/color-profile.cpp:850 -#, c-format -msgid "Color profiles directory (%s) is unavailable." -msgstr "Kleurprofielenmap (%s) is niet beschikbaar." +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:49 +#: ../share/symbols/symbols.h:50 +msgctxt "Symbol" +msgid "Hotel Information" +msgstr "Hotelinformatie" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:51 +#: ../share/symbols/symbols.h:52 +msgctxt "Symbol" +msgid "Air Transportation" +msgstr "Luchtvervoer" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:53 +#: ../share/symbols/symbols.h:54 +#: ../share/symbols/symbols.h:308 +msgctxt "Symbol" +msgid "Heliport" +msgstr "Helihaven" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:55 +#: ../share/symbols/symbols.h:56 +#: ../share/symbols/symbols.h:304 +msgctxt "Symbol" +msgid "Taxi" +msgstr "Taxi" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:57 +#: ../share/symbols/symbols.h:58 +msgctxt "Symbol" +msgid "Bus" +msgstr "Bus" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:59 +#: ../share/symbols/symbols.h:60 +msgctxt "Symbol" +msgid "Ground Transportation" +msgstr "Vervoer over grond" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:61 +#: ../share/symbols/symbols.h:62 +msgctxt "Symbol" +msgid "Rail Transportation" +msgstr "Spoorwegvervoer" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:63 +#: ../share/symbols/symbols.h:64 +msgctxt "Symbol" +msgid "Water Transportation" +msgstr "Vervoer over water" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:65 +#: ../share/symbols/symbols.h:66 +#: ../share/symbols/symbols.h:306 +msgctxt "Symbol" +msgid "Car Rental" +msgstr "Autoverhuur" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:67 +#: ../share/symbols/symbols.h:68 +#: ../share/symbols/symbols.h:218 +msgctxt "Symbol" +msgid "Restaurant" +msgstr "Restaurant" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:69 +#: ../share/symbols/symbols.h:70 +msgctxt "Symbol" +msgid "Coffeeshop" +msgstr "Koffiebar" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:71 +#: ../share/symbols/symbols.h:72 +msgctxt "Symbol" +msgid "Bar" +msgstr "Bar" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:73 +#: ../share/symbols/symbols.h:74 +msgctxt "Symbol" +msgid "Shops" +msgstr "Winkels" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:75 +#: ../share/symbols/symbols.h:76 +msgctxt "Symbol" +msgid "Barber Shop - Beauty Salon" +msgstr "Barbier - schoonheidssalon" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:77 +#: ../share/symbols/symbols.h:78 +msgctxt "Symbol" +msgid "Barber Shop" +msgstr "Barbier" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:79 +#: ../share/symbols/symbols.h:80 +msgctxt "Symbol" +msgid "Beauty Salon" +msgstr "Schoonheidssalon" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:81 +#: ../share/symbols/symbols.h:82 +msgctxt "Symbol" +msgid "Ticket Purchase" +msgstr "Ticketbalie" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:83 +#: ../share/symbols/symbols.h:84 +msgctxt "Symbol" +msgid "Baggage Check In" +msgstr "Incheckbalie" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:85 +#: ../share/symbols/symbols.h:86 +msgctxt "Symbol" +msgid "Baggage Claim" +msgstr "Baggageophaling" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:87 +#: ../share/symbols/symbols.h:88 +msgctxt "Symbol" +msgid "Customs" +msgstr "Douane" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:89 +#: ../share/symbols/symbols.h:90 +msgctxt "Symbol" +msgid "Immigration" +msgstr "Immigratie" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:91 +#: ../share/symbols/symbols.h:92 +msgctxt "Symbol" +msgid "Departing Flights" +msgstr "Vertrekkende vluchten" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:93 +#: ../share/symbols/symbols.h:94 +msgctxt "Symbol" +msgid "Arriving Flights" +msgstr "Toekomende vluchten" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:95 +#: ../share/symbols/symbols.h:96 +msgctxt "Symbol" +msgid "Smoking" +msgstr "Rokers" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:97 +#: ../share/symbols/symbols.h:98 +msgctxt "Symbol" +msgid "No Smoking" +msgstr "Niet rokers" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:99 +#: ../share/symbols/symbols.h:100 +#: ../share/symbols/symbols.h:315 +msgctxt "Symbol" +msgid "Parking" +msgstr "Parking" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:101 +#: ../share/symbols/symbols.h:102 +msgctxt "Symbol" +msgid "No Parking" +msgstr "Geen parking" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:103 +#: ../share/symbols/symbols.h:104 +msgctxt "Symbol" +msgid "No Dogs" +msgstr "Geen honden" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:105 +#: ../share/symbols/symbols.h:106 +msgctxt "Symbol" +msgid "No Entry" +msgstr "Geen toegang" + +#. Symbols: ./AigaSymbols.svg +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:107 +#: ../share/symbols/symbols.h:108 +#: ../share/symbols/symbols.h:208 +msgctxt "Symbol" +msgid "Exit" +msgstr "Uitgang" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:109 +#: ../share/symbols/symbols.h:110 +msgctxt "Symbol" +msgid "Fire Extinguisher" +msgstr "Brandblusser" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:111 +#: ../share/symbols/symbols.h:112 +msgctxt "Symbol" +msgid "Right Arrow" +msgstr "Pijl rechts" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:113 +#: ../share/symbols/symbols.h:114 +msgctxt "Symbol" +msgid "Forward and Right Arrow" +msgstr "Pijl rechtsboven" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:115 +#: ../share/symbols/symbols.h:116 +msgctxt "Symbol" +msgid "Up Arrow" +msgstr "Pijl omhoog" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:117 +#: ../share/symbols/symbols.h:118 +msgctxt "Symbol" +msgid "Forward and Left Arrow" +msgstr "Pijl linksboven" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:119 +#: ../share/symbols/symbols.h:120 +msgctxt "Symbol" +msgid "Left Arrow" +msgstr "Pijl links" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:121 +#: ../share/symbols/symbols.h:122 +msgctxt "Symbol" +msgid "Left and Down Arrow" +msgstr "Pijl linksonder" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:123 +#: ../share/symbols/symbols.h:124 +msgctxt "Symbol" +msgid "Down Arrow" +msgstr "Pijl omlaag" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:125 +#: ../share/symbols/symbols.h:126 +msgctxt "Symbol" +msgid "Right and Down Arrow" +msgstr "Pijl rechtsonder" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:127 +#: ../share/symbols/symbols.h:128 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessable - 1996" +msgstr "Toegankelijk voor rolstoelgebruikers - 1996" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:129 +#: ../share/symbols/symbols.h:130 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessable" +msgstr "Toegankelijk voor rolstoelgebruikers" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:131 +#: ../share/symbols/symbols.h:132 +msgctxt "Symbol" +msgid "New Wheelchair Accessable" +msgstr "Toegankelijk voor rolstoelgebruikers, nieuw" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:133 +msgctxt "Symbol" +msgid "Word Balloons" +msgstr "Tekstballonnen" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:134 +msgctxt "Symbol" +msgid "Thought Balloon" +msgstr "" -#: ../src/color-profile.cpp:909 -#: ../src/color-profile.cpp:926 -msgid "(invalid UTF-8 string)" -msgstr "(ongeldige UTF-8 string)" +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:135 +msgctxt "Symbol" +msgid "Dream Speaking" +msgstr "" -#: ../src/color-profile.cpp:911 -#: ../src/filter-enums.cpp:119 -#: ../src/live_effects/lpe-ruler.cpp:32 -#: ../src/ui/dialog/filter-effects-dialog.cpp:518 -#: ../src/ui/dialog/inkscape-preferences.cpp:332 -#: ../src/ui/dialog/inkscape-preferences.cpp:641 -#: ../src/ui/dialog/inkscape-preferences.cpp:1259 -#: ../src/ui/dialog/inkscape-preferences.cpp:1830 -#: ../src/ui/dialog/input.cpp:742 -#: ../src/ui/dialog/input.cpp:743 -#: ../src/ui/dialog/input.cpp:1571 -#: ../src/ui/dialog/input.cpp:1625 -#: ../src/verbs.cpp:2352 -#: ../src/widgets/gradient-toolbar.cpp:1130 -#: ../src/widgets/pencil-toolbar.cpp:184 -#: ../src/widgets/stroke-marker-selector.cpp:388 -#: ../share/extensions/gcodetools_area.inx.h:48 -#: ../share/extensions/gcodetools_dxf_points.inx.h:20 -#: ../share/extensions/gcodetools_engraving.inx.h:26 -#: ../share/extensions/gcodetools_graffiti.inx.h:37 -#: ../share/extensions/gcodetools_lathe.inx.h:41 -#: ../share/extensions/gcodetools_path_to_gcode.inx.h:30 -#: ../share/extensions/grid_polar.inx.h:4 -#: ../share/extensions/plotter.inx.h:15 -#: ../share/extensions/scour.inx.h:18 -msgid "None" -msgstr "Geen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:136 +msgctxt "Symbol" +msgid "Flow Chart Shapes" +msgstr "" -#: ../src/context-fns.cpp:36 -#: ../src/context-fns.cpp:65 -msgid "Current layer is hidden. Unhide it to be able to draw on it." -msgstr "De huidige laag is verborgen. Toon deze om er op te kunnen tekenen." +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:137 +msgctxt "Symbol" +msgid "Process" +msgstr "" -#: ../src/context-fns.cpp:42 -#: ../src/context-fns.cpp:71 -msgid "Current layer is locked. Unlock it to be able to draw on it." -msgstr "De huidige laag is vergrendeld. Ontgrendel deze om er op te kunnen tekenen." +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:138 +msgctxt "Symbol" +msgid "Predefined Process" +msgstr "" -#: ../src/desktop-events.cpp:225 -msgid "Create guide" -msgstr "Hulplijn maken" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:139 +msgctxt "Symbol" +msgid "Alternate Process" +msgstr "" -#: ../src/desktop-events.cpp:470 -msgid "Move guide" -msgstr "Hulplijn verplaatsen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:140 +msgctxt "Symbol" +msgid "Extract" +msgstr "" -#: ../src/desktop-events.cpp:477 -#: ../src/desktop-events.cpp:535 -#: ../src/ui/dialog/guides.cpp:144 -msgid "Delete guide" -msgstr "Hulplijn verwijderen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:141 +msgctxt "Symbol" +msgid "Manual Input" +msgstr "" -#: ../src/desktop-events.cpp:515 -#, c-format -msgid "Guideline: %s" -msgstr "Hulplijn: %s" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:142 +msgctxt "Symbol" +msgid "Merge" +msgstr "Samenvoegen" -#: ../src/desktop.cpp:852 -msgid "No previous zoom." -msgstr "Er is geen vorige zoom." +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:143 +msgctxt "Symbol" +msgid "Delay" +msgstr "" -#: ../src/desktop.cpp:873 -msgid "No next zoom." -msgstr "Er is geen volgende zoom." +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:144 +msgctxt "Symbol" +msgid "Data I/O" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:317 -#: ../src/display/canvas-grid.cpp:693 -msgid "Grid _units:" -msgstr "Raster_eenheid:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:145 +msgctxt "Symbol" +msgid "Internal Storage" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:319 -#: ../src/display/canvas-grid.cpp:695 -msgid "_Origin X:" -msgstr "X-_oorsprong:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:146 +msgctxt "Symbol" +msgid "Card" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:319 -#: ../src/display/canvas-grid.cpp:695 -#: ../src/ui/dialog/inkscape-preferences.cpp:735 -#: ../src/ui/dialog/inkscape-preferences.cpp:760 -msgid "X coordinate of grid origin" -msgstr "X-coördinaat vanaf de rasteroorsprong" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:147 +msgctxt "Symbol" +msgid "Document" +msgstr "Document" -#: ../src/display/canvas-axonomgrid.cpp:321 -#: ../src/display/canvas-grid.cpp:697 -msgid "O_rigin Y:" -msgstr "Y-oo_rsprong:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:148 +msgctxt "Symbol" +msgid "Direct Access Storage" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:321 -#: ../src/display/canvas-grid.cpp:697 -#: ../src/ui/dialog/inkscape-preferences.cpp:736 -#: ../src/ui/dialog/inkscape-preferences.cpp:761 -msgid "Y coordinate of grid origin" -msgstr "Y-coördinaat vanaf de rasteroorsprong" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:149 +msgctxt "Symbol" +msgid "Stored Data" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:323 -#: ../src/display/canvas-grid.cpp:701 -msgid "Spacing _Y:" -msgstr "_Y-tussenafstand:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:150 +msgctxt "Symbol" +msgid "Magnetic Disk (Database)" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:323 -#: ../src/ui/dialog/inkscape-preferences.cpp:764 -msgid "Base length of z-axis" -msgstr "Basislengte van z-as" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:151 +msgctxt "Symbol" +msgid "Punched Tape" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:325 -#: ../src/ui/dialog/inkscape-preferences.cpp:767 -#: ../src/widgets/box3d-toolbar.cpp:315 -msgid "Angle X:" -msgstr "X-hoek:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:152 +msgctxt "Symbol" +msgid "Terminator" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:325 -#: ../src/ui/dialog/inkscape-preferences.cpp:767 -msgid "Angle of x-axis" -msgstr "Hoek van de x-as" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:153 +msgctxt "Symbol" +msgid "Thick Arrow" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:327 -#: ../src/ui/dialog/inkscape-preferences.cpp:768 -#: ../src/widgets/box3d-toolbar.cpp:394 -msgid "Angle Z:" -msgstr "Z-hoek:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:154 +msgctxt "Symbol" +msgid "Transfer" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:327 -#: ../src/ui/dialog/inkscape-preferences.cpp:768 -msgid "Angle of z-axis" -msgstr "Hoek van de z-as" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:155 +msgctxt "Symbol" +msgid "Decision" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:331 -#: ../src/display/canvas-grid.cpp:705 -msgid "Minor grid line _color:" -msgstr "Kleur _nevenrasterlijnen:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:156 +msgctxt "Symbol" +msgid "Flow Arrow" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:331 -#: ../src/display/canvas-grid.cpp:705 -#: ../src/ui/dialog/inkscape-preferences.cpp:719 -msgid "Minor grid line color" -msgstr "Kleur nevenrasterlijnen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:157 +msgctxt "Symbol" +msgid "Circle Arrow" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:331 -#: ../src/display/canvas-grid.cpp:705 -msgid "Color of the minor grid lines" -msgstr "Kleur nevenrasterlijnen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:158 +msgctxt "Symbol" +msgid "Off-Page Connector" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:336 -#: ../src/display/canvas-grid.cpp:710 -msgid "Ma_jor grid line color:" -msgstr "Kleur _hoofdrasterlijnen:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:159 +msgctxt "Symbol" +msgid "Connector" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:336 -#: ../src/display/canvas-grid.cpp:710 -#: ../src/ui/dialog/inkscape-preferences.cpp:721 -msgid "Major grid line color" -msgstr "Kleur hoofdrasterlijnen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:160 +msgctxt "Symbol" +msgid "Logical Or" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:337 -#: ../src/display/canvas-grid.cpp:711 -msgid "Color of the major (highlighted) grid lines" -msgstr "Kleur van de (gemarkeerde) hoofdrasterlijnen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:161 +msgctxt "Symbol" +msgid "Logical And" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:341 -#: ../src/display/canvas-grid.cpp:715 -msgid "_Major grid line every:" -msgstr "Hoofdr_asterlijn elke:" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:162 +msgctxt "Symbol" +msgid "Manual Operation" +msgstr "Manuele bediening" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:163 +msgctxt "Symbol" +msgid "Preparation" +msgstr "Voorbereiding" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:164 +msgctxt "Symbol" +msgid "Display" +msgstr "" -#: ../src/display/canvas-axonomgrid.cpp:341 -#: ../src/display/canvas-grid.cpp:715 -msgid "lines" -msgstr "rasterlijnen" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:165 +msgctxt "Symbol" +msgid "Sort" +msgstr "Sorteren" -#: ../src/display/canvas-grid.cpp:63 -msgid "Rectangular grid" -msgstr "Rechthoekig raster" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:166 +msgctxt "Symbol" +msgid "Collate" +msgstr "" -#: ../src/display/canvas-grid.cpp:64 -msgid "Axonometric grid" -msgstr "Axonometrisch raster" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:167 +msgctxt "Symbol" +msgid "Logic Symbols" +msgstr "Logicasymbolen" -#: ../src/display/canvas-grid.cpp:275 -msgid "Create new grid" -msgstr "Nieuw raster maken" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:168 +msgctxt "Symbol" +msgid "Xnor Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:341 -msgid "_Enabled" -msgstr "_Actief" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:169 +msgctxt "Symbol" +msgid "Xor Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:342 -msgid "Determines whether to snap to this grid or not. Can be 'on' for invisible grids." -msgstr "Bepaalt of er aan dit raster gekleefd moet worden of niet. Kan ingeschakeld zijn voor onzichtbare rasters." +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:170 +msgctxt "Symbol" +msgid "Nor Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:346 -msgid "Snap to visible _grid lines only" -msgstr "Alleen aan zichtbare _rasterlijnen kleven" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:171 +msgctxt "Symbol" +msgid "Or Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:347 -msgid "When zoomed out, not all grid lines will be displayed. Only the visible ones will be snapped to" -msgstr "Bij uitzoomen worden niet alle rasterlijnen getoond. Er wordt alleen gekleefd aan de zichtbare rasterlijnen" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:172 +msgctxt "Symbol" +msgid "Nand Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:351 -msgid "_Visible" -msgstr "_Zichtbaar" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:173 +msgctxt "Symbol" +msgid "And Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:352 -msgid "Determines whether the grid is displayed or not. Objects are still snapped to invisible grids." -msgstr "Bepaalt of het raster weergegven moet worden of niet. Objecten worden ook aan onzichtbare rasters gekleefd." +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:174 +msgctxt "Symbol" +msgid "Buffer" +msgstr "" -#: ../src/display/canvas-grid.cpp:699 -msgid "Spacing _X:" -msgstr "_X-tussenafstand:" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:175 +msgctxt "Symbol" +msgid "Not Gate" +msgstr "" -#: ../src/display/canvas-grid.cpp:699 -#: ../src/ui/dialog/inkscape-preferences.cpp:741 -msgid "Distance between vertical grid lines" -msgstr "Afstand tussen verticale rasterlijnen" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:176 +msgctxt "Symbol" +msgid "Buffer Small" +msgstr "" -#: ../src/display/canvas-grid.cpp:701 -#: ../src/ui/dialog/inkscape-preferences.cpp:742 -msgid "Distance between horizontal grid lines" -msgstr "Afstand tussen horizontale rasterlijnen" +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:177 +msgctxt "Symbol" +msgid "Not Gate Small" +msgstr "" -#: ../src/display/canvas-grid.cpp:732 -msgid "_Show dots instead of lines" -msgstr "_Punten weergeven in plaats van lijnen" +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:178 +msgctxt "Symbol" +msgid "Map Symbols" +msgstr "Kaartsymbolen" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:179 +msgctxt "Symbol" +msgid "Bed and Breakfast" +msgstr "Bed and Breakfast" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:180 +msgctxt "Symbol" +msgid "Youth Hostel" +msgstr "Jeugdhotel" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:181 +msgctxt "Symbol" +msgid "Shelter" +msgstr "" -#: ../src/display/canvas-grid.cpp:733 -msgid "If set, displays dots at gridpoints instead of gridlines" -msgstr "Indien aangevinkt, worden punten op de rasterkruispunten weergegeven in plaats van rasterlijnen." +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:182 +msgctxt "Symbol" +msgid "Motel" +msgstr "" -#. TRANSLATORS: undefined target for snapping -#: ../src/display/snap-indicator.cpp:72 -#: ../src/display/snap-indicator.cpp:75 -#: ../src/display/snap-indicator.cpp:179 -#: ../src/display/snap-indicator.cpp:182 -msgid "UNDEFINED" -msgstr "ONGEDEFINIEERD" +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:183 +msgctxt "Symbol" +msgid "Hotel" +msgstr "Hotel" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:184 +msgctxt "Symbol" +msgid "Hostel" +msgstr "Hostel" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:185 +msgctxt "Symbol" +msgid "Chalet" +msgstr "Chalet" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:186 +msgctxt "Symbol" +msgid "Caravan Park" +msgstr "" -#: ../src/display/snap-indicator.cpp:78 -msgid "grid line" -msgstr "rasterlijn" +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:187 +msgctxt "Symbol" +msgid "Camping" +msgstr "Camping" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:188 +msgctxt "Symbol" +msgid "Alpine Hut" +msgstr "Berghut" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:189 +msgctxt "Symbol" +msgid "Bench or Park" +msgstr "" -#: ../src/display/snap-indicator.cpp:81 +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:190 +msgctxt "Symbol" +msgid "Playground" +msgstr "Speelplaats" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:191 +msgctxt "Symbol" +msgid "Fountain" +msgstr "Fontein" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:192 +msgctxt "Symbol" +msgid "Library" +msgstr "Bibliotheek" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:193 +msgctxt "Symbol" +msgid "Town Hall" +msgstr "Stadshuis" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:194 +msgctxt "Symbol" +msgid "Court" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:195 +msgctxt "Symbol" +msgid "Fire Station / House" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:196 +msgctxt "Symbol" +msgid "Police Station" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:197 +msgctxt "Symbol" +msgid "Prison" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:198 +msgctxt "Symbol" +msgid "Post Office" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:199 +msgctxt "Symbol" +msgid "Public Building" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:200 +msgctxt "Symbol" +msgid "Recycling" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:201 +msgctxt "Symbol" +msgid "Survey Point" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:202 +msgctxt "Symbol" +msgid "Toll Booth" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:203 +msgctxt "Symbol" +msgid "Lift Gate" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:204 +msgctxt "Symbol" +msgid "Steps" +msgstr "Stappen" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:205 +msgctxt "Symbol" +msgid "Stile" +msgstr "Stijl" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:206 +msgctxt "Symbol" +msgid "Kissing Gate" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:207 +msgctxt "Symbol" +msgid "Gate" +msgstr "Poort" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:209 +msgctxt "Symbol" +msgid "Entrance" +msgstr "Toegang" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:210 +msgctxt "Symbol" +msgid "Cycle Barrier" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:211 +msgctxt "Symbol" +msgid "Cattle Grid" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:212 +msgctxt "Symbol" +msgid "Bollard" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:213 +msgctxt "Symbol" +msgid "University" +msgstr "Universiteit" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:214 +msgctxt "Symbol" +msgid "High/Secondary School" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:215 +msgctxt "Symbol" +msgid "School" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:216 +msgctxt "Symbol" +msgid "Kindergatten" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:219 +msgctxt "Symbol" +msgid "Pub" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:220 +msgctxt "Symbol" +msgid "Deserts/Cakes Shop" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:221 +msgctxt "Symbol" +msgid "Fast Food" +msgstr "Fast Food" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:222 +msgctxt "Symbol" +msgid "Public Tap/Water" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:223 +msgctxt "Symbol" +msgid "Cafe" +msgstr "Cafe" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:224 +msgctxt "Symbol" +msgid "Beer Garden" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:225 +msgctxt "Symbol" +msgid "Wine Bar" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:226 +msgctxt "Symbol" +msgid "Opticians/Eye Doctors" +msgstr "Opticien/Oogarts" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:227 +msgctxt "Symbol" +msgid "Dentist" +msgstr "Tandarts" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:228 +msgctxt "Symbol" +msgid "Veterinarian" +msgstr "Dierenarts" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:229 +msgctxt "Symbol" +msgid "Drugs Dispensary" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:230 +msgctxt "Symbol" +msgid "Pharmacy" +msgstr "Apotheker" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:231 +msgctxt "Symbol" +msgid "Accident & Emergency" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:232 +msgctxt "Symbol" +msgid "Hospital" +msgstr "Ziekenhuis" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:233 +msgctxt "Symbol" +msgid "Doctors" +msgstr "Dokterspraktijk" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:234 +msgctxt "Symbol" +msgid "Scrub Land" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:235 +msgctxt "Symbol" +msgid "Swamp" +msgstr "Moeras" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:236 +msgctxt "Symbol" +msgid "Hills" +msgstr "Heuvels" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:237 +msgctxt "Symbol" +msgid "Grass Land" +msgstr "Grasland" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:238 +msgctxt "Symbol" +msgid "Deciduous Forest" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:239 +msgctxt "Symbol" +msgid "Mixed Forest" +msgstr "Gemengd bos" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:240 +msgctxt "Symbol" +msgid "Coniferous Forest" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:241 +msgctxt "Symbol" +msgid "Church or Place of Worship" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:242 +msgctxt "Symbol" +msgid "Bank" +msgstr "Bank" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:243 +msgctxt "Symbol" +msgid "Power Lines" +msgstr "Elektriciteitsleiding" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:244 +msgctxt "Symbol" +msgid "Watch Tower" +msgstr "Uitkijktoren" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:245 +msgctxt "Symbol" +msgid "Transmitter" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:246 +msgctxt "Symbol" +msgid "Village" +msgstr "Dorp" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:247 +msgctxt "Symbol" +msgid "Town" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:248 +msgctxt "Symbol" +msgid "Hamlet" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:249 +msgctxt "Symbol" +msgid "City" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:250 +msgctxt "Symbol" +msgid "Peak" +msgstr "Piek" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:251 +msgctxt "Symbol" +msgid "Mountain Pass" +msgstr "Bergpas" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:252 +msgctxt "Symbol" +msgid "Mine" +msgstr "Mijn" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:253 +msgctxt "Symbol" +msgid "Military Complex" +msgstr "Militair complex" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:254 +msgctxt "Symbol" +msgid "Embassy" +msgstr "Ambasade" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:255 +msgctxt "Symbol" +msgid "Toy Shop" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:256 +msgctxt "Symbol" +msgid "Supermarket" +msgstr "Supermarkt" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:257 +msgctxt "Symbol" +msgid "Jewlers" +msgstr "Juwelier" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:258 +msgctxt "Symbol" +msgid "Hairdressers" +msgstr "Kapper" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:259 +msgctxt "Symbol" +msgid "Greengrocer" +msgstr "Kruidenier" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:260 +msgctxt "Symbol" +msgid "Gift Shop" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:261 +msgctxt "Symbol" +msgid "Garden Center" +msgstr "Tuincentrum" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:262 +msgctxt "Symbol" +msgid "Florist" +msgstr "Bloemist" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:263 +msgctxt "Symbol" +msgid "Fish Monger" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:264 +msgctxt "Symbol" +msgid "Real Estate" +msgstr "Vastgoed" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:265 +msgctxt "Symbol" +msgid "Hardware / DIY" +msgstr "Hardware" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:266 +msgctxt "Symbol" +msgid "Shop" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:267 +msgctxt "Symbol" +msgid "Confectioner" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:268 +msgctxt "Symbol" +msgid "Computer Shop" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:269 +msgctxt "Symbol" +msgid "Clothing" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:270 +msgctxt "Symbol" +msgid "Mechanic" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:271 +msgctxt "Symbol" +msgid "Car Dealer" +msgstr "Garage" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:272 +msgctxt "Symbol" +msgid "Butcher" +msgstr "Slager" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:273 +msgctxt "Symbol" +msgid "Meat Shop" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:274 +msgctxt "Symbol" +msgid "Bicycle Shop" +msgstr "Fietswinkel" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:275 +msgctxt "Symbol" +msgid "Baker" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:276 +msgctxt "Symbol" +msgid "Off License / Liquor Store" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:277 +msgctxt "Symbol" +msgid "Wind Surfing" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:278 +msgctxt "Symbol" +msgid "Tennis" +msgstr "Tennis" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:279 +msgctxt "Symbol" +msgid "Outdoor Pool" +msgstr "Buitenzwembad" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:280 +msgctxt "Symbol" +msgid "Indoor Pool" +msgstr "Binnenzwembad" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:281 +msgctxt "Symbol" +msgid "Skiing" +msgstr "Skiën" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:282 +msgctxt "Symbol" +msgid "Sailing" +msgstr "Zeilen" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:283 +msgctxt "Symbol" +msgid "Leasure Center" +msgstr "Ontspanningsruimte" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:284 +msgctxt "Symbol" +msgid "Ice Skating" +msgstr "Ijsschaatsen" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:285 +msgctxt "Symbol" +msgid "Equine Sports" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:286 +msgctxt "Symbol" +msgid "Rock Climbing" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:287 +msgctxt "Symbol" +msgid "Gym" +msgstr "Gym" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:288 +msgctxt "Symbol" +msgid "Golf" +msgstr "Golf" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:289 +msgctxt "Symbol" +msgid "Diving" +msgstr "Duiken" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:290 +msgctxt "Symbol" +msgid "Archery" +msgstr "Boogschieten" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:291 +msgctxt "Symbol" +msgid "Zoo" +msgstr "Zoo" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:292 +msgctxt "Symbol" +msgid "Wreck" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:293 +msgctxt "Symbol" +msgid "Water Wheel" +msgstr "Waterrad" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:294 +msgctxt "Symbol" +msgid "Point of Interest" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:295 +msgctxt "Symbol" +msgid "Theater" +msgstr "Theater" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:296 +msgctxt "Symbol" +msgid "Park / Picnick Area" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:297 +msgctxt "Symbol" +msgid "Monument" +msgstr "Monument" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:298 +msgctxt "Symbol" +msgid "Intormation" +msgstr "Informatie" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:299 +msgctxt "Symbol" +msgid "Beach" +msgstr "Strand" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:300 +msgctxt "Symbol" +msgid "Battle Location" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:301 +msgctxt "Symbol" +msgid "Archaeology / Ruins" +msgstr "Archeologische site / ruïnes" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:302 +msgctxt "Symbol" +msgid "Walking" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:303 +msgctxt "Symbol" +msgid "Train" +msgstr "Trein" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:305 +msgctxt "Symbol" +msgid "Underground Rail" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:307 +msgctxt "Symbol" +msgid "Bike Rental" +msgstr "Fietsverhuur" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:309 +msgctxt "Symbol" +msgid "Carpool" +msgstr "Carpoolen" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:310 +msgctxt "Symbol" +msgid "Flood Gate" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:311 +msgctxt "Symbol" +msgid "Shipping" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:312 +msgctxt "Symbol" +msgid "Disabled Parking" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:313 +msgctxt "Symbol" +msgid "Paid Parking" +msgstr "Betaalparking" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:314 +msgctxt "Symbol" +msgid "Bike Parking" +msgstr "Fietsparking" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:316 +msgctxt "Symbol" +msgid "Marina" +msgstr "" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:317 +msgctxt "Symbol" +msgid "Fuel Station" +msgstr "Tankstation" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:318 +msgctxt "Symbol" +msgid "Bus Stop" +msgstr "Busstop" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:319 +msgctxt "Symbol" +msgid "Bus Station" +msgstr "Busstation" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:320 +msgctxt "Symbol" +msgid "Airport" +msgstr "Luchthaven" + +#: ../share/templates/templates.h:1 +msgid "A4 Landscape Page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 landscape sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty landscape" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "A4 Page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Black Opaque" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty black page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "black opaque empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "White Opaque" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty white page" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "white opaque empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Business Card 85x54mm" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty business card template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "business card empty 85x54" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Business Card 90x50mm" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "business card empty 90x50" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD Cover 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty CD box cover." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD cover disc disk 300dpi box" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD Label 120x120 " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Simple CD Label template with disc's pattern." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "CD label 120x120 disc disk" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Regular 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover regular 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Slim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD slim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover slim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Superslim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD superslim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover superslim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Ultraslim 300dpi " +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD ultraslim covers." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "DVD cover ultraslim 300dpi" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1024x768" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty desktop size sheet" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 1024x768 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1600x1200" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 1600x1200 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 640x480" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 640x480 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Desktop 800x600" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "desktop 800x600 wallpaper" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Fontforge Glyph" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "font fontforge glyph 1000x1000" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 16x16" +msgstr "Icoon 16x16" + +#: ../share/templates/templates.h:1 +msgid "Small 16x16 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 16x16 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 32x32" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "32x32 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 32x32 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 48x48" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "48x48 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 48x48 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Icon 64x64" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "64x64 icon template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "icon 64x64 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Letter Landscape" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Standard letter landscape sheet - 792x612" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "letter landscape 792x612 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Letter" +msgstr "Letter" + +#: ../share/templates/templates.h:1 +msgid "Standard letter sheet - 612x792" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "letter 612x792 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "No Borders" +msgstr "Geen randen" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no borders" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "no borders empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "No Layers" +msgstr "Geen lagen" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no layers" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "no layers empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video HDTV 1920x1080" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "HDTV video template for 1920x1080 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "HDTV video empty 1920x1080" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video NTSC 720x486" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "NTSC video template for 720x486 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "NTSC video empty 720x486" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Video PAL 728x576" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "PAL video template for 728x576 resolution." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "PAL video empty 728x576" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 468x60" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty 468x60 web banner template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "web banner 468x60 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 728x90" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Empty 728x90 web banner template." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "web banner 728x90 empty" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "LaTeX Beamer" +msgstr "LaTeX Beamer" + +#: ../share/templates/templates.h:1 +msgid "LaTeX beamer template with helping grid." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "LaTex LaTeX latex grid beamer" +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "Typography Canvas" +msgstr "Typografiecanvas" + +#: ../share/templates/templates.h:1 +msgid "Empty typography canvas with helping guidelines." +msgstr "" + +#: ../share/templates/templates.h:1 +msgid "guidelines typography canvas" +msgstr "" + +#. 3D box +#: ../src/box3d.cpp:259 +#: ../src/box3d.cpp:1329 +#: ../src/ui/dialog/inkscape-preferences.cpp:398 +msgid "3D Box" +msgstr "3D-kubus" + +#: ../src/color-profile.cpp:850 +#, c-format +msgid "Color profiles directory (%s) is unavailable." +msgstr "Kleurprofielenmap (%s) is niet beschikbaar." + +#: ../src/color-profile.cpp:909 +#: ../src/color-profile.cpp:926 +msgid "(invalid UTF-8 string)" +msgstr "(ongeldige UTF-8 string)" + +#: ../src/color-profile.cpp:911 +#: ../src/filter-enums.cpp:119 +#: ../src/live_effects/lpe-ruler.cpp:32 +#: ../src/ui/dialog/filter-effects-dialog.cpp:549 +#: ../src/ui/dialog/inkscape-preferences.cpp:332 +#: ../src/ui/dialog/inkscape-preferences.cpp:641 +#: ../src/ui/dialog/inkscape-preferences.cpp:1259 +#: ../src/ui/dialog/inkscape-preferences.cpp:1830 +#: ../src/ui/dialog/input.cpp:742 +#: ../src/ui/dialog/input.cpp:743 +#: ../src/ui/dialog/input.cpp:1571 +#: ../src/ui/dialog/input.cpp:1625 +#: ../src/verbs.cpp:2352 +#: ../src/widgets/gradient-toolbar.cpp:1130 +#: ../src/widgets/pencil-toolbar.cpp:184 +#: ../src/widgets/stroke-marker-selector.cpp:388 +#: ../share/extensions/gcodetools_area.inx.h:48 +#: ../share/extensions/gcodetools_dxf_points.inx.h:20 +#: ../share/extensions/gcodetools_engraving.inx.h:26 +#: ../share/extensions/gcodetools_graffiti.inx.h:37 +#: ../share/extensions/gcodetools_lathe.inx.h:41 +#: ../share/extensions/gcodetools_path_to_gcode.inx.h:30 +#: ../share/extensions/grid_polar.inx.h:4 +#: ../share/extensions/plotter.inx.h:15 +#: ../share/extensions/scour.inx.h:18 +msgid "None" +msgstr "Geen" + +#: ../src/context-fns.cpp:36 +#: ../src/context-fns.cpp:65 +msgid "Current layer is hidden. Unhide it to be able to draw on it." +msgstr "De huidige laag is verborgen. Toon deze om er op te kunnen tekenen." + +#: ../src/context-fns.cpp:42 +#: ../src/context-fns.cpp:71 +msgid "Current layer is locked. Unlock it to be able to draw on it." +msgstr "De huidige laag is vergrendeld. Ontgrendel deze om er op te kunnen tekenen." + +#: ../src/desktop.cpp:858 +msgid "No previous zoom." +msgstr "Er is geen vorige zoom." + +#: ../src/desktop.cpp:879 +msgid "No next zoom." +msgstr "Er is geen volgende zoom." + +#: ../src/desktop-events.cpp:225 +msgid "Create guide" +msgstr "Hulplijn maken" + +#: ../src/desktop-events.cpp:470 +msgid "Move guide" +msgstr "Hulplijn verplaatsen" + +#: ../src/desktop-events.cpp:477 +#: ../src/desktop-events.cpp:536 +#: ../src/ui/dialog/guides.cpp:144 +msgid "Delete guide" +msgstr "Hulplijn verwijderen" + +#: ../src/desktop-events.cpp:516 +#, c-format +msgid "Guideline: %s" +msgstr "Hulplijn: %s" + +#: ../src/display/canvas-axonomgrid.cpp:317 +#: ../src/display/canvas-grid.cpp:693 +msgid "Grid _units:" +msgstr "Raster_eenheid:" + +#: ../src/display/canvas-axonomgrid.cpp:319 +#: ../src/display/canvas-grid.cpp:695 +msgid "_Origin X:" +msgstr "X-_oorsprong:" + +#: ../src/display/canvas-axonomgrid.cpp:319 +#: ../src/display/canvas-grid.cpp:695 +#: ../src/ui/dialog/inkscape-preferences.cpp:735 +#: ../src/ui/dialog/inkscape-preferences.cpp:760 +msgid "X coordinate of grid origin" +msgstr "X-coördinaat vanaf de rasteroorsprong" + +#: ../src/display/canvas-axonomgrid.cpp:321 +#: ../src/display/canvas-grid.cpp:697 +msgid "O_rigin Y:" +msgstr "Y-oo_rsprong:" + +#: ../src/display/canvas-axonomgrid.cpp:321 +#: ../src/display/canvas-grid.cpp:697 +#: ../src/ui/dialog/inkscape-preferences.cpp:736 +#: ../src/ui/dialog/inkscape-preferences.cpp:761 +msgid "Y coordinate of grid origin" +msgstr "Y-coördinaat vanaf de rasteroorsprong" + +#: ../src/display/canvas-axonomgrid.cpp:323 +#: ../src/display/canvas-grid.cpp:701 +msgid "Spacing _Y:" +msgstr "_Y-tussenafstand:" + +#: ../src/display/canvas-axonomgrid.cpp:323 +#: ../src/ui/dialog/inkscape-preferences.cpp:764 +msgid "Base length of z-axis" +msgstr "Basislengte van z-as" + +#: ../src/display/canvas-axonomgrid.cpp:325 +#: ../src/ui/dialog/inkscape-preferences.cpp:767 +#: ../src/widgets/box3d-toolbar.cpp:315 +msgid "Angle X:" +msgstr "X-hoek:" + +#: ../src/display/canvas-axonomgrid.cpp:325 +#: ../src/ui/dialog/inkscape-preferences.cpp:767 +msgid "Angle of x-axis" +msgstr "Hoek van de x-as" + +#: ../src/display/canvas-axonomgrid.cpp:327 +#: ../src/ui/dialog/inkscape-preferences.cpp:768 +#: ../src/widgets/box3d-toolbar.cpp:394 +msgid "Angle Z:" +msgstr "Z-hoek:" + +#: ../src/display/canvas-axonomgrid.cpp:327 +#: ../src/ui/dialog/inkscape-preferences.cpp:768 +msgid "Angle of z-axis" +msgstr "Hoek van de z-as" + +#: ../src/display/canvas-axonomgrid.cpp:331 +#: ../src/display/canvas-grid.cpp:705 +msgid "Minor grid line _color:" +msgstr "Kleur _nevenrasterlijnen:" + +#: ../src/display/canvas-axonomgrid.cpp:331 +#: ../src/display/canvas-grid.cpp:705 +#: ../src/ui/dialog/inkscape-preferences.cpp:719 +msgid "Minor grid line color" +msgstr "Kleur nevenrasterlijnen" + +#: ../src/display/canvas-axonomgrid.cpp:331 +#: ../src/display/canvas-grid.cpp:705 +msgid "Color of the minor grid lines" +msgstr "Kleur nevenrasterlijnen" + +#: ../src/display/canvas-axonomgrid.cpp:336 +#: ../src/display/canvas-grid.cpp:710 +msgid "Ma_jor grid line color:" +msgstr "Kleur _hoofdrasterlijnen:" + +#: ../src/display/canvas-axonomgrid.cpp:336 +#: ../src/display/canvas-grid.cpp:710 +#: ../src/ui/dialog/inkscape-preferences.cpp:721 +msgid "Major grid line color" +msgstr "Kleur hoofdrasterlijnen" + +#: ../src/display/canvas-axonomgrid.cpp:337 +#: ../src/display/canvas-grid.cpp:711 +msgid "Color of the major (highlighted) grid lines" +msgstr "Kleur van de (gemarkeerde) hoofdrasterlijnen" + +#: ../src/display/canvas-axonomgrid.cpp:341 +#: ../src/display/canvas-grid.cpp:715 +msgid "_Major grid line every:" +msgstr "Hoofdr_asterlijn elke:" + +#: ../src/display/canvas-axonomgrid.cpp:341 +#: ../src/display/canvas-grid.cpp:715 +msgid "lines" +msgstr "rasterlijnen" + +#: ../src/display/canvas-grid.cpp:63 +msgid "Rectangular grid" +msgstr "Rechthoekig raster" + +#: ../src/display/canvas-grid.cpp:64 +msgid "Axonometric grid" +msgstr "Axonometrisch raster" + +#: ../src/display/canvas-grid.cpp:275 +msgid "Create new grid" +msgstr "Nieuw raster maken" + +#: ../src/display/canvas-grid.cpp:341 +msgid "_Enabled" +msgstr "_Actief" + +#: ../src/display/canvas-grid.cpp:342 +msgid "Determines whether to snap to this grid or not. Can be 'on' for invisible grids." +msgstr "Bepaalt of er aan dit raster gekleefd moet worden of niet. Kan ingeschakeld zijn voor onzichtbare rasters." + +#: ../src/display/canvas-grid.cpp:346 +msgid "Snap to visible _grid lines only" +msgstr "Alleen aan zichtbare _rasterlijnen kleven" + +#: ../src/display/canvas-grid.cpp:347 +msgid "When zoomed out, not all grid lines will be displayed. Only the visible ones will be snapped to" +msgstr "Bij uitzoomen worden niet alle rasterlijnen getoond. Er wordt alleen gekleefd aan de zichtbare rasterlijnen" + +#: ../src/display/canvas-grid.cpp:351 +msgid "_Visible" +msgstr "_Zichtbaar" + +#: ../src/display/canvas-grid.cpp:352 +msgid "Determines whether the grid is displayed or not. Objects are still snapped to invisible grids." +msgstr "Bepaalt of het raster weergegven moet worden of niet. Objecten worden ook aan onzichtbare rasters gekleefd." + +#: ../src/display/canvas-grid.cpp:699 +msgid "Spacing _X:" +msgstr "_X-tussenafstand:" + +#: ../src/display/canvas-grid.cpp:699 +#: ../src/ui/dialog/inkscape-preferences.cpp:741 +msgid "Distance between vertical grid lines" +msgstr "Afstand tussen verticale rasterlijnen" + +#: ../src/display/canvas-grid.cpp:701 +#: ../src/ui/dialog/inkscape-preferences.cpp:742 +msgid "Distance between horizontal grid lines" +msgstr "Afstand tussen horizontale rasterlijnen" + +#: ../src/display/canvas-grid.cpp:732 +msgid "_Show dots instead of lines" +msgstr "_Punten weergeven in plaats van lijnen" + +#: ../src/display/canvas-grid.cpp:733 +msgid "If set, displays dots at gridpoints instead of gridlines" +msgstr "Indien aangevinkt, worden punten op de rasterkruispunten weergegeven in plaats van rasterlijnen." + +#. TRANSLATORS: undefined target for snapping +#: ../src/display/snap-indicator.cpp:72 +#: ../src/display/snap-indicator.cpp:75 +#: ../src/display/snap-indicator.cpp:179 +#: ../src/display/snap-indicator.cpp:182 +msgid "UNDEFINED" +msgstr "ONGEDEFINIEERD" + +#: ../src/display/snap-indicator.cpp:78 +msgid "grid line" +msgstr "rasterlijn" + +#: ../src/display/snap-indicator.cpp:81 msgid "grid intersection" msgstr "kruising met rasterlijn" @@ -3783,7 +5709,7 @@ msgid "" msgstr "" "Bij het laden van sommige uitbreidingen ging iets mis\n" "\n" -"De uitbreidingen waarbij iets mis ging zijn overgeslagen. Inkscape zal gewoon werken, maar deze uitbreidingen zijn niet te gebruiken. Zie dit fouten-logboek voor meer details:" +"De uitbreidingen waarbij iets mis ging zijn overgeslagen. Inkscape zal gewoon werken, maar deze uitbreidingen zijn niet te gebruiken. Zie dit fouten-logboek voor meer details: " #: ../src/extension/error-file.cpp:66 msgid "Show dialog on startup" @@ -3904,10 +5830,7 @@ msgstr "Breedte:" msgid "Height:" msgstr "Hoogte:" -#. Label #: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:43 -#: ../src/widgets/gradient-toolbar.cpp:1174 -#: ../src/widgets/gradient-vector.cpp:926 #: ../share/extensions/printing_marks.inx.h:12 msgid "Offset:" msgstr "Beginpunt:" @@ -3928,8 +5851,8 @@ msgstr "Beginpunt:" #: ../src/extension/internal/bitmap/equalize.cpp:40 #: ../src/extension/internal/bitmap/gaussianBlur.cpp:45 #: ../src/extension/internal/bitmap/implode.cpp:43 -#: ../src/extension/internal/bitmap/level.cpp:49 #: ../src/extension/internal/bitmap/levelChannel.cpp:71 +#: ../src/extension/internal/bitmap/level.cpp:49 #: ../src/extension/internal/bitmap/medianFilter.cpp:43 #: ../src/extension/internal/bitmap/modulate.cpp:48 #: ../src/extension/internal/bitmap/negate.cpp:41 @@ -3966,8 +5889,8 @@ msgstr "Ruis toevoegen" #: ../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:2627 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 #: ../src/ui/dialog/object-attributes.cpp:49 #: ../share/extensions/jessyInk_effects.inx.h:5 #: ../share/extensions/jessyInk_export.inx.h:3 @@ -4019,7 +5942,7 @@ msgstr "Vervagen" #: ../src/extension/internal/bitmap/oilPaint.cpp:39 #: ../src/extension/internal/bitmap/sharpen.cpp:40 #: ../src/extension/internal/bitmap/unsharpmask.cpp:43 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2684 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2885 msgid "Radius:" msgstr "Straal:" @@ -4230,46 +6153,46 @@ msgstr "Imploderen" msgid "Implode selected bitmap(s)" msgstr "Geselecteerde bitmap(s) imploderen" -#: ../src/extension/internal/bitmap/level.cpp:41 -#: ../src/extension/internal/filter/color.h:742 -#: ../src/extension/internal/filter/image.h:56 -#: ../src/extension/internal/filter/morphology.h:66 -#: ../src/extension/internal/filter/paint.h:345 -msgid "Level" -msgstr "Egaliseren" +#: ../src/extension/internal/bitmap/levelChannel.cpp:52 +msgid "Level (with Channel)" +msgstr "Eén kanaal egaliseren" + +#: ../src/extension/internal/bitmap/levelChannel.cpp:54 +#: ../src/extension/internal/filter/color.h:636 +msgid "Channel:" +msgstr "Kanaal:" -#: ../src/extension/internal/bitmap/level.cpp:43 #: ../src/extension/internal/bitmap/levelChannel.cpp:65 +#: ../src/extension/internal/bitmap/level.cpp:43 msgid "Black Point:" msgstr "Zwart punt:" -#: ../src/extension/internal/bitmap/level.cpp:44 #: ../src/extension/internal/bitmap/levelChannel.cpp:66 +#: ../src/extension/internal/bitmap/level.cpp:44 msgid "White Point:" msgstr "Wit punt:" -#: ../src/extension/internal/bitmap/level.cpp:45 #: ../src/extension/internal/bitmap/levelChannel.cpp:67 +#: ../src/extension/internal/bitmap/level.cpp:45 msgid "Gamma Correction:" msgstr "Gammacorrectie:" -#: ../src/extension/internal/bitmap/level.cpp:51 -msgid "Level selected bitmap(s) by scaling values falling between the given ranges to the full color range" -msgstr "Geselecteerde bitmap(s) egaliseren door het opgegeven interval te schalen naar het volledige kleurbereik" - -#: ../src/extension/internal/bitmap/levelChannel.cpp:52 -msgid "Level (with Channel)" -msgstr "Eén kanaal egaliseren" - -#: ../src/extension/internal/bitmap/levelChannel.cpp:54 -#: ../src/extension/internal/filter/color.h:636 -msgid "Channel:" -msgstr "Kanaal:" - #: ../src/extension/internal/bitmap/levelChannel.cpp:73 msgid "Level the specified channel of selected bitmap(s) by scaling values falling between the given ranges to the full color range" msgstr "Het gegeven kanaal van geselecteerde bitmap(s) egaliseren door het opgegeven interval te schalen naar het volledige kleurbereik" +#: ../src/extension/internal/bitmap/level.cpp:41 +#: ../src/extension/internal/filter/color.h:742 +#: ../src/extension/internal/filter/image.h:56 +#: ../src/extension/internal/filter/morphology.h:66 +#: ../src/extension/internal/filter/paint.h:345 +msgid "Level" +msgstr "Egaliseren" + +#: ../src/extension/internal/bitmap/level.cpp:51 +msgid "Level selected bitmap(s) by scaling values falling between the given ranges to the full color range" +msgstr "Geselecteerde bitmap(s) egaliseren door het opgegeven interval te schalen naar het volledige kleurbereik" + #: ../src/extension/internal/bitmap/medianFilter.cpp:37 msgid "Median" msgstr "Mediaan" @@ -4333,7 +6256,7 @@ msgid "Opacity" msgstr "Ondoorzichtigheid" #: ../src/extension/internal/bitmap/opacity.cpp:40 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2674 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2875 #: ../src/widgets/dropper-toolbar.cpp:107 msgid "Opacity:" msgstr "Ondoorzichtigheid:" @@ -4502,102 +6425,102 @@ msgid "PostScript" msgstr "PostScript" #: ../src/extension/internal/cairo-ps-out.cpp:329 -#: ../src/extension/internal/cairo-ps-out.cpp:370 +#: ../src/extension/internal/cairo-ps-out.cpp:368 msgid "Restrict to PS level:" msgstr "PS-niveau beperken tot:" #: ../src/extension/internal/cairo-ps-out.cpp:330 -#: ../src/extension/internal/cairo-ps-out.cpp:371 +#: ../src/extension/internal/cairo-ps-out.cpp:369 msgid "PostScript level 3" msgstr "PostScript niveau 3" -#: ../src/extension/internal/cairo-ps-out.cpp:332 -#: ../src/extension/internal/cairo-ps-out.cpp:373 +#: ../src/extension/internal/cairo-ps-out.cpp:331 +#: ../src/extension/internal/cairo-ps-out.cpp:370 msgid "PostScript level 2" msgstr "PostScript niveau 2" -#: ../src/extension/internal/cairo-ps-out.cpp:335 -#: ../src/extension/internal/cairo-ps-out.cpp:376 +#: ../src/extension/internal/cairo-ps-out.cpp:333 +#: ../src/extension/internal/cairo-ps-out.cpp:372 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250 -#: ../src/extension/internal/emf-inout.cpp:3551 -#: ../src/extension/internal/wmf-inout.cpp:3236 +#: ../src/extension/internal/emf-inout.cpp:3520 +#: ../src/extension/internal/wmf-inout.cpp:3088 msgid "Convert texts to paths" msgstr "Tekst naar paden omzetten" -#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:334 msgid "PS+LaTeX: Omit text in PS, and create LaTeX file" msgstr "PS+LaTeX: tekst in PS negeren en LaTeX-bestand maken" -#: ../src/extension/internal/cairo-ps-out.cpp:337 -#: ../src/extension/internal/cairo-ps-out.cpp:378 +#: ../src/extension/internal/cairo-ps-out.cpp:335 +#: ../src/extension/internal/cairo-ps-out.cpp:374 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:252 msgid "Rasterize filter effects" msgstr "SVG-filtereffecten rasteriseren" -#: ../src/extension/internal/cairo-ps-out.cpp:338 -#: ../src/extension/internal/cairo-ps-out.cpp:379 +#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:375 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:253 msgid "Resolution for rasterization (dpi):" msgstr "Resolutie voor rasteriseren (ppi):" # XXX Waar wordt dit gebruikt? -#: ../src/extension/internal/cairo-ps-out.cpp:339 -#: ../src/extension/internal/cairo-ps-out.cpp:380 +#: ../src/extension/internal/cairo-ps-out.cpp:337 +#: ../src/extension/internal/cairo-ps-out.cpp:376 msgid "Output page size" msgstr "Paginagrootte" # XXX Waar wordt dit gebruikt? -#: ../src/extension/internal/cairo-ps-out.cpp:340 -#: ../src/extension/internal/cairo-ps-out.cpp:381 +#: ../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 msgid "Use document's page size" msgstr "Paginagrootte document gebruiken" -#: ../src/extension/internal/cairo-ps-out.cpp:341 -#: ../src/extension/internal/cairo-ps-out.cpp:382 +#: ../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 msgid "Use exported object's size" msgstr "Objectgrootte gebruiken" -#: ../src/extension/internal/cairo-ps-out.cpp:343 +#: ../src/extension/internal/cairo-ps-out.cpp:341 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258 msgid "Bleed/margin (mm):" msgstr "Overschot/marge (mm):" -#: ../src/extension/internal/cairo-ps-out.cpp:344 -#: ../src/extension/internal/cairo-ps-out.cpp:385 +#: ../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 msgid "Limit export to the object with ID:" msgstr "Export limiteren tot het object met ID:" -#: ../src/extension/internal/cairo-ps-out.cpp:348 +#: ../src/extension/internal/cairo-ps-out.cpp:346 #: ../share/extensions/ps_input.inx.h:2 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" -#: ../src/extension/internal/cairo-ps-out.cpp:349 +#: ../src/extension/internal/cairo-ps-out.cpp:347 msgid "PostScript File" msgstr "Postscript-bestand" -#: ../src/extension/internal/cairo-ps-out.cpp:368 +#: ../src/extension/internal/cairo-ps-out.cpp:366 #: ../share/extensions/eps_input.inx.h:3 msgid "Encapsulated PostScript" msgstr "Encapsulated Postscript" -#: ../src/extension/internal/cairo-ps-out.cpp:377 +#: ../src/extension/internal/cairo-ps-out.cpp:373 msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file" msgstr "EPS+LaTeX: tekst in EPS negeren en LaTeX-bestand maken" -#: ../src/extension/internal/cairo-ps-out.cpp:384 +#: ../src/extension/internal/cairo-ps-out.cpp:380 msgid "Bleed/margin (mm)" msgstr "Overschot/marge (mm)" -#: ../src/extension/internal/cairo-ps-out.cpp:389 +#: ../src/extension/internal/cairo-ps-out.cpp:385 #: ../share/extensions/eps_input.inx.h:2 msgid "Encapsulated PostScript (*.eps)" msgstr "Encapsulated Postscript (*.eps)" -#: ../src/extension/internal/cairo-ps-out.cpp:390 +#: ../src/extension/internal/cairo-ps-out.cpp:386 msgid "Encapsulated PostScript File" msgstr "Encapsulated Postscript File" @@ -4693,70 +6616,74 @@ msgstr "Corel DRAW Presentation uitwisselingsbestanden (*.cmx)" msgid "Open presentation exchange files saved in Corel DRAW" msgstr "Open Presentation uitwisselingsbestanden opgeslagen met Corel DRAW" -#: ../src/extension/internal/emf-inout.cpp:3535 +#: ../src/extension/internal/emf-inout.cpp:3504 msgid "EMF Input" msgstr "EMF-invoer" -#: ../src/extension/internal/emf-inout.cpp:3540 +#: ../src/extension/internal/emf-inout.cpp:3509 msgid "Enhanced Metafiles (*.emf)" msgstr "Enhanced Metafiles (*.emf)" -#: ../src/extension/internal/emf-inout.cpp:3541 +#: ../src/extension/internal/emf-inout.cpp:3510 msgid "Enhanced Metafiles" msgstr "Enhanced Metafiles" -#: ../src/extension/internal/emf-inout.cpp:3549 +#: ../src/extension/internal/emf-inout.cpp:3518 msgid "EMF Output" msgstr "EMF-uitvoer" -#: ../src/extension/internal/emf-inout.cpp:3552 -#: ../src/extension/internal/wmf-inout.cpp:3237 +#: ../src/extension/internal/emf-inout.cpp:3521 +#: ../src/extension/internal/wmf-inout.cpp:3089 msgid "Map Unicode to Symbol font" msgstr "Unicode naar lettertype Symbol mappen" -#: ../src/extension/internal/emf-inout.cpp:3553 -#: ../src/extension/internal/wmf-inout.cpp:3238 +#: ../src/extension/internal/emf-inout.cpp:3522 +#: ../src/extension/internal/wmf-inout.cpp:3090 msgid "Map Unicode to Wingdings" msgstr "Unicode naar lettertype Wingdings mappen" -#: ../src/extension/internal/emf-inout.cpp:3554 -#: ../src/extension/internal/wmf-inout.cpp:3239 +#: ../src/extension/internal/emf-inout.cpp:3523 +#: ../src/extension/internal/wmf-inout.cpp:3091 msgid "Map Unicode to Zapf Dingbats" msgstr "Unicode naar lettertype Zapf Dingbats mappen" -#: ../src/extension/internal/emf-inout.cpp:3555 -#: ../src/extension/internal/wmf-inout.cpp:3240 +#: ../src/extension/internal/emf-inout.cpp:3524 +#: ../src/extension/internal/wmf-inout.cpp:3092 msgid "Use MS Unicode PUA (0xF020-0xF0FF) for converted characters" msgstr "MS Unicode PUA (0xF020-0xF0FF) voor omgezette karakters gebruiken" -#: ../src/extension/internal/emf-inout.cpp:3556 -#: ../src/extension/internal/wmf-inout.cpp:3241 +#: ../src/extension/internal/emf-inout.cpp:3525 +#: ../src/extension/internal/wmf-inout.cpp:3093 msgid "Compensate for PPT font bug" msgstr "Compenseren voor PPT lettertypebug" -#: ../src/extension/internal/emf-inout.cpp:3557 -#: ../src/extension/internal/wmf-inout.cpp:3242 +#: ../src/extension/internal/emf-inout.cpp:3526 +#: ../src/extension/internal/wmf-inout.cpp:3094 msgid "Convert dashed/dotted lines to single lines" msgstr "Streep-/puntlijnen naar enkele lijnen omzetten" -#: ../src/extension/internal/emf-inout.cpp:3558 -#: ../src/extension/internal/wmf-inout.cpp:3243 +#: ../src/extension/internal/emf-inout.cpp:3527 +#: ../src/extension/internal/wmf-inout.cpp:3095 msgid "Convert gradients to colored polygon series" msgstr "Gradiënten naar polygoonseries omzetten" -#: ../src/extension/internal/emf-inout.cpp:3559 +#: ../src/extension/internal/emf-inout.cpp:3528 +msgid "Use native rectangular linear gradients" +msgstr "Standaard lineaire rechthoekige kleurverlopen gebruiken" + +#: ../src/extension/internal/emf-inout.cpp:3529 msgid "Map all fill patterns to standard EMF hatches" msgstr "Alle vulpatronen naar standaard EMF-hatches mappen" -#: ../src/extension/internal/emf-inout.cpp:3560 +#: ../src/extension/internal/emf-inout.cpp:3530 msgid "Ignore image rotations" msgstr "Afbeeldingsrotaties negeren" -#: ../src/extension/internal/emf-inout.cpp:3564 +#: ../src/extension/internal/emf-inout.cpp:3534 msgid "Enhanced Metafile (*.emf)" msgstr "Enhanced Metafile (*.emf)" -#: ../src/extension/internal/emf-inout.cpp:3565 +#: ../src/extension/internal/emf-inout.cpp:3535 msgid "Enhanced Metafile" msgstr "Enhanced Metafile" @@ -4819,8 +6746,8 @@ msgstr "Belichtingskleur" #: ../src/extension/internal/filter/color.h:1615 #: ../src/extension/internal/filter/distort.h:95 #: ../src/extension/internal/filter/distort.h:204 -#: ../src/extension/internal/filter/filter-file.cpp:151 #: ../src/extension/internal/filter/filter.cpp:214 +#: ../src/extension/internal/filter/filter-file.cpp:151 #: ../src/extension/internal/filter/image.h:61 #: ../src/extension/internal/filter/morphology.h:75 #: ../src/extension/internal/filter/morphology.h:202 @@ -4857,7 +6784,7 @@ msgstr "Matte gel" #: ../src/extension/internal/filter/blurs.h:187 #: ../src/extension/internal/filter/color.h:74 msgid "Brightness" -msgstr "Helderheid::" +msgstr "Helderheid" #: ../src/extension/internal/filter/bevels.h:147 msgid "Bulging, matte jelly covering" @@ -4872,14 +6799,14 @@ msgstr "Spiegelende belichting" #: ../src/extension/internal/filter/blurs.h:329 #: ../src/extension/internal/filter/distort.h:73 msgid "Horizontal blur" -msgstr "Horizontale vervaging::" +msgstr "Horizontale vervaging" #: ../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 "Verticale vervaging::" +msgstr "Verticale vervaging" #: ../src/extension/internal/filter/blurs.h:58 msgid "Blur content only" @@ -4899,7 +6826,7 @@ msgstr "Randen schoonmaken" #: ../src/extension/internal/filter/paint.h:336 #: ../src/extension/internal/filter/paint.h:341 msgid "Strength" -msgstr "Kracht::" +msgstr "Kracht" #: ../src/extension/internal/filter/blurs.h:135 msgid "Removes or decreases glows and jaggeries around objects edges after applying some filters" @@ -4911,7 +6838,7 @@ msgstr "Kruisvervaging" #: ../src/extension/internal/filter/blurs.h:188 msgid "Fading" -msgstr "Vervagen::" +msgstr "Vervagen" #: ../src/extension/internal/filter/blurs.h:191 #: ../src/extension/internal/filter/textures.h:74 @@ -4999,7 +6926,7 @@ msgstr "Masker dat aan de randen vervaagt zonder de inhoud aan te passen" #: ../src/extension/internal/filter/blurs.h:325 msgid "Out of Focus" -msgstr "Buiten focus" +msgstr "Uit focus" #: ../src/extension/internal/filter/blurs.h:331 #: ../src/extension/internal/filter/distort.h:75 @@ -5008,7 +6935,7 @@ msgstr "Buiten focus" #: ../src/extension/internal/filter/paint.h:342 #: ../src/extension/internal/filter/paint.h:346 msgid "Dilatation" -msgstr "Verwijding::" +msgstr "Verwijding" #: ../src/extension/internal/filter/blurs.h:332 #: ../src/extension/internal/filter/distort.h:76 @@ -5020,7 +6947,7 @@ msgstr "Verwijding::" #: ../src/extension/internal/filter/transparency.h:208 #: ../src/extension/internal/filter/transparency.h:282 msgid "Erosion" -msgstr "Erosie::" +msgstr "Erosie" #: ../src/extension/internal/filter/blurs.h:336 #: ../src/extension/internal/filter/color.h:1205 @@ -5070,12 +6997,12 @@ msgstr "Reliëf" #: ../src/extension/internal/filter/bumps.h:84 #: ../src/extension/internal/filter/bumps.h:313 msgid "Image simplification" -msgstr "Vereenvoudigen afbeelding::" +msgstr "Vereenvoudigen afbeelding" #: ../src/extension/internal/filter/bumps.h:85 #: ../src/extension/internal/filter/bumps.h:314 msgid "Bump simplification" -msgstr "Vereenvoudigen reliëf::" +msgstr "Vereenvoudigen reliëf" # het blijkt hier ook om embossering te gaan: in Inkscape consistent als reliëf aangeduid #: ../src/extension/internal/filter/bumps.h:87 @@ -5143,8 +7070,8 @@ msgstr "Diffuus" #: ../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/libgdl/gdl-dock-placeholder.c:175 #: ../src/widgets/rect-toolbar.cpp:338 #: ../share/extensions/interp_att_g.inx.h:11 msgid "Height" @@ -5170,7 +7097,7 @@ msgstr "Lichtheid" #: ../src/extension/internal/filter/bumps.h:100 #: ../src/extension/internal/filter/bumps.h:331 msgid "Precision" -msgstr "Precisie::" +msgstr "Precisie" #: ../src/extension/internal/filter/bumps.h:103 msgid "Light source" @@ -5199,13 +7126,13 @@ msgstr "Opties ver licht" #: ../src/extension/internal/filter/bumps.h:110 #: ../src/extension/internal/filter/bumps.h:332 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Azimuth" msgstr "Azimut" #: ../src/extension/internal/filter/bumps.h:111 #: ../src/extension/internal/filter/bumps.h:333 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Elevation" msgstr "Hoogte" @@ -5216,17 +7143,17 @@ msgstr "Opties puntlicht" #: ../src/extension/internal/filter/bumps.h:113 #: ../src/extension/internal/filter/bumps.h:117 msgid "X location" -msgstr "X-locatie::" +msgstr "X-locatie" #: ../src/extension/internal/filter/bumps.h:114 #: ../src/extension/internal/filter/bumps.h:118 msgid "Y location" -msgstr "Y-locatie::" +msgstr "Y-locatie" #: ../src/extension/internal/filter/bumps.h:115 #: ../src/extension/internal/filter/bumps.h:119 msgid "Z location" -msgstr "Z-locatie::" +msgstr "Z-locatie" #: ../src/extension/internal/filter/bumps.h:116 msgid "Spot light options" @@ -5234,23 +7161,23 @@ msgstr "Opties spotlicht" #: ../src/extension/internal/filter/bumps.h:120 msgid "X target" -msgstr "X-doel::" +msgstr "X-doel" #: ../src/extension/internal/filter/bumps.h:121 msgid "Y target" -msgstr "Y-doel::" +msgstr "Y-doel" #: ../src/extension/internal/filter/bumps.h:122 msgid "Z target" -msgstr "Z-doel::" +msgstr "Z-doel" #: ../src/extension/internal/filter/bumps.h:123 msgid "Specular exponent" -msgstr "Spiegelfactor::" +msgstr "Spiegelfactor" #: ../src/extension/internal/filter/bumps.h:124 msgid "Cone angle" -msgstr "Kegelhoek::" +msgstr "Kegelhoek" #: ../src/extension/internal/filter/bumps.h:127 msgid "Image color" @@ -5276,7 +7203,7 @@ msgstr "Achtergrond:" #: ../src/extension/internal/filter/bumps.h:322 #: ../src/extension/internal/filter/transparency.h:57 #: ../src/filter-enums.cpp:29 -#: ../src/sp-image.cpp:616 +#: ../src/sp-image.cpp:637 msgid "Image" msgstr "Afbeelding" @@ -5286,7 +7213,7 @@ msgstr "Vervaagde afbeelding" #: ../src/extension/internal/filter/bumps.h:325 msgid "Background opacity" -msgstr "Ondoorzichtigheid achtergrond::" +msgstr "Ondoorzichtigheid achtergrond" #: ../src/extension/internal/filter/bumps.h:327 #: ../src/extension/internal/filter/color.h:1040 @@ -5337,7 +7264,7 @@ msgstr "Glans" #: ../src/extension/internal/filter/color.h:75 #: ../src/extension/internal/filter/color.h:1417 msgid "Over-saturation" -msgstr "Oververzadiging::" +msgstr "Oververzadiging" #: ../src/extension/internal/filter/color.h:77 #: ../src/extension/internal/filter/color.h:161 @@ -5389,7 +7316,7 @@ msgstr "Kleurshift" #: ../src/extension/internal/filter/color.h:256 msgid "Shift (°)" -msgstr "Verplaatsing (°)::" +msgstr "Verplaatsing (°)" #: ../src/extension/internal/filter/color.h:265 msgid "Rotate and desaturate hue" @@ -5397,7 +7324,7 @@ msgstr "Tint roteren en desatureren" #: ../src/extension/internal/filter/color.h:321 msgid "Harsh light" -msgstr "Hard licht::" +msgstr "Hard licht" #: ../src/extension/internal/filter/color.h:322 msgid "Normal light" @@ -5434,12 +7361,14 @@ msgstr "Identiteit" #: ../src/extension/internal/filter/color.h:428 #: ../src/extension/internal/filter/paint.h:498 #: ../src/filter-enums.cpp:108 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1050 msgid "Table" msgstr "Tabel" #: ../src/extension/internal/filter/color.h:429 #: ../src/extension/internal/filter/paint.h:499 #: ../src/filter-enums.cpp:109 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1053 msgid "Discrete" msgstr "Discreet" @@ -5637,6 +7566,7 @@ msgstr "Schaduwen" #: ../src/live_effects/effect.cpp:97 #: ../src/live_effects/lpe-offset.cpp:31 #: ../src/live_effects/lpe-parallel.cpp:50 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1047 #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset" msgstr "Verplaatsen" @@ -5915,8 +7845,8 @@ msgid "Detect:" msgstr "Detecteren:" #: ../src/extension/internal/filter/image.h:52 -#: ../src/ui/dialog/template-load-tab.cpp:104 -#: ../src/ui/dialog/template-load-tab.cpp:141 +#: ../src/ui/dialog/template-load-tab.cpp:105 +#: ../src/ui/dialog/template-load-tab.cpp:142 msgid "All" msgstr "Alle" @@ -5955,8 +7885,8 @@ msgid "Open" msgstr "Open" #: ../src/extension/internal/filter/morphology.h:65 -#: ../src/libgdl/gdl-dock-placeholder.c:167 #: ../src/libgdl/gdl-dock.c:191 +#: ../src/libgdl/gdl-dock-placeholder.c:167 #: ../src/widgets/rect-toolbar.cpp:321 #: ../src/widgets/spray-toolbar.cpp:128 #: ../src/widgets/tweak-toolbar.cpp:142 @@ -6069,8 +7999,8 @@ msgstr "Ruis opvulling" #: ../src/extension/internal/filter/shadows.h:60 #: ../src/ui/dialog/find.cpp:87 #: ../src/ui/dialog/tracedialog.cpp:747 -#: ../share/extensions/color_HSL_adjust.inx.h:2 #: ../share/extensions/color_custom.inx.h:2 +#: ../share/extensions/color_HSL_adjust.inx.h:2 #: ../share/extensions/color_randomize.inx.h:2 #: ../share/extensions/dots.inx.h:2 #: ../share/extensions/dxf_input.inx.h:2 @@ -6092,9 +8022,9 @@ msgstr "Ruis opvulling" #: ../share/extensions/split.inx.h:2 #: ../share/extensions/voronoi2svg.inx.h:2 #: ../share/extensions/web-set-att.inx.h:2 -#: ../share/extensions/web-transmit-att.inx.h:2 #: ../share/extensions/webslicer_create_group.inx.h:2 #: ../share/extensions/webslicer_export.inx.h:2 +#: ../share/extensions/web-transmit-att.inx.h:2 msgid "Options" msgstr "Opties" @@ -6196,7 +8126,7 @@ msgstr "Afbeelding omzetten in gravure van verticale en horizontale lijnen" #: ../src/extension/internal/filter/paint.h:331 #: ../src/ui/dialog/align-and-distribute.cpp:1004 -#: ../src/widgets/desktop-widget.cpp:2007 +#: ../src/widgets/desktop-widget.cpp:1998 msgid "Drawing" msgstr "Tekening" @@ -6485,7 +8415,7 @@ msgid "Background" msgstr "Achtergrond" #: ../src/extension/internal/filter/transparency.h:59 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2624 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2830 #: ../src/ui/dialog/input.cpp:1088 #: ../src/widgets/eraser-toolbar.cpp:123 #: ../src/widgets/pencil-toolbar.cpp:156 @@ -6563,7 +8493,7 @@ msgstr "Invoegen resulteert in alleenstaande, grotere SVG-bestanden. Linken refe #: ../src/extension/internal/gdkpixbuf-input.cpp:182 msgid "Scale image preference (image-rendering):" -msgstr "" +msgstr "Schalen (renderen afbeelding):" #: ../src/extension/internal/gdkpixbuf-input.cpp:183 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 @@ -6573,21 +8503,20 @@ msgstr "Geen (standaard)" #: ../src/extension/internal/gdkpixbuf-input.cpp:184 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 msgid "Smooth (optimizeQuality)" -msgstr "" +msgstr "Glad (optimizeQuality)" #: ../src/extension/internal/gdkpixbuf-input.cpp:185 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 msgid "Blocky (optimizeSpeed)" -msgstr "" +msgstr "Geblokt (optimizeSpeed)" #: ../src/extension/internal/gdkpixbuf-input.cpp:187 msgid "When an image is upscaled, apply smoothing or keep blocky (pixelated). (Will not work in all browsers.)" -msgstr "" +msgstr "Uitsmeren of blok-/pixeleffect behouden bij opschalen van een afbeelding. (werkt niet in alle browsers.)" #: ../src/extension/internal/gdkpixbuf-input.cpp:189 -#, fuzzy msgid "Hide the dialog next time and always apply the same actions." -msgstr "Het dialoogvenster de volgende keer verbergen en dezelfde actie toepassen." +msgstr "Het dialoogvenster de volgende keer verbergen en dezelfde acties toepassen." #: ../src/extension/internal/gdkpixbuf-input.cpp:189 msgid "Don't ask again" @@ -6647,8 +8576,8 @@ msgstr "Verticale inspringing:" #: ../share/extensions/polyhedron_3d.inx.h:56 #: ../share/extensions/printing_marks.inx.h:20 #: ../share/extensions/render_alphabetsoup.inx.h:5 -#: ../share/extensions/render_barcode.inx.h:5 #: ../share/extensions/render_barcode_datamatrix.inx.h:5 +#: ../share/extensions/render_barcode.inx.h:5 #: ../share/extensions/render_barcode_qrcode.inx.h:18 #: ../share/extensions/render_gear_rack.inx.h:5 #: ../share/extensions/render_gears.inx.h:11 @@ -6683,6 +8612,10 @@ msgstr "JavaFX (*.fx)" msgid "JavaFX Raytracer File" msgstr "JavaFX Raytracer Bestand" +#: ../src/extension/internal/latex-pstricks.cpp:334 +msgid "LaTeX Print" +msgstr "LaTeX print" + #: ../src/extension/internal/latex-pstricks-out.cpp:95 msgid "LaTeX Output" msgstr "LaTeX-uitvoer" @@ -6695,10 +8628,6 @@ msgstr "LaTeX met PSTricks macros (*.tex)" msgid "LaTeX PSTricks File" msgstr "LaTeX PSTricks Bestand" -#: ../src/extension/internal/latex-pstricks.cpp:334 -msgid "LaTeX Print" -msgstr "LaTeX print" - #: ../src/extension/internal/odf.cpp:2149 msgid "OpenDocument Drawing Output" msgstr "OpenDocument-tekeninguitvoer" @@ -6977,33 +8906,33 @@ msgstr "VSDX-invoer" msgid "Microsoft Visio 2013 drawing (*.vsdx)" msgstr "Microsoft Visio 2013 tekening (*.vsdx)" -#: ../src/extension/internal/wmf-inout.cpp:3220 +#: ../src/extension/internal/wmf-inout.cpp:3072 msgid "WMF Input" msgstr "WMF-invoer" -#: ../src/extension/internal/wmf-inout.cpp:3225 +#: ../src/extension/internal/wmf-inout.cpp:3077 msgid "Windows Metafiles (*.wmf)" msgstr "Windows Metafiles (*.wmf)" -#: ../src/extension/internal/wmf-inout.cpp:3226 +#: ../src/extension/internal/wmf-inout.cpp:3078 msgid "Windows Metafiles" msgstr "Windows Metafiles" -#: ../src/extension/internal/wmf-inout.cpp:3234 +#: ../src/extension/internal/wmf-inout.cpp:3086 msgid "WMF Output" msgstr "WMF-uitvoer" -#: ../src/extension/internal/wmf-inout.cpp:3244 +#: ../src/extension/internal/wmf-inout.cpp:3096 msgid "Map all fill patterns to standard WMF hatches" msgstr "Alle vulpatronen naar standaard WMF-hatches mappen" -#: ../src/extension/internal/wmf-inout.cpp:3248 +#: ../src/extension/internal/wmf-inout.cpp:3100 #: ../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:3249 +#: ../src/extension/internal/wmf-inout.cpp:3101 msgid "Windows Metafile" msgstr "Windows Metafile" @@ -7041,7 +8970,7 @@ msgid "Broken links have been changed to point to existing files." msgstr "Verbroken links werden aangepast naar bestaande bestanden." #: ../src/file.cpp:331 -#: ../src/file.cpp:1250 +#: ../src/file.cpp:1247 #, c-format msgid "Failed to load the requested file %s" msgstr "Het laden van het gevraagde bestand %s is mislukt" @@ -7051,111 +8980,110 @@ msgid "Document not saved yet. Cannot revert." msgstr "Het bestand is nog niet opgeslagen. Kan het niet terugdraaien." #: ../src/file.cpp:363 -#, c-format -msgid "Changes will be lost! Are you sure you want to reload document %s?" -msgstr "Wijzigingen zullen verloren gaan! Weet u zeker dat u bestand %s opnieuw wilt laden?" +msgid "Changes will be lost! Are you sure you want to reload document %1?" +msgstr "Wijzigingen gaan verloren! Weet u zeker dat u bestand %1 opnieuw wil laden?" -#: ../src/file.cpp:392 +#: ../src/file.cpp:389 msgid "Document reverted." msgstr "Het bestand is teruggezet." -#: ../src/file.cpp:394 +#: ../src/file.cpp:391 msgid "Document not reverted." msgstr "Het bestand is niet teruggezet." -#: ../src/file.cpp:544 +#: ../src/file.cpp:541 msgid "Select file to open" msgstr "Selecteer een bestand om te openen" -#: ../src/file.cpp:626 +#: ../src/file.cpp:623 msgid "Clean up document" msgstr "Document schoonmaken" -#: ../src/file.cpp:633 +#: ../src/file.cpp:630 #, c-format msgid "Removed %i unused definition in <defs>." msgid_plural "Removed %i unused definitions in <defs>." msgstr[0] "In <defs> is %i ongebruikte definitie verwijderd." msgstr[1] "In <defs> zijn %i ongebruikte definities verwijderd." -#: ../src/file.cpp:638 +#: ../src/file.cpp:635 msgid "No unused definitions in <defs>." msgstr "Er zijn geen ongebruikte definities in <defs>." -#: ../src/file.cpp:670 +#: ../src/file.cpp:667 #, c-format msgid "No Inkscape extension found to save document (%s). This may have been caused by an unknown filename extension." msgstr "Er werd geen Inkscape-uitbreiding aangetroffen om het bestand (%s) op te slaan. Dit kan komen door een onbekende bestandsextensie." -#: ../src/file.cpp:671 -#: ../src/file.cpp:679 -#: ../src/file.cpp:687 -#: ../src/file.cpp:693 -#: ../src/file.cpp:698 +#: ../src/file.cpp:668 +#: ../src/file.cpp:676 +#: ../src/file.cpp:684 +#: ../src/file.cpp:690 +#: ../src/file.cpp:695 msgid "Document not saved." msgstr "Document is niet opgeslagen." -#: ../src/file.cpp:678 +#: ../src/file.cpp:675 #, c-format msgid "File %s is write protected. Please remove write protection and try again." msgstr "Bestand %s is schrijfbeveiligd. Verwijder aub de schrijfbeveiliging en probeer opnieuw." -#: ../src/file.cpp:686 +#: ../src/file.cpp:683 #, c-format msgid "File %s could not be saved." msgstr "Bestand %s kon niet worden opgeslagen." -#: ../src/file.cpp:716 -#: ../src/file.cpp:718 +#: ../src/file.cpp:713 +#: ../src/file.cpp:715 msgid "Document saved." msgstr "Document is opgeslagen." #. We are saving for the first time; create a unique default filename -#: ../src/file.cpp:861 +#: ../src/file.cpp:858 msgid "drawing" msgstr "tekening" -#: ../src/file.cpp:866 +#: ../src/file.cpp:863 msgid "drawing-%1" msgstr "tekening-%1" -#: ../src/file.cpp:883 +#: ../src/file.cpp:880 msgid "Select file to save a copy to" msgstr "Selecteer een bestand om een kopie naar op te slaan" -#: ../src/file.cpp:885 +#: ../src/file.cpp:882 msgid "Select file to save to" msgstr "Selecteer een bestand om in op te slaan" -#: ../src/file.cpp:990 -#: ../src/file.cpp:992 +#: ../src/file.cpp:987 +#: ../src/file.cpp:989 msgid "No changes need to be saved." msgstr "Er zijn geen wijzigingen die opgeslagen hoeven te worden." -#: ../src/file.cpp:1011 +#: ../src/file.cpp:1008 msgid "Saving document..." msgstr "Opslaan van document..." -#: ../src/file.cpp:1247 +#: ../src/file.cpp:1244 #: ../src/ui/dialog/inkscape-preferences.cpp:1439 #: ../src/ui/dialog/ocaldialogs.cpp:1246 msgid "Import" msgstr "Importeren" -#: ../src/file.cpp:1297 +#: ../src/file.cpp:1294 msgid "Select file to import" msgstr "Selecteer een bestand om te importeren" -#: ../src/file.cpp:1413 +#: ../src/file.cpp:1410 #, c-format msgid "drawing%s" msgstr "Tekening%s" -#: ../src/file.cpp:1435 +#: ../src/file.cpp:1432 msgid "Select file to export to" msgstr "Selecteer een bestand om naar te exporteren" -#: ../src/file.cpp:1688 +#: ../src/file.cpp:1685 msgid "Import Clip Art" msgstr "Clipart importeren" @@ -7222,19 +9150,16 @@ msgstr "Lijnkleur" #. New in Compositing and Blending Level 1 #: ../src/filter-enums.cpp:58 -#, fuzzy msgid "Overlay" -msgstr "Bedekking" +msgstr "" #: ../src/filter-enums.cpp:59 -#, fuzzy msgid "Color Dodge" -msgstr "Alleen kleur" +msgstr "" #: ../src/filter-enums.cpp:60 -#, fuzzy msgid "Color Burn" -msgstr "Kleurbalken" +msgstr "" #: ../src/filter-enums.cpp:61 msgid "Hard Light" @@ -7610,11 +9535,10 @@ msgstr "" #: ../src/interface.cpp:1395 #: ../src/ui/dialog/export.cpp:1298 -#: ../src/widgets/desktop-widget.cpp:1126 -#: ../src/widgets/desktop-widget.cpp:1188 -#, fuzzy +#: ../src/widgets/desktop-widget.cpp:1127 +#: ../src/widgets/desktop-widget.cpp:1189 msgid "_Cancel" -msgstr "Annuleren" +msgstr "_Annuleren" #: ../src/interface.cpp:1396 #: ../share/extensions/web-set-att.inx.h:21 @@ -7828,22 +9752,53 @@ msgstr "Dockbarstijl" msgid "Dockbar style to show items on it" msgstr "Dockbarstijl om items in weer te geven" -#: ../src/libgdl/gdl-dock-item-grip.c:399 -msgid "Iconify this dock" -msgstr "Dit paneel inklappen" +#: ../src/libgdl/gdl-dock.c:176 +#: ../src/ui/dialog/inkscape-preferences.cpp:631 +#: ../src/ui/dialog/inkscape-preferences.cpp:674 +msgid "Floating" +msgstr "Zwevend" -#: ../src/libgdl/gdl-dock-item-grip.c:401 -msgid "Close this dock" -msgstr "Dit paneel sluiten" +#: ../src/libgdl/gdl-dock.c:177 +msgid "Whether the dock is floating in its own window" +msgstr "Of het paneel in zijn eigen venster zweeft" -#: ../src/libgdl/gdl-dock-item-grip.c:721 -#: ../src/libgdl/gdl-dock-tablabel.c:125 -msgid "Controlling dock item" -msgstr "Aansturend paneelitem" +#: ../src/libgdl/gdl-dock.c:184 +#: ../src/libgdl/gdl-dock-master.c:141 +msgid "Default title" +msgstr "Standaardtitel" -#: ../src/libgdl/gdl-dock-item-grip.c:722 -msgid "Dockitem which 'owns' this grip" -msgstr "Paneelitem die dit grijppunt 'beheert'" +#: ../src/libgdl/gdl-dock.c:185 +msgid "Default title for the newly created floating docks" +msgstr "Standaardtitel voor nieuw aangemaakte zwevende panelen" + +#: ../src/libgdl/gdl-dock.c:192 +msgid "Width for the dock when it's of floating type" +msgstr "Breedte van het paneel als het van het zwevende type is" + +#: ../src/libgdl/gdl-dock.c:200 +msgid "Height for the dock when it's of floating type" +msgstr "Hoogte van het paneel als het van het zwevende type is" + +#: ../src/libgdl/gdl-dock.c:207 +msgid "Float X" +msgstr "Zwevend X" + +#: ../src/libgdl/gdl-dock.c:208 +msgid "X coordinate for a floating dock" +msgstr "X-coördinaat voor een zwevend paneel" + +#: ../src/libgdl/gdl-dock.c:215 +msgid "Float Y" +msgstr "Zwevend Y" + +#: ../src/libgdl/gdl-dock.c:216 +msgid "Y coordinate for a floating dock" +msgstr "Y-coördinaat voor een zwevend paneel" + +#: ../src/libgdl/gdl-dock.c:478 +#, c-format +msgid "Dock #%d" +msgstr "Paneel #%d" #. Name #: ../src/libgdl/gdl-dock-item.c:298 @@ -7935,10 +9890,22 @@ msgstr "Vergrendelen" msgid "Attempt to bind an unbound item %p" msgstr "Poging tot binden van ongebonden item %p" -#: ../src/libgdl/gdl-dock-master.c:141 -#: ../src/libgdl/gdl-dock.c:184 -msgid "Default title" -msgstr "Standaardtitel" +#: ../src/libgdl/gdl-dock-item-grip.c:399 +msgid "Iconify this dock" +msgstr "Dit paneel inklappen" + +#: ../src/libgdl/gdl-dock-item-grip.c:401 +msgid "Close this dock" +msgstr "Dit paneel sluiten" + +#: ../src/libgdl/gdl-dock-item-grip.c:721 +#: ../src/libgdl/gdl-dock-tablabel.c:125 +msgid "Controlling dock item" +msgstr "Aansturend paneelitem" + +#: ../src/libgdl/gdl-dock-item-grip.c:722 +msgid "Dockitem which 'owns' this grip" +msgstr "Paneelitem die dit grijppunt 'beheert'" #: ../src/libgdl/gdl-dock-master.c:142 msgid "Default title for newly created floating docks" @@ -7972,7 +9939,7 @@ msgstr "De nieuwe dock-controller %p is automatisch. Enkel manuele dockobjecten #: ../src/ui/dialog/align-and-distribute.cpp:1003 #: ../src/ui/dialog/document-properties.cpp:150 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1551 -#: ../src/widgets/desktop-widget.cpp:2003 +#: ../src/widgets/desktop-widget.cpp:1994 #: ../share/extensions/voronoi2svg.inx.h:9 msgid "Page" msgstr "Pagina" @@ -8107,69 +10074,26 @@ msgid "Y Coordinate" msgstr "Y-coördinaat" #: ../src/libgdl/gdl-dock-placeholder.c:197 -msgid "Y coordinate for dock when floating" -msgstr "Y-coördinaat voor zwevend paneel" - -#: ../src/libgdl/gdl-dock-placeholder.c:499 -msgid "Attempt to dock a dock object to an unbound placeholder" -msgstr "Probeer een paneelobject aan een ongebonden plaatshouder te verbinden" - -#: ../src/libgdl/gdl-dock-placeholder.c:611 -#, c-format -msgid "Got a detach signal from an object (%p) who is not our host %p" -msgstr "Kreeg een ontkoppelingssignaal van een object (%p) die niet op onze host %p is." - -#: ../src/libgdl/gdl-dock-placeholder.c:636 -#, c-format -msgid "Something weird happened while getting the child placement for %p from parent %p" -msgstr "Iets vreemd gebeurde tijdens het opvragen van de positie van dochter %p van ouder %p" - -#: ../src/libgdl/gdl-dock-tablabel.c:126 -msgid "Dockitem which 'owns' this tablabel" -msgstr "Paneelitem die dit tabbladlabel 'beheert'" - -#: ../src/libgdl/gdl-dock.c:176 -#: ../src/ui/dialog/inkscape-preferences.cpp:631 -#: ../src/ui/dialog/inkscape-preferences.cpp:674 -msgid "Floating" -msgstr "Zwevend" - -#: ../src/libgdl/gdl-dock.c:177 -msgid "Whether the dock is floating in its own window" -msgstr "Of het paneel in zijn eigen venster zweeft" - -#: ../src/libgdl/gdl-dock.c:185 -msgid "Default title for the newly created floating docks" -msgstr "Standaardtitel voor nieuw aangemaakte zwevende panelen" - -#: ../src/libgdl/gdl-dock.c:192 -msgid "Width for the dock when it's of floating type" -msgstr "Breedte van het paneel als het van het zwevende type is" - -#: ../src/libgdl/gdl-dock.c:200 -msgid "Height for the dock when it's of floating type" -msgstr "Hoogte van het paneel als het van het zwevende type is" - -#: ../src/libgdl/gdl-dock.c:207 -msgid "Float X" -msgstr "Zwevend X" - -#: ../src/libgdl/gdl-dock.c:208 -msgid "X coordinate for a floating dock" -msgstr "X-coördinaat voor een zwevend paneel" +msgid "Y coordinate for dock when floating" +msgstr "Y-coördinaat voor zwevend paneel" -#: ../src/libgdl/gdl-dock.c:215 -msgid "Float Y" -msgstr "Zwevend Y" +#: ../src/libgdl/gdl-dock-placeholder.c:499 +msgid "Attempt to dock a dock object to an unbound placeholder" +msgstr "Probeer een paneelobject aan een ongebonden plaatshouder te verbinden" -#: ../src/libgdl/gdl-dock.c:216 -msgid "Y coordinate for a floating dock" -msgstr "Y-coördinaat voor een zwevend paneel" +#: ../src/libgdl/gdl-dock-placeholder.c:611 +#, c-format +msgid "Got a detach signal from an object (%p) who is not our host %p" +msgstr "Kreeg een ontkoppelingssignaal van een object (%p) die niet op onze host %p is." -#: ../src/libgdl/gdl-dock.c:478 +#: ../src/libgdl/gdl-dock-placeholder.c:636 #, c-format -msgid "Dock #%d" -msgstr "Paneel #%d" +msgid "Something weird happened while getting the child placement for %p from parent %p" +msgstr "Iets vreemd gebeurde tijdens het opvragen van de positie van dochter %p van ouder %p" + +#: ../src/libgdl/gdl-dock-tablabel.c:126 +msgid "Dockitem which 'owns' this tablabel" +msgstr "Paneelitem die dit tabbladlabel 'beheert'" #: ../src/libnrtype/FontFactory.cpp:964 msgid "Ignoring font without family that will crash Pango" @@ -8334,12 +10258,12 @@ msgstr "Geen effect" msgid "Please specify a parameter path for the LPE '%s' with %d mouse clicks" msgstr "Geef aub een parameterpad op voor het padeffect '%s' met %d muisklikken" -#: ../src/live_effects/effect.cpp:632 +#: ../src/live_effects/effect.cpp:626 #, c-format msgid "Editing parameter %s." msgstr "Parameter %s bewerken." -#: ../src/live_effects/effect.cpp:637 +#: ../src/live_effects/effect.cpp:631 msgid "None of the applied path effect's parameters can be edited on-canvas." msgstr "Geen van de toegepaste padeffectparameters kunnen op het canvas bewerkt worden." @@ -8368,11 +10292,13 @@ msgid "Specifies the right end of the bisector" msgstr "Definieert het rechterdeel van de deellijn" #: ../src/live_effects/lpe-angle_bisector.cpp:86 +#: ../src/live_effects/lpe-perp_bisector.cpp:159 msgid "Adjust the \"left\" end of the bisector" msgstr "Het \"linker\"deel van de deellijn aanpassen" #: ../src/live_effects/lpe-angle_bisector.cpp:92 -msgid "Adjust the \"right\" of the bisector" +#: ../src/live_effects/lpe-perp_bisector.cpp:165 +msgid "Adjust the \"right\" end of the bisector" msgstr "Het \"rechter\"deel van de deellijn aanpassen" #: ../src/live_effects/lpe-bendpath.cpp:53 @@ -8641,7 +10567,6 @@ msgid "Angle:" msgstr "Hoek:" #: ../src/live_effects/lpe-dynastroke.cpp:53 -#, fuzzy msgid "direction of thickest strokes (opposite = thinnest)" msgstr "richting van de dikste lijnen (tegengesteld = dunste)" @@ -8793,60 +10718,60 @@ msgid "If true, the spacing between intermediates is constant along the length o msgstr "Indien aangevinkt, is de ruimte tussen de intermediairen constant over de lengte van het pad. Indien niet aangevinkt is de afstand afhankelijk van de positie van de knooppunten op het traject." #. initialise your parameters here: -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Fi_xed width:" msgstr "_Vaste breedte:" -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Size of hidden region of lower string" msgstr "Grootte verborgen deel van onderliggend pad" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "_In units of stroke width" msgstr "_In eenheid van lijnbreedte" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "Consider 'Interruption width' as a ratio of stroke width" msgstr "'Breedte onderbreking' beschouwen als verhouding van lijnbreedte" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "St_roke width" msgstr "Li_jnbreedte" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "Add the stroke width to the interruption size" msgstr "Lijnbreedte toevoegen aan de breedte van de onderbreking" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "_Crossing path stroke width" msgstr "B_reedte kruisend pad" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "Add crossed stroke width to the interruption size" msgstr "Breedte kruising toevoegen aan de breedte van de onderbreking" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "S_witcher size:" msgstr "_Grootte kruising:" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "Orientation indicator/switcher size" msgstr "Oriëntatie indicator/grootte kruising" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossing Signs" msgstr "Kruisingstekens" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossings signs" msgstr "Kruisingstekens" -#: ../src/live_effects/lpe-knot.cpp:617 +#: ../src/live_effects/lpe-knot.cpp:620 msgid "Drag to select a crossing, click to flip it" msgstr "Sleep om een kruising te selecteren, klik om te spiegelen" #. / @todo Is this the right verb? -#: ../src/live_effects/lpe-knot.cpp:655 +#: ../src/live_effects/lpe-knot.cpp:658 msgid "Change knot crossing" msgstr "Kruising aanpassen" @@ -9049,7 +10974,7 @@ msgstr "Het \"rechter\"deel van de evenwijdige aanpassen" #: ../src/live_effects/lpe-path_length.cpp:26 #: ../src/live_effects/lpe-sketch.cpp:58 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 #: ../share/extensions/render_alphabetsoup.inx.h:3 msgid "Scale:" msgstr "Schaal:" @@ -9171,14 +11096,6 @@ msgstr "Nabi_je uiteinden aaneensmelten:" msgid "Fuse ends closer than this number. 0 means don't fuse." msgstr "Uiteinden dichter dan dit getal aaneensmelten. 0 betekent geen versmelting." -#: ../src/live_effects/lpe-perp_bisector.cpp:159 -msgid "Adjust the bisector's \"left\" end" -msgstr "Het \"linker\"deel van de deellijn aanpassen" - -#: ../src/live_effects/lpe-perp_bisector.cpp:165 -msgid "Adjust the bisector's \"right\" end" -msgstr "Het \"rechter\"deel van de deellijn aanpassen" - #. initialise your parameters here: #: ../src/live_effects/lpe-perspective_path.cpp:47 msgid "Scale x" @@ -9605,9 +11522,8 @@ msgstr "Kies of er markeringen getekend worden op het begin en het einde van het #. initialise your parameters here: #: ../src/live_effects/lpe-skeleton.cpp:37 -#, fuzzy msgid "Float parameter" -msgstr "Effectparameters" +msgstr "" #: ../src/live_effects/lpe-skeleton.cpp:37 msgid "just a real number like 1.4!" @@ -10426,30 +12342,6 @@ msgstr "Verdwijnpunt omschakelen" msgid "Toggle multiple vanishing points" msgstr "Meerdere verdwijnpunten omschakelen" -#: ../src/preferences-skeleton.h:101 -msgid "Dip pen" -msgstr "Kroontjespen" - -#: ../src/preferences-skeleton.h:102 -msgid "Marker" -msgstr "Markeerstift" - -#: ../src/preferences-skeleton.h:103 -msgid "Brush" -msgstr "Penseel" - -#: ../src/preferences-skeleton.h:104 -msgid "Wiggly" -msgstr "Bevend" - -#: ../src/preferences-skeleton.h:105 -msgid "Splotchy" -msgstr "Vlekkenmakend" - -#: ../src/preferences-skeleton.h:106 -msgid "Tracing" -msgstr "Overtrekkend" - #: ../src/preferences.cpp:134 msgid "Inkscape will run with default settings, and new settings will not be saved. " msgstr "Inscape wordt gestart met de standaardinstellingen. Nieuwe instellingen worden niet bewaard." @@ -10468,7 +12360,7 @@ msgstr "Kan profielmap %s niet aanmaken." #: ../src/preferences.cpp:167 #, c-format msgid "%s is not a valid directory." -msgstr "%s is geen geldige maps." +msgstr "%s is geen geldige map." #. The write failed. #. _reportError(Glib::ustring::compose(_("Failed to create the preferences file %1."), @@ -10498,6 +12390,30 @@ msgstr "Het voorkeurenbestand %s is geen geldig XML-document." msgid "The file %s is not a valid Inkscape preferences file." msgstr "Het bestand %s is geen geldig Inkscape voorkeurenbestand." +#: ../src/preferences-skeleton.h:101 +msgid "Dip pen" +msgstr "Kroontjespen" + +#: ../src/preferences-skeleton.h:102 +msgid "Marker" +msgstr "Markeerstift" + +#: ../src/preferences-skeleton.h:103 +msgid "Brush" +msgstr "Penseel" + +#: ../src/preferences-skeleton.h:104 +msgid "Wiggly" +msgstr "Bevend" + +#: ../src/preferences-skeleton.h:105 +msgid "Splotchy" +msgstr "Vlekkenmakend" + +#: ../src/preferences-skeleton.h:106 +msgid "Tracing" +msgstr "Overtrekkend" + #: ../src/rdf.cpp:175 msgid "CC Attribution" msgstr "CC Attribution" @@ -10687,7 +12603,7 @@ msgstr "Er is niets verwijderd." #: ../src/selection-chemistry.cpp:421 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:75 #: ../src/ui/dialog/swatches.cpp:278 -#: ../src/ui/tools/text-tool.cpp:994 +#: ../src/ui/tools/text-tool.cpp:995 #: ../src/widgets/eraser-toolbar.cpp:110 #: ../src/widgets/gradient-toolbar.cpp:1196 #: ../src/widgets/gradient-toolbar.cpp:1210 @@ -10711,7 +12627,7 @@ msgstr "Selecteer twee objecten of meer objecten om te groeperen." #: ../src/selection-chemistry.cpp:763 #: ../src/sp-item-group.cpp:331 msgid "Group" -msgstr "Groeperen" +msgstr "Groep" #: ../src/selection-chemistry.cpp:772 msgid "Select a group to ungroup." @@ -10802,7 +12718,7 @@ msgid "Select object(s) to remove filters from." msgstr "Selecteer object(en) om filters van te verwijderen." #: ../src/selection-chemistry.cpp:1235 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1462 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1669 msgid "Remove filter" msgstr "Verwijder filter" @@ -11002,86 +12918,86 @@ msgstr "Selecteer een symbool om objecten uit te halen." msgid "Select only one symbol to convert to group." msgstr "Selecteer slechts één symbool om naar een groep te converteren." -#: ../src/selection-chemistry.cpp:3088 +#: ../src/selection-chemistry.cpp:3089 msgid "Group from symbol" msgstr "Groep van symbool" -#: ../src/selection-chemistry.cpp:3105 +#: ../src/selection-chemistry.cpp:3106 msgid "Select object(s) to convert to pattern." msgstr "Selecteer eerst de objecten om te converteren naar een patroon." -#: ../src/selection-chemistry.cpp:3195 +#: ../src/selection-chemistry.cpp:3196 msgid "Objects to pattern" msgstr "Objecten naar patroon" -#: ../src/selection-chemistry.cpp:3211 +#: ../src/selection-chemistry.cpp:3212 msgid "Select an object with pattern fill to extract objects from." msgstr "Selecteer objecten met patroonvulling om objecten uit te halen." -#: ../src/selection-chemistry.cpp:3266 +#: ../src/selection-chemistry.cpp:3267 msgid "No pattern fills in the selection." msgstr "Er zijn geen objecten met patroonvulling geselecteerd." -#: ../src/selection-chemistry.cpp:3269 +#: ../src/selection-chemistry.cpp:3270 msgid "Pattern to objects" msgstr "Patroon naar objecten" -#: ../src/selection-chemistry.cpp:3360 +#: ../src/selection-chemistry.cpp:3361 msgid "Select object(s) to make a bitmap copy." msgstr "Selecteer eerst de objecten om een bitmapkopie van te maken." -#: ../src/selection-chemistry.cpp:3364 +#: ../src/selection-chemistry.cpp:3365 msgid "Rendering bitmap..." msgstr "Renderen van bitmap..." -#: ../src/selection-chemistry.cpp:3543 +#: ../src/selection-chemistry.cpp:3544 msgid "Create bitmap" msgstr "Bitmap maken" -#: ../src/selection-chemistry.cpp:3575 +#: ../src/selection-chemistry.cpp:3576 msgid "Select object(s) to create clippath or mask from." msgstr "Selecteer de objecten om een afsnijpad/masker van te maken." -#: ../src/selection-chemistry.cpp:3578 +#: ../src/selection-chemistry.cpp:3579 msgid "Select mask object and object(s) to apply clippath or mask to." msgstr "Selecteer het maskerobject en de object(en) om het afsnijpad/masker op toe te passen." -#: ../src/selection-chemistry.cpp:3761 +#: ../src/selection-chemistry.cpp:3762 msgid "Set clipping path" msgstr "Afsnijpad inschakelen" -#: ../src/selection-chemistry.cpp:3763 +#: ../src/selection-chemistry.cpp:3764 msgid "Set mask" msgstr "Masker inschakelen" -#: ../src/selection-chemistry.cpp:3778 +#: ../src/selection-chemistry.cpp:3779 msgid "Select object(s) to remove clippath or mask from." msgstr "Selecteer object(en) om het afsnijpad/masker van uit te schakelen." -#: ../src/selection-chemistry.cpp:3889 +#: ../src/selection-chemistry.cpp:3890 msgid "Release clipping path" msgstr "Afsnijpad uitschakelen" -#: ../src/selection-chemistry.cpp:3891 +#: ../src/selection-chemistry.cpp:3892 msgid "Release mask" msgstr "Masker uitschakelen" -#: ../src/selection-chemistry.cpp:3910 +#: ../src/selection-chemistry.cpp:3911 msgid "Select object(s) to fit canvas to." msgstr "Selecteer object(en) voor aanpassing van het canvas" #. Fit Page -#: ../src/selection-chemistry.cpp:3930 +#: ../src/selection-chemistry.cpp:3931 #: ../src/verbs.cpp:2909 msgid "Fit Page to Selection" msgstr "Pagina naar selectie schalen" -#: ../src/selection-chemistry.cpp:3959 +#: ../src/selection-chemistry.cpp:3960 #: ../src/verbs.cpp:2911 msgid "Fit Page to Drawing" msgstr "Pagina naar tekening schalen" -#: ../src/selection-chemistry.cpp:3980 +#: ../src/selection-chemistry.cpp:3981 #: ../src/verbs.cpp:2913 msgid "Fit Page to Selection or Drawing" msgstr "Pagina naar selectie of inhoud schalen" @@ -11171,26 +13087,6 @@ msgid_plural "; %d filtered objects " msgstr[0] "; %d gefilterd object" msgstr[1] "; %d gefilterde objecten" -#: ../src/seltrans-handles.cpp:9 -msgid "Squeeze or stretch selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" -msgstr "Selectie samendrukken of uitrekken; Ctrl behoudt de verhoudingen; Shift vergroot/verkleint om het rotatiemiddelpunt" - -#: ../src/seltrans-handles.cpp:10 -msgid "Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" -msgstr "Selectie vergroten of verkleinen; Ctrl behoudt de verhoudingen; Shift vergroot/verkleint om het rotatiemiddelpunt" - -#: ../src/seltrans-handles.cpp:11 -msgid "Skew selection; with Ctrl to snap angle; with Shift to skew around the opposite side" -msgstr "Selectie scheeftrekken; Ctrl trekt in stappen, Shift trekt om de tegenoverliggende hoek" - -#: ../src/seltrans-handles.cpp:12 -msgid "Rotate selection; with Ctrl to snap angle; with Shift to rotate around the opposite corner" -msgstr "Selectie draaien; Ctrl draait in stappen, Shift draait om de tegenoverliggende hoek" - -#: ../src/seltrans-handles.cpp:13 -msgid "Center of rotation and skewing: drag to reposition; scaling with Shift also uses this center" -msgstr "Het centrum van draaien en scheeftrekken: sleep om te verplaatsen; vergroten/verkleinen met Shift gebruikt ook dit centrum." - #: ../src/seltrans.cpp:471 #: ../src/ui/dialog/transformation.cpp:982 msgid "Skew" @@ -11238,6 +13134,26 @@ msgstr "Centrum verplaatsen naar %s, %s" msgid "Move by %s, %s; with Ctrl to restrict to horizontal/vertical; with Shift to disable snapping" msgstr "Verplaatsen met %s, %s; gebruik Ctrl om het te beperken tot horizontaal en verticaal, gebruik Shift om magnetisch raster uit te zetten." +#: ../src/seltrans-handles.cpp:9 +msgid "Squeeze or stretch selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" +msgstr "Selectie samendrukken of uitrekken; Ctrl behoudt de verhoudingen; Shift vergroot/verkleint om het rotatiemiddelpunt" + +#: ../src/seltrans-handles.cpp:10 +msgid "Scale selection; with Ctrl to scale uniformly; with Shift to scale around rotation center" +msgstr "Selectie vergroten of verkleinen; Ctrl behoudt de verhoudingen; Shift vergroot/verkleint om het rotatiemiddelpunt" + +#: ../src/seltrans-handles.cpp:11 +msgid "Skew selection; with Ctrl to snap angle; with Shift to skew around the opposite side" +msgstr "Selectie scheeftrekken; Ctrl trekt in stappen, Shift trekt om de tegenoverliggende hoek" + +#: ../src/seltrans-handles.cpp:12 +msgid "Rotate selection; with Ctrl to snap angle; with Shift to rotate around the opposite corner" +msgstr "Selectie draaien; Ctrl draait in stappen, Shift draait om de tegenoverliggende hoek" + +#: ../src/seltrans-handles.cpp:13 +msgid "Center of rotation and skewing: drag to reposition; scaling with Shift also uses this center" +msgstr "Het centrum van draaien en scheeftrekken: sleep om te verplaatsen; vergroten/verkleinen met Shift gebruikt ook dit centrum." + #: ../src/shortcuts.cpp:226 #, c-format msgid "Keyboard directory (%s) is unavailable." @@ -11305,7 +13221,7 @@ msgstr "Gelinkte ingekaderde tekst" #: ../src/sp-flowtext.cpp:298 #: ../src/sp-text.cpp:357 -#: ../src/ui/tools/text-tool.cpp:1599 +#: ../src/ui/tools/text-tool.cpp:1600 msgid " [truncated]" msgstr " [afgekort]" @@ -11349,32 +13265,20 @@ msgstr "horizontaal, op %s" msgid "at %d degrees, through (%s,%s)" msgstr "op %d graden, door (%s,%s)" -#: ../src/sp-image.cpp:624 +#: ../src/sp-image.cpp:645 msgid "embedded" msgstr "ingevoegd" -#: ../src/sp-image.cpp:632 +#: ../src/sp-image.cpp:653 #, c-format msgid "[bad reference]: %s" msgstr "[slechte referentie]: %s" -#: ../src/sp-image.cpp:633 +#: ../src/sp-image.cpp:654 #, c-format msgid "%d × %d: %s" msgstr "%d × %d: %s" -#: ../src/sp-item-group.cpp:337 -#: ../src/sp-switch.cpp:82 -#, fuzzy, c-format -msgid "of %d object" -msgstr "van %d object" - -#: ../src/sp-item-group.cpp:337 -#: ../src/sp-switch.cpp:82 -#, c-format -msgid "of %d objects" -msgstr "van %d objecten" - #: ../src/sp-item.cpp:942 #: ../src/verbs.cpp:213 msgid "Object" @@ -11395,14 +13299,128 @@ msgstr "%s; gemaskeerd" msgid "%s; filtered (%s)" msgstr "%s; gefilterd (%s)" -#: ../src/sp-item.cpp:977 +#: ../src/sp-item.cpp:977 +#, c-format +msgid "%s; filtered" +msgstr "%s; gefilterd" + +#: ../src/sp-item-group.cpp:337 +#: ../src/sp-switch.cpp:82 +#, c-format +msgid "of %d object" +msgstr "van %d object" + +#: ../src/sp-item-group.cpp:337 +#: ../src/sp-switch.cpp:82 +#, c-format +msgid "of %d objects" +msgstr "van %d objecten" + +#: ../src/sp-line.cpp:126 +msgid "Line" +msgstr "Lijn" + +#: ../src/splivarot.cpp:82 +msgid "Intersection" +msgstr "Overlap" + +#: ../src/splivarot.cpp:105 +msgid "Division" +msgstr "Splitsen" + +#: ../src/splivarot.cpp:110 +msgid "Cut path" +msgstr "Pad versnijden" + +#: ../src/splivarot.cpp:333 +msgid "Select at least 2 paths to perform a boolean operation." +msgstr "Selecteer minstens twee paden om een booleaanse bewerking uit te voeren." + +#: ../src/splivarot.cpp:337 +msgid "Select at least 1 path to perform a boolean union." +msgstr "Selecteer minstens één pad om een booleaanse vereniging uit te voeren." + +#: ../src/splivarot.cpp:345 +msgid "Select exactly 2 paths to perform difference, division, or path cut." +msgstr "Selecteer precies twee paden om een verschil, uitsluiting, splitsing of padversnijding uit te voeren." + +#: ../src/splivarot.cpp:361 +#: ../src/splivarot.cpp:376 +msgid "Unable to determine the z-order of the objects selected for difference, XOR, division, or path cut." +msgstr "Er kon niet worden bepaald welk object boven de andere lag om een verschil, uitsluiting, splitsing of pad-snijding uit te voeren." + +#: ../src/splivarot.cpp:407 +msgid "One of the objects is not a path, cannot perform boolean operation." +msgstr "Een van de geselecteerde objecten is geen pad, de booleaansche bewerking kan niet worden uitgevoerd." + +#: ../src/splivarot.cpp:1156 +msgid "Select stroked path(s) to convert stroke to path." +msgstr "Selecteer paden waarvan de omlijning omgezet moet worden naar een pad." + +#: ../src/splivarot.cpp:1511 +msgid "Convert stroke to path" +msgstr "Omlijning omzetten naar pad" + +#. TRANSLATORS: "to outline" means "to convert stroke to path" +#: ../src/splivarot.cpp:1514 +msgid "No stroked paths in the selection." +msgstr "Er zijn geen omlijnde paden geselecteerd." + +#: ../src/splivarot.cpp:1585 +msgid "Selected object is not a path, cannot inset/outset." +msgstr "Het geselecteerde object is geen pad, en kan dus niet versmalt/verbreed worden." + +#: ../src/splivarot.cpp:1676 +#: ../src/splivarot.cpp:1741 +msgid "Create linked offset" +msgstr "Gekoppelde offset maken" + +#: ../src/splivarot.cpp:1677 +#: ../src/splivarot.cpp:1742 +msgid "Create dynamic offset" +msgstr "Dynamische offset maken" + +#: ../src/splivarot.cpp:1767 +msgid "Select path(s) to inset/outset." +msgstr "Selecteer de paden om te versmallen/verbreden." + +#: ../src/splivarot.cpp:1963 +msgid "Outset path" +msgstr "Pad verbreden" + +#: ../src/splivarot.cpp:1963 +msgid "Inset path" +msgstr "Pad versmallen" + +#: ../src/splivarot.cpp:1965 +msgid "No paths to inset/outset in the selection." +msgstr "Er zijn geen paden geselecteerd om te vernauwen/verwijden." + +#: ../src/splivarot.cpp:2127 +msgid "Simplifying paths (separately):" +msgstr "Vereenvoudigen van paden (apart):" + +#: ../src/splivarot.cpp:2129 +msgid "Simplifying paths:" +msgstr "Vereenvoudigen van paden:" + +#: ../src/splivarot.cpp:2166 +#, c-format +msgid "%s %d of %d paths simplified..." +msgstr "%s %d van %d paden vereenvoudigd..." + +#: ../src/splivarot.cpp:2179 #, c-format -msgid "%s; filtered" -msgstr "%s; gefilterd" +msgid "%d paths simplified." +msgstr "%d paden zijn vereenvoudigd." -#: ../src/sp-line.cpp:126 -msgid "Line" -msgstr "Lijn" +#: ../src/splivarot.cpp:2193 +msgid "Select path(s) to simplify." +msgstr "Selecteer paden om te vereenvoudigen." + +#: ../src/splivarot.cpp:2209 +msgid "No paths to simplify in the selection." +msgstr "Er zijn geen paden geselecteerd om te vereenvoudigen." #: ../src/sp-lpe-item.cpp:249 msgid "An exception occurred during execution of the Path Effect." @@ -11552,9 +13570,8 @@ msgid "[orphaned]" msgstr "[verweesd]" #: ../src/sp-tspan.cpp:220 -#, fuzzy msgid "Text Span" -msgstr "Tekstanker" +msgstr "Tekstruimte" #: ../src/sp-use.cpp:213 msgid "Symbol" @@ -11580,108 +13597,6 @@ msgstr "..." msgid "of: %s" msgstr "van: %s" -#: ../src/splivarot.cpp:82 -msgid "Intersection" -msgstr "Overlap" - -#: ../src/splivarot.cpp:105 -msgid "Division" -msgstr "Splitsen" - -#: ../src/splivarot.cpp:110 -msgid "Cut path" -msgstr "Pad versnijden" - -#: ../src/splivarot.cpp:333 -msgid "Select at least 2 paths to perform a boolean operation." -msgstr "Selecteer minstens twee paden om een booleaanse bewerking uit te voeren." - -#: ../src/splivarot.cpp:337 -msgid "Select at least 1 path to perform a boolean union." -msgstr "Selecteer minstens één pad om een booleaanse vereniging uit te voeren." - -#: ../src/splivarot.cpp:345 -msgid "Select exactly 2 paths to perform difference, division, or path cut." -msgstr "Selecteer precies twee paden om een verschil, uitsluiting, splitsing of padversnijding uit te voeren." - -#: ../src/splivarot.cpp:361 -#: ../src/splivarot.cpp:376 -msgid "Unable to determine the z-order of the objects selected for difference, XOR, division, or path cut." -msgstr "Er kon niet worden bepaald welk object boven de andere lag om een verschil, uitsluiting, splitsing of pad-snijding uit te voeren." - -#: ../src/splivarot.cpp:407 -msgid "One of the objects is not a path, cannot perform boolean operation." -msgstr "Een van de geselecteerde objecten is geen pad, de booleaansche bewerking kan niet worden uitgevoerd." - -#: ../src/splivarot.cpp:1156 -msgid "Select stroked path(s) to convert stroke to path." -msgstr "Selecteer paden waarvan de omlijning omgezet moet worden naar een pad." - -#: ../src/splivarot.cpp:1511 -msgid "Convert stroke to path" -msgstr "Omlijning omzetten naar pad" - -#. TRANSLATORS: "to outline" means "to convert stroke to path" -#: ../src/splivarot.cpp:1514 -msgid "No stroked paths in the selection." -msgstr "Er zijn geen omlijnde paden geselecteerd." - -#: ../src/splivarot.cpp:1585 -msgid "Selected object is not a path, cannot inset/outset." -msgstr "Het geselecteerde object is geen pad, en kan dus niet versmalt/verbreed worden." - -#: ../src/splivarot.cpp:1676 -#: ../src/splivarot.cpp:1741 -msgid "Create linked offset" -msgstr "Gekoppelde offset maken" - -#: ../src/splivarot.cpp:1677 -#: ../src/splivarot.cpp:1742 -msgid "Create dynamic offset" -msgstr "Dynamische offset maken" - -#: ../src/splivarot.cpp:1767 -msgid "Select path(s) to inset/outset." -msgstr "Selecteer de paden om te versmallen/verbreden." - -#: ../src/splivarot.cpp:1963 -msgid "Outset path" -msgstr "Pad verbreden" - -#: ../src/splivarot.cpp:1963 -msgid "Inset path" -msgstr "Pad versmallen" - -#: ../src/splivarot.cpp:1965 -msgid "No paths to inset/outset in the selection." -msgstr "Er zijn geen paden geselecteerd om te vernauwen/verwijden." - -#: ../src/splivarot.cpp:2127 -msgid "Simplifying paths (separately):" -msgstr "Vereenvoudigen van paden (apart):" - -#: ../src/splivarot.cpp:2129 -msgid "Simplifying paths:" -msgstr "Vereenvoudigen van paden:" - -#: ../src/splivarot.cpp:2166 -#, c-format -msgid "%s %d of %d paths simplified..." -msgstr "%s %d van %d paden vereenvoudigd..." - -#: ../src/splivarot.cpp:2179 -#, c-format -msgid "%d paths simplified." -msgstr "%d paden zijn vereenvoudigd." - -#: ../src/splivarot.cpp:2193 -msgid "Select path(s) to simplify." -msgstr "Selecteer paden om te vereenvoudigen." - -#: ../src/splivarot.cpp:2209 -msgid "No paths to simplify in the selection." -msgstr "Er zijn geen paden geselecteerd om te vereenvoudigen." - #: ../src/text-chemistry.cpp:94 msgid "Select a text and a path to put text on path." msgstr "Selecteer tekst en pad om de tekst op het pad te zetten." @@ -11763,14 +13678,12 @@ msgid "You cannot edit cloned character data." msgstr "Gekloonde teksten kunnen niet bewerkt worden." #: ../src/tools-switch.cpp:91 -#, fuzzy msgid "Click to Select and Transform objects, Drag to select many objects." -msgstr "Klik om een item te selecteren, sleep om het te verplaatsen." +msgstr "Klik om een object te selecteren en aan te passen, sleep om vele objecten te selecteren." #: ../src/tools-switch.cpp:92 -#, fuzzy msgid "Modify selected path points (nodes) directly." -msgstr "Geselecteerde paden vereenvoudigen (overbodige knooppunten verwijderen)" +msgstr "Geselecteerde knooppunten direct aanpassen." #: ../src/tools-switch.cpp:93 msgid "To tweak a path by pushing, select it and drag over it." @@ -11813,7 +13726,7 @@ msgid "Drag to draw a calligraphic stroke; with Ctrl to track a gu msgstr "Sleep om een kalligrafische lijn te tekenen; gebruik Ctrl om over te trekken. Pijltjestoetsen passen breedte (links/rechts) en hoek (boven/beneden) aan." #: ../src/tools-switch.cpp:103 -#: ../src/ui/tools/text-tool.cpp:1626 +#: ../src/ui/tools/text-tool.cpp:1627 msgid "Click to select or create text, drag to create flowed text; then type." msgstr "Klik om een tekst te beginnen of te selecteren, sleep om ingekaderde tekst te maken; begin vervolgens te tikken." @@ -11991,7 +13904,7 @@ msgstr "about.nl.svg" #: ../src/ui/dialog/aboutbox.cpp:416 msgid "translator-credits" msgstr "" -"Kris De Gussem (Kris.DeGussem@gmail.com), 2008-2013.\n" +"Kris De Gussem (Kris.DeGussem@gmail.com), 2008-2014.\n" "\n" "Vorige vertalers:\n" "Foppe Benedictus (foppe.benedictus@gmail.com), 2007-2009.\n" @@ -12254,7 +14167,7 @@ msgstr "Kleinste object" #: ../src/ui/dialog/align-and-distribute.cpp:1005 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1555 #: ../src/verbs.cpp:175 -#: ../src/widgets/desktop-widget.cpp:2011 +#: ../src/widgets/desktop-widget.cpp:2002 #: ../share/extensions/printing_marks.inx.h:18 msgid "Selection" msgstr "Selectie" @@ -13454,7 +15367,7 @@ msgstr "_Exporteren als..." #: ../src/ui/dialog/export.cpp:173 msgid "B_atch export all selected objects" -msgstr "Alle _geselecteerde objecten apart exporteren" +msgstr "_Geselecteerde objecten afzonderlijk exporteren" #: ../src/ui/dialog/export.cpp:173 msgid "Export each selected object into its own PNG file, using export hints if any (caution, overwrites without asking!)" @@ -13462,7 +15375,7 @@ msgstr "Elk geselecteerd object naar zijn eigen PNG-bestand exporteren, door geb #: ../src/ui/dialog/export.cpp:175 msgid "Hide a_ll except selected" -msgstr "Alles _verbergen behalve het geselecteerde" +msgstr "Alles _verbergen behalve selectie" #: ../src/ui/dialog/export.cpp:175 msgid "In the exported image, hide all objects except those that are selected" @@ -13623,7 +15536,7 @@ msgstr "Export afgebroken." #: ../src/ui/dialog/export.cpp:1299 #: ../src/ui/dialog/input.cpp:1082 #: ../src/verbs.cpp:2361 -#: ../src/widgets/desktop-widget.cpp:1127 +#: ../src/widgets/desktop-widget.cpp:1128 msgid "_Save" msgstr "Op_slaan" @@ -13634,8 +15547,8 @@ msgstr "Informatie" #: ../src/ui/dialog/extension-editor.cpp:82 #: ../src/verbs.cpp:290 #: ../src/verbs.cpp:309 -#: ../share/extensions/color_HSL_adjust.inx.h:11 #: ../share/extensions/color_custom.inx.h:7 +#: ../share/extensions/color_HSL_adjust.inx.h:11 #: ../share/extensions/color_randomize.inx.h:6 #: ../share/extensions/dots.inx.h:7 #: ../share/extensions/draw_from_triangle.inx.h:35 @@ -13653,7 +15566,7 @@ msgstr "Informatie" #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:17 #: ../share/extensions/gcodetools_tools_library.inx.h:12 #: ../share/extensions/generate_voronoi.inx.h:5 -#: ../share/extensions/gimp_xcf.inx.h:6 +#: ../share/extensions/gimp_xcf.inx.h:7 #: ../share/extensions/interp_att_g.inx.h:27 #: ../share/extensions/jessyInk_autoTexts.inx.h:8 #: ../share/extensions/jessyInk_effects.inx.h:13 @@ -13677,9 +15590,9 @@ msgstr "Informatie" #: ../share/extensions/split.inx.h:8 #: ../share/extensions/voronoi2svg.inx.h:11 #: ../share/extensions/web-set-att.inx.h:25 -#: ../share/extensions/web-transmit-att.inx.h:23 #: ../share/extensions/webslicer_create_group.inx.h:11 #: ../share/extensions/webslicer_export.inx.h:6 +#: ../share/extensions/web-transmit-att.inx.h:23 msgid "Help" msgstr "Hulp" @@ -13837,371 +15750,408 @@ msgid "Stroke st_yle" msgstr "Lijn_stijl" #. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor -#: ../src/ui/dialog/filter-effects-dialog.cpp:515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:546 msgid "This matrix determines a linear transform on color space. Each line affects one of the color components. Each column determines how much of each color component from the input is passed to the output. The last column does not depend on input colors, so can be used to adjust a constant component value." msgstr "Deze matrix bepaalt een lineaire transformatie van de kleurruimte. Elke lijn beïnvloedt één van de kleurcomponenten. Elke kolom bepaalt hoeveel van elke kleurcomponent van de invoer overgedragen wordt naar de uitvoer. De laatste kolom hangt niet af van de invoerkleuren. Ze kan daarom gebruikt worden om een constante bij de kleurcomponenten toe te voegen." -#: ../src/ui/dialog/filter-effects-dialog.cpp:625 +#: ../src/ui/dialog/filter-effects-dialog.cpp:656 msgid "Image File" msgstr "Afbeeldingsbestand" -#: ../src/ui/dialog/filter-effects-dialog.cpp:628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:659 msgid "Selected SVG Element" msgstr "Geselecteerd SVG element" #. TODO: any image, not just svg -#: ../src/ui/dialog/filter-effects-dialog.cpp:698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:729 msgid "Select an image to be used as feImage input" msgstr "Selecteer een afbeelding om als feImage-invoer te gebruiken" -#: ../src/ui/dialog/filter-effects-dialog.cpp:790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:821 msgid "This SVG filter effect does not require any parameters." msgstr "Dit SVG-filtereffect vereist geen parameters." -#: ../src/ui/dialog/filter-effects-dialog.cpp:796 +#: ../src/ui/dialog/filter-effects-dialog.cpp:827 msgid "This SVG filter effect is not yet implemented in Inkscape." msgstr "Dit SVG-filtereffect is nog niet in Inkscape geimplementeerd." -#: ../src/ui/dialog/filter-effects-dialog.cpp:984 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1041 +msgid "Slope" +msgstr "Richting" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1042 +msgid "Intercept" +msgstr "Asafsnede" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1045 +msgid "Amplitude" +msgstr "Amplitude" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1046 +msgid "Exponent" +msgstr "Exponent" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1143 +msgid "New transfer function type" +msgstr "Nieuw type transferfunctie" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1178 msgid "Light Source:" -msgstr "Lichtbron: " +msgstr "Lichtbron:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Direction angle for the light source on the XY plane, in degrees" msgstr "Richtingshoek voor de lichtbron op het XY-vlak, in graden" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Direction angle for the light source on the YZ plane, in degrees" msgstr "Richtingshoek voor de lichtbron op het YZ-vlak, in graden" #. default x: #. default y: #. default z: -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 msgid "Location:" msgstr "Locatie:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "X coordinate" msgstr "X-coördinaat" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Y coordinate" msgstr "Y-coördinaat" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Z coordinate" msgstr "Z-coördinaat" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Points At" msgstr "Punten op" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Specular Exponent" msgstr "Reflectiefactor" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Exponent value controlling the focus for the light source" msgstr "Exponentwaarde die de focus van de lichtbron controleert" #. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option. -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "Cone Angle" msgstr "Kegelhoek" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "This is the angle between the spot light axis (i.e. the axis between the light source and the point to which it is pointing at) and the spot light cone. No light is projected outside this cone." msgstr "Dit is de hoek tussen de as (dit is de as tussen de lichtbron en het punt waarop deze gericht is) en de conus van de lichtbron. Er wordt geen licht buiten de deze conus geprojecteerd." -#: ../src/ui/dialog/filter-effects-dialog.cpp:1077 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1274 msgid "New light source" msgstr "Nieuwe lichtbron" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1118 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1325 msgid "_Duplicate" msgstr "_Dupliceren" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1152 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1359 msgid "_Filter" msgstr "_Filter" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1174 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1381 msgid "R_ename" msgstr "H_ernoemen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1304 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1511 msgid "Rename filter" msgstr "Hernoem filter" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1349 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1556 msgid "Apply filter" msgstr "Filter toepassen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1419 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1626 msgid "filter" msgstr "filter" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1426 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1633 msgid "Add filter" msgstr "Filter toevoegen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1478 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1685 msgid "Duplicate filter" msgstr "Filter dupliceren" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1577 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1784 msgid "_Effect" msgstr "_Effect" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1587 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1794 msgid "Connections" msgstr "Verbindingen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1725 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1932 msgid "Remove filter primitive" msgstr "Filtereffect verwijderen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2313 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2520 msgid "Remove merge node" msgstr "Verwijder samenvoegingsknooppunt" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2433 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2640 msgid "Reorder filter primitive" msgstr "Filtereffect herordenen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2513 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2720 msgid "Add Effect:" msgstr "Effect toevoegen:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2514 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 msgid "No effect selected" msgstr "Geen effect geselecteerd" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2722 msgid "No filter selected" msgstr "Geen filter geselecteerd" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2561 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2767 msgid "Effect parameters" msgstr "Effectparameters" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2562 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2768 msgid "Filter General Settings" msgstr "Algemene filterinstellingen" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Coordinates:" msgstr "Coördinaten:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "X coordinate of the left corners of filter effects region" msgstr "X-coördinaat van de linkerhoeken van het filtereffectgebied" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Y coordinate of the upper corners of filter effects region" msgstr "Y-coördinaat van de linkerhoeken van het filtereffectgebied" #. default width: #. default height: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Dimensions:" msgstr "Dimensies:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Width of filter effects region" msgstr "Breedte van filtereffectgebied" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Height of filter effects region" msgstr "Hoogte van filtereffectgebied" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2627 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 msgid "Indicates the type of matrix operation. The keyword 'matrix' indicates that a full 5x4 matrix of values will be provided. The other keywords represent convenience shortcuts to allow commonly used color operations to be performed without specifying a complete matrix." msgstr "Geeft het type matrixbewerking aan. De optie 'matrix' geeft de mogelijkheid een volledige 5x4-matrix op te geven. De andere opties stellen veelgebruikte kleurbewerkingen voor zonder dat een volledige matrix opgegeven moet worden." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2834 msgid "Value(s):" msgstr "Waarde(n):" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2643 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2838 +msgid "R:" +msgstr "R:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2839 +#: ../src/widgets/sp-color-icc-selector.cpp:359 +msgid "G:" +msgstr "G:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2840 +msgid "B:" +msgstr "B:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2841 +msgid "A:" +msgstr "A:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2844 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "Operator:" msgstr "Operator:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 msgid "K1:" msgstr "K1:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "If the arithmetic operation is chosen, each result pixel is computed using the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel values of the first and second inputs respectively." msgstr "Als de rekenkundige bewerking is gekozen, wordt elke pixel berekend volgens de formule k1*i1*i2 + k2*i1 + k3*i2 + k4 waarbij i1 en i2 de pixelwaarden van respectievelijk de eerste en tweede invoer zijn." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 msgid "K2:" msgstr "K2:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 msgid "K3:" msgstr "K3:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "K4:" msgstr "K4:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "Size:" msgstr "Grootte:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "width of the convolve matrix" msgstr "Breedte van de convolutiematrix" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "height of the convolve matrix" msgstr "Hoogte van de convolutiematrix" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 #: ../src/ui/dialog/object-attributes.cpp:48 msgid "Target:" msgstr "Doel:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "X coordinate of the target point in the convolve matrix. The convolution is applied to pixels around this point." msgstr "X-coördinaat van het doelpunt in de convolutiematrix. De convolutie wordt toegepast op pixels rondom dit punt." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "Y coordinate of the target point in the convolve matrix. The convolution is applied to pixels around this point." msgstr "Y-coördinaat van het doelpunt in de convolutiematrix. De convolutie wordt toegepast op pixels rondom dit punt." #. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix) -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "Kernel:" msgstr "Kernmatrix:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "This matrix describes the convolve operation that is applied to the input image in order to calculate the pixel colors at the output. Different arrangements of values in this matrix result in various possible visual effects. An identity matrix would lead to a motion blur effect (parallel to the matrix diagonal) while a matrix filled with a constant non-zero value would lead to a common blur effect." msgstr "Deze matrix beschrijft de convolutie die wordt toegepast op de afbeelding om de kleurwaarde van de pixels in het resultaat te berekenen. Verschillende waarden voor de getallen in deze matrix resulteren in verschillende visuele effecten. Een identiteitsmatrix resulteert in bewegingsonscherpte (parallel met de diagonaal) terwijl een matrix met een constante niet-nul waarde resulteert in algemene onscherpte." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "Divisor:" msgstr "Deler:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "After applying the kernelMatrix to the input image to yield a number, that number is divided by divisor to yield the final destination color value. A divisor that is the sum of all the matrix values tends to have an evening effect on the overall color intensity of the result." msgstr "Na toepassen van de kernmatrix op de afbeelding wordt de kleurwaarde gedeeld door de deler om de uiteindelijke kleurwaarde te bepalen. Een deler die gelijk is aan de som van de kleurwaarden geeft een avondeffect aan de algemene kleurintensiteit van het resultaat." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "Bias:" msgstr "Vertekening:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "This value is added to each component. This is useful to define a constant value as the zero response of the filter." msgstr "Deze waarde wordt opgeteld bij elke kleurcomponent. Dit is handig om een constante als nulwaarde van de filterrespons te definiëren." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "Edge Mode:" msgstr "Randgedrag:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "Determines how to extend the input image as necessary with color values so that the matrix operations can be applied when the kernel is positioned at or near the edge of the input image." msgstr "Bepaalt hoe de afbeelding wordt vergroot met extra pixels opdat matrixoperaties toegepast kunnen worden wanneer de kernmatrix zich op of nabij de rand van de afbeelding bevindt." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "Preserve Alpha" msgstr "Alfa behouden" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "If set, the alpha channel won't be altered by this filter primitive." msgstr "Indien aangevinkt, wordt het alfakanaal door dit filtereffect niet aangepast." #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 msgid "Diffuse Color:" msgstr "Diffusiekleur:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Defines the color of the light source" msgstr "Definieert de kleur van de lichtbron" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "Surface Scale:" msgstr "Textuurversterking:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "This value amplifies the heights of the bump map defined by the input alpha channel" msgstr "Deze waarde versterkt de hoogten in de textuurkaart gedefinieerd door het invoeralfakanaal" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "Constant:" msgstr "Constante:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "This constant affects the Phong lighting model." msgstr "Deze constante beïnvloedt het Phong-belichtingsmodel" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2664 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2865 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2899 msgid "Kernel Unit Length:" msgstr "Kerneleenheidslengte:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 msgid "This defines the intensity of the displacement effect." msgstr "Dit definieert de intensiteit van het verplaatsingseffect." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "X displacement:" msgstr "X-verplaatsing:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "Color component that controls the displacement in the X direction" msgstr "Kleurcomponent die de verplaatsing in horizontale richting bepaalt." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Y displacement:" msgstr "Y-verplaatsing:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Color component that controls the displacement in the Y direction" msgstr "Kleurcomponent die de verplaatsing in verticale richting bepaalt." #. default: black -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "Flood Color:" msgstr "Vulkleur:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "The whole filter region will be filled with this color." msgstr "Het hele filtereffectgebied zal worden gevuld met deze kleur." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "Standard Deviation:" msgstr "Standaarddeviatie:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "The standard deviation for the blur operation." msgstr "De standaarddeviatie voor de vervagingsbewerking." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "" "Erode: performs \"thinning\" of input image.\n" "Dilate: performs \"fattenning\" of input image." @@ -14209,133 +16159,133 @@ msgstr "" "Eroderen: maakt de afbeelding \"vlakker\".\n" "Aandikken: maakt de afbeelding \"dikker\"." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2687 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2888 msgid "Source of Image:" msgstr "Bron van afbeelding:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "Delta X:" msgstr "Horizontaal verschil:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "This is how far the input image gets shifted to the right" msgstr "Hoe ver de bronafbeelding naar rechts wordt verschoven." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "Delta Y:" msgstr "Verticaal verschil:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "This is how far the input image gets shifted downwards" msgstr "Hoe ver de bronafbeelding omlaag wordt verschoven." #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Specular Color:" msgstr "Lichtbronkleur:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 #: ../share/extensions/interp.inx.h:2 msgid "Exponent:" msgstr "Exponent:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 msgid "Exponent for specular term, larger is more \"shiny\"." msgstr "Exponent van de lichtbronkleur; groter is \"glimmender\"." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 msgid "Indicates whether the filter primitive should perform a noise or turbulence function." msgstr "Geeft aan of het filtereffect een ruis- of turbulentiefunctie toepast." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2707 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2908 msgid "Base Frequency:" msgstr "Basisfrequentie:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2708 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2909 msgid "Octaves:" msgstr "Octaven:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "Seed:" msgstr "Beginwaarde:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "The starting number for the pseudo random number generator." msgstr "Het begingetal voor de toevalsgenerator" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2922 msgid "Add filter primitive" msgstr "Filtereffect toevoegen" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2738 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2939 msgid "The feBlend filter primitive provides 4 image blending modes: screen, multiply, darken and lighten." msgstr "Het feBlend-filtereffect kent vier mengmanieren voor afbeeldingen: scherm, vermenigvuldigen, donkerder en lichter." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2742 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2943 msgid "The feColorMatrix filter primitive applies a matrix transformation to color of each rendered pixel. This allows for effects like turning object to grayscale, modifying color saturation and changing color hue." msgstr "Het feColorMatrix-filtereffect past een matrixoperatie toe op de kleur van elke gerenderde pixel. Dit maakt effecten mogelijk zoals het omzetten van een object naar grijswaarden, het aanpassen van kleurverzadiging en het veranderen van de tint." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2746 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2947 msgid "The feComponentTransfer filter primitive manipulates the input's color components (red, green, blue, and alpha) according to particular transfer functions, allowing operations like brightness and contrast adjustment, color balance, and thresholding." msgstr "Het feComponentTransfer-filtereffect manipuleert de kleurcomponenten (rood, groen, blauw en alfa) van de invoer aan de hand van bepaalde transferfuncties, hetgeen bewerkingen zoals het aanpassen van helderheid en contrast, kleurbalans, en drempelwaarden mogelijk maakt." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2750 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2951 msgid "The feComposite filter primitive composites two images using one of the Porter-Duff blending modes or the arithmetic mode described in SVG standard. Porter-Duff blending modes are essentially logical operations between the corresponding pixel values of the images." msgstr "Het feComposite-filtereffect verenigt twee afbeeldingen met één van de Porter-Duff-mengmodi of de rekenkundige modus beschreven in de SVG-standaard. Porter-Duff-mengmodi zijn in essentie logische bewerkingen tussen de overeenkomende pixelwaarden van de afbeeldingen." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2754 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2955 msgid "The feConvolveMatrix lets you specify a Convolution to be applied on the image. Common effects created using convolution matrices are blur, sharpening, embossing and edge detection. Note that while gaussian blur can be created using this filter primitive, the special gaussian blur primitive is faster and resolution-independent." msgstr "Met het feConvolveMatrix-filtereffect kan een convolutie toegepast worden op de afbeelding. Gebruikelijke effecten die met convolutiematrices gemaakt worden zijn: vervaging, verscherping, reliëf, en randherkenning. Merk op dat hoewel gaussiaans vervagen mogelijk is met dit filtereffect, het speciale filtereffect hiervoor sneller en resolutie-onafhankelijk is." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2758 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2959 msgid "The feDiffuseLighting and feSpecularLighting filter primitives create \"embossed\" shadings. The input's alpha channel is used to provide depth information: higher opacity areas are raised toward the viewer and lower opacity areas recede away from the viewer." msgstr "De feDiffuseLighting- en feSpecularLighting-filtereffecten maken reliëfschaduwen. Het alfakanaal van de invoer wordt gebruikt voor de diepte-informatie: gebieden met grotere ondoorzichtigheid verrijzen ten opzichte van de kijker en gebieden met lagere ondoorzichtigheid wijken terug." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2762 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2963 msgid "The feDisplacementMap filter primitive displaces the pixels in the first input using the second input as a displacement map, that shows from how far the pixel should come from. Classical examples are whirl and pinch effects." msgstr "Het feDisplacementMap-filtereffect verplaatst de pixels in de eerste invoer, daarbij de tweede invoer gebruikend als een verplaatsingskaart die aangeeft van hoever elk pixel moet komen. Klassieke voorbeelden zijn draai- en boetseerefffecten" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2766 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2967 msgid "The feFlood filter primitive fills the region with a given color and opacity. It is usually used as an input to other filters to apply color to a graphic." msgstr "Het feFlood-filtereffect vult een regio met een opgegeven kleur en ondoorzichtigheid. Het wordt normaal gebruikt als invoer voor andere filters om een kleur toe te passen op een tekening." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2770 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2971 msgid "The feGaussianBlur filter primitive uniformly blurs its input. It is commonly used together with feOffset to create a drop shadow effect." msgstr "Het feGaussianBlur-filtereffect vervaagt de invoer uniform. Het wordt vaak samen met feOffset gebruikt om een schaduweffect te creëren." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2774 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2975 msgid "The feImage filter primitive fills the region with an external image or another part of the document." msgstr "Het feImage-filtereffect vult een regio met een externe afbeelding of een ander deel van het document." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2778 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2979 msgid "The feMerge filter primitive composites several temporary images inside the filter primitive to a single image. It uses normal alpha compositing for this. This is equivalent to using several feBlend primitives in 'normal' mode or several feComposite primitives in 'over' mode." msgstr "Het feMerge-filtereffect verenigt verschillende tijdelijke beelden in het filter tot één afbeelding. Hiervoor wordt normale alfamenging gebruikt. Dit is equivalent aan het gebruik van verschillende feBlend-filtereffecten in 'normale' modus of verschillende feComposite-filtereffecten in 'over'-modus." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2782 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2983 msgid "The feMorphology filter primitive provides erode and dilate effects. For single-color objects erode makes the object thinner and dilate makes it thicker." msgstr "Het feMorphology-filtereffect verschaft eroderings- en verdikkingseffecten. Voor objecten met één kleur maakt eroderen het object dunner en verdikken maakt het object dikker." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2786 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2987 msgid "The feOffset filter primitive offsets the image by an user-defined amount. For example, this is useful for drop shadows, where the shadow is in a slightly different position than the actual object." msgstr "Het feOffset-filtereffect verplaatst de afbeelding met een opgegeven hoeveelheid. Dit is handig om bijvoorbeeld schaduwen te maken, waarbij de schaduw en het actuele object zich op bijna dezelfde positie bevinden." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2991 msgid "The feDiffuseLighting and feSpecularLighting filter primitives create \"embossed\" shadings. The input's alpha channel is used to provide depth information: higher opacity areas are raised toward the viewer and lower opacity areas recede away from the viewer." msgstr "De feDiffuseLighting- en feSpecularLighting-filtereffecten maken \"reliëf\"schaduwen. Het alfakanaal van de invoer wordt gebruikt voor de diepte-informatie: gebieden met grotere ondoorzichtigheid verrijzen ten opzichte van de kijker en gebieden met lagere ondoorzichtigheid wijken terug." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2794 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2995 msgid "The feTile filter primitive tiles a region with its input graphic" msgstr "Het feTile-filtereffect maakt klonen van een regio in de bronafbeelding." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2798 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2999 msgid "The feTurbulence filter primitive renders Perlin noise. This kind of noise is useful in simulating several nature phenomena like clouds, fire and smoke and in generating complex textures like marble or granite." msgstr "Het feTurbulence-filtereffect genereert Perlin-ruis. Dit type ruis simuleert diverse natuurlijke fenomenen zoals wolken, vuur en rook, en genereert complexe texturen zoals marmer of graniet." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2817 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3018 msgid "Duplicate filter primitive" msgstr "Filtereffect dupliceren" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3071 msgid "Set filter primitive attribute" msgstr "Eigenschap van filtereffect instellen" @@ -15813,7 +17763,7 @@ msgstr "Verfstijl objecten" #. Zoom #: ../src/ui/dialog/inkscape-preferences.cpp:376 -#: ../src/widgets/desktop-widget.cpp:635 +#: ../src/widgets/desktop-widget.cpp:636 msgid "Zoom" msgstr "Zoomen" @@ -17731,13 +19681,12 @@ msgid "Pop-up linking and scaling dialog when importing bitmap image." msgstr "" #: ../src/ui/dialog/inkscape-preferences.cpp:1448 -#, fuzzy msgid "Bitmap link:" -msgstr "Bitmapeditor:" +msgstr "Bitmaplink:" #: ../src/ui/dialog/inkscape-preferences.cpp:1455 msgid "Bitmap scale (image-rendering):" -msgstr "" +msgstr "Bitmapschaal (image-rendering):" #: ../src/ui/dialog/inkscape-preferences.cpp:1460 msgid "Default _import resolution:" @@ -17768,7 +19717,7 @@ msgid "Shortcut file:" msgstr "Bestand met sneltoetsen:" #: ../src/ui/dialog/inkscape-preferences.cpp:1484 -#: ../src/ui/dialog/template-load-tab.cpp:49 +#: ../src/ui/dialog/template-load-tab.cpp:48 msgid "Search:" msgstr "Zoeken:" @@ -17928,7 +19877,7 @@ msgstr "Locatie van Inkscapedata" #: ../src/ui/dialog/inkscape-preferences.cpp:1934 msgid "Inkscape extensions: " -msgstr "Inkscape-uitbreidingen:" +msgstr "Inkscape-uitbreidingen: " #: ../src/ui/dialog/inkscape-preferences.cpp:1934 msgid "Location of the Inkscape extensions" @@ -18275,7 +20224,7 @@ msgstr "Onbekend" #: ../src/ui/dialog/memory.cpp:167 msgid "Combined" -msgstr "Opgeteld:" +msgstr "Totaal" #: ../src/ui/dialog/memory.cpp:209 msgid "Recalculate" @@ -18338,7 +20287,7 @@ msgstr "URL:" #: ../src/ui/dialog/object-attributes.cpp:66 #: ../src/ui/dialog/object-attributes.cpp:75 #: ../src/ui/dialog/tile.cpp:618 -#: ../src/widgets/desktop-widget.cpp:670 +#: ../src/widgets/desktop-widget.cpp:671 #: ../src/widgets/node-toolbar.cpp:594 msgid "X:" msgstr "X:" @@ -18346,15 +20295,14 @@ msgstr "X:" #: ../src/ui/dialog/object-attributes.cpp:67 #: ../src/ui/dialog/object-attributes.cpp:76 #: ../src/ui/dialog/tile.cpp:619 -#: ../src/widgets/desktop-widget.cpp:680 +#: ../src/widgets/desktop-widget.cpp:681 #: ../src/widgets/node-toolbar.cpp:612 msgid "Y:" msgstr "Y:" #: ../src/ui/dialog/object-attributes.cpp:70 -#, fuzzy msgid "Image Rendering:" -msgstr "Renderen" +msgstr "Renderen van afbeelding:" #: ../src/ui/dialog/object-properties.cpp:63 #: ../src/ui/dialog/object-properties.cpp:398 @@ -18368,9 +20316,8 @@ msgid "_Title:" msgstr "_Titel:" #: ../src/ui/dialog/object-properties.cpp:66 -#, fuzzy msgid "_Image Rendering:" -msgstr "Renderen" +msgstr "" #: ../src/ui/dialog/object-properties.cpp:67 msgid "_Description:" @@ -18883,8 +20830,8 @@ msgid "Preview Text:" msgstr "Voorbeeldtekst:" #: ../src/ui/dialog/swatches.cpp:203 -#: ../src/ui/tools/gradient-tool.cpp:369 -#: ../src/ui/tools/gradient-tool.cpp:467 +#: ../src/ui/tools/gradient-tool.cpp:371 +#: ../src/ui/tools/gradient-tool.cpp:469 #: ../src/widgets/gradient-vector.cpp:814 msgid "Add gradient stop" msgstr "Kleurverloopovergang toevoegen" @@ -18913,37 +20860,37 @@ msgid "Palettes directory (%s) is unavailable." msgstr "De palettenmap (%s) is niet beschikbaar." #. ******************* Symbol Sets ************************ -#: ../src/ui/dialog/symbols.cpp:128 +#: ../src/ui/dialog/symbols.cpp:127 msgid "Symbol set: " msgstr "Symbolenset: " #. Fill in later +#: ../src/ui/dialog/symbols.cpp:136 #: ../src/ui/dialog/symbols.cpp:137 -#: ../src/ui/dialog/symbols.cpp:138 msgid "Current Document" msgstr "Huidig document" -#: ../src/ui/dialog/symbols.cpp:205 +#: ../src/ui/dialog/symbols.cpp:204 msgid "Add Symbol from the current document." msgstr "Symbool aan huidige document toevoegen." -#: ../src/ui/dialog/symbols.cpp:214 +#: ../src/ui/dialog/symbols.cpp:213 msgid "Remove Symbol from the current document." msgstr "Symbool uit huidig document verwijderen." -#: ../src/ui/dialog/symbols.cpp:227 +#: ../src/ui/dialog/symbols.cpp:226 msgid "Make Icons bigger by zooming in." msgstr "Iconen groter maken door inzoomen." -#: ../src/ui/dialog/symbols.cpp:236 +#: ../src/ui/dialog/symbols.cpp:235 msgid "Make Icons smaller by zooming out." msgstr "Iconen kleiner maken door uitzoomen." -#: ../src/ui/dialog/symbols.cpp:245 +#: ../src/ui/dialog/symbols.cpp:244 msgid "Toggle 'fit' symbols in icon space." msgstr "" -#: ../src/ui/dialog/symbols.cpp:558 +#: ../src/ui/dialog/symbols.cpp:567 msgid "Unnamed Symbols" msgstr "Onbenoemde symbolen" @@ -18951,29 +20898,25 @@ msgstr "Onbenoemde symbolen" msgid "More info" msgstr "Meer info" -#: ../src/ui/dialog/template-widget.cpp:37 -msgid " " -msgstr " " - #: ../src/ui/dialog/template-widget.cpp:38 msgid "no template selected" msgstr "geen template geselecteerd" #: ../src/ui/dialog/template-widget.cpp:119 msgid "Path: " -msgstr "Pad:" +msgstr "Pad: " #: ../src/ui/dialog/template-widget.cpp:122 msgid "Description: " -msgstr "Beschrijving:" +msgstr "Beschrijving: " #: ../src/ui/dialog/template-widget.cpp:124 msgid "Keywords: " -msgstr "Sleutelwoorden:" +msgstr "Sleutelwoorden: " #: ../src/ui/dialog/template-widget.cpp:131 msgid "By: " -msgstr "" +msgstr "Door: " #: ../src/ui/dialog/text-edit.cpp:73 msgid "Set as _default" @@ -19029,7 +20972,7 @@ msgstr "Verplaatsing tekstpad" #: ../src/ui/dialog/text-edit.cpp:588 #: ../src/ui/dialog/text-edit.cpp:662 -#: ../src/ui/tools/text-tool.cpp:1487 +#: ../src/ui/tools/text-tool.cpp:1488 msgid "Set text style" msgstr "Tekststijl instellen" @@ -19625,96 +21568,96 @@ msgctxt "Path segment tip" msgid "Bezier segment: drag to shape the segment, doubleclick to insert node, click to select (more: Shift, Ctrl+Alt)" msgstr "Beziersegment: sleep om het segment te vervormen, dubbelklik om een knooppunt in te voegen, klik om te selecteren (toetscombinaties: Shift, Ctrl+Alt)" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 msgid "Retract handles" msgstr "Handvaten intrekken" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 #: ../src/ui/tool/node.cpp:270 msgid "Change node type" msgstr "Knooppunttype veranderen" -#: ../src/ui/tool/multi-path-manipulator.cpp:334 +#: ../src/ui/tool/multi-path-manipulator.cpp:323 msgid "Straighten segments" msgstr "Segmenten effenen" -#: ../src/ui/tool/multi-path-manipulator.cpp:336 +#: ../src/ui/tool/multi-path-manipulator.cpp:325 msgid "Make segments curves" msgstr "Van segmenten curven maken" -#: ../src/ui/tool/multi-path-manipulator.cpp:344 +#: ../src/ui/tool/multi-path-manipulator.cpp:333 msgid "Add nodes" msgstr "Knooppunten toevoegen" -#: ../src/ui/tool/multi-path-manipulator.cpp:350 +#: ../src/ui/tool/multi-path-manipulator.cpp:339 msgid "Add extremum nodes" msgstr "Knooppunten aan uiteinden toevoegen" -#: ../src/ui/tool/multi-path-manipulator.cpp:357 +#: ../src/ui/tool/multi-path-manipulator.cpp:346 msgid "Duplicate nodes" msgstr "Knooppunten dupliceren" -#: ../src/ui/tool/multi-path-manipulator.cpp:420 +#: ../src/ui/tool/multi-path-manipulator.cpp:409 #: ../src/widgets/node-toolbar.cpp:421 msgid "Join nodes" msgstr "Knooppunten samenvoegen" -#: ../src/ui/tool/multi-path-manipulator.cpp:427 +#: ../src/ui/tool/multi-path-manipulator.cpp:416 #: ../src/widgets/node-toolbar.cpp:432 msgid "Break nodes" msgstr "Knooppunten verbreken" -#: ../src/ui/tool/multi-path-manipulator.cpp:434 +#: ../src/ui/tool/multi-path-manipulator.cpp:423 msgid "Delete nodes" msgstr "Knooppunten verwijderen" -#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:757 msgid "Move nodes" msgstr "Knooppunten verplaatsen" -#: ../src/ui/tool/multi-path-manipulator.cpp:771 +#: ../src/ui/tool/multi-path-manipulator.cpp:760 msgid "Move nodes horizontally" msgstr "Knooppunten horizontaal verplaatsen" -#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:764 msgid "Move nodes vertically" msgstr "Knooppunten verticaal verplaatsen" -#: ../src/ui/tool/multi-path-manipulator.cpp:779 -#: ../src/ui/tool/multi-path-manipulator.cpp:782 +#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:771 msgid "Rotate nodes" msgstr "Knooppunten roteren" -#: ../src/ui/tool/multi-path-manipulator.cpp:786 -#: ../src/ui/tool/multi-path-manipulator.cpp:792 +#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:781 msgid "Scale nodes uniformly" msgstr "Knooppunten uniform schalen" -#: ../src/ui/tool/multi-path-manipulator.cpp:789 +#: ../src/ui/tool/multi-path-manipulator.cpp:778 msgid "Scale nodes" msgstr "Knooppunten schalen" -#: ../src/ui/tool/multi-path-manipulator.cpp:796 +#: ../src/ui/tool/multi-path-manipulator.cpp:785 msgid "Scale nodes horizontally" msgstr "Knooppunten horizontaal schalen" -#: ../src/ui/tool/multi-path-manipulator.cpp:800 +#: ../src/ui/tool/multi-path-manipulator.cpp:789 msgid "Scale nodes vertically" msgstr "Knooppunten verticaal schalen" -#: ../src/ui/tool/multi-path-manipulator.cpp:804 +#: ../src/ui/tool/multi-path-manipulator.cpp:793 msgid "Skew nodes horizontally" msgstr "Knooppunten horizontaal scheeftrekken" -#: ../src/ui/tool/multi-path-manipulator.cpp:808 +#: ../src/ui/tool/multi-path-manipulator.cpp:797 msgid "Skew nodes vertically" msgstr "Knooppunten verticaal scheeftrekken" -#: ../src/ui/tool/multi-path-manipulator.cpp:812 +#: ../src/ui/tool/multi-path-manipulator.cpp:801 msgid "Flip nodes horizontally" msgstr "Knooppunten horizontaal spiegelen" -#: ../src/ui/tool/multi-path-manipulator.cpp:815 +#: ../src/ui/tool/multi-path-manipulator.cpp:804 msgid "Flip nodes vertically" msgstr "Knooppunten verticaal spiegelen" @@ -19826,171 +21769,67 @@ msgctxt "Path node tip" msgid "Alt: sculpt nodes" msgstr "Alt: knooppunten boetseren" -#: ../src/ui/tool/node.cpp:1288 -#, c-format -msgctxt "Path node tip" -msgid "%s: drag to shape the path (more: Shift, Ctrl, Alt)" -msgstr "%s: sleep om het pad te vervormen (toetscombinatie: Shift, Ctrl, Alt)" - -#: ../src/ui/tool/node.cpp:1291 -#, c-format -msgctxt "Path node tip" -msgid "%s: drag to shape the path, click to toggle scale/rotation handles (more: Shift, Ctrl, Alt)" -msgstr "%s: sleep om het pad te vervormen, klik om te schakelen tussen schalings- en rotatiehandvatten (toetscombinaties: Shift, Ctrl, Alt)" - -#: ../src/ui/tool/node.cpp:1294 -#, c-format -msgctxt "Path node tip" -msgid "%s: drag to shape the path, click to select only this node (more: Shift, Ctrl, Alt)" -msgstr "%s: sleep om het pad te vervormen, klik om enkel dit knooppunt te selecteren (toetscombinaties: Shift, Ctrl, Alt)" - -#: ../src/ui/tool/node.cpp:1305 -#, c-format -msgctxt "Path node tip" -msgid "Move node by %s, %s" -msgstr "Knooppunt verplaatsen met %s, %s" - -#: ../src/ui/tool/node.cpp:1316 -msgid "Symmetric node" -msgstr "Symmetrisch knooppunt" - -#: ../src/ui/tool/node.cpp:1317 -msgid "Auto-smooth node" -msgstr "Automatisch glad knooppunt" - -#: ../src/ui/tool/path-manipulator.cpp:821 -msgid "Scale handle" -msgstr "Schaalhandvat" - -#: ../src/ui/tool/path-manipulator.cpp:845 -msgid "Rotate handle" -msgstr "Roteerhandvat" - -#. We need to call MPM's method because it could have been our last node -#: ../src/ui/tool/path-manipulator.cpp:1384 -#: ../src/widgets/node-toolbar.cpp:410 -msgid "Delete node" -msgstr "Item verwijderen" - -#: ../src/ui/tool/path-manipulator.cpp:1392 -msgid "Cycle node type" -msgstr "Wisselen van knooppunttype" - -#: ../src/ui/tool/path-manipulator.cpp:1407 -msgid "Drag handle" -msgstr "Handvat slepen" - -#: ../src/ui/tool/path-manipulator.cpp:1416 -msgid "Retract handle" -msgstr "Handvat intrekken" - -#: ../src/ui/tool/transform-handle-set.cpp:195 -msgctxt "Transform handle tip" -msgid "Shift+Ctrl: scale uniformly about the rotation center" -msgstr "Shift+Ctrl: uniform schalen rond het rotatiecentrum" - -#: ../src/ui/tool/transform-handle-set.cpp:197 -msgctxt "Transform handle tip" -msgid "Ctrl: scale uniformly" -msgstr "Ctrl: uniform schalen" - -#: ../src/ui/tool/transform-handle-set.cpp:202 -msgctxt "Transform handle tip" -msgid "Shift+Alt: scale using an integer ratio about the rotation center" -msgstr "Shift+Alt: schalen met een gehele verhouding rond het rotatiecentrum" - -#: ../src/ui/tool/transform-handle-set.cpp:204 -msgctxt "Transform handle tip" -msgid "Shift: scale from the rotation center" -msgstr "Shift: schalen rond het rotatiecentrum" - -#: ../src/ui/tool/transform-handle-set.cpp:207 -msgctxt "Transform handle tip" -msgid "Alt: scale using an integer ratio" -msgstr "Alt: schalen met een gehele verhouding" - -#: ../src/ui/tool/transform-handle-set.cpp:209 -msgctxt "Transform handle tip" -msgid "Scale handle: drag to scale the selection" -msgstr "Schaalhandvat: sleep om de selectie te schalen" - -#: ../src/ui/tool/transform-handle-set.cpp:214 +#: ../src/ui/tool/node.cpp:1288 #, c-format -msgctxt "Transform handle tip" -msgid "Scale by %.2f%% x %.2f%%" -msgstr "Schaal met %.2f%% x %.2f%%" +msgctxt "Path node tip" +msgid "%s: drag to shape the path (more: Shift, Ctrl, Alt)" +msgstr "%s: sleep om het pad te vervormen (toetscombinatie: Shift, Ctrl, Alt)" -#: ../src/ui/tool/transform-handle-set.cpp:438 +#: ../src/ui/tool/node.cpp:1291 #, c-format -msgctxt "Transform handle tip" -msgid "Shift+Ctrl: rotate around the opposite corner and snap angle to %f° increments" -msgstr "Shift+Ctrl: roteren rond de tegenoverliggende hoek en hoek beperken tot stappen van %f°" - -#: ../src/ui/tool/transform-handle-set.cpp:441 -msgctxt "Transform handle tip" -msgid "Shift: rotate around the opposite corner" -msgstr "Shift: roteren rond de tegenoverliggende hoek" +msgctxt "Path node tip" +msgid "%s: drag to shape the path, click to toggle scale/rotation handles (more: Shift, Ctrl, Alt)" +msgstr "%s: sleep om het pad te vervormen, klik om te schakelen tussen schalings- en rotatiehandvatten (toetscombinaties: Shift, Ctrl, Alt)" -#: ../src/ui/tool/transform-handle-set.cpp:445 +#: ../src/ui/tool/node.cpp:1294 #, c-format -msgctxt "Transform handle tip" -msgid "Ctrl: snap angle to %f° increments" -msgstr "Ctrl: hoek beperken tot stappen van %f°" - -#: ../src/ui/tool/transform-handle-set.cpp:447 -msgctxt "Transform handle tip" -msgid "Rotation handle: drag to rotate the selection around the rotation center" -msgstr "Rotatiehandvat: sleep om de selectie te roteren rond het rotatiecentrum" +msgctxt "Path node tip" +msgid "%s: drag to shape the path, click to select only this node (more: Shift, Ctrl, Alt)" +msgstr "%s: sleep om het pad te vervormen, klik om enkel dit knooppunt te selecteren (toetscombinaties: Shift, Ctrl, Alt)" -#. event -#: ../src/ui/tool/transform-handle-set.cpp:452 +#: ../src/ui/tool/node.cpp:1305 #, c-format -msgctxt "Transform handle tip" -msgid "Rotate by %.2f°" -msgstr "Roteren met %.2f°" +msgctxt "Path node tip" +msgid "Move node by %s, %s" +msgstr "Knooppunt verplaatsen met %s, %s" -#: ../src/ui/tool/transform-handle-set.cpp:578 -#, c-format -msgctxt "Transform handle tip" -msgid "Shift+Ctrl: skew about the rotation center with snapping to %f° increments" -msgstr "Shift+Ctrl: scheeftrekken rond het rotatiecentrum met stappen van %f°" +#: ../src/ui/tool/node.cpp:1316 +msgid "Symmetric node" +msgstr "Symmetrisch knooppunt" -#: ../src/ui/tool/transform-handle-set.cpp:581 -msgctxt "Transform handle tip" -msgid "Shift: skew about the rotation center" -msgstr "Shift: scheeftrekken rond het rotatiecentrum" +#: ../src/ui/tool/node.cpp:1317 +msgid "Auto-smooth node" +msgstr "Automatisch glad knooppunt" -#: ../src/ui/tool/transform-handle-set.cpp:585 -#, c-format -msgctxt "Transform handle tip" -msgid "Ctrl: snap skew angle to %f° increments" -msgstr "Ctrl: scheeftrekken met stappen van %f°" +#: ../src/ui/tool/path-manipulator.cpp:821 +msgid "Scale handle" +msgstr "Schaalhandvat" -#: ../src/ui/tool/transform-handle-set.cpp:588 -msgctxt "Transform handle tip" -msgid "Skew handle: drag to skew (shear) selection about the opposite handle" -msgstr "Hellingshandvat: sleep om de selectie scheef te trekken rond het tegenovergestelde handvat" +#: ../src/ui/tool/path-manipulator.cpp:845 +msgid "Rotate handle" +msgstr "Roteerhandvat" -#: ../src/ui/tool/transform-handle-set.cpp:594 -#, c-format -msgctxt "Transform handle tip" -msgid "Skew horizontally by %.2f°" -msgstr "Horizontaal scheeftrekken met %.2f°" +#. We need to call MPM's method because it could have been our last node +#: ../src/ui/tool/path-manipulator.cpp:1384 +#: ../src/widgets/node-toolbar.cpp:410 +msgid "Delete node" +msgstr "Item verwijderen" -#: ../src/ui/tool/transform-handle-set.cpp:597 -#, c-format -msgctxt "Transform handle tip" -msgid "Skew vertically by %.2f°" -msgstr "Verticaal scheeftrekken met %.2f°" +#: ../src/ui/tool/path-manipulator.cpp:1392 +msgid "Cycle node type" +msgstr "Wisselen van knooppunttype" -#: ../src/ui/tool/transform-handle-set.cpp:656 -msgctxt "Transform handle tip" -msgid "Rotation center: drag to change the origin of transforms" -msgstr "Rotatiecentrum: sleep om de oorsprong van transformaties aan te passen" +#: ../src/ui/tool/path-manipulator.cpp:1407 +msgid "Drag handle" +msgstr "Handvat slepen" + +#: ../src/ui/tool/path-manipulator.cpp:1416 +msgid "Retract handle" +msgstr "Handvat intrekken" #: ../src/ui/tools/arc-tool.cpp:269 msgid "Ctrl: make circle or integer-ratio ellipse, snap arc/segment angle" -msgstr "Ctrl: tekent een cirkel of een ellips met gehele verhoudingen, beperkt de boog-/segmenthoek" +msgstr "Ctrl: maakt een cirkel of een ellips met gehele verhoudingen, beperkt de boog-/segmenthoek" #: ../src/ui/tools/arc-tool.cpp:270 #: ../src/ui/tools/rect-tool.cpp:297 @@ -20005,7 +21844,7 @@ msgstr "Ellips: %s × %s (verhouding %d:%d); gebruik Shift om #: ../src/ui/tools/arc-tool.cpp:441 #, c-format msgid "Ellipse: %s × %s; with Ctrl to make square or integer-ratio ellipse; with Shift to draw around the starting point" -msgstr "Ellips: %s × %s; gebruik Ctrl om een ellips met gehele verhoudingen te maken; gebruik Shift om rond het startpunt te tekenen" +msgstr "Ellips: %s × %s; gebruik Ctrl om een ellips met gehele verhoudingen te maken; Shift om rond het startpunt te tekenen" #: ../src/ui/tools/arc-tool.cpp:464 msgid "Create ellipse" @@ -20031,7 +21870,7 @@ msgstr "3D-kubus maken" #: ../src/ui/tools/calligraphic-tool.cpp:542 msgid "Guide path selected; start drawing along the guide with Ctrl" -msgstr "Hulplijn is geselecteerd; begin met Ctrl langs de hulplijn te tekenen" +msgstr "Hulplijn geselecteerd; begin met Ctrl langs de hulplijn te tekenen" #: ../src/ui/tools/calligraphic-tool.cpp:544 msgid "Select a guide path to track with Ctrl" @@ -20039,7 +21878,7 @@ msgstr "Selecteer een hulplijn om met Ctrl te volgen" #: ../src/ui/tools/calligraphic-tool.cpp:679 msgid "Tracking: connection to guide path lost!" -msgstr "Volgen: connectie met hulplijn is verloren gegaan!" +msgstr "Volgen: verbinding met hulplijn is verloren gegaan!" #: ../src/ui/tools/calligraphic-tool.cpp:679 msgid "Tracking a guide path" @@ -20265,28 +22104,28 @@ msgid_plural "No gradient handles selected out of %d on %d selected objec msgstr[0] "Geen (van %d) kleurverloophandvat geselecteerd op %d geselecteerd object" msgstr[1] "Geen (van %d) kleurverloophandvat geselecteerd op %d geselecteerde objecten" -#: ../src/ui/tools/gradient-tool.cpp:442 +#: ../src/ui/tools/gradient-tool.cpp:444 msgid "Simplify gradient" msgstr "Kleurverloop vereenvoudigen" -#: ../src/ui/tools/gradient-tool.cpp:518 +#: ../src/ui/tools/gradient-tool.cpp:520 msgid "Create default gradient" msgstr "Standaardkleurverloop maken" -#: ../src/ui/tools/gradient-tool.cpp:577 +#: ../src/ui/tools/gradient-tool.cpp:579 #: ../src/ui/tools/mesh-tool.cpp:572 msgid "Draw around handles to select them" msgstr "Sleep rondom handvatten om ze te selecteren" -#: ../src/ui/tools/gradient-tool.cpp:700 +#: ../src/ui/tools/gradient-tool.cpp:702 msgid "Ctrl: snap gradient angle" msgstr "Ctrl: draait kleurverloop in stappen" -#: ../src/ui/tools/gradient-tool.cpp:701 +#: ../src/ui/tools/gradient-tool.cpp:703 msgid "Shift: draw gradient around the starting point" msgstr "Shift: tekent kleurverloop rondom het startpunt" -#: ../src/ui/tools/gradient-tool.cpp:955 +#: ../src/ui/tools/gradient-tool.cpp:957 #: ../src/ui/tools/mesh-tool.cpp:995 #, c-format msgid "Gradient for %d object; with Ctrl to snap angle" @@ -20294,7 +22133,7 @@ msgid_plural "Gradient for %d objects; with Ctrl to snap angle" msgstr[0] "Kleurverloop voor %d object; gebruik Ctrl om in stappen te draaien" msgstr[1] "Kleurverloop voor %d objecten; gebruik Ctrl om in stappen te draaien" -#: ../src/ui/tools/gradient-tool.cpp:959 +#: ../src/ui/tools/gradient-tool.cpp:961 #: ../src/ui/tools/mesh-tool.cpp:999 msgid "Select objects on which to create gradient." msgstr "Selecteer objecten om een kleurverloop voor te maken." @@ -20412,26 +22251,51 @@ msgctxt "Node tool tip" msgid "Drag to select objects to edit" msgstr "Sleep om te bewerken objecten te selecteren" -#: ../src/ui/tools/pen-tool.cpp:193 -#: ../src/ui/tools/pencil-tool.cpp:504 -msgid "Drawing cancelled" -msgstr "Tekenen is geannuleerd" - -#: ../src/ui/tools/pen-tool.cpp:413 #: ../src/ui/tools/pencil-tool.cpp:229 +#: ../src/ui/tools/pen-tool.cpp:413 msgid "Continuing selected path" msgstr "Huidig pad wordt voortgezet" -#: ../src/ui/tools/pen-tool.cpp:423 #: ../src/ui/tools/pencil-tool.cpp:237 +#: ../src/ui/tools/pen-tool.cpp:423 msgid "Creating new path" msgstr "Maken van nieuw pad" -#: ../src/ui/tools/pen-tool.cpp:425 #: ../src/ui/tools/pencil-tool.cpp:240 +#: ../src/ui/tools/pen-tool.cpp:425 msgid "Appending to selected path" msgstr "Toevoegen aan het geselecteerde pad" +#: ../src/ui/tools/pencil-tool.cpp:345 +msgid "Release here to close and finish the path." +msgstr "Laat hier los om het pad te sluiten." + +#: ../src/ui/tools/pencil-tool.cpp:351 +msgid "Drawing a freehand path" +msgstr "Tekenen van een pad uit de losse hand" + +#: ../src/ui/tools/pencil-tool.cpp:356 +msgid "Drag to continue the path from this point." +msgstr "Sleep om vanaf hier verder te gaan met een pad." + +#. Write curves to object +#: ../src/ui/tools/pencil-tool.cpp:448 +msgid "Finishing freehand" +msgstr "Afwerken van tekening uit de losse hand" + +#: ../src/ui/tools/pencil-tool.cpp:504 +#: ../src/ui/tools/pen-tool.cpp:193 +msgid "Drawing cancelled" +msgstr "Tekenen is geannuleerd" + +#: ../src/ui/tools/pencil-tool.cpp:554 +msgid "Sketch mode: holding Alt interpolates between sketched paths. Release Alt to finalize." +msgstr "Schetsmodus: Alt ingedrukt houden interpoleert tussen de geschetse paden. Laat Alt los om te beëindigen." + +#: ../src/ui/tools/pencil-tool.cpp:582 +msgid "Finishing freehand sketch" +msgstr "Afwerken van tekening uit de losse hand" + #: ../src/ui/tools/pen-tool.cpp:585 msgid "Click or click and drag to close and finish the path." msgstr "Klik of klik en sleep om een pad te sluiten." @@ -20469,31 +22333,6 @@ msgstr "Handvat curve: hoek %3.2f°, lengte %s; gebruik Ctrl o msgid "Drawing finished" msgstr "Tekenen is voltooid" -#: ../src/ui/tools/pencil-tool.cpp:345 -msgid "Release here to close and finish the path." -msgstr "Laat hier los om het pad te sluiten." - -#: ../src/ui/tools/pencil-tool.cpp:351 -msgid "Drawing a freehand path" -msgstr "Tekenen van een pad uit de losse hand" - -#: ../src/ui/tools/pencil-tool.cpp:356 -msgid "Drag to continue the path from this point." -msgstr "Sleep om vanaf hier verder te gaan met een pad." - -#. Write curves to object -#: ../src/ui/tools/pencil-tool.cpp:448 -msgid "Finishing freehand" -msgstr "Afwerken van tekening uit de losse hand" - -#: ../src/ui/tools/pencil-tool.cpp:554 -msgid "Sketch mode: holding Alt interpolates between sketched paths. Release Alt to finalize." -msgstr "Schetsmodus: Alt ingedrukt houden interpoleert tussen de geschetse paden. Laat Alt los om te beëindigen." - -#: ../src/ui/tools/pencil-tool.cpp:582 -msgid "Finishing freehand sketch" -msgstr "Afwerken van tekening uit de losse hand" - #: ../src/ui/tools/rect-tool.cpp:296 msgid "Ctrl: make square or integer-ratio rect, lock a rounded corner circular" msgstr "Ctrl: tekent een vierkant of simpele rechthoek, vergrendelt de hoekafronding op cirkelvormig" @@ -20643,144 +22482,144 @@ msgstr "Ster: straal %s, hoek %5g°; gebruik Ctrl om in stappe msgid "Create star" msgstr "Ster maken" -#: ../src/ui/tools/text-tool.cpp:392 +#: ../src/ui/tools/text-tool.cpp:393 msgid "Click to edit the text, drag to select part of the text." msgstr "Klik om de tekst te bewerken, sleep om een deel van de tekst te selecteren." -#: ../src/ui/tools/text-tool.cpp:394 +#: ../src/ui/tools/text-tool.cpp:395 msgid "Click to edit the flowed text, drag to select part of the text." msgstr "Klik om de ingekaderde tekst te bewerken, sleep om een gedeelte te selecteren." -#: ../src/ui/tools/text-tool.cpp:448 +#: ../src/ui/tools/text-tool.cpp:449 msgid "Create text" msgstr "Tekst aanmaken" -#: ../src/ui/tools/text-tool.cpp:473 +#: ../src/ui/tools/text-tool.cpp:474 msgid "Non-printable character" msgstr "Niet-afdrukbaar teken" -#: ../src/ui/tools/text-tool.cpp:488 +#: ../src/ui/tools/text-tool.cpp:489 msgid "Insert Unicode character" msgstr "Unicodeteken invoegen" -#: ../src/ui/tools/text-tool.cpp:523 +#: ../src/ui/tools/text-tool.cpp:524 #, c-format msgid "Unicode (Enter to finish): %s: %s" msgstr "Unicode (Enter om te voltooien): %s: %s" -#: ../src/ui/tools/text-tool.cpp:525 -#: ../src/ui/tools/text-tool.cpp:832 +#: ../src/ui/tools/text-tool.cpp:526 +#: ../src/ui/tools/text-tool.cpp:833 msgid "Unicode (Enter to finish): " msgstr "Unicode (Enter om te voltooien): " -#: ../src/ui/tools/text-tool.cpp:608 +#: ../src/ui/tools/text-tool.cpp:609 #, c-format msgid "Flowed text frame: %s × %s" msgstr "Tekstkader: %s × %s" -#: ../src/ui/tools/text-tool.cpp:666 +#: ../src/ui/tools/text-tool.cpp:667 msgid "Type text; Enter to start new line." msgstr "Tik uw tekst; Enter begint een nieuwe regel." -#: ../src/ui/tools/text-tool.cpp:677 +#: ../src/ui/tools/text-tool.cpp:678 msgid "Flowed text is created." msgstr "Ingekaderde tekst is aangemaakt." -#: ../src/ui/tools/text-tool.cpp:679 +#: ../src/ui/tools/text-tool.cpp:680 msgid "Create flowed text" msgstr "Ingekaderde tekst maken" -#: ../src/ui/tools/text-tool.cpp:681 +#: ../src/ui/tools/text-tool.cpp:682 msgid "The frame is too small for the current font size. Flowed text not created." msgstr "Het kader is te klein voor de grootte van het huidige lettertype. Er is geen ingekaderde tekst aangemaakt." -#: ../src/ui/tools/text-tool.cpp:817 +#: ../src/ui/tools/text-tool.cpp:818 msgid "No-break space" msgstr "Harde spatie" -#: ../src/ui/tools/text-tool.cpp:819 +#: ../src/ui/tools/text-tool.cpp:820 msgid "Insert no-break space" msgstr "Harde spatie invoegen" -#: ../src/ui/tools/text-tool.cpp:856 +#: ../src/ui/tools/text-tool.cpp:857 msgid "Make bold" msgstr "Vet maken" -#: ../src/ui/tools/text-tool.cpp:874 +#: ../src/ui/tools/text-tool.cpp:875 msgid "Make italic" msgstr "Cursief maken" -#: ../src/ui/tools/text-tool.cpp:913 +#: ../src/ui/tools/text-tool.cpp:914 msgid "New line" msgstr "Nieuwe regel invoegen" -#: ../src/ui/tools/text-tool.cpp:955 +#: ../src/ui/tools/text-tool.cpp:956 msgid "Backspace" msgstr "Backspace" -#: ../src/ui/tools/text-tool.cpp:1011 +#: ../src/ui/tools/text-tool.cpp:1012 msgid "Kern to the left" msgstr "Overhang naar links" -#: ../src/ui/tools/text-tool.cpp:1036 +#: ../src/ui/tools/text-tool.cpp:1037 msgid "Kern to the right" msgstr "Overhang naar rechts" -#: ../src/ui/tools/text-tool.cpp:1061 +#: ../src/ui/tools/text-tool.cpp:1062 msgid "Kern up" msgstr "Overhang naar boven" -#: ../src/ui/tools/text-tool.cpp:1086 +#: ../src/ui/tools/text-tool.cpp:1087 msgid "Kern down" msgstr "Overhang naar beneden" -#: ../src/ui/tools/text-tool.cpp:1162 +#: ../src/ui/tools/text-tool.cpp:1163 msgid "Rotate counterclockwise" msgstr "Tegen de klok in draaien" -#: ../src/ui/tools/text-tool.cpp:1183 +#: ../src/ui/tools/text-tool.cpp:1184 msgid "Rotate clockwise" msgstr "Met de klok mee draaien" -#: ../src/ui/tools/text-tool.cpp:1200 +#: ../src/ui/tools/text-tool.cpp:1201 msgid "Contract line spacing" msgstr "Regelafstand verkleinen" -#: ../src/ui/tools/text-tool.cpp:1207 +#: ../src/ui/tools/text-tool.cpp:1208 msgid "Contract letter spacing" msgstr "Letterafstand verkleinen" -#: ../src/ui/tools/text-tool.cpp:1225 +#: ../src/ui/tools/text-tool.cpp:1226 msgid "Expand line spacing" msgstr "Regelafstand vergroten" -#: ../src/ui/tools/text-tool.cpp:1232 +#: ../src/ui/tools/text-tool.cpp:1233 msgid "Expand letter spacing" msgstr "Letterafstand vergroten" -#: ../src/ui/tools/text-tool.cpp:1362 +#: ../src/ui/tools/text-tool.cpp:1363 msgid "Paste text" msgstr "Tekst plakken" -#: ../src/ui/tools/text-tool.cpp:1616 -#, fuzzy, c-format +#: ../src/ui/tools/text-tool.cpp:1617 +#, c-format msgid "Type or edit flowed text (%d character%s); Enter to start new paragraph." msgid_plural "Type or edit flowed text (%d characters%s); Enter to start new paragraph." -msgstr[0] "Tik of wijzig ingekaderde tekst (%d karakters%s); Enter begint een nieuwe paragraaf." +msgstr[0] "Tik of wijzig ingekaderde tekst (%d karakter%s); Enter begint een nieuwe paragraaf." msgstr[1] "Tik of wijzig ingekaderde tekst (%d karakters%s); Enter begint een nieuwe paragraaf." -#: ../src/ui/tools/text-tool.cpp:1618 -#, fuzzy, c-format +#: ../src/ui/tools/text-tool.cpp:1619 +#, c-format msgid "Type or edit text (%d character%s); Enter to start new line." msgid_plural "Type or edit text (%d characters%s); Enter to start new line." -msgstr[0] "Tik of wijzig tekst (%d karakters%s); Enter begint een nieuwe regel." +msgstr[0] "Tik of wijzig tekst (%d karakter%s); Enter begint een nieuwe regel." msgstr[1] "Tik of wijzig tekst (%d karakters%s); Enter begint een nieuwe regel." -#: ../src/ui/tools/text-tool.cpp:1728 +#: ../src/ui/tools/text-tool.cpp:1729 msgid "Type text" msgstr "Tekst typen" -#: ../src/ui/tools/tool-base.cpp:697 +#: ../src/ui/tools/tool-base.cpp:698 msgid "Space+mouse move to pan canvas" msgstr "Spatie indrukken + muis verplaatsen om het canvas te verschuiven" @@ -20863,49 +22702,153 @@ msgstr "Verplaatsing" msgid "Move in/out tweak" msgstr "Verplaatsing (naar/van cursor)" -#: ../src/ui/tools/tweak-tool.cpp:1242 -msgid "Move jitter tweak" -msgstr "Verplaatsing (random)" +#: ../src/ui/tools/tweak-tool.cpp:1242 +msgid "Move jitter tweak" +msgstr "Verplaatsing (random)" + +#: ../src/ui/tools/tweak-tool.cpp:1246 +msgid "Scale tweak" +msgstr "Vergroten/verkleinen" + +#: ../src/ui/tools/tweak-tool.cpp:1250 +msgid "Rotate tweak" +msgstr "Roteren" + +#: ../src/ui/tools/tweak-tool.cpp:1254 +msgid "Duplicate/delete tweak" +msgstr "Dupliceren/verwijderen" + +#: ../src/ui/tools/tweak-tool.cpp:1258 +msgid "Push path tweak" +msgstr "Pad duwen" + +#: ../src/ui/tools/tweak-tool.cpp:1262 +msgid "Shrink/grow path tweak" +msgstr "Pad verdunnen/verdikken" + +#: ../src/ui/tools/tweak-tool.cpp:1266 +msgid "Attract/repel path tweak" +msgstr "Pad aantrekken/afstoten" + +#: ../src/ui/tools/tweak-tool.cpp:1270 +msgid "Roughen path tweak" +msgstr "Pad verruwen" + +#: ../src/ui/tools/tweak-tool.cpp:1274 +msgid "Color paint tweak" +msgstr "Verver" + +#: ../src/ui/tools/tweak-tool.cpp:1278 +msgid "Color jitter tweak" +msgstr "Verkleuren" + +#: ../src/ui/tools/tweak-tool.cpp:1282 +msgid "Blur tweak" +msgstr "Vervagen" + +#: ../src/ui/tool/transform-handle-set.cpp:195 +msgctxt "Transform handle tip" +msgid "Shift+Ctrl: scale uniformly about the rotation center" +msgstr "Shift+Ctrl: uniform schalen rond het rotatiecentrum" + +#: ../src/ui/tool/transform-handle-set.cpp:197 +msgctxt "Transform handle tip" +msgid "Ctrl: scale uniformly" +msgstr "Ctrl: uniform schalen" + +#: ../src/ui/tool/transform-handle-set.cpp:202 +msgctxt "Transform handle tip" +msgid "Shift+Alt: scale using an integer ratio about the rotation center" +msgstr "Shift+Alt: schalen met een gehele verhouding rond het rotatiecentrum" + +#: ../src/ui/tool/transform-handle-set.cpp:204 +msgctxt "Transform handle tip" +msgid "Shift: scale from the rotation center" +msgstr "Shift: schalen rond het rotatiecentrum" + +#: ../src/ui/tool/transform-handle-set.cpp:207 +msgctxt "Transform handle tip" +msgid "Alt: scale using an integer ratio" +msgstr "Alt: schalen met een gehele verhouding" + +#: ../src/ui/tool/transform-handle-set.cpp:209 +msgctxt "Transform handle tip" +msgid "Scale handle: drag to scale the selection" +msgstr "Schaalhandvat: sleep om de selectie te schalen" + +#: ../src/ui/tool/transform-handle-set.cpp:214 +#, c-format +msgctxt "Transform handle tip" +msgid "Scale by %.2f%% x %.2f%%" +msgstr "Schaal met %.2f%% x %.2f%%" + +#: ../src/ui/tool/transform-handle-set.cpp:438 +#, c-format +msgctxt "Transform handle tip" +msgid "Shift+Ctrl: rotate around the opposite corner and snap angle to %f° increments" +msgstr "Shift+Ctrl: roteren rond de tegenoverliggende hoek en hoek beperken tot stappen van %f°" + +#: ../src/ui/tool/transform-handle-set.cpp:441 +msgctxt "Transform handle tip" +msgid "Shift: rotate around the opposite corner" +msgstr "Shift: roteren rond de tegenoverliggende hoek" -#: ../src/ui/tools/tweak-tool.cpp:1246 -msgid "Scale tweak" -msgstr "Vergroten/verkleinen" +#: ../src/ui/tool/transform-handle-set.cpp:445 +#, c-format +msgctxt "Transform handle tip" +msgid "Ctrl: snap angle to %f° increments" +msgstr "Ctrl: hoek beperken tot stappen van %f°" -#: ../src/ui/tools/tweak-tool.cpp:1250 -msgid "Rotate tweak" -msgstr "Roteren" +#: ../src/ui/tool/transform-handle-set.cpp:447 +msgctxt "Transform handle tip" +msgid "Rotation handle: drag to rotate the selection around the rotation center" +msgstr "Rotatiehandvat: sleep om de selectie te roteren rond het rotatiecentrum" -#: ../src/ui/tools/tweak-tool.cpp:1254 -msgid "Duplicate/delete tweak" -msgstr "Dupliceren/verwijderen" +#. event +#: ../src/ui/tool/transform-handle-set.cpp:452 +#, c-format +msgctxt "Transform handle tip" +msgid "Rotate by %.2f°" +msgstr "Roteren met %.2f°" -#: ../src/ui/tools/tweak-tool.cpp:1258 -msgid "Push path tweak" -msgstr "Pad duwen" +#: ../src/ui/tool/transform-handle-set.cpp:578 +#, c-format +msgctxt "Transform handle tip" +msgid "Shift+Ctrl: skew about the rotation center with snapping to %f° increments" +msgstr "Shift+Ctrl: scheeftrekken rond het rotatiecentrum met stappen van %f°" -#: ../src/ui/tools/tweak-tool.cpp:1262 -msgid "Shrink/grow path tweak" -msgstr "Pad verdunnen/verdikken" +#: ../src/ui/tool/transform-handle-set.cpp:581 +msgctxt "Transform handle tip" +msgid "Shift: skew about the rotation center" +msgstr "Shift: scheeftrekken rond het rotatiecentrum" -#: ../src/ui/tools/tweak-tool.cpp:1266 -msgid "Attract/repel path tweak" -msgstr "Pad aantrekken/afstoten" +#: ../src/ui/tool/transform-handle-set.cpp:585 +#, c-format +msgctxt "Transform handle tip" +msgid "Ctrl: snap skew angle to %f° increments" +msgstr "Ctrl: scheeftrekken met stappen van %f°" -#: ../src/ui/tools/tweak-tool.cpp:1270 -msgid "Roughen path tweak" -msgstr "Pad verruwen" +#: ../src/ui/tool/transform-handle-set.cpp:588 +msgctxt "Transform handle tip" +msgid "Skew handle: drag to skew (shear) selection about the opposite handle" +msgstr "Hellingshandvat: sleep om de selectie scheef te trekken rond het tegenovergestelde handvat" -#: ../src/ui/tools/tweak-tool.cpp:1274 -msgid "Color paint tweak" -msgstr "Verver" +#: ../src/ui/tool/transform-handle-set.cpp:594 +#, c-format +msgctxt "Transform handle tip" +msgid "Skew horizontally by %.2f°" +msgstr "Horizontaal scheeftrekken met %.2f°" -#: ../src/ui/tools/tweak-tool.cpp:1278 -msgid "Color jitter tweak" -msgstr "Verkleuren" +#: ../src/ui/tool/transform-handle-set.cpp:597 +#, c-format +msgctxt "Transform handle tip" +msgid "Skew vertically by %.2f°" +msgstr "Verticaal scheeftrekken met %.2f°" -#: ../src/ui/tools/tweak-tool.cpp:1282 -msgid "Blur tweak" -msgstr "Vervagen" +#: ../src/ui/tool/transform-handle-set.cpp:656 +msgctxt "Transform handle tip" +msgid "Rotation center: drag to change the origin of transforms" +msgstr "Rotatiecentrum: sleep om de oorsprong van transformaties aan te passen" #: ../src/ui/widget/filter-effect-chooser.cpp:27 msgid "Blur (%)" @@ -21876,7 +23819,7 @@ msgstr "Inkscape afsluiten" #: ../src/verbs.cpp:2386 msgid "_Templates..." -msgstr "_Templates..." +msgstr "_Sjablonen..." #: ../src/verbs.cpp:2387 msgid "Create new project from template" @@ -22492,19 +24435,19 @@ msgstr "Huidige laag hernoemen" #: ../src/verbs.cpp:2572 msgid "Switch to Layer Abov_e" -msgstr "_Wisselen naar de laag erboven" +msgstr "_Ga naar bovenliggende laag" #: ../src/verbs.cpp:2573 msgid "Switch to the layer above the current" -msgstr "Wisselen naar de laag in het document die boven de huidige ligt" +msgstr "Ga naar de laag in het document die boven de huidige ligt" #: ../src/verbs.cpp:2574 msgid "Switch to Layer Belo_w" -msgstr "W_isselen naar de laag eronder" +msgstr "G_a naar onderliggende laag" #: ../src/verbs.cpp:2575 msgid "Switch to the layer below the current" -msgstr "Wisselen naar de laag in het document die onder de huidige ligt" +msgstr "Ga naar de laag in het document die onder de huidige ligt" #: ../src/verbs.cpp:2576 msgid "Move Selection to Layer Abo_ve" @@ -22624,7 +24567,7 @@ msgstr "Alle lagen ontgrendelen" #: ../src/verbs.cpp:2606 msgid "_Lock/Unlock Current Layer" -msgstr "_Vergrendelen/ontgrendel huidige laag" +msgstr "Huidige laag _ver-/ontgrendelen" #: ../src/verbs.cpp:2607 msgid "Toggle lock on current layer" @@ -22932,7 +24875,7 @@ msgstr "Gom" #: ../src/verbs.cpp:2693 msgid "Erase existing paths" -msgstr "Bestaande pagen verwijderen" +msgstr "Bestaande paden verwijderen" #: ../src/verbs.cpp:2694 msgctxt "ContextVerb" @@ -23381,7 +25324,7 @@ msgstr "De paginabreedte in het scherm laten passen" #: ../src/verbs.cpp:2805 msgid "Zoom to fit drawing in window" -msgstr "De hele tekening in het scherm laten passen" +msgstr "De volledige tekening in het scherm laten passen" #: ../src/verbs.cpp:2807 msgid "Zoom to fit selection in window" @@ -23477,7 +25420,7 @@ msgstr "Geschiedenis" #: ../src/verbs.cpp:2836 msgid "View and select font family, font size and other text properties" -msgstr "Lettertype, lettergrootte, letterstijl en andere teksteigenschappen tonen en instellen" +msgstr "Lettertype, -grootte, -stijl en andere teksteigenschappen tonen en instellen" #: ../src/verbs.cpp:2837 msgid "_XML Editor..." @@ -23614,7 +25557,7 @@ msgstr "Over _uitbreidingen" #: ../src/verbs.cpp:2873 msgid "Information on Inkscape extensions" -msgstr "Informatie over Inkscape-uitbreidingen tonen" +msgstr "Informatie over Inkscape-uitbreidingen" #: ../src/verbs.cpp:2874 msgid "About _Memory" @@ -23622,7 +25565,7 @@ msgstr "_Geheugengebruik" #: ../src/verbs.cpp:2875 msgid "Memory usage information" -msgstr "Informatie over geheugengebruik tonen" +msgstr "Informatie over geheugengebruik" #: ../src/verbs.cpp:2876 msgid "_About Inkscape" @@ -23630,7 +25573,7 @@ msgstr "_Over Inkscape" #: ../src/verbs.cpp:2877 msgid "Inkscape version, authors, license" -msgstr "Inkscapeversie, -auteurs, en -licentie tonen" +msgstr "Inkscapeversie, -auteurs, en -licentie" #. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"), #. N_("Distribution terms"), /*"show_license"*/"inkscape_options"), @@ -24304,88 +26247,88 @@ msgstr "Streepjespatroon" msgid "Pattern offset" msgstr "Patroonverplaatsing" -#: ../src/widgets/desktop-widget.cpp:465 +#: ../src/widgets/desktop-widget.cpp:466 msgid "Zoom drawing if window size changes" msgstr "In- of uitzoomen wanneer venstergrootte verandert" -#: ../src/widgets/desktop-widget.cpp:669 +#: ../src/widgets/desktop-widget.cpp:670 msgid "Cursor coordinates" msgstr "Cursorcoördinaten" -#: ../src/widgets/desktop-widget.cpp:695 +#: ../src/widgets/desktop-widget.cpp:696 msgid "Z:" msgstr "Z:" #. display the initial welcome message in the statusbar -#: ../src/widgets/desktop-widget.cpp:738 +#: ../src/widgets/desktop-widget.cpp:739 msgid "Welcome to Inkscape! Use shape or freehand tools to create objects; use selector (arrow) to move or transform them." msgstr "Welkom bij Inkscape! Gebruik vorm- of tekengereedschappen om objecten te maken, gebruik aanwijsgereedschap om ze te verplaatsen of te vervormen." -#: ../src/widgets/desktop-widget.cpp:832 +#: ../src/widgets/desktop-widget.cpp:833 msgid "grayscale" msgstr "grijstinten" -#: ../src/widgets/desktop-widget.cpp:833 +#: ../src/widgets/desktop-widget.cpp:834 msgid ", grayscale" msgstr ", grijstinten" -#: ../src/widgets/desktop-widget.cpp:834 +#: ../src/widgets/desktop-widget.cpp:835 msgid "print colors preview" msgstr "" -#: ../src/widgets/desktop-widget.cpp:835 +#: ../src/widgets/desktop-widget.cpp:836 msgid ", print colors preview" msgstr "" -#: ../src/widgets/desktop-widget.cpp:836 +#: ../src/widgets/desktop-widget.cpp:837 msgid "outline" msgstr "contour" -#: ../src/widgets/desktop-widget.cpp:837 +#: ../src/widgets/desktop-widget.cpp:838 msgid "no filters" msgstr "geen filters" -#: ../src/widgets/desktop-widget.cpp:864 +#: ../src/widgets/desktop-widget.cpp:865 #, c-format msgid "%s%s: %d (%s%s) - Inkscape" msgstr "%s%s: %d (%s%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:866 -#: ../src/widgets/desktop-widget.cpp:870 +#: ../src/widgets/desktop-widget.cpp:867 +#: ../src/widgets/desktop-widget.cpp:871 #, c-format msgid "%s%s: %d (%s) - Inkscape" msgstr "%s%s: %d (%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:872 +#: ../src/widgets/desktop-widget.cpp:873 #, c-format msgid "%s%s: %d - Inkscape" msgstr "%s%s: %d - Inkscape" -#: ../src/widgets/desktop-widget.cpp:878 +#: ../src/widgets/desktop-widget.cpp:879 #, c-format msgid "%s%s (%s%s) - Inkscape" msgstr "%s%s (%s%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:880 -#: ../src/widgets/desktop-widget.cpp:884 +#: ../src/widgets/desktop-widget.cpp:881 +#: ../src/widgets/desktop-widget.cpp:885 #, c-format msgid "%s%s (%s) - Inkscape" msgstr "%s%s (%s) - Inkscape" -#: ../src/widgets/desktop-widget.cpp:886 +#: ../src/widgets/desktop-widget.cpp:887 #, c-format msgid "%s%s - Inkscape" msgstr "%s%s - Inkscape" -#: ../src/widgets/desktop-widget.cpp:1055 +#: ../src/widgets/desktop-widget.cpp:1056 msgid "Color-managed display is enabled in this window" msgstr "Kleurmanagementweergave is actiefvoor dit venster" -#: ../src/widgets/desktop-widget.cpp:1057 +#: ../src/widgets/desktop-widget.cpp:1058 msgid "Color-managed display is disabled in this window" msgstr "Kleurmanagementweergave is inactief voor dit venster" -#: ../src/widgets/desktop-widget.cpp:1112 +#: ../src/widgets/desktop-widget.cpp:1113 #, c-format msgid "" "Save changes to document \"%s\" before closing?\n" @@ -24396,12 +26339,12 @@ msgstr "" "\n" "Als u afsluit zonder opslaan, gaan de wijzigingen verloren." -#: ../src/widgets/desktop-widget.cpp:1122 -#: ../src/widgets/desktop-widget.cpp:1181 +#: ../src/widgets/desktop-widget.cpp:1123 +#: ../src/widgets/desktop-widget.cpp:1182 msgid "Close _without saving" -msgstr "Sluiten _zonder opslaan" +msgstr "_Sluiten zonder opslaan" -#: ../src/widgets/desktop-widget.cpp:1171 +#: ../src/widgets/desktop-widget.cpp:1172 #, c-format msgid "" "The file \"%s\" was saved with a format that may cause data loss!\n" @@ -24412,11 +26355,11 @@ msgstr "" "\n" "Wilt u dit bestand opslaan in het Inkscape SVG-formaat?" -#: ../src/widgets/desktop-widget.cpp:1183 +#: ../src/widgets/desktop-widget.cpp:1184 msgid "_Save as Inkscape SVG" msgstr "Op_slaan als Inkscape SVG" -#: ../src/widgets/desktop-widget.cpp:1393 +#: ../src/widgets/desktop-widget.cpp:1394 msgid "Note:" msgstr "Nota:" @@ -24646,9 +26589,8 @@ msgid "Repeat:" msgstr "Herhalen:" #: ../src/widgets/gradient-toolbar.cpp:1159 -#, fuzzy msgid "No stops" -msgstr "Geen lijn" +msgstr "Geen overgangen" #: ../src/widgets/gradient-toolbar.cpp:1161 msgid "Stops" @@ -24662,6 +26604,13 @@ msgstr "Selecteer een overgang voor het huidige kleurverloop" msgid "Stops:" msgstr "Overgangen:" +#. Label +#: ../src/widgets/gradient-toolbar.cpp:1174 +#: ../src/widgets/gradient-vector.cpp:926 +msgctxt "Gradient" +msgid "Offset:" +msgstr "Beginpunt:" + #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset of selected stop" msgstr "Beginpunt kleurovergang" @@ -25065,6 +27014,53 @@ msgstr "Y-coördinaat:" msgid "Y coordinate of selected node(s)" msgstr "Y-coördinaat van geselecteerd knooppunt" +#: ../src/widgets/paintbucket-toolbar.cpp:154 +msgid "Fill by" +msgstr "Vullen met" + +#: ../src/widgets/paintbucket-toolbar.cpp:155 +msgid "Fill by:" +msgstr "Vullen met:" + +#: ../src/widgets/paintbucket-toolbar.cpp:167 +msgid "Fill Threshold" +msgstr "Vullingsdrempel" + +#: ../src/widgets/paintbucket-toolbar.cpp:168 +msgid "The maximum allowed difference between the clicked pixel and the neighboring pixels to be counted in the fill" +msgstr "Het maximaal toegestane verschil tussen de aangeklikte pixel en de naastliggende pixels geteld in de vulling" + +#: ../src/widgets/paintbucket-toolbar.cpp:195 +msgid "Grow/shrink by" +msgstr "Verdikken/verdunnen met" + +#: ../src/widgets/paintbucket-toolbar.cpp:195 +msgid "Grow/shrink by:" +msgstr "Verdikken/verdunnen met:" + +#: ../src/widgets/paintbucket-toolbar.cpp:196 +msgid "The amount to grow (positive) or shrink (negative) the created fill path" +msgstr "Mate waarmee het vullingspad verdikt (positief) of verdunt (negatief)" + +#: ../src/widgets/paintbucket-toolbar.cpp:221 +msgid "Close gaps" +msgstr "Gaten opvullen" + +#: ../src/widgets/paintbucket-toolbar.cpp:222 +msgid "Close gaps:" +msgstr "Gaten opvullen:" + +#: ../src/widgets/paintbucket-toolbar.cpp:233 +#: ../src/widgets/pencil-toolbar.cpp:322 +#: ../src/widgets/spiral-toolbar.cpp:300 +#: ../src/widgets/star-toolbar.cpp:572 +msgid "Defaults" +msgstr "Standaardwaarden" + +#: ../src/widgets/paintbucket-toolbar.cpp:234 +msgid "Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools to change defaults)" +msgstr "Herinitialiseer afgebakende gebieden vullen naar standaardwaarden (gebruik Inkscapevoorkeuren > Gereedschappen om de standaardwaarden te veranderen)" + #: ../src/widgets/paint-selector.cpp:234 msgid "No paint" msgstr "Geen opvulling" @@ -25136,53 +27132,6 @@ msgstr "Patroonvulling" msgid "Swatch fill" msgstr "Vulling uit palet" -#: ../src/widgets/paintbucket-toolbar.cpp:154 -msgid "Fill by" -msgstr "Vullen met" - -#: ../src/widgets/paintbucket-toolbar.cpp:155 -msgid "Fill by:" -msgstr "Vullen met:" - -#: ../src/widgets/paintbucket-toolbar.cpp:167 -msgid "Fill Threshold" -msgstr "Vullingsdrempel" - -#: ../src/widgets/paintbucket-toolbar.cpp:168 -msgid "The maximum allowed difference between the clicked pixel and the neighboring pixels to be counted in the fill" -msgstr "Het maximaal toegestane verschil tussen de aangeklikte pixel en de naastliggende pixels geteld in de vulling" - -#: ../src/widgets/paintbucket-toolbar.cpp:195 -msgid "Grow/shrink by" -msgstr "Verdikken/verdunnen met" - -#: ../src/widgets/paintbucket-toolbar.cpp:195 -msgid "Grow/shrink by:" -msgstr "Verdikken/verdunnen met:" - -#: ../src/widgets/paintbucket-toolbar.cpp:196 -msgid "The amount to grow (positive) or shrink (negative) the created fill path" -msgstr "Mate waarmee het vullingspad verdikt (positief) of verdunt (negatief)" - -#: ../src/widgets/paintbucket-toolbar.cpp:221 -msgid "Close gaps" -msgstr "Gaten opvullen" - -#: ../src/widgets/paintbucket-toolbar.cpp:222 -msgid "Close gaps:" -msgstr "Gaten opvullen:" - -#: ../src/widgets/paintbucket-toolbar.cpp:233 -#: ../src/widgets/pencil-toolbar.cpp:322 -#: ../src/widgets/spiral-toolbar.cpp:300 -#: ../src/widgets/star-toolbar.cpp:572 -msgid "Defaults" -msgstr "Standaardwaarden" - -#: ../src/widgets/paintbucket-toolbar.cpp:234 -msgid "Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools to change defaults)" -msgstr "Herinitialiseer afgebakende gebieden vullen naar standaardwaarden (gebruik Inkscapevoorkeuren > Gereedschappen om de standaardwaarden te veranderen)" - #: ../src/widgets/pencil-toolbar.cpp:125 msgid "Bezier" msgstr "Bezier" @@ -25318,9 +27267,8 @@ msgid "Make corners sharp" msgstr "De hoeken weer scherp maken" #: ../src/widgets/ruler.cpp:192 -#, fuzzy msgid "The orientation of the ruler" -msgstr "Oriëntatie van het paneelitem" +msgstr "Oriëntatie van de meetlat" #: ../src/widgets/ruler.cpp:202 msgid "Unit of the ruler" @@ -25491,10 +27439,6 @@ msgstr "_G:" msgid "_B:" msgstr "_B:" -#: ../src/widgets/sp-color-icc-selector.cpp:359 -msgid "G:" -msgstr "G:" - #: ../src/widgets/sp-color-icc-selector.cpp:359 msgid "Gray" msgstr "Grijs" @@ -25615,14 +27559,6 @@ msgstr "CMYK" msgid "Unnamed" msgstr "Naamloos" -#: ../src/widgets/sp-xmlview-attr-list.cpp:64 -msgid "Value" -msgstr "Waarde" - -#: ../src/widgets/sp-xmlview-content.cpp:179 -msgid "Type text in a text node" -msgstr "Tekst tikken in een tekstobject" - #: ../src/widgets/spiral-toolbar.cpp:111 msgid "Change spiral" msgstr "Spiraal aanpassen" @@ -25842,6 +27778,14 @@ msgstr "Schaal:" msgid "Variation in the scale of the sprayed objects; 0% for the same scale than the original object" msgstr "Variatie van de schaal van de verstoven objecten; 0% voor de schaal van het originele object" +#: ../src/widgets/sp-xmlview-attr-list.cpp:64 +msgid "Value" +msgstr "Waarde" + +#: ../src/widgets/sp-xmlview-content.cpp:179 +msgid "Type text in a text node" +msgstr "Tekst tikken in een tekstobject" + #: ../src/widgets/star-toolbar.cpp:110 msgid "Star: Change number of corners" msgstr "Ster: aantal hoeken veranderen" @@ -27036,7 +28980,7 @@ msgstr "" #: ../share/extensions/generate_voronoi.py:36 msgid "Python version is: " -msgstr "Pythonversie:" +msgstr "Pythonversie: " #: ../share/extensions/generate_voronoi.py:94 msgid "Please select an object" @@ -27050,7 +28994,7 @@ msgstr "Gimp moet geïnstalleerd zijn en in de padvariabele staan." msgid "An error occurred while processing the XCF file." msgstr "Er trad een fout bij bij het verwerken van het XCF-bestand." -#: ../share/extensions/gimp_xcf.py:171 +#: ../share/extensions/gimp_xcf.py:177 msgid "This extension requires at least one non empty layer." msgstr "Deze uitbreiding vereist ten minste één niet lege laag." @@ -27059,14 +29003,12 @@ msgid "The sliced bitmaps have been saved as:" msgstr "De versneden bitmaps werden bewaard als:" #: ../share/extensions/hpgl_decoder.py:44 -#, fuzzy msgid "Movements" -msgstr "Kleurverlopen verplaatsen" +msgstr "" #: ../share/extensions/hpgl_decoder.py:45 -#, fuzzy msgid "Pen #" -msgstr "Pen" +msgstr "Pen #" #. issue error if no hpgl data found #: ../share/extensions/hpgl_input.py:59 @@ -27095,7 +29037,13 @@ msgstr "" "Technische details:\n" "%s" -#: ../share/extensions/inkex.py:260 +#: ../share/extensions/inkex.py:162 +#: ../share/extensions/inkex.py:171 +#, python-format +msgid "Unable to open specified file: %s" +msgstr "Kan opgegeven bestand niet openen: %s" + +#: ../share/extensions/inkex.py:276 #, python-format msgid "No matching node for expression: %s" msgstr "Geen overeenkomend knooppunt voor de expressie: %s" @@ -27369,9 +29317,8 @@ msgid "pySerial is not installed." msgstr "pySerial is niet geïnstalleerd." #: ../share/extensions/plotter.py:151 -#, fuzzy msgid "Could not open port. Please check that your plotter is running, connected and the settings are correct." -msgstr "Kon de data niet verzenden. Kijk aub. na of je plotter aanstaat, verbonden is en of de de instellingen juist zijn." +msgstr "Kon de poort niet openen. Kijk aub. na of je plotter aanstaat, verbonden is en of de de instellingen juist zijn." #: ../share/extensions/polyhedron_3d.py:65 msgid "Failed to import the numpy module. This module is required by this extension. Please install it and try again. On a Debian-like system this can be done with the command 'sudo apt-get install python-numpy'." @@ -27671,51 +29618,9 @@ msgstr "Corel DRAW Presentation uitwisselingsbestanden invoer (UC)" msgid "Corel DRAW Presentation Exchange files (UC) (*.cmx)" msgstr "Corel DRAW Presentation uitwisselingsbestanden (UC) (*.cmx)" -#: ../share/extensions/cmx_input.inx.h:3 -msgid "Open presentation exchange files saved in Corel DRAW (UC)" -msgstr "Open uitwisselingsbestanden opgeslagen met Corel DRAW (UC)" - -#: ../share/extensions/color_HSL_adjust.inx.h:1 -msgid "HSL Adjust" -msgstr "TVH aanpassen" - -#: ../share/extensions/color_HSL_adjust.inx.h:3 -msgid "Hue (°)" -msgstr "Tintrotatie (°)" - -#: ../share/extensions/color_HSL_adjust.inx.h:4 -msgid "Random hue" -msgstr "Random tint" - -#: ../share/extensions/color_HSL_adjust.inx.h:6 -#, no-c-format -msgid "Saturation (%)" -msgstr "Verzadiging (%)" - -#: ../share/extensions/color_HSL_adjust.inx.h:7 -msgid "Random saturation" -msgstr "Random verzadiging" - -#: ../share/extensions/color_HSL_adjust.inx.h:9 -#, no-c-format -msgid "Lightness (%)" -msgstr "Lichtheid (%)" - -#: ../share/extensions/color_HSL_adjust.inx.h:10 -msgid "Random lightness" -msgstr "Random lichtheid" - -#: ../share/extensions/color_HSL_adjust.inx.h:13 -#, no-c-format -msgid "" -"Adjusts hue, saturation and lightness in the HSL representation of the selected objects's color.\n" -"Options:\n" -" * Hue: rotate by degrees (wraps around).\n" -" * Saturation: add/subtract % (min=-100, max=100).\n" -" * Lightness: add/subtract % (min=-100, max=100).\n" -" * Random Hue/Saturation/Lightness: randomize the parameter's value.\n" -" " -msgstr "" +#: ../share/extensions/cmx_input.inx.h:3 +msgid "Open presentation exchange files saved in Corel DRAW (UC)" +msgstr "Open uitwisselingsbestanden opgeslagen met Corel DRAW (UC)" #: ../share/extensions/color_blackandwhite.inx.h:1 msgid "Black and White" @@ -27777,6 +29682,48 @@ msgstr "Onverzadigd maken" msgid "Grayscale" msgstr "Grijstinten" +#: ../share/extensions/color_HSL_adjust.inx.h:1 +msgid "HSL Adjust" +msgstr "TVH aanpassen" + +#: ../share/extensions/color_HSL_adjust.inx.h:3 +msgid "Hue (°)" +msgstr "Tintrotatie (°)" + +#: ../share/extensions/color_HSL_adjust.inx.h:4 +msgid "Random hue" +msgstr "Random tint" + +#: ../share/extensions/color_HSL_adjust.inx.h:6 +#, no-c-format +msgid "Saturation (%)" +msgstr "Verzadiging (%)" + +#: ../share/extensions/color_HSL_adjust.inx.h:7 +msgid "Random saturation" +msgstr "Random verzadiging" + +#: ../share/extensions/color_HSL_adjust.inx.h:9 +#, no-c-format +msgid "Lightness (%)" +msgstr "Lichtheid (%)" + +#: ../share/extensions/color_HSL_adjust.inx.h:10 +msgid "Random lightness" +msgstr "Random lichtheid" + +#: ../share/extensions/color_HSL_adjust.inx.h:13 +#, no-c-format +msgid "" +"Adjusts hue, saturation and lightness in the HSL representation of the selected objects's color.\n" +"Options:\n" +" * Hue: rotate by degrees (wraps around).\n" +" * Saturation: add/subtract % (min=-100, max=100).\n" +" * Lightness: add/subtract % (min=-100, max=100).\n" +" * Random Hue/Saturation/Lightness: randomize the parameter's value.\n" +" " +msgstr "" + #: ../share/extensions/color_lesshue.inx.h:1 msgid "Less Hue" msgstr "Minder tint" @@ -28211,14 +30158,12 @@ msgid "Character Encoding" msgstr "Karakterencodering" #: ../share/extensions/dxf_outlines.inx.h:7 -#, fuzzy msgid "Layer export selection" -msgstr "Selectie verwijderen" +msgstr "" #: ../share/extensions/dxf_outlines.inx.h:8 -#, fuzzy msgid "Layer match name" -msgstr "Naam van de laag:" +msgstr "" #: ../share/extensions/dxf_outlines.inx.h:9 msgid "pt" @@ -28298,7 +30243,6 @@ msgid "By name match" msgstr "" #: ../share/extensions/dxf_outlines.inx.h:25 -#, fuzzy msgid "" "- AutoCAD Release 14 DXF format.\n" "- The base unit parameter specifies in what unit the coordinates are output (90 px = 1 in).\n" @@ -28311,13 +30255,14 @@ msgid "" "- You can choose to export all layers, only visible ones or by name match (case insensitive and use comma ',' as separator)" msgstr "" "- AutoCAD versie 14 DXF-formaat.\n" -"- De parameter basiseenheid specifiëert in welke eenheid de coördinaten weggeschreven worden (90 px = 1 in).\n" +"- De parameter basiseenheid specifiëert in welke eenheid de coördinaten weggeschreven worden (90 px = 1 duim).\n" "- Ondersteunde elementen\n" " - paden (lijnstukken en splines)\n" " - rechthoeken\n" " - klonen (de link met het origineel gaat verloren)\n" "- ROBO-Master spline uitvoer is een gespecialiseerde spline die alleen leesbaar is door ROBO-Master en Autodesk viewers, niet door Inkscape.\n" -"- LWPOLYLINE uitvoer is een meervoudig verbonden veellijn, schakel dit uit voor verouderde lijnuitvoer.- Je kan kiezen om alle of alleen zichtbare lagen te exporteren" +"- LWPOLYLINE uitvoer is een meervoudig verbonden veellijn, schakel dit uit voor verouderde lijnuitvoer.\n" +"- Je kan kiezen om alle of alleen zichtbare lagen te exporteren, of door opgave van de naam (hoofdletterongevoelig, gebruik een comma ',' als scheidingsteken)" #: ../share/extensions/dxf_outlines.inx.h:34 msgid "Desktop Cutting Plotter (AutoCAD DXF R14) (*.dxf)" @@ -28389,14 +30334,12 @@ msgid "Empty Page" msgstr "" #: ../share/extensions/empty_page.inx.h:2 -#, fuzzy msgid "Page size:" -msgstr "Grootte plakken" +msgstr "Paginagrootte:" #: ../share/extensions/empty_page.inx.h:3 -#, fuzzy msgid "Page orientation:" -msgstr "Tekstoriëntatie" +msgstr "Paginaoriëntatie" #: ../share/extensions/eps_input.inx.h:1 msgid "EPS Input" @@ -29288,23 +31231,29 @@ msgstr "Raster bewaren" msgid "Save Background" msgstr "Achtergrond bewaren" -#: ../share/extensions/gimp_xcf.inx.h:7 +#: ../share/extensions/gimp_xcf.inx.h:6 +msgid "File Resolution:" +msgstr "Resolutie:" + +#: ../share/extensions/gimp_xcf.inx.h:8 msgid "" "This extension exports the document to Gimp XCF format according to the following options:\n" " * Save Guides: convert all guides to Gimp guides.\n" " * Save Grid: convert the first rectangular grid to a Gimp grid (note that the default Inkscape grid is very narrow when shown in Gimp).\n" " * Save Background: add the document background to each converted layer.\n" +" * File Resolution: XCF file resolution, in DPI.\n" "\n" "Each first level layer is converted to a Gimp layer. Sublayers are concatenated and converted with their first level parent layer into a single Gimp layer." msgstr "" -"Deze uitbreiding exporteert het document naar het Gimp XCF-formaat met de opties:\n" +"Deze uitbreiding exporteert het document naar het Gimp XCF-formaat met de volgende opties:\n" " * Hulplijnen bewaren: alle hulplijnen naar Gimp hulplijnen converteren.\n" " * Raster bewaren: het eerste rechthoekige grid naar een Gimp grid converteren (nota: het standaard Inkscape grid is erg fijn wanneer het in Gimp getoond wordt).\n" " * Achtergrond bewaren: documentachtergrond aan elke geconverteerde laag toevoegen.\n" +" * Resolutie: XCF-bestandsresolutie, in PPI.\n" "\n" -"Elke eerste niveau laag wordt geconverteerd naar een gimp laag. Sublagen worden samengevoegd met hun eerste niveau ouderlaag en geconverteerd in één enkele Gimp laag." +"Elke eerste-niveau-laag wordt geconverteerd naar een gimp laag. Sublagen worden samengevoegd met hun eerste-niveau-ouderlaag en geconverteerd in één enkele Gimp laag." -#: ../share/extensions/gimp_xcf.inx.h:13 +#: ../share/extensions/gimp_xcf.inx.h:15 msgid "GIMP XCF maintaining layers (*.xcf)" msgstr "GIMP XCF met behoud van lagen (*.xcf)" @@ -29519,14 +31468,12 @@ msgid "Guides creator" msgstr "Hulplijngenerator" #: ../share/extensions/guides_creator.inx.h:2 -#, fuzzy msgid "Regular guides" -msgstr "Rechthoekig raster" +msgstr "Normale hulplijnen" #: ../share/extensions/guides_creator.inx.h:3 -#, fuzzy msgid "Guides preset" -msgstr "Hulplijngenerator" +msgstr "" #: ../share/extensions/guides_creator.inx.h:6 msgid "Start from edges" @@ -29537,9 +31484,8 @@ msgid "Delete existing guides" msgstr "Bestaande hulplijnen verwijderen" #: ../share/extensions/guides_creator.inx.h:8 -#, fuzzy msgid "Diagonal guides" -msgstr "Hulplijnen kleven" +msgstr "Diagonale hulplijnen" #: ../share/extensions/guides_creator.inx.h:9 msgid "Upper left corner" @@ -29562,9 +31508,8 @@ msgid "Margins" msgstr "Marges" #: ../share/extensions/guides_creator.inx.h:14 -#, fuzzy msgid "Margins preset" -msgstr "Marge hulplijn" +msgstr "" #: ../share/extensions/guides_creator.inx.h:15 msgid "Header margin" @@ -29588,7 +31533,7 @@ msgstr "Naam afbeelding (zonder extensie):" #: ../share/extensions/guillotine.inx.h:4 msgid "Ignore these settings and use export hints" -msgstr "Deze instellingen negeren en export hints gebruiken" +msgstr "Deze instellingen negeren en exporthints gebruiken" #: ../share/extensions/handles.inx.h:1 msgid "Draw Handles" @@ -29610,14 +31555,12 @@ msgid "Text:" msgstr "Tekst:" #: ../share/extensions/hershey.inx.h:4 -#, fuzzy msgid " Action: " -msgstr " Actie" +msgstr "Actie: " #: ../share/extensions/hershey.inx.h:5 -#, fuzzy msgid " Font face: " -msgstr " Lettertype " +msgstr "Lettertype: " #: ../share/extensions/hershey.inx.h:6 msgid "Typeset that text" @@ -29773,7 +31716,7 @@ msgstr "Noteer aub dat je alleen HPGL-bestanden van Inkscape kan openen. Om ande #: ../share/extensions/hpgl_output.inx.h:4 #: ../share/extensions/plotter.inx.h:20 msgid "Resolution X (dpi)" -msgstr "X-resolutie (ppi):" +msgstr "X-resolutie (ppi)" #: ../share/extensions/hpgl_input.inx.h:4 msgid "The amount of steps in one inch on the X axis. (Default: 1016.0)" @@ -29783,7 +31726,7 @@ msgstr "Aantal stappen per duim op de X-as (standaard 1016.0)" #: ../share/extensions/hpgl_output.inx.h:6 #: ../share/extensions/plotter.inx.h:22 msgid "Resolution Y (dpi)" -msgstr "Y-resolutie (ppi):" +msgstr "Y-resolutie (ppi)" #: ../share/extensions/hpgl_input.inx.h:6 msgid "The amount of steps in one inch on the Y axis. (Default: 1016.0)" @@ -29795,7 +31738,7 @@ msgstr "Bewegingen tussen paden tonen" #: ../share/extensions/hpgl_input.inx.h:8 msgid "Check this to show movements between paths. (Default: Unchecked)" -msgstr "" +msgstr "Vink dit aan om de bewegingen tussen paden te tonen. (Standaard: uitgevinkt)" #: ../share/extensions/hpgl_input.inx.h:9 #: ../share/extensions/hpgl_output.inx.h:42 @@ -29812,7 +31755,7 @@ msgstr "HPGL-uitvoer" #: ../share/extensions/hpgl_output.inx.h:2 msgid "Please make sure that all objects you want to save are converted to paths. The drawing will be automatically aligned to the zero point. Please use the plotter extension (Extensions menu) to plot directly on a plotter." -msgstr "" +msgstr "Zorg dat alle objecten die je wil bewaren omgezet zijn naar paden. De afbeelding wordt automatisch uitgelijnd met het nulpunt. Gebruik de plotteruitbreiding (menu Uitbreidingen) om onmiddellijk naar een plotter te plotten." #: ../share/extensions/hpgl_output.inx.h:3 #: ../share/extensions/plotter.inx.h:19 @@ -29821,15 +31764,13 @@ msgstr "Plotterinstellingen" #: ../share/extensions/hpgl_output.inx.h:5 #: ../share/extensions/plotter.inx.h:21 -#, fuzzy msgid "The amount of steps the cutter moves if it moves for 1 inch on the X axis. (Default: 1016.0)" -msgstr "Aantal stappen per duim op de X-as (standaard 1016.0)" +msgstr "Aantal stappen van de cutter bij verplaatsing van 1 duim op de X-as (standaard 1016.0)" #: ../share/extensions/hpgl_output.inx.h:7 #: ../share/extensions/plotter.inx.h:23 -#, fuzzy msgid "The amount of steps the cutter moves if it moves for 1 inch on the Y axis. (Default: 1016.0)" -msgstr "Aantal stappen per duim op de Y-as (standaard 1016.0)" +msgstr "Aantal stappen van de cutter bij verplaatsing van 1 duim op de Y-as (standaard 1016.0)" #: ../share/extensions/hpgl_output.inx.h:8 #: ../share/extensions/plotter.inx.h:24 @@ -29839,27 +31780,27 @@ msgstr "Nummer pen" #: ../share/extensions/hpgl_output.inx.h:9 #: ../share/extensions/plotter.inx.h:25 msgid "The number of the pen (tool) to use. (Standard: '1')" -msgstr "" +msgstr "Te gebruiken pennummer (gereedschap). (Standaard: '1')" #: ../share/extensions/hpgl_output.inx.h:10 #: ../share/extensions/plotter.inx.h:26 msgid "Pen force (g)" -msgstr "" +msgstr "Drukkracht pen (g)" #: ../share/extensions/hpgl_output.inx.h:11 #: ../share/extensions/plotter.inx.h:27 msgid "The amount of force pushing down the pen in grams, set to 0 to omit command. Most plotters ignore this command. (Default: 24)" -msgstr "" +msgstr "De grootte van de kracht in gram waarmee de pen drukt, stel op 0 in om opdracht over te slaan. De meeste plotters negeren deze opdracht. (Standaard: 24)" #: ../share/extensions/hpgl_output.inx.h:12 #: ../share/extensions/plotter.inx.h:28 msgid "Pen speed (cm/s)" -msgstr "" +msgstr "Snelheid pen (cm/s)" #: ../share/extensions/hpgl_output.inx.h:13 #: ../share/extensions/plotter.inx.h:29 msgid "The speed the pen will move with in centimetres per second, set to 0 to omit command. Most plotters ignore this command. (Default: 20)" -msgstr "" +msgstr "De snelheid waarmee de pen beweegt in cm/s, stel op 0 in om opdracht over te slaan. De meeste plotters negeren deze opdracht. (Standaard: 20)" #: ../share/extensions/hpgl_output.inx.h:14 #: ../share/extensions/plotter.inx.h:30 @@ -29869,7 +31810,7 @@ msgstr "Rotatie (met de klok mee)" #: ../share/extensions/hpgl_output.inx.h:15 #: ../share/extensions/plotter.inx.h:31 msgid "Rotation of the plot. (Default: 0°)" -msgstr "" +msgstr "Rotatie van de plot. (Standaard: 0°)" #: ../share/extensions/hpgl_output.inx.h:16 #: ../share/extensions/plotter.inx.h:32 @@ -29879,7 +31820,7 @@ msgstr "X-as spiegelen" #: ../share/extensions/hpgl_output.inx.h:17 #: ../share/extensions/plotter.inx.h:33 msgid "Check this to mirror the X axis. (Default: Unchecked)" -msgstr "" +msgstr "Vink dit aan om de X-as te spiegelen. (Standaard: uit)" #: ../share/extensions/hpgl_output.inx.h:18 #: ../share/extensions/plotter.inx.h:34 @@ -29889,18 +31830,17 @@ msgstr "Y-as spiegelen" #: ../share/extensions/hpgl_output.inx.h:19 #: ../share/extensions/plotter.inx.h:35 msgid "Check this to mirror the Y axis. (Default: Unchecked)" -msgstr "" +msgstr "Vink dit aan om de Y-as te spiegelen. (Standaard: uit)" #: ../share/extensions/hpgl_output.inx.h:20 #: ../share/extensions/plotter.inx.h:36 -#, fuzzy msgid "Center zero point" -msgstr "Centreren om de horizontale as" +msgstr "Nulpunt centraal" #: ../share/extensions/hpgl_output.inx.h:21 #: ../share/extensions/plotter.inx.h:37 msgid "Check this if your plotter uses a centered zero point. (Default: Unchecked)" -msgstr "" +msgstr "Vink dit aan indien je plotter een gecenteerd nulpunt gebruikt. (Standaard: uit)" #: ../share/extensions/hpgl_output.inx.h:22 #: ../share/extensions/plotter.inx.h:38 @@ -29909,9 +31849,8 @@ msgstr "" #: ../share/extensions/hpgl_output.inx.h:23 #: ../share/extensions/plotter.inx.h:39 -#, fuzzy msgid "Use overcut" -msgstr "_Standaard gebruiken" +msgstr "" #: ../share/extensions/hpgl_output.inx.h:24 #: ../share/extensions/plotter.inx.h:40 @@ -29945,15 +31884,13 @@ msgstr "X-afstand (mm)" #: ../share/extensions/hpgl_output.inx.h:30 #: ../share/extensions/plotter.inx.h:46 -#, fuzzy msgid "The offset from the tool tip to the tool axis in mm. (Default: 0.25)" -msgstr "Aantal stappen per duim op de X-as (standaard 1016.0)" +msgstr "Afstand tussen gereedschapstip en gereedschapsas in mm. (Standaard: 0.25)" #: ../share/extensions/hpgl_output.inx.h:31 #: ../share/extensions/plotter.inx.h:47 -#, fuzzy msgid "Use precut" -msgstr "_Standaard gebruiken" +msgstr "" #: ../share/extensions/hpgl_output.inx.h:32 #: ../share/extensions/plotter.inx.h:48 @@ -29967,14 +31904,13 @@ msgstr "" #: ../share/extensions/hpgl_output.inx.h:35 #: ../share/extensions/plotter.inx.h:51 -#, fuzzy msgid "Curve flatness" -msgstr "Vlakheid:" +msgstr "Vlakheid pad" #: ../share/extensions/hpgl_output.inx.h:36 #: ../share/extensions/plotter.inx.h:52 msgid "Curves are divided into lines, this number controls how fine the curves will be reproduced, the smaller the finer. (Default: '1.2')" -msgstr "" +msgstr "Paden worden opgedeeld in lijnen, dit getal bepaalt hoe nauwkeurig de paden worden gereproduceerd, hoe kleiner, hoe fijner. (Standaard: '1.2')" #: ../share/extensions/hpgl_output.inx.h:37 #: ../share/extensions/plotter.inx.h:53 @@ -29983,9 +31919,8 @@ msgstr "X-afstand (mm)" #: ../share/extensions/hpgl_output.inx.h:38 #: ../share/extensions/plotter.inx.h:54 -#, fuzzy msgid "The offset to move your plot away from the zero point on the X axis in mm. (Default: '0.00')" -msgstr "Aantal stappen per duim op de X-as (standaard 1016.0)" +msgstr "De afstand op de X-as waarover je plot weg van het nulpunt wordt verschoven in mm. (Standaard: '0.00')" #: ../share/extensions/hpgl_output.inx.h:39 #: ../share/extensions/plotter.inx.h:55 @@ -29994,17 +31929,15 @@ msgstr "Y-afstand (mm)" #: ../share/extensions/hpgl_output.inx.h:40 #: ../share/extensions/plotter.inx.h:56 -#, fuzzy msgid "The offset to move your plot away from the zero point on the Y axis in mm. (Default: '0.00')" -msgstr "Aantal stappen per duim op de Y-as (standaard 1016.0)" +msgstr "De afstand op de Y-as waarover je plot weg van het nulpunt wordt verschoven in mm. (Standaard: '0.00')" #: ../share/extensions/hpgl_output.inx.h:41 #: ../share/extensions/plotter.inx.h:59 msgid "All these settings depend on the plotter you use, for more information please consult the manual or homepage for your plotter." -msgstr "" +msgstr "Deze instellingen hangen af van je plotter, raadpleeg voor meer info de handleiding of homepage van je plotter." #: ../share/extensions/hpgl_output.inx.h:43 -#, fuzzy msgid "Export an HP Graphics Language file" msgstr "Naar een HP Graphics Language bestand exporteren" @@ -30081,26 +32014,6 @@ msgstr "Meld een programmafout" msgid "SVG 1.1 Specification" msgstr "SVG 1.1-specificatie" -#: ../share/extensions/interp.inx.h:1 -msgid "Interpolate" -msgstr "Interpoleren" - -#: ../share/extensions/interp.inx.h:3 -msgid "Interpolation steps:" -msgstr "Interpolatiestappen:" - -#: ../share/extensions/interp.inx.h:4 -msgid "Interpolation method:" -msgstr "Interpolatiemethode:" - -#: ../share/extensions/interp.inx.h:5 -msgid "Duplicate endpaths" -msgstr "Eindpaden dupliceren" - -#: ../share/extensions/interp.inx.h:6 -msgid "Interpolate style" -msgstr "Stijl interpoleren" - #: ../share/extensions/interp_att_g.inx.h:1 msgid "Interpolate Attribute in a group" msgstr "Attribuut interpoleren in een groep" @@ -30183,6 +32096,26 @@ msgstr "Geen eenheid" msgid "This effect applies a value for any interpolatable attribute for all elements inside the selected group or for all elements in a multiple selection." msgstr "Dit effect past een waarde toe voor elk interpoleerbaar attribuut voor alle elementen binnen de geselecteerde groep of voor alle elementen in een meervoudige selectie." +#: ../share/extensions/interp.inx.h:1 +msgid "Interpolate" +msgstr "Interpoleren" + +#: ../share/extensions/interp.inx.h:3 +msgid "Interpolation steps:" +msgstr "Interpolatiestappen:" + +#: ../share/extensions/interp.inx.h:4 +msgid "Interpolation method:" +msgstr "Interpolatiemethode:" + +#: ../share/extensions/interp.inx.h:5 +msgid "Duplicate endpaths" +msgstr "Eindpaden dupliceren" + +#: ../share/extensions/interp.inx.h:6 +msgid "Interpolate style" +msgstr "Stijl interpoleren" + #: ../share/extensions/jessyInk_autoTexts.inx.h:1 msgid "Auto-texts" msgstr "Autoteksten" @@ -31245,9 +33178,8 @@ msgid "The Software / Hardware flow control of your serial connection. (Default: msgstr "" #: ../share/extensions/plotter.inx.h:10 -#, fuzzy msgid "Command language" -msgstr "Tweede taal:" +msgstr "" #: ../share/extensions/plotter.inx.h:11 msgid "The command language to use. (Default: HPGL)" @@ -31258,13 +33190,12 @@ msgid "Software (XON/XOFF)" msgstr "" #: ../share/extensions/plotter.inx.h:13 -#, fuzzy msgid "Hardware (RTS/CTS)" -msgstr "Hardware" +msgstr "Hardware (RTS/CTS)" #: ../share/extensions/plotter.inx.h:14 msgid "Hardware (DSR/DTR + RTS/CTS)" -msgstr "" +msgstr "Hardware (DSR/DTR + RTS/CTS)" #: ../share/extensions/plotter.inx.h:16 msgid "Using wrong settings can under certain circumstances cause Inkscape to freeze. Always save your work before plotting." @@ -31276,7 +33207,7 @@ msgstr "" #: ../share/extensions/plotter.inx.h:18 msgid "Parallel (LPT) connections are not supported." -msgstr "" +msgstr "Parallelle (LPT) verbindingen worden niet ondersteund." #: ../share/extensions/plotter.inx.h:57 msgid "Show debug information" @@ -31519,10 +33450,6 @@ msgstr "Gemiddelde" msgid "View Previous Glyph" msgstr "Vorig karakter bekijken" -#: ../share/extensions/print_win32_vector.inx.h:1 -msgid "Win32 Vector Print" -msgstr "Win32 Vector Print" - #: ../share/extensions/printing_marks.inx.h:1 msgid "Printing Marks" msgstr "Afdrukmarkeringen" @@ -31567,6 +33494,10 @@ msgstr "Canvas" msgid "Bleed Margin" msgstr "Overschotmarge" +#: ../share/extensions/print_win32_vector.inx.h:1 +msgid "Win32 Vector Print" +msgstr "Win32 Vector Print" + #: ../share/extensions/ps_input.inx.h:1 msgid "PostScript Input" msgstr "PostScript-invoer" @@ -31603,6 +33534,25 @@ msgstr "Dit effect verschuift op een willekeurige manier de knooppunten (en even msgid "Alphabet Soup" msgstr "Lettersoep" +#: ../share/extensions/render_barcode_datamatrix.inx.h:1 +msgid "Datamatrix" +msgstr "Datamatrix" + +#: ../share/extensions/render_barcode_datamatrix.inx.h:3 +#: ../share/extensions/render_barcode_qrcode.inx.h:4 +msgid "Size, in unit squares:" +msgstr "Grootte, in punten:" + +#: ../share/extensions/render_barcode_datamatrix.inx.h:4 +msgid "Square Size (px):" +msgstr "Grootte vierkant (px):" + +#: ../share/extensions/render_barcode_datamatrix.inx.h:6 +#: ../share/extensions/render_barcode.inx.h:6 +#: ../share/extensions/render_barcode_qrcode.inx.h:19 +msgid "Barcode" +msgstr "Streepjescode" + #: ../share/extensions/render_barcode.inx.h:1 msgid "Classic" msgstr "Klassiek" @@ -31619,25 +33569,6 @@ msgstr "Streepjescodedata:" msgid "Bar Height:" msgstr "Hoogte van streepjes:" -#: ../share/extensions/render_barcode.inx.h:6 -#: ../share/extensions/render_barcode_datamatrix.inx.h:6 -#: ../share/extensions/render_barcode_qrcode.inx.h:19 -msgid "Barcode" -msgstr "Streepjescode" - -#: ../share/extensions/render_barcode_datamatrix.inx.h:1 -msgid "Datamatrix" -msgstr "Datamatrix" - -#: ../share/extensions/render_barcode_datamatrix.inx.h:3 -#: ../share/extensions/render_barcode_qrcode.inx.h:4 -msgid "Size, in unit squares:" -msgstr "Grootte, in punten:" - -#: ../share/extensions/render_barcode_datamatrix.inx.h:4 -msgid "Square Size (px):" -msgstr "Grootte vierkant (px):" - #: ../share/extensions/render_barcode_qrcode.inx.h:1 msgid "QR Code" msgstr "QR-code" @@ -31687,9 +33618,8 @@ msgid "Rack Gear" msgstr "" #: ../share/extensions/render_gear_rack.inx.h:2 -#, fuzzy msgid "Rack Length:" -msgstr "Lengte:" +msgstr "" #: ../share/extensions/render_gear_rack.inx.h:3 msgid "Tooth Spacing:" @@ -32629,45 +34559,13 @@ msgid "If you want to set more than one attribute, you must separate this with a msgstr "Indien je meer dan één attribuut wilt instellen, moeten deze gescheiden zijn door één spatie." #: ../share/extensions/web-set-att.inx.h:29 -#: ../share/extensions/web-transmit-att.inx.h:27 #: ../share/extensions/webslicer_create_group.inx.h:13 #: ../share/extensions/webslicer_create_rect.inx.h:41 #: ../share/extensions/webslicer_export.inx.h:8 +#: ../share/extensions/web-transmit-att.inx.h:27 msgid "Web" msgstr "Web" -#: ../share/extensions/web-transmit-att.inx.h:1 -msgid "Transmit Attributes" -msgstr "Attributen kopiëren" - -#: ../share/extensions/web-transmit-att.inx.h:3 -msgid "Attribute to transmit:" -msgstr "Te kopiëren attribuut:" - -#: ../share/extensions/web-transmit-att.inx.h:4 -msgid "When to transmit:" -msgstr "Wanneer te kopiëren:" - -#: ../share/extensions/web-transmit-att.inx.h:6 -msgid "Source and destination of transmitting:" -msgstr "Bron en bestemming van kopiëren:" - -#: ../share/extensions/web-transmit-att.inx.h:21 -msgid "All selected ones transmit to the last one" -msgstr "Alle geselecteerde kopiëren naar de laatste" - -#: ../share/extensions/web-transmit-att.inx.h:22 -msgid "The first selected transmits to all others" -msgstr "Het eerste geselecteerd naar alle andere kopiëren" - -#: ../share/extensions/web-transmit-att.inx.h:25 -msgid "This effect transmits one or more attributes from the first selected element to the second when an event occurs." -msgstr "Dit effect kopieert één of meer attributen van het eerste naar het tweede geselecteerde element, wanneer een bepaalde gebeurtenis voorvalt." - -#: ../share/extensions/web-transmit-att.inx.h:26 -msgid "If you want to transmit more than one attribute, you should separate this with a space, and only with a space." -msgstr "Als je meer dan één attribuut wil kopiëren, moeten deze gescheiden zijn door één spatie." - #: ../share/extensions/webslicer_create_group.inx.h:1 msgid "Set a layout group" msgstr "Layoutgroep instellen" @@ -32864,6 +34762,38 @@ msgstr "Met HTML en CSS" msgid "All sliced images, and optionally - code, will be generated as you had configured and saved to one directory." msgstr "Alle deelafbeeldingen en optionele code worden gegenereerd volgens de opgegeven voorkeuren en bewaard in één map." +#: ../share/extensions/web-transmit-att.inx.h:1 +msgid "Transmit Attributes" +msgstr "Attributen kopiëren" + +#: ../share/extensions/web-transmit-att.inx.h:3 +msgid "Attribute to transmit:" +msgstr "Te kopiëren attribuut:" + +#: ../share/extensions/web-transmit-att.inx.h:4 +msgid "When to transmit:" +msgstr "Wanneer te kopiëren:" + +#: ../share/extensions/web-transmit-att.inx.h:6 +msgid "Source and destination of transmitting:" +msgstr "Bron en bestemming van kopiëren:" + +#: ../share/extensions/web-transmit-att.inx.h:21 +msgid "All selected ones transmit to the last one" +msgstr "Alle geselecteerde kopiëren naar de laatste" + +#: ../share/extensions/web-transmit-att.inx.h:22 +msgid "The first selected transmits to all others" +msgstr "Het eerste geselecteerd naar alle andere kopiëren" + +#: ../share/extensions/web-transmit-att.inx.h:25 +msgid "This effect transmits one or more attributes from the first selected element to the second when an event occurs." +msgstr "Dit effect kopieert één of meer attributen van het eerste naar het tweede geselecteerde element, wanneer een bepaalde gebeurtenis voorvalt." + +#: ../share/extensions/web-transmit-att.inx.h:26 +msgid "If you want to transmit more than one attribute, you should separate this with a space, and only with a space." +msgstr "Als je meer dan één attribuut wil kopiëren, moeten deze gescheiden zijn door één spatie." + #: ../share/extensions/whirl.inx.h:1 msgid "Whirl" msgstr "Draaiing" @@ -32910,6 +34840,12 @@ msgstr "Een populair bestandsformaat voor clipart" msgid "XAML Input" msgstr "XAML-invoer" +#~ msgid "Adjust the bisector's \"left\" end" +#~ msgstr "Het \"linker\"deel van de deellijn aanpassen" +#~ msgid "Adjust the bisector's \"right\" end" +#~ msgstr "Het \"rechter\"deel van de deellijn aanpassen" +#~ msgid " " +#~ msgstr " " #~ msgid "drawing-%d%s" #~ msgstr "Tekening-%d%s" #~ msgid "%s" @@ -32920,8 +34856,6 @@ msgstr "XAML-invoer" #~ msgstr "4x4" #~ msgid "8x8" #~ msgstr "8x8" -#~ msgid "16x16" -#~ msgstr "16x16" #~ msgid "Oversample bitmaps:" #~ msgstr "Bitmaps oversampelen:" #~ msgid "Always embed" -- cgit v1.2.3 From 1534dc84087db1b26f1e86e79436eb63f3dffd3f Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Mon, 20 Jan 2014 20:56:38 +0100 Subject: cppcheck stuff (bzr r12963) --- src/line-geometry.cpp | 16 +++++++++------- src/ui/dialog/template-load-tab.cpp | 7 ++----- src/ui/tools/text-tool.cpp | 4 ++-- src/widgets/icon.cpp | 4 ++-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/line-geometry.cpp b/src/line-geometry.cpp index e9f07f96f..982762a12 100644 --- a/src/line-geometry.cpp +++ b/src/line-geometry.cpp @@ -28,8 +28,9 @@ namespace Box3D { * of the segment. Otherwise interpret it as the direction of the line. * FIXME: Think of a better way to distinguish between the two constructors of lines. */ -Line::Line(Geom::Point const &start, Geom::Point const &vec, bool is_endpoint) { - pt = start; +Line::Line(Geom::Point const &start, Geom::Point const &vec, bool is_endpoint): + pt(start) +{ if (is_endpoint) v_dir = vec - start; else @@ -38,11 +39,12 @@ Line::Line(Geom::Point const &start, Geom::Point const &vec, bool is_endpoint) { d0 = Geom::dot(normal, pt); } -Line::Line(Line const &line) { - pt = line.pt; - v_dir = line.v_dir; - normal = line.normal; - d0 = line.d0; +Line::Line(Line const &line): + pt(line.pt), + v_dir(line.v_dir), + normal(line.normal), + d0(line.d0) +{ } Line &Line::operator=(Line const &line) { diff --git a/src/ui/dialog/template-load-tab.cpp b/src/ui/dialog/template-load-tab.cpp index 4f2d51ef7..6b1f4542f 100644 --- a/src/ui/dialog/template-load-tab.cpp +++ b/src/ui/dialog/template-load-tab.cpp @@ -220,12 +220,9 @@ TemplateLoadTab::TemplateData TemplateLoadTab::_processTemplateFile(const std::s n = result.display_name.rfind(".svg"); result.display_name.replace(n, 4, 1, ' '); - Inkscape::XML::Document *rdoc; - rdoc = sp_repr_read_file(path.data(), SP_SVG_NS_URI); - Inkscape::XML::Node *myRoot; - + Inkscape::XML::Document *rdoc = sp_repr_read_file(path.data(), SP_SVG_NS_URI); if (rdoc){ - myRoot = rdoc->root(); + Inkscape::XML::Node *myRoot = rdoc->root(); if (strcmp(myRoot->name(), "svg:svg") != 0){ // Wrong file format return result; } diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp index c73164c09..9b5ab1016 100644 --- a/src/ui/tools/text-tool.cpp +++ b/src/ui/tools/text-tool.cpp @@ -1335,7 +1335,7 @@ bool sp_text_paste_inline(ToolBase *ec) paste_string_uchar == 0x00000009 || paste_string_uchar == 0x0000000A || paste_string_uchar == 0x0000000D) { - itr++; + ++itr; } else { itr = text.erase(itr); } @@ -1637,7 +1637,7 @@ static void sp_text_context_update_text_selection(TextTool *tc) // the selection update (can't do both atomically, alas) if (!tc->desktop) return; - for (std::vector::iterator it = tc->text_selection_quads.begin() ; it != tc->text_selection_quads.end() ; it++) { + for (std::vector::iterator it = tc->text_selection_quads.begin() ; it != tc->text_selection_quads.end() ; ++it) { sp_canvas_item_hide(*it); sp_canvas_item_destroy(*it); } diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp index 768a835c9..a9c30ee8f 100644 --- a/src/widgets/icon.cpp +++ b/src/widgets/icon.cpp @@ -1310,11 +1310,11 @@ guchar *IconImpl::load_svg_pixels(std::list const &names, } static void addToIconSet(GdkPixbuf* pb, gchar const* name, GtkIconSize lsize, unsigned psize) { - static bool dump = Inkscape::Preferences::get()->getBool("/debug/icons/dumpGtk"); Glib::RefPtr icon_theme = Gtk::IconTheme::get_default(); bool icon_found = icon_theme->has_icon(name); if ( !icon_found ) { Gtk::IconTheme::add_builtin_icon( name, psize, Glib::wrap(pb) ); + static bool dump = Inkscape::Preferences::get()->getBool("/debug/icons/dumpGtk"); if (dump) { g_message(" set in a builtin for %s:%d:%d", name, lsize, psize); } @@ -1354,7 +1354,6 @@ static std::string getDestDir( unsigned psize ) bool IconImpl::prerenderIcon(gchar const *name, GtkIconSize lsize, unsigned psize) { bool loadNeeded = false; - static bool dump = Inkscape::Preferences::get()->getBool("/debug/icons/dumpGtk"); static bool useCache = Inkscape::Preferences::get()->getBool("/debug/icons/useCache", true); static bool cacheValidated = false; if (!cacheValidated) { @@ -1366,6 +1365,7 @@ bool IconImpl::prerenderIcon(gchar const *name, GtkIconSize lsize, unsigned psiz Glib::ustring key = icon_cache_key(name, psize); if ( !get_cached_pixbuf(key) ) { + static bool dump = Inkscape::Preferences::get()->getBool("/debug/icons/dumpGtk"); if ((internalNames.find(name) != internalNames.end()) || (!gtk_icon_theme_has_icon(gtk_icon_theme_get_default(), name))) { if (dump) { -- cgit v1.2.3 From 0e330f5f1fc975666d7a934e3d2efe594ac0b876 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Mon, 20 Jan 2014 17:06:21 -0500 Subject: 1. make scaling of stroke of horizontal line the same as nearly horizontal line. 2. remove vertical offset when using Transform dialog to attempt to vertically scale horizontal line. (bzr r12964) --- src/sp-item-transform.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp index 854fb9cd7..7fa591fee 100644 --- a/src/sp-item-transform.cpp +++ b/src/sp-item-transform.cpp @@ -144,13 +144,11 @@ Geom::Affine get_scale_transform_for_uniform_stroke(Geom::Rect const &bbox_visua gdouble r1 = r0; if ((fabs(w0 - stroke_x) < 1e-6) || w1 == 0) { // We have a vertical line at hand - r1 = transform_stroke ? r0 * sqrt(h1/h0) : r0; - scale_x = 1; - scale_y = preserve ? h1/h0 : (h1 - r1)/(h0 - r0); + scale_y = h1/h0; + scale_x = transform_stroke ? 1 : scale_y; } else if ((fabs(h0 - stroke_y) < 1e-6) || h1 == 0) { // We have a horizontal line at hand - r1 = transform_stroke ? r0 * sqrt(w1/w0) : r0; - scale_x = preserve ? w1/w0 : (w1 - r1)/(w0 - r0); - scale_y = 1; + scale_x = w1/w0; + scale_y = transform_stroke ? 1 : scale_x; } else { // We have a true 2D object at hand if (transform_stroke && !preserve) { /* Initial area of the geometric bounding box: A0 = (w0-r0)*(h0-r0) @@ -297,13 +295,13 @@ Geom::Affine get_scale_transform_for_variable_stroke(Geom::Rect const &bbox_visu gdouble r1w = r0w; if ((fabs(w0 - r0w) < 1e-6) || w1 == 0) { // We have a vertical line at hand - r1h = transform_stroke ? r0h * sqrt(h1/h0) : r0h; - scale_x = 1; - scale_y = preserve ? h1/h0 : (h1 - r1h)/(h0 - r0h); + scale_y = h1/h0; + scale_x = transform_stroke ? 1 : scale_y; + unbudge *= Geom::Translate (flip_x * 0.5 * (w1 - w0), 0); // compensate for the fact that this operation cannot be performed } else if ((fabs(h0 - r0h) < 1e-6) || h1 == 0) { // We have a horizontal line at hand - r1w = transform_stroke ? r0w * sqrt(w1/w0) : r0w; - scale_x = preserve ? w1/w0 : (w1 - r1w)/(w0 - r0w); - scale_y = 1; + scale_x = w1/w0; + scale_y = transform_stroke ? 1 : scale_x; + unbudge *= Geom::Translate (0, flip_y * 0.5 * (h1 - h0)); // compensate for the fact that this operation cannot be performed } else { // We have a true 2D object at hand if (transform_stroke && !preserve) { /* Initial area of the geometric bounding box: A0 = (w0-r0w)*(h0-r0h) -- cgit v1.2.3 From 77c9748e54f9170aac7c8b292377951f73da487f Mon Sep 17 00:00:00 2001 From: Matthew Petroff Date: Mon, 20 Jan 2014 20:11:09 -0500 Subject: Fix imprecise viewBox dimensions on page size change (bug #1235279). Fixed bugs: - https://launchpad.net/bugs/1235279 (bzr r12965) --- src/document.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index e56adee68..8b956d5e7 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -585,6 +585,7 @@ Inkscape::Util::Quantity SPDocument::getWidth() const void SPDocument::setWidth(const Inkscape::Util::Quantity &width) { gdouble old_computed = root->width.computed; + gdouble old_value = root->width.value; root->width.computed = width.value("px"); /* SVG does not support meters as a unit, so we must translate meters to * cm when writing */ @@ -596,8 +597,14 @@ void SPDocument::setWidth(const Inkscape::Util::Quantity &width) root->width.unit = (SVGLength::Unit) width.unit->svgUnit(); } - if (root->viewBox_set) - root->viewBox.setMax(Geom::Point(root->viewBox.left() + (root->width.computed / old_computed) * root->viewBox.width(), root->viewBox.bottom())); + if (root->viewBox_set) { + if (abs(old_value - root->viewBox.width()) < 0.00001) { + root->viewBox.setMax(Geom::Point(root->viewBox.left() + root->width.value, root->viewBox.bottom())); + } + else { + root->viewBox.setMax(Geom::Point(root->viewBox.left() + (root->width.computed / old_computed) * root->viewBox.width(), root->viewBox.bottom())); + } + } root->updateRepr(); } @@ -622,6 +629,7 @@ Inkscape::Util::Quantity SPDocument::getHeight() const void SPDocument::setHeight(const Inkscape::Util::Quantity &height) { gdouble old_computed = root->height.computed; + gdouble old_value = root->height.value; root->height.computed = height.value("px"); /* SVG does not support meters as a unit, so we must translate meters to * cm when writing */ @@ -633,8 +641,14 @@ void SPDocument::setHeight(const Inkscape::Util::Quantity &height) root->height.unit = (SVGLength::Unit) height.unit->svgUnit(); } - if (root->viewBox_set) - root->viewBox.setMax(Geom::Point(root->viewBox.right(), root->viewBox.top() + (root->height.computed / old_computed) * root->viewBox.height())); + if (root->viewBox_set) { + if (abs(old_value - root->viewBox.height()) < 0.00001) { + root->viewBox.setMax(Geom::Point(root->viewBox.right(), root->viewBox.top() + root->height.value)); + } + else { + root->viewBox.setMax(Geom::Point(root->viewBox.right(), root->viewBox.top() + (root->height.computed / old_computed) * root->viewBox.height())); + } + } root->updateRepr(); } -- cgit v1.2.3 From d94a93e813b9e4a30f82925670b30de93fc63d38 Mon Sep 17 00:00:00 2001 From: Matthew Petroff Date: Mon, 20 Jan 2014 20:36:09 -0500 Subject: Revert last commit (breaks changing document units). (bzr r12966) --- src/document.cpp | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index 8b956d5e7..e56adee68 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -585,7 +585,6 @@ Inkscape::Util::Quantity SPDocument::getWidth() const void SPDocument::setWidth(const Inkscape::Util::Quantity &width) { gdouble old_computed = root->width.computed; - gdouble old_value = root->width.value; root->width.computed = width.value("px"); /* SVG does not support meters as a unit, so we must translate meters to * cm when writing */ @@ -597,14 +596,8 @@ void SPDocument::setWidth(const Inkscape::Util::Quantity &width) root->width.unit = (SVGLength::Unit) width.unit->svgUnit(); } - if (root->viewBox_set) { - if (abs(old_value - root->viewBox.width()) < 0.00001) { - root->viewBox.setMax(Geom::Point(root->viewBox.left() + root->width.value, root->viewBox.bottom())); - } - else { - root->viewBox.setMax(Geom::Point(root->viewBox.left() + (root->width.computed / old_computed) * root->viewBox.width(), root->viewBox.bottom())); - } - } + if (root->viewBox_set) + root->viewBox.setMax(Geom::Point(root->viewBox.left() + (root->width.computed / old_computed) * root->viewBox.width(), root->viewBox.bottom())); root->updateRepr(); } @@ -629,7 +622,6 @@ Inkscape::Util::Quantity SPDocument::getHeight() const void SPDocument::setHeight(const Inkscape::Util::Quantity &height) { gdouble old_computed = root->height.computed; - gdouble old_value = root->height.value; root->height.computed = height.value("px"); /* SVG does not support meters as a unit, so we must translate meters to * cm when writing */ @@ -641,14 +633,8 @@ void SPDocument::setHeight(const Inkscape::Util::Quantity &height) root->height.unit = (SVGLength::Unit) height.unit->svgUnit(); } - if (root->viewBox_set) { - if (abs(old_value - root->viewBox.height()) < 0.00001) { - root->viewBox.setMax(Geom::Point(root->viewBox.right(), root->viewBox.top() + root->height.value)); - } - else { - root->viewBox.setMax(Geom::Point(root->viewBox.right(), root->viewBox.top() + (root->height.computed / old_computed) * root->viewBox.height())); - } - } + if (root->viewBox_set) + root->viewBox.setMax(Geom::Point(root->viewBox.right(), root->viewBox.top() + (root->height.computed / old_computed) * root->viewBox.height())); root->updateRepr(); } -- cgit v1.2.3 From 29e005620b05165ffd5ad21c2a9751adac89d34a Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Tue, 21 Jan 2014 10:21:10 -0500 Subject: Move dragging undo block from tools-base to canvas. Regarding bug #168695 (bzr r12967) --- src/display/sp-canvas.cpp | 5 +++++ src/display/sp-canvas.h | 1 + src/selection-chemistry.cpp | 5 +++-- src/ui/tools/tool-base.cpp | 7 ------- src/ui/tools/tool-base.h | 1 - 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index 455f628bc..ff58cf453 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -1545,6 +1545,11 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event) default: break; } + // Block Undo and Redo while we drag /anything/ + if(event->type == GDK_BUTTON_PRESS) + canvas->is_dragging = true; + else if(event->type == GDK_BUTTON_RELEASE) + canvas->is_dragging = false; // Choose where we send the event diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h index b570b739e..72ae4b6bc 100644 --- a/src/display/sp-canvas.h +++ b/src/display/sp-canvas.h @@ -124,6 +124,7 @@ struct SPCanvas { SPCanvasItem *root; + bool is_dragging; double dx0; double dy0; int x0; diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 1957b9297..3082a2fe4 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -56,6 +56,7 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS; #include "sp-polyline.h" #include "sp-line.h" #include "text-editing.h" +#include "display/sp-canvas.h" #include "ui/tools/text-tool.h" #include "ui/tools/connector-tool.h" #include "sp-path.h" @@ -1084,7 +1085,7 @@ void sp_undo(SPDesktop *desktop, SPDocument *) { // No re/undo while dragging, too dangerous. - if(desktop->getEventContext()->is_dragging) return; + if(desktop->getCanvas()->is_dragging) return; if (!DocumentUndo::undo(sp_desktop_document(desktop))) { desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to undo.")); @@ -1095,7 +1096,7 @@ void sp_redo(SPDesktop *desktop, SPDocument *) { // No re/undo while dragging, too dangerous. - if(desktop->getEventContext()->is_dragging) return; + if(desktop->getCanvas()->is_dragging) return; if (!DocumentUndo::redo(sp_desktop_document(desktop))) { desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to redo.")); diff --git a/src/ui/tools/tool-base.cpp b/src/ui/tools/tool-base.cpp index 3b51147e0..cc028724a 100644 --- a/src/ui/tools/tool-base.cpp +++ b/src/ui/tools/tool-base.cpp @@ -98,7 +98,6 @@ ToolBase::ToolBase() { this->hot_x = 0; this->yp = 0; this->within_tolerance = false; - this->is_dragging = false; this->tolerance = 0; //this->key = 0; this->item_to_select = 0; @@ -979,14 +978,8 @@ gint sp_event_context_root_handler(ToolBase * event_context, gint sp_event_context_virtual_root_handler(ToolBase * event_context, GdkEvent * event) { gint ret = false; if (event_context) { - if(event->type == GDK_BUTTON_PRESS) - event_context->is_dragging = true; - ret = event_context->root_handler(event); set_event_location(event_context->desktop, event); - - if(event->type == GDK_BUTTON_RELEASE) - event_context->is_dragging = false; } return ret; } diff --git a/src/ui/tools/tool-base.h b/src/ui/tools/tool-base.h index ab8bd8caa..43edc4bd7 100644 --- a/src/ui/tools/tool-base.h +++ b/src/ui/tools/tool-base.h @@ -118,7 +118,6 @@ public: gint xp, yp; ///< where drag started gint tolerance; - bool is_dragging; // Is a tool currently dragging something bool within_tolerance; ///< are we still within tolerance of origin -- cgit v1.2.3 From 61737a54a16f2434f26b1ccfa5e1e082464d65c0 Mon Sep 17 00:00:00 2001 From: David Mathog Date: Wed, 22 Jan 2014 00:44:34 +0100 Subject: EMF export: fix handling of transformed rectangular gradients (bug #1263242) Fixed bugs: - https://launchpad.net/bugs/1263242 (bzr r12968) --- src/extension/internal/emf-print.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp index 3c27ac1b8..2680718cf 100644 --- a/src/extension/internal/emf-print.cpp +++ b/src/extension/internal/emf-print.cpp @@ -814,10 +814,10 @@ Geom::Path PrintEmf::pathv_to_simple_polygon(Geom::PathVector const &pathv, int return(bad); } P1_lead = cit->finalPoint(); - if(Geom::are_near(P1_lead,P1))continue; // duplicate points at the same coordinate + if(Geom::are_near(P1_lead, P1, 1e-5))continue; // duplicate points at the same coordinate v1 = unit_vector(P1 - P1_trail); v2 = unit_vector(P1_lead - P1 ); - if(Geom::are_near(dot(v1,v2),1.0)){ // P1 is within a straight line + if(Geom::are_near(dot(v1,v2), 1.0, 1e-5)){ // P1 is within a straight line P1 = P1_lead; continue; } @@ -867,7 +867,7 @@ Geom::Path PrintEmf::pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, P1_lead = cit->finalPoint(); v1 = unit_vector(P1 - P1_trail); v2 = unit_vector(P1_lead - P1 ); - if(!Geom::are_near(dot(v1,v2),0.0))break; // P1 is center of a turn that is not 90 degrees + if(!Geom::are_near(dot(v1,v2), 0.0, 1e-5))break; // P1 is center of a turn that is not 90 degrees P1_trail = P1; P1 = P1_lead; vertex_count++; @@ -891,12 +891,12 @@ int PrintEmf::vector_rect_alignment(double angle, Geom::Point vtest){ int stat = 0; Geom::Point v1 = Geom::unit_vector(vtest); // unit vector to test alignment Geom::Point v2 = Geom::Point(1,0) * Geom::Rotate(-angle); // unit horizontal side (sign change because Y increases DOWN) - if( Geom::are_near(dot(v1,v2), 1.0)){ stat = 1; } - else if(Geom::are_near(dot(v1,v2),-1.0)){ stat = 2; } + if( Geom::are_near(dot(v1,v2), 1.0, 1e-5)){ stat = 1; } + else if(Geom::are_near(dot(v1,v2),-1.0, 1e-5)){ stat = 2; } if(!stat){ v2 = Geom::Point(0,1) * Geom::Rotate(-angle); // unit vertical side - if( Geom::are_near(dot(v1,v2), 1.0)){ stat = 3; } - else if(Geom::are_near(dot(v1,v2),-1.0)){ stat = 4; } + if( Geom::are_near(dot(v1,v2), 1.0, 1e-5)){ stat = 3; } + else if(Geom::are_near(dot(v1,v2),-1.0, 1e-5)){ stat = 4; } } return(stat); } @@ -1091,7 +1091,6 @@ unsigned int PrintEmf::fill( U_TRIVERTEX ut[2]; U_GRADIENT4 ug4; U_RECTL rcb; - Geom::Affine tf2; U_XFORM tmpTransform; double wRect, hRect; @@ -1107,7 +1106,8 @@ unsigned int PrintEmf::fill( Actual gradientfill records are either this entire rectangle or slices of it as defined by the stops. */ - tf2 = Geom::Rotate(-angle); + Geom::Affine tf2 = Geom::Rotate(-angle); // the rectangle may be drawn skewed to the coordinate system + tf2 *= tf; // the coordinate system of the rectangular path may be rotated tmpTransform.eM11 = tf2[0]; tmpTransform.eM12 = tf2[1]; tmpTransform.eM21 = tf2[2]; -- cgit v1.2.3 From e01eb5907b04fdc194551741be6c6dbf5ee6f7e5 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Tue, 21 Jan 2014 22:20:23 -0500 Subject: Improve use tag logic by recording the loaded documents in a list. (bzr r12969) --- src/document.cpp | 1 + src/document.h | 5 +++++ src/uri-references.cpp | 39 +++++++++++++++++++++++++++++---------- 3 files changed, 35 insertions(+), 10 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index e56adee68..32a025e87 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -106,6 +106,7 @@ SPDocument::SPDocument() : profileManager(0), // deferred until after other initialization router(new Avoid::Router(Avoid::PolyLineRouting|Avoid::OrthogonalRouting)), _collection_queue(0), + parent_document(NULL), oldSignalsConnected(false), current_persp3d(NULL), current_persp3d_impl(NULL) diff --git a/src/document.h b/src/document.h index cc565e3aa..e804a4980 100644 --- a/src/document.h +++ b/src/document.h @@ -25,6 +25,7 @@ #include "gc-finalized.h" #include "gc-anchored.h" #include +#include #include namespace Avoid { @@ -120,6 +121,10 @@ public: GSList *_collection_queue; + // A list of svg documents being used or shown within this document + boost::ptr_list child_documents; + SPDocument *parent_document; + bool oldSignalsConnected; /** Returns our SPRoot */ diff --git a/src/uri-references.cpp b/src/uri-references.cpp index 718b2d451..adf948c7b 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -58,17 +58,36 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // The path contains references to seperate document files to load. const char *path = uri.getPath(); - if(path) { - if(document != NULL) { - // Calculate the absolute path from an available document - std::string basePath = std::string( document->getBase() ); - std::string absPath = Glib::build_filename(basePath, std::string( path ) ); - path = absPath.c_str(); + if(path && document != NULL) { + // Calculate the absolute path from an available document + std::string basePath = std::string( document->getBase() ); + std::string absPath = Glib::build_filename(basePath, std::string( path ) ); + path = absPath.c_str(); + + // We look at existing children and parents + SPDocument *parent = document; + SPDocument *original = document; + document = NULL; + + while(parent != NULL) { + boost::ptr_list::iterator iter; + for (iter = parent->child_documents.begin(); + iter != parent->child_documents.end(); ++iter) { + if(strcmp(iter->getURI(), path)==0) + document = &*iter; + } + parent = parent->parent_document; + } + // Load a fresh document from the svg source. + if(!document) { + document = SPDocument::createNewDoc(path, FALSE); + if(document) { + document->parent_document = original; + original->child_documents.push_back(document); + } else { + g_warning("Could not load svg file: %s", path); + } } - // TODO: This is inefficient because it will load the same svg file - // many times if it's used many times. A global list of documents would - // be useful for tracking linked items. - document = SPDocument::createNewDoc(path, FALSE); } g_return_if_fail(document != NULL); -- cgit v1.2.3 From 9a0c54cb8bc9b0bfc0c6af95f4b156fd717179a8 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 22 Jan 2014 14:58:15 -0500 Subject: Protect against infinate looping of new included hrefs (bzr r12970) --- src/document.cpp | 10 ++++++---- src/document.h | 8 +++++--- src/extension/implementation/xslt.cpp | 2 +- src/uri-references.cpp | 17 ++++++++++++----- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index 32a025e87..90f35307d 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -315,7 +315,8 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, gchar const *uri, gchar const *base, gchar const *name, - unsigned int keepalive) + unsigned int keepalive, + SPDocument *parent) { SPDocument *document = new SPDocument(); @@ -326,6 +327,7 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, document->rdoc = rdoc; document->rroot = rroot; + document->parent_document = parent; if (document->uri){ g_free(document->uri); @@ -474,7 +476,7 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, * Fetches document from URI, or creates new, if NULL; public document * appears in document list. */ -SPDocument *SPDocument::createNewDoc(gchar const *uri, unsigned int keepalive, bool make_new) +SPDocument *SPDocument::createNewDoc(gchar const *uri, unsigned int keepalive, bool make_new, SPDocument *parent) { SPDocument *doc; Inkscape::XML::Document *rdoc; @@ -519,7 +521,7 @@ SPDocument *SPDocument::createNewDoc(gchar const *uri, unsigned int keepalive, b //# These should be set by now g_assert(name); - doc = createDoc(rdoc, uri, base, name, keepalive); + doc = createDoc(rdoc, uri, base, name, keepalive, parent); g_free(base); g_free(name); @@ -540,7 +542,7 @@ SPDocument *SPDocument::createNewDocFromMem(gchar const *buffer, gint length, un // TODO fixme: destroy document } else { Glib::ustring name = Glib::ustring::compose( _("Memory document %1"), ++doc_mem_count ); - doc = createDoc(rdoc, NULL, NULL, name.c_str(), keepalive); + doc = createDoc(rdoc, NULL, NULL, name.c_str(), keepalive, NULL); } } diff --git a/src/document.h b/src/document.h index e804a4980..06b2b5f6e 100644 --- a/src/document.h +++ b/src/document.h @@ -221,7 +221,8 @@ public: sigc::connection connectResourcesChanged(const gchar *key, SPDocument::ResourcesChangedSignal::slot_type slot); void fitToRect(Geom::Rect const &rect, bool with_margins = false); - static SPDocument *createNewDoc(const gchar *uri, unsigned int keepalive, bool make_new = false); + static SPDocument *createNewDoc(const gchar *uri, unsigned int keepalive, + bool make_new = false, SPDocument *parent=NULL ); static SPDocument *createNewDocFromMem(const gchar *buffer, gint length, unsigned int keepalive); /** @@ -229,8 +230,9 @@ public: */ static SPItem *getItemFromListAtPointBottom(unsigned int dkey, SPGroup *group, const GSList *list, Geom::Point const &p, bool take_insensitive = false); - // ToDo - Merge createDoc with createNewDoc - static SPDocument *createDoc(Inkscape::XML::Document *rdoc, gchar const *uri, gchar const *base, gchar const *name, unsigned int keepalive); + static SPDocument *createDoc(Inkscape::XML::Document *rdoc, gchar const *uri, + gchar const *base, gchar const *name, unsigned int keepalive, + SPDocument *parent); SPDocument *doRef(); SPDocument *doUnref(); diff --git a/src/extension/implementation/xslt.cpp b/src/extension/implementation/xslt.cpp index 9dd9c83ee..bcea06cb5 100644 --- a/src/extension/implementation/xslt.cpp +++ b/src/extension/implementation/xslt.cpp @@ -177,7 +177,7 @@ XSLT::open(Inkscape::Extension::Input */*module*/, gchar const *filename) } g_free(s); - SPDocument * doc = SPDocument::createDoc(rdoc, filename, base, name, true); + SPDocument * doc = SPDocument::createDoc(rdoc, filename, base, name, true, NULL); g_free(base); g_free(name); diff --git a/src/uri-references.cpp b/src/uri-references.cpp index adf948c7b..30e832c04 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -64,25 +64,32 @@ void URIReference::attach(const URI &uri) throw(BadURIException) std::string absPath = Glib::build_filename(basePath, std::string( path ) ); path = absPath.c_str(); - // We look at existing children and parents SPDocument *parent = document; SPDocument *original = document; document = NULL; - while(parent != NULL) { + while(parent != NULL && document == NULL) { + // Check myself and any parents int he chain + if(strcmp(parent->getURI(), path)==0) { + document = parent; + break; + } + // Then check children of those. boost::ptr_list::iterator iter; for (iter = parent->child_documents.begin(); iter != parent->child_documents.end(); ++iter) { - if(strcmp(iter->getURI(), path)==0) + if(strcmp(iter->getURI(), path)==0) { document = &*iter; + break; + } } parent = parent->parent_document; } + // Load a fresh document from the svg source. if(!document) { - document = SPDocument::createNewDoc(path, FALSE); + document = SPDocument::createNewDoc(path, false, false, original); if(document) { - document->parent_document = original; original->child_documents.push_back(document); } else { g_warning("Could not load svg file: %s", path); -- cgit v1.2.3 From 423ea7c0373e77a83c8a9ef62df9a786b4feb7ac Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 22 Jan 2014 17:58:40 -0500 Subject: Move sub-document reference creation code from uri-reference to document.cpp as createChildDoc(path) (bzr r12971) --- src/document.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++++--- src/document.h | 10 ++++++---- src/uri-references.cpp | 37 +------------------------------------ 3 files changed, 51 insertions(+), 43 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index 90f35307d..f5c799575 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -106,10 +106,10 @@ SPDocument::SPDocument() : profileManager(0), // deferred until after other initialization router(new Avoid::Router(Avoid::PolyLineRouting|Avoid::OrthogonalRouting)), _collection_queue(0), - parent_document(NULL), oldSignalsConnected(false), current_persp3d(NULL), - current_persp3d_impl(NULL) + current_persp3d_impl(NULL), + _parent_document(NULL) { // Penalise libavoid for choosing paths with needless extra segments. // This results in much better looking orthogonal connector paths. @@ -327,7 +327,10 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, document->rdoc = rdoc; document->rroot = rroot; - document->parent_document = parent; + if (parent) { + document->_parent_document = parent; + parent->_child_documents.push_back(document); + } if (document->uri){ g_free(document->uri); @@ -472,6 +475,43 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, return document; } +/** + * Fetches a document and attaches it to the current document as a child href + */ +SPDocument *SPDocument::createChildDoc(gchar const *uri) { + + // Calculate the absolute path from an available document + std::string basePath = std::string( this->getBase() ); + std::string absPath = Glib::build_filename(basePath, std::string( uri ) ); + const char *path = absPath.c_str(); + + SPDocument *parent = this; + SPDocument *document = NULL; + + while(parent != NULL && document == NULL) { + // Check myself and any parents int he chain + if(strcmp(parent->getURI(), path)==0) { + document = parent; + break; + } + // Then check children of those. + boost::ptr_list::iterator iter; + for (iter = parent->_child_documents.begin(); + iter != parent->_child_documents.end(); ++iter) { + if(strcmp(iter->getURI(), path)==0) { + document = &*iter; + break; + } + } + parent = parent->_parent_document; + } + + // Load a fresh document from the svg source. + if(!document) { + document = createNewDoc(path, false, false, this); + } + return document; +} /** * Fetches document from URI, or creates new, if NULL; public document * appears in document list. @@ -605,6 +645,7 @@ void SPDocument::setWidth(const Inkscape::Util::Quantity &width) root->updateRepr(); } + Inkscape::Util::Quantity SPDocument::getHeight() const { g_return_val_if_fail(this->priv != NULL, Inkscape::Util::Quantity(0.0, unit_table.getUnit(""))); diff --git a/src/document.h b/src/document.h index 06b2b5f6e..79381e0c2 100644 --- a/src/document.h +++ b/src/document.h @@ -121,10 +121,6 @@ public: GSList *_collection_queue; - // A list of svg documents being used or shown within this document - boost::ptr_list child_documents; - SPDocument *parent_document; - bool oldSignalsConnected; /** Returns our SPRoot */ @@ -207,6 +203,11 @@ private: Persp3D *current_persp3d; /**< Currently 'active' perspective (to which, e.g., newly created boxes are attached) */ Persp3DImpl *current_persp3d_impl; + // A list of svg documents being used or shown within this document + boost::ptr_list _child_documents; + // Conversely this is a parent document because this is a child. + SPDocument *_parent_document; + public: sigc::connection connectReconstructionStart(ReconstructionStart::slot_type slot); sigc::connection connectReconstructionFinish(ReconstructionFinish::slot_type slot); @@ -224,6 +225,7 @@ public: static SPDocument *createNewDoc(const gchar *uri, unsigned int keepalive, bool make_new = false, SPDocument *parent=NULL ); static SPDocument *createNewDocFromMem(const gchar *buffer, gint length, unsigned int keepalive); + SPDocument *createChildDoc(gchar const *uri); /** * Returns the bottommost item from the list which is at the point, or NULL if none. diff --git a/src/uri-references.cpp b/src/uri-references.cpp index 30e832c04..1684c6ade 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -59,42 +59,7 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // The path contains references to seperate document files to load. const char *path = uri.getPath(); if(path && document != NULL) { - // Calculate the absolute path from an available document - std::string basePath = std::string( document->getBase() ); - std::string absPath = Glib::build_filename(basePath, std::string( path ) ); - path = absPath.c_str(); - - SPDocument *parent = document; - SPDocument *original = document; - document = NULL; - - while(parent != NULL && document == NULL) { - // Check myself and any parents int he chain - if(strcmp(parent->getURI(), path)==0) { - document = parent; - break; - } - // Then check children of those. - boost::ptr_list::iterator iter; - for (iter = parent->child_documents.begin(); - iter != parent->child_documents.end(); ++iter) { - if(strcmp(iter->getURI(), path)==0) { - document = &*iter; - break; - } - } - parent = parent->parent_document; - } - - // Load a fresh document from the svg source. - if(!document) { - document = SPDocument::createNewDoc(path, false, false, original); - if(document) { - original->child_documents.push_back(document); - } else { - g_warning("Could not load svg file: %s", path); - } - } + document = document->createChildDoc(path); } g_return_if_fail(document != NULL); -- cgit v1.2.3 From ae7f7f7449a2da248ff13119e802a104de297c3d Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 22 Jan 2014 18:06:39 -0500 Subject: Improve warnings for missing files. Don't just assert bolocks to the user. (bzr r12972) --- src/uri-references.cpp | 5 ++++- src/xml/repr-io.cpp | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/uri-references.cpp b/src/uri-references.cpp index 1684c6ade..f2df55213 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -61,7 +61,10 @@ void URIReference::attach(const URI &uri) throw(BadURIException) if(path && document != NULL) { document = document->createChildDoc(path); } - g_return_if_fail(document != NULL); + if(!document) { + g_warning("Can't get document for referenced URI: %s", uri.toString()); + return; + } gchar const *fragment = uri.getFragment(); if ( !uri.isRelative() || uri.getQuery() || !fragment ) { diff --git a/src/xml/repr-io.cpp b/src/xml/repr-io.cpp index 54eff00bc..0319bb5e3 100644 --- a/src/xml/repr-io.cpp +++ b/src/xml/repr-io.cpp @@ -334,7 +334,10 @@ Document *sp_repr_read_file (const gchar * filename, const gchar *default_ns) xmlSubstituteEntitiesDefault(1); g_return_val_if_fail (filename != NULL, NULL); - g_return_val_if_fail (Inkscape::IO::file_test( filename, G_FILE_TEST_EXISTS ), NULL); + if (!Inkscape::IO::file_test( filename, G_FILE_TEST_EXISTS )) { + g_warning("Can't open file: %s (doesn't exist)", filename); + return NULL; + } /* fixme: A file can disappear at any time, including between now and when we actually try to * open it. Get rid of the above test once we're sure that we correctly handle * non-existence. */ -- cgit v1.2.3 From f30005bef81c2e1c5e04fe583935269c5b209749 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 22 Jan 2014 21:17:48 -0500 Subject: Don't throw away an existing full path. (bzr r12973) --- src/document.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index f5c799575..499601259 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -481,16 +481,19 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, SPDocument *SPDocument::createChildDoc(gchar const *uri) { // Calculate the absolute path from an available document - std::string basePath = std::string( this->getBase() ); - std::string absPath = Glib::build_filename(basePath, std::string( uri ) ); - const char *path = absPath.c_str(); + if(strncmp(uri, "/", 1)!=0) { + std::string basePath = std::string( this->getBase() ); + std::string absPath = Glib::build_filename(basePath, std::string( uri ) ); + // free uri first? + uri = absPath.c_str(); + } SPDocument *parent = this; SPDocument *document = NULL; while(parent != NULL && document == NULL) { // Check myself and any parents int he chain - if(strcmp(parent->getURI(), path)==0) { + if(strcmp(parent->getURI(), uri)==0) { document = parent; break; } @@ -498,7 +501,7 @@ SPDocument *SPDocument::createChildDoc(gchar const *uri) { boost::ptr_list::iterator iter; for (iter = parent->_child_documents.begin(); iter != parent->_child_documents.end(); ++iter) { - if(strcmp(iter->getURI(), path)==0) { + if(strcmp(iter->getURI(), uri)==0) { document = &*iter; break; } @@ -508,7 +511,7 @@ SPDocument *SPDocument::createChildDoc(gchar const *uri) { // Load a fresh document from the svg source. if(!document) { - document = createNewDoc(path, false, false, this); + document = createNewDoc(uri, false, false, this); } return document; } -- cgit v1.2.3 From 11ae816a74c061c219a4d833b58e6f940a53fff5 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 22 Jan 2014 22:21:57 -0500 Subject: Make sure we're not interfering with right or middle click with undo prevention bug #168695 (bzr r12974) --- src/display/sp-canvas.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/display/sp-canvas.cpp b/src/display/sp-canvas.cpp index ff58cf453..d9640f763 100644 --- a/src/display/sp-canvas.cpp +++ b/src/display/sp-canvas.cpp @@ -1546,7 +1546,7 @@ int SPCanvasImpl::emitEvent(SPCanvas *canvas, GdkEvent *event) break; } // Block Undo and Redo while we drag /anything/ - if(event->type == GDK_BUTTON_PRESS) + if(event->type == GDK_BUTTON_PRESS && event->button.button == 1) canvas->is_dragging = true; else if(event->type == GDK_BUTTON_RELEASE) canvas->is_dragging = false; -- cgit v1.2.3 From d9fbd1a23235bc8725574f61e156e0992ecc83bf Mon Sep 17 00:00:00 2001 From: su_v Date: Thu, 23 Jan 2014 22:12:22 +0100 Subject: Fix GTK3 build failure (follow-up to r12971) Fixed bugs: - https://launchpad.net/bugs/1271802 (bzr r12975) --- src/document.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/document.cpp b/src/document.cpp index 499601259..b7f5cb097 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -67,6 +67,8 @@ #include "xml/rebase-hrefs.h" #include "libcroco/cr-cascade.h" +#include + using Inkscape::DocumentUndo; using Inkscape::Util::unit_table; -- cgit v1.2.3 From 8b8155db3b0b5716f74c6b9307e88ac8b6a7f08c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Thu, 23 Jan 2014 22:50:45 +0100 Subject: fixed user description of VS command (bzr r12976) --- share/extensions/hpgl_output.inx | 4 ++-- share/extensions/plotter.inx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/share/extensions/hpgl_output.inx b/share/extensions/hpgl_output.inx index a0ba6e364..a8ce7c7e0 100644 --- a/share/extensions/hpgl_output.inx +++ b/share/extensions/hpgl_output.inx @@ -12,8 +12,8 @@ 1016.0 1016.0 1 - 24 - 20 + 0 + 0 diff --git a/share/extensions/plotter.inx b/share/extensions/plotter.inx index e69099e1a..673922d2e 100644 --- a/share/extensions/plotter.inx +++ b/share/extensions/plotter.inx @@ -47,8 +47,8 @@ 1016.0 1016.0 1 - 24 - 20 + 0 + 0 -- cgit v1.2.3 From ddb8af8009f151c7107daf0c2127f0ba2d882649 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Fri, 24 Jan 2014 20:05:26 -0500 Subject: Move absolute path generator to URI and use std::strings (bzr r12977) --- src/document.cpp | 21 ++++++--------------- src/document.h | 2 +- src/uri-references.cpp | 8 +++++--- src/uri.cpp | 13 +++++++++++++ src/uri.h | 3 +++ 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index b7f5cb097..e456f2b81 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -67,8 +67,6 @@ #include "xml/rebase-hrefs.h" #include "libcroco/cr-cascade.h" -#include - using Inkscape::DocumentUndo; using Inkscape::Util::unit_table; @@ -480,22 +478,14 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, /** * Fetches a document and attaches it to the current document as a child href */ -SPDocument *SPDocument::createChildDoc(gchar const *uri) { - - // Calculate the absolute path from an available document - if(strncmp(uri, "/", 1)!=0) { - std::string basePath = std::string( this->getBase() ); - std::string absPath = Glib::build_filename(basePath, std::string( uri ) ); - // free uri first? - uri = absPath.c_str(); - } - +SPDocument *SPDocument::createChildDoc(std::string const uri) +{ SPDocument *parent = this; SPDocument *document = NULL; while(parent != NULL && document == NULL) { // Check myself and any parents int he chain - if(strcmp(parent->getURI(), uri)==0) { + if(uri.compare(parent->getURI())==0) { document = parent; break; } @@ -503,7 +493,7 @@ SPDocument *SPDocument::createChildDoc(gchar const *uri) { boost::ptr_list::iterator iter; for (iter = parent->_child_documents.begin(); iter != parent->_child_documents.end(); ++iter) { - if(strcmp(iter->getURI(), uri)==0) { + if(uri.compare(iter->getURI())==0) { document = &*iter; break; } @@ -513,7 +503,8 @@ SPDocument *SPDocument::createChildDoc(gchar const *uri) { // Load a fresh document from the svg source. if(!document) { - document = createNewDoc(uri, false, false, this); + const char *path = g_strdup(uri.c_str()); + document = createNewDoc(path, false, false, this); } return document; } diff --git a/src/document.h b/src/document.h index 79381e0c2..110db11c6 100644 --- a/src/document.h +++ b/src/document.h @@ -225,7 +225,7 @@ public: static SPDocument *createNewDoc(const gchar *uri, unsigned int keepalive, bool make_new = false, SPDocument *parent=NULL ); static SPDocument *createNewDocFromMem(const gchar *buffer, gint length, unsigned int keepalive); - SPDocument *createChildDoc(gchar const *uri); + SPDocument *createChildDoc(std::string const uri); /** * Returns the bottommost item from the list which is at the point, or NULL if none. diff --git a/src/uri-references.cpp b/src/uri-references.cpp index f2df55213..dc0101024 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -57,9 +57,11 @@ void URIReference::attach(const URI &uri) throw(BadURIException) } // The path contains references to seperate document files to load. - const char *path = uri.getPath(); - if(path && document != NULL) { - document = document->createChildDoc(path); + if(document && uri.getPath()) { + std::string base = std::string(g_strdup(document->getBase())); + std::string path = uri.getFullPath(base); + if(!path.empty()) + document = document->createChildDoc(path); } if(!document) { g_warning("Can't get document for referenced URI: %s", uri.toString()); diff --git a/src/uri.cpp b/src/uri.cpp index de6a454ec..8d0e49139 100644 --- a/src/uri.cpp +++ b/src/uri.cpp @@ -10,7 +10,9 @@ #include #include "uri.h" +#include #include +#include namespace Inkscape { @@ -134,6 +136,17 @@ gchar *URI::to_native_filename(gchar const* uri) throw(BadURIException) return filename; } +const std::string URI::getFullPath(std::string const base) const { + std::string path = std::string(_impl->getPath()); + // Calculate the absolute path from an available base + if(!path.empty() && !base.empty() && path.compare(0, 1, "/") != 0) { + path = Glib::build_filename(base, path); + } + // TODO: Check existance of file here + return path; +} + + /* TODO !!! proper error handling */ gchar *URI::toNativeFilename() const throw(BadURIException) { gchar *uriString = toString(); diff --git a/src/uri.h b/src/uri.h index adcc76d6b..74820cb29 100644 --- a/src/uri.h +++ b/src/uri.h @@ -15,6 +15,7 @@ #include #include #include "bad-uri-exception.h" +#include namespace Inkscape { @@ -101,6 +102,8 @@ public: static gchar *to_native_filename(gchar const* uri) throw(BadURIException); + const std::string getFullPath(std::string const base) const; + gchar *toNativeFilename() const throw(BadURIException); /** -- cgit v1.2.3 From 24b5b970fd4e6fadce881db84aa9f40bf81183d8 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Fri, 24 Jan 2014 20:05:47 -0500 Subject: A partial refactor of sp-image.cpp, expect more. (bzr r12978) --- src/sp-image.cpp | 89 +++++++++++++++++++++----------------------------------- src/sp-image.h | 5 ++++ 2 files changed, 38 insertions(+), 56 deletions(-) diff --git a/src/sp-image.cpp b/src/sp-image.cpp index b08d6f9b0..f1ea737ff 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -76,7 +76,6 @@ static void sp_image_set_curve(SPImage *image); -gchar const *sp_image_repr_read_filename(gchar const *href, gchar const *absref, gchar const *base ); static void sp_image_update_arenaitem (SPImage *img, Inkscape::DrawingImage *ai); static void sp_image_update_canvas_image (SPImage *image); @@ -170,8 +169,7 @@ void SPImage::release() { this->href = NULL; } - delete this->pixbuf; - this->pixbuf = NULL; + this->clear_image(); #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) if (this->color_profile) { @@ -329,29 +327,31 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { SPItem::update(ctx, flags); if (flags & SP_IMAGE_HREF_MODIFIED_FLAG) { - delete this->pixbuf; - this->pixbuf = NULL; + this->clear_image(); if (this->href) { Inkscape::Pixbuf *pixbuf = NULL; + gchar const* uri = this->getRepr()->attribute("xlink:href"); + + if(!uri) { + g_warning("Image tag has no valid href: %s", this->getId()); - gchar const* filename = sp_image_repr_read_filename ( - this->getRepr()->attribute("xlink:href"), - this->getRepr()->attribute("sodipodi:absref"), - doc->getBase()); - - Inkscape::Pixbuf::create_from_data_uri(filename); - if (strncmp (filename,"data:", 5) == 0) { - filename += 5; - pixbuf = Inkscape::Pixbuf::create_from_data_uri(filename); - } else if(filename && g_str_has_suffix(filename, ".svg")) { - // TODO: We want to deal with svg images properly. This - // space allows us to do so later. - g_warning("Including svg images tags is not yet supported."); - } else if (filename) { - pixbuf = Inkscape::Pixbuf::create_from_file(filename); + } else if (strncmp (uri, "data:", 5) == 0) { + uri += 5; + pixbuf = Inkscape::Pixbuf::create_from_data_uri(uri); + + } else if(g_str_has_suffix(uri, ".svg")) { + SPDocument *doc = this->document->createChildDoc(uri); + if(doc) { + this->child = SP_ITEM(doc); + g_warning("Loaded document: %s", uri); + } else { + g_warning("Could not load svg for image tag: %s",this->getId()); + } + } else { + pixbuf = Inkscape::Pixbuf::create_from_file(uri); } - if(!pixbuf) { + if(!pixbuf && !this->child) { /* Nope: We do not find any valid pixmap file :-( */ pixbuf = new Inkscape::Pixbuf( gdk_pixbuf_new_from_xpm_data((const gchar **) brokenimage_xpm)); @@ -527,6 +527,18 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { sp_image_update_canvas_image ((SPImage *) this); } +// Remove references to image or child objects. +void SPImage::clear_image() { + if(this->pixbuf) { + delete this->pixbuf; + this->pixbuf = NULL; + } + if(this->child) { + this->detach(this->child); + this->child = NULL; + } +} + void SPImage::modified(unsigned int flags) { // SPItem::onModified(flags); @@ -667,41 +679,6 @@ Inkscape::DrawingItem* SPImage::show(Inkscape::Drawing &drawing, unsigned int /* return ai; } -gchar const *sp_image_repr_read_filename(gchar const *href, gchar const *absref, gchar const *base) -{ - gchar const *filename = href; - - if (filename != NULL) { - if (strncmp (filename,"file:",5) == 0) { - filename = g_filename_from_uri(filename, NULL, NULL); - } else if (strncmp (filename,"data:",5) == 0) { - /* data URI - embedded image */ - return filename; - } else if (!g_path_is_absolute (filename)) { - /* try to load from relative pos combined with document base*/ - const gchar *docbase = base; - if (!docbase) docbase = "."; - filename = g_build_filename(docbase, filename, NULL); - } - } - - if (filename && g_file_test(filename, G_FILE_TEST_EXISTS) ) { - return filename; - } - - /* at last try to load from sp absolute path name */ - if (absref != NULL && g_file_test(absref, G_FILE_TEST_EXISTS)) { - // using absref is outside of SVG rules, so we must at least warn the user - if ( base != NULL && href != NULL ) { - g_warning (" did not resolve to a valid image file (base dir is %s), now trying sodipodi:absref=\"%s\"", href, base, absref); - } else { - g_warning ("xlink:href did not resolve to a valid image file, now trying sodipodi:absref=\"%s\"", absref); - } - return absref; - } - return NULL; -} - /* We assert that realpixbuf is either NULL or identical size to pixbuf */ static void sp_image_update_arenaitem (SPImage *image, Inkscape::DrawingImage *ai) diff --git a/src/sp-image.h b/src/sp-image.h index 3b7208487..ad4fd4d54 100644 --- a/src/sp-image.h +++ b/src/sp-image.h @@ -53,7 +53,10 @@ public: gchar *color_profile; #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + // When image is a raster image, we use pixbuf Inkscape::Pixbuf *pixbuf; + // When it's an svg file, we use an SPItem similar to sp-use + SPItem *child; virtual void build(SPDocument *document, Inkscape::XML::Node *repr); virtual void release(); @@ -69,6 +72,8 @@ public: virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); virtual void snappoints(std::vector &p, Inkscape::SnapPreferences const *snapprefs) const; virtual Geom::Affine set_transform(Geom::Affine const &transform); +private: + void clear_image(); }; /* Return duplicate of curve or NULL */ -- cgit v1.2.3 From 7455f1a259ce28ee56866b5cde06e79be4cfaf97 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Sun, 26 Jan 2014 12:19:47 -0500 Subject: Check file existance and clean up memory issues thanks to KK and Johan (bzr r12979) --- src/document.cpp | 10 +++++----- src/document.h | 2 +- src/uri-references.cpp | 4 +++- src/uri.cpp | 17 ++++++++++++++--- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index e456f2b81..634462001 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -478,22 +478,22 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, /** * Fetches a document and attaches it to the current document as a child href */ -SPDocument *SPDocument::createChildDoc(std::string const uri) +SPDocument *SPDocument::createChildDoc(std::string const &uri) { SPDocument *parent = this; SPDocument *document = NULL; while(parent != NULL && document == NULL) { // Check myself and any parents int he chain - if(uri.compare(parent->getURI())==0) { + if(uri == parent->getURI()) { document = parent; break; } // Then check children of those. boost::ptr_list::iterator iter; for (iter = parent->_child_documents.begin(); - iter != parent->_child_documents.end(); ++iter) { - if(uri.compare(iter->getURI())==0) { + iter != parent->_child_documents.end(); ++iter) { + if(uri == iter->getURI()) { document = &*iter; break; } @@ -503,7 +503,7 @@ SPDocument *SPDocument::createChildDoc(std::string const uri) // Load a fresh document from the svg source. if(!document) { - const char *path = g_strdup(uri.c_str()); + const char *path = uri.c_str(); document = createNewDoc(path, false, false, this); } return document; diff --git a/src/document.h b/src/document.h index 110db11c6..e5567d3b6 100644 --- a/src/document.h +++ b/src/document.h @@ -225,7 +225,7 @@ public: static SPDocument *createNewDoc(const gchar *uri, unsigned int keepalive, bool make_new = false, SPDocument *parent=NULL ); static SPDocument *createNewDocFromMem(const gchar *buffer, gint length, unsigned int keepalive); - SPDocument *createChildDoc(std::string const uri); + SPDocument *createChildDoc(std::string const &uri); /** * Returns the bottommost item from the list which is at the point, or NULL if none. diff --git a/src/uri-references.cpp b/src/uri-references.cpp index dc0101024..abe16ec9d 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -58,10 +58,12 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // The path contains references to seperate document files to load. if(document && uri.getPath()) { - std::string base = std::string(g_strdup(document->getBase())); + std::string base = std::string(document->getBase()); std::string path = uri.getFullPath(base); if(!path.empty()) document = document->createChildDoc(path); + else + document = NULL; } if(!document) { g_warning("Can't get document for referenced URI: %s", uri.toString()); diff --git a/src/uri.cpp b/src/uri.cpp index 8d0e49139..89f6f33e4 100644 --- a/src/uri.cpp +++ b/src/uri.cpp @@ -135,14 +135,25 @@ gchar *URI::to_native_filename(gchar const* uri) throw(BadURIException) filename = tmp.toNativeFilename(); return filename; } - +/* + * Returns the absolute path to an existing file referenced in this URI, + * if the uri is data, the path is empty or the file doesn't exist, then + * an empty string is returned. + * + * Does not check if the returned path is the local document's path (local) + * and thus redundent. Caller is expected to check against the document's path. + */ const std::string URI::getFullPath(std::string const base) const { std::string path = std::string(_impl->getPath()); // Calculate the absolute path from an available base - if(!path.empty() && !base.empty() && path.compare(0, 1, "/") != 0) { + if(!base.empty() && !path.empty() && path[0] != '/') { path = Glib::build_filename(base, path); } - // TODO: Check existance of file here + // Check the existance of the file + if(! g_file_test(path.c_str(), G_FILE_TEST_EXISTS) + || g_file_test(path.c_str(), G_FILE_TEST_IS_DIR) ) { + path.clear(); + } return path; } -- cgit v1.2.3 From 99a8b0ae7da4f776f7ec85862ab52c29a4abb164 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sun, 26 Jan 2014 15:09:05 -0500 Subject: sbasis-to-bezier : add support for case where Bezier control arm length is zero (Bug 1272119) Fixed bugs: - https://launchpad.net/bugs/1272119 (bzr r12980) --- src/2geom/sbasis-to-bezier.cpp | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/2geom/sbasis-to-bezier.cpp b/src/2geom/sbasis-to-bezier.cpp index bd88f93c0..0525be04b 100644 --- a/src/2geom/sbasis-to-bezier.cpp +++ b/src/2geom/sbasis-to-bezier.cpp @@ -242,24 +242,38 @@ void sbasis_to_cubic_bezier (std::vector & bz, D2 const& sb) // calculate Bezier control arms - if (std::abs(xprime[1]*yprime[0] - yprime[1]*xprime[0]) > 1.e-5) { // general case : fit mid fxn value + if ((std::abs(xprime[0]) < EPSILON) && (std::abs(yprime[0]) < EPSILON) + && ((std::abs(xprime[1]) > EPSILON) || (std::abs(yprime[1]) > EPSILON))) { // degenerate handle at 0 : use distance of closest approach + numer = midx*xprime[1] + midy*yprime[1]; + denom = 3.0*(xprime[1]*xprime[1] + yprime[1]*yprime[1]); + delx[0] = 0; + dely[0] = 0; + delx[1] = -xprime[1]*numer/denom; + dely[1] = -yprime[1]*numer/denom; + } else if ((std::abs(xprime[1]) < EPSILON) && (std::abs(yprime[1]) < EPSILON) + && ((std::abs(xprime[0]) > EPSILON) || (std::abs(yprime[0]) > EPSILON))) { // degenerate handle at 1 : ditto + numer = midx*xprime[0] + midy*yprime[0]; + denom = 3.0*(xprime[0]*xprime[0] + yprime[0]*yprime[0]); + delx[0] = xprime[0]*numer/denom; + dely[0] = yprime[0]*numer/denom; + delx[1] = 0; + dely[1] = 0; + } else if (std::abs(xprime[1]*yprime[0] - yprime[1]*xprime[0]) > EPSILON) { // general case : fit mid fxn value denom = xprime[1]*yprime[0] - yprime[1]*xprime[0]; for (int i = 0; i < 2; ++i) { numer = xprime[1 - i]*midy - yprime[1 - i]*midx; delx[i] = xprime[i]*numer/denom/3; dely[i] = yprime[i]*numer/denom/3; } - } - else if ((xprime[0]*xprime[1] < 0) || (yprime[0]*yprime[1] < 0)) { // symmetric case : use distance of closest approach + } else if ((xprime[0]*xprime[1] < 0) || (yprime[0]*yprime[1] < 0)) { // symmetric case : use distance of closest approach numer = midx*xprime[0] + midy*yprime[0]; denom = 6.0*(xprime[0]*xprime[0] + yprime[0]*yprime[0]); delx[0] = xprime[0]*numer/denom; dely[0] = yprime[0]*numer/denom; delx[1] = -delx[0]; dely[1] = -dely[0]; - } - else { // anti-symmetric case : fit mid slope - // calculate slope at t = 0.5 + } else { // anti-symmetric case : fit mid slope + // calculate slope at t = 0.5 midx = 0; div = 1; for (size_t i = 0; i < sb[X].size(); ++i) { @@ -279,8 +293,7 @@ void sbasis_to_cubic_bezier (std::vector & bz, D2 const& sb) delx[i] = xprime[0]*numer/denom; dely[i] = yprime[0]*numer/denom; } - } - else { // linear case + } else { // linear case for (int i = 0; i < 2; ++i) { delx[i] = (bz[3][X] - bz[0][X])/3; dely[i] = (bz[3][Y] - bz[0][Y])/3; -- cgit v1.2.3 From 8da52916bd86c3c19749b3062dcdbda63de3b554 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Mon, 27 Jan 2014 08:11:24 -0500 Subject: Protect export options from blank filenames, png, pdf, emf and wmf. This should fix Bug #941103 Fixed bugs: - https://launchpad.net/bugs/941103 (bzr r12981) --- src/main.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 079944af6..868f389a8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1515,7 +1515,7 @@ static int sp_do_export_png(SPDocument *doc) // set filename and dpi from options, if not yet set from the hints if (filename.empty()) { - if (!sp_export_png) { + if (!sp_export_png || sp_export_png[0] == '\0') { g_warning ("No export filename given and no filename hint. Nothing exported."); return 1; } @@ -1771,6 +1771,11 @@ static int do_export_ps_pdf(SPDocument* doc, gchar const* uri, char const* mime) } } + if(!uri || uri[0] == '\0') { + g_warning ("No export filename given. Nothing exported."); + return 0; + } + //check if specified directory exists if (!Inkscape::IO::file_directory_exists(uri)) { g_warning("File path \"%s\" includes directory that doesn't exist.\n", uri); @@ -1837,6 +1842,10 @@ static int do_export_win_metafile_common(SPDocument* doc, gchar const* uri, char static int do_export_emf(SPDocument* doc, gchar const* uri, char const* mime) { + if(!uri || uri[0] == '\0') { + g_warning("No filename provided for emf export."); + return 0; + } return do_export_win_metafile_common(doc, uri, mime); } @@ -1850,6 +1859,10 @@ static int do_export_emf(SPDocument* doc, gchar const* uri, char const* mime) static int do_export_wmf(SPDocument* doc, gchar const* uri, char const* mime) { + if(!uri || uri[0] == '\0') { + g_warning("No filename provided for wmf export."); + return 0; + } return do_export_win_metafile_common(doc, uri, mime); } -- cgit v1.2.3 From fd1ceb05805f20402606fd9fae1a048e0bca8e78 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Mon, 27 Jan 2014 13:19:30 -0500 Subject: Protect pdf and png exports from failure and output reasonalbe warnings. (bzr r12982) --- src/helper/png-write.cpp | 2 +- src/main.cpp | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp index b8b815b4c..a16fe8e12 100644 --- a/src/helper/png-write.cpp +++ b/src/helper/png-write.cpp @@ -142,7 +142,7 @@ sp_png_write_rgba_striped(SPDocument *doc, Inkscape::IO::dump_fopen_call(filename, "M"); fp = Inkscape::IO::fopen_utf8name(filename, "wb"); - g_return_val_if_fail(fp != NULL, false); + if(fp == NULL) return false; /* Create and initialize the png_struct with the desired error handler * functions. If you want to use the default stderr and longjump method, diff --git a/src/main.cpp b/src/main.cpp index 868f389a8..25f813c2b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1632,10 +1632,13 @@ static int sp_do_export_png(SPDocument *doc) 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); - g_print("Bitmap saved as: %s\n", filename.c_str()); - if ((width >= 1) && (height >= 1) && (width <= PNG_UINT_31_MAX) && (height <= PNG_UINT_31_MAX)) { - sp_export_png_file(doc, path.c_str(), area, width, height, dpi, dpi, bgcolor, NULL, NULL, true, sp_export_id_only ? items : NULL); + 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 ) { + g_print("Bitmap saved as: %s\n", filename.c_str()); + } else { + g_warning("Bitmap failed to save to: %s", filename.c_str()); + } } else { g_warning("Calculated bitmap dimensions %lu %lu are out of range (1 - %lu). Nothing exported.", width, height, (unsigned long int)PNG_UINT_31_MAX); } @@ -1794,7 +1797,11 @@ static int do_export_ps_pdf(SPDocument* doc, gchar const* uri, char const* mime) ? "PostScript level 3" : "PostScript level 2"); } - (*i)->save(doc, uri); + try { + (*i)->save(doc, uri); + } catch(...) { + g_warning("Failed to save pdf to: %s", uri); + } return 0; } -- cgit v1.2.3 From 2a812f32332b2dd910b5bdafae464c60b8507c6b Mon Sep 17 00:00:00 2001 From: ctenar Date: Wed, 29 Jan 2014 11:43:41 +0100 Subject: * [INTL:sk] Slovak translation update (bzr r12983) --- po/sk.po | 194 ++++++++++++--------------------------------------------------- 1 file changed, 37 insertions(+), 157 deletions(-) mode change 100644 => 100755 po/sk.po diff --git a/po/sk.po b/po/sk.po old mode 100644 new mode 100755 index 777d311cb..1c8c294d4 --- a/po/sk.po +++ b/po/sk.po @@ -3,25 +3,23 @@ # This file is distributed under the same license as the Inkscape package. # Zdenko Podobný , 2003, 2004. # Ján Pulmann , 2012. -# Ivan Masár , 2007, 2008, 2009, 2010, 2011, 2012. -# +# Ivan Masár , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014. # Slovak terminology used in Inkscape: # http://wiki.inkscape.org/wiki/index.php/InkscapeTerminology/sk -# #: ../share/filters/filters.svg.h:1 msgid "" msgstr "" "Project-Id-Version: inkscape\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2012-10-08 22:42+0200\n" -"PO-Revision-Date: 2012-04-14 01:23+0100\n" +"PO-Revision-Date: 2014-01-29 11:42+0200\n" "Last-Translator: Ivan Masár \n" "Language-Team: Slovak \n" "Language: sk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: ../inkscape.desktop.in.h:1 msgid "Create and edit Scalable Vector Graphics images" @@ -36,16 +34,14 @@ msgid "Inkscape Vector Graphics Editor" msgstr "Inkscape - editor vektorovej grafiky" #: ../inkscape.desktop.in.h:4 -#, fuzzy msgid "New Drawing" -msgstr "Kresba" +msgstr "Nová kresba" #: ../inkscape.desktop.in.h:5 msgid "Vector Graphics Editor" msgstr "editor vektorovej grafiky" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Smart Jelly" msgstr "Inteligentné želé" @@ -61,7 +57,6 @@ msgid "Same as Matte jelly but with more controls" msgstr "Rovnaké ako matné želé, ale s viacerými parametrami" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Metal Casting" msgstr "Odlievanie kovu" @@ -87,7 +82,6 @@ msgid "Edges are partly feathered out" msgstr "Okraje sú čiastočne rozmazané" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Jigsaw Piece" msgstr "Kúsok skladačky" @@ -96,7 +90,6 @@ msgid "Low, sharp bevel" msgstr "Nízke, ostré vrstvenie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Rubber Stamp" msgstr "Pečiatka" @@ -187,7 +180,6 @@ msgid "Flake-like white splotches" msgstr "Vločkovité biele špliechance" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Leopard Fur" msgstr "Leopardia koža" @@ -222,7 +214,6 @@ msgstr "Zaostriť" #: ../share/filters/filters.svg.h:1 #: ../src/extension/internal/filter/image.h:62 -#, fuzzy msgid "Image Effects" msgstr "Obrazové efekty" @@ -231,7 +222,6 @@ msgid "Sharpen edges and boundaries within the object, force=0.15" msgstr "Zaostriť hrany a hranice v rámci objektu, sila=0.15" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Sharpen More" msgstr "Viac zaostriť" @@ -253,7 +243,7 @@ msgstr "Olejomaľba" #: ../src/extension/internal/filter/paint.h:879 #: ../src/extension/internal/filter/paint.h:983 msgid "Image Paint and Draw" -msgstr "" +msgstr "Maľovanie a kreslenie obrázka" #: ../share/filters/filters.svg.h:1 msgid "Simulate oil painting style" @@ -298,7 +288,6 @@ msgid "Bulging, knotty, slick 3D surface" msgstr "Vydutý, hrčovitý, hladký 3D povrch" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Barbed Wire" msgstr "Ostnatý drôt" @@ -307,7 +296,6 @@ msgid "Gray bevelled wires with drop shadows" msgstr "Šedé vrstvené drôty s vrhanými tieňmi" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Swiss Cheese" msgstr "Švajčiarsky syr" @@ -316,7 +304,6 @@ msgid "Random inner-bevel holes" msgstr "Náhodné diery s vnútorným vrstvením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Blue Cheese" msgstr "Modrý syr" @@ -354,7 +341,6 @@ msgid "Random paint streaks downwards" msgstr "Náhodné ťahy farbou smerom dolu" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Jam Spread" msgstr "Rozmazaný džem" @@ -363,7 +349,6 @@ msgid "Glossy clumpy jam spread" msgstr "Lesklý zhlukovitý rozmazaný džem" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Pixel Smear" msgstr "Rozmazanie pixelov" @@ -372,7 +357,6 @@ msgid "Van Gogh painting effect for bitmaps" msgstr "Efekt Van Goghovej maľby pre bitmapy" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Cracked Glass" msgstr "Popraskané sklo" @@ -395,9 +379,8 @@ msgid "Flexible bubbles effect with some displacement" msgstr "Efekt flexibilných bublín s určitým posunutím" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Glowing Bubble" -msgstr "Rastúca bublina" +msgstr "Žiariaca bublina" #: ../share/filters/filters.svg.h:1 msgid "Ridges" @@ -416,7 +399,6 @@ msgid "Neon light effect" msgstr "Efekt neónového svetla" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Molten Metal" msgstr "Roztavený kov" @@ -425,7 +407,6 @@ msgid "Melting parts of object together, with a glossy bevel and a glow" msgstr "Roztopenie častí objektu dohromady s lesklým vrstvením a žiarou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Pressed Steel" msgstr "Lisovaná oceľ" @@ -434,7 +415,6 @@ msgid "Pressed metal with a rolled edge" msgstr "Lisovaná oceľ s valcovaným okrajom" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Matte Bevel" msgstr "Matné vrstvenie" @@ -451,7 +431,6 @@ msgid "Thin like a soap membrane" msgstr "Tenká ako mydlová membrána" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Matte Ridge" msgstr "Matný hrebeň" @@ -460,7 +439,6 @@ msgid "Soft pastel ridge" msgstr "Mäkké pastelové nárožie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Glowing Metal" msgstr "Žiariaci kov" @@ -490,7 +468,6 @@ msgid "Illuminated translucent plastic or glass effect" msgstr "Osvetlený priesvitný plastový alebo sklenený efekt" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Iridescent Beeswax" msgstr "Perleťový včelí vosk" @@ -499,7 +476,6 @@ msgid "Waxy texture which keeps its iridescence through color fill change" msgstr "Vosková textúra, ktorá si ponecháva perleťovosť zmenou farebnej výplne" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Eroded Metal" msgstr "Erodovaný kov" @@ -524,7 +500,6 @@ msgid "Bark texture, vertical; use with deep colors" msgstr "Textúra kôry, zvislá; použite s hlbokými farbami" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Lizard Skin" msgstr "Jašteričia koža" @@ -533,7 +508,6 @@ msgid "Stylized reptile skin texture" msgstr "Štylizovaná textúra kože plaza" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Stone Wall" msgstr "Kamenný múr" @@ -542,7 +516,6 @@ msgid "Stone wall texture to use with not too saturated colors" msgstr "Textúra kamenného múru na použitie s nie príliš nasýtenými farbami" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Silk Carpet" msgstr "Hodvábny koberec" @@ -551,7 +524,6 @@ msgid "Silk carpet texture, horizontal stripes" msgstr "Textúra hodvábneho koberca, vodorovné prúžky" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Refractive Gel A" msgstr "Refraktívny gél A" @@ -560,7 +532,6 @@ msgid "Gel effect with light refraction" msgstr "Gélový efekt s refrakciou svetla" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Refractive Gel B" msgstr "Refraktívny gél B" @@ -569,7 +540,6 @@ msgid "Gel effect with strong refraction" msgstr "Gélový efekt so silnou refrakciou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Metallized Paint" msgstr "Metalizovaná farba" @@ -587,7 +557,6 @@ msgid "Gel Ridge with a pearlescent look" msgstr "Gélové nárožie s perličkovým výzorom" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Raised Border" msgstr "Vyvýšený okraj" @@ -605,7 +574,6 @@ msgid "Gel Ridge metallized at its top" msgstr "Gélové nárožie navrchu metalizované" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Fat Oil" msgstr "Tučný olej" @@ -614,7 +582,6 @@ msgid "Fat oil with some adjustable turbulence" msgstr "Tučný olej s prispôsobiteľnou turbulenciou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Black Hole" msgstr "Čierna diera" @@ -639,7 +606,6 @@ msgstr "" "Roztrúsené kocky; nastavením primitívy Morfológia môžete meniť ich veľkosť" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Peel Off" msgstr "Olupovanie" @@ -648,7 +614,6 @@ msgid "Peeling painting on a wall" msgstr "Olupujúca sa farba na stene" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Gold Splatter" msgstr "Zlatý špliechanec" @@ -657,7 +622,6 @@ msgid "Splattered cast metal, with golden highlights" msgstr "Kovové špliechance so zlatým zvýraznením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Gold Paste" msgstr "Zlatá pasta" @@ -666,7 +630,6 @@ msgid "Fat pasted cast metal, with golden highlights" msgstr "Tučne prilepený kov so zlatým zvýraznením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Crumpled Plastic" msgstr "Pokrčený plast" @@ -675,7 +638,6 @@ msgid "Crumpled matte plastic, with melted edge" msgstr "Pokrčený matný plast s roztaveným okrajom" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Enamel Jewelry" msgstr "Smaltované klenoty" @@ -684,7 +646,6 @@ msgid "Slightly cracked enameled texture" msgstr "Mierne popraskaná smaltovaná textúra" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Rough Paper" msgstr "Drsný papier" @@ -694,7 +655,6 @@ msgstr "" "Efekt akvarelového papiera, ktorý možno použiť na obrázky ako na objekty" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Rough and Glossy" msgstr "Drsná a lesklá" @@ -714,7 +674,6 @@ msgid "Inner colorized shadow, outer black shadow" msgstr "Vnútorný vyfarbený tieň, vonkajší čierny tieň" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Air Spray" msgstr "Sprej" @@ -723,7 +682,6 @@ msgid "Convert to small scattered particles with some thickness" msgstr "Previesť na malé roztrúsené častice s určitou hrúbkou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Warm Inside" msgstr "Teplo vnútri" @@ -732,7 +690,6 @@ msgid "Blurred colorized contour, filled inside" msgstr "Rozostrené zafarbené obrysy, vnútri vyplnené" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Cool Outside" msgstr "Chladno vonku" @@ -741,7 +698,6 @@ msgid "Blurred colorized contour, empty inside" msgstr "Rozostrená zafarbená textúra, vnútri prázdna" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Electronic Microscopy" msgstr "Elektrónová mikroskopia" @@ -760,7 +716,6 @@ msgid "Checkered tartan pattern" msgstr "Kockovaný vzor tartan" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Shaken Liquid" msgstr "Roztrasená tekutina" @@ -778,16 +733,14 @@ msgid "Glowing image content without blurring it" msgstr "Žiarenie obsahu obrázka bez toho, aby bol rozmazaný" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Stained Glass" -msgstr "Vitraj" +msgstr "Vitráž" #: ../share/filters/filters.svg.h:1 msgid "Illuminated stained glass effect" msgstr "Efekt osvietenej vitraje" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Dark Glass" msgstr "Tmavé sklo" @@ -796,7 +749,6 @@ msgid "Illuminated glass effect with light coming from beneath" msgstr "Efekt osvieteného skla, svetlo prichádza zospodu" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "HSL Bumps Alpha" msgstr "HSL hrče, priesvitnosť" @@ -805,7 +757,6 @@ msgid "Same as HSL Bumps but with transparent highlights" msgstr "Rovnaké ako HSL hrče, ale s priesvitným zvýraznením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Bubbly Bumps Alpha" msgstr "Bublinové hrče, priesvitnosť" @@ -814,9 +765,8 @@ msgid "Same as Bubbly Bumps but with transparent highlights" msgstr "Rovnaké ako Bublinové hrče, ale s priesvitným zvýraznením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Torn Edges" -msgstr "Trhané okraje" +msgstr "Roztrhané hrany" #: ../share/filters/filters.svg.h:1 msgid "" @@ -824,7 +774,6 @@ msgid "" msgstr "Posunúť vonkajšok tvarov a obrázkov bez zmeny ich obsahu" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Roughen Inside" msgstr "Zdrsnenie vovnútri" @@ -845,7 +794,6 @@ msgstr "" "priesvitnosti na okrajoch" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Chalk and Sponge" msgstr "Krieda a špongia" @@ -897,7 +845,6 @@ msgid "Emboss effect : 3D relief where white is replaced by black" msgstr "Efekt reliéfu: 3D reliéf kde je biela nahradená čiernou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Bubbly Bumps Matte" msgstr "Bublinové hrče, matné" @@ -906,7 +853,6 @@ msgid "Same as Bubbly Bumps but with a diffuse light instead of a specular one" msgstr "Rovnaké ako Bublinové hrče ale s difúznym svetlom namiesto zrkadlového" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Blotting Paper" msgstr "Pijavý papier" @@ -915,7 +861,6 @@ msgid "Inkblot on blotting paper" msgstr "Atramentové škvrny na pijaku" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Wax Print" msgstr "Voskový odtlačok" @@ -941,7 +886,6 @@ msgid "" msgstr "Páperovitá textúra s turbulenciou farieb mierne tmavšia na okrajoch" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Ink Paint" msgstr "Atramentová farba" @@ -950,7 +894,6 @@ msgid "Ink paint on paper with some turbulent color shift" msgstr "Atramentová maľba na papieri s turbulentným farebným posunom" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Tinted Rainbow" msgstr "Sfarbená dúha" @@ -959,7 +902,6 @@ msgid "Smooth rainbow colors melted along the edges and colorizable" msgstr "Jemné dúhové farby prelínajúce sa na okrajoch a sfarbiteľné" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Melted Rainbow" msgstr "Roztopená dúha" @@ -977,7 +919,6 @@ msgid "Bright, polished uneven metal casting, colorizable" msgstr "Jasný vyleštený nerovnomerný kovový odliatok, sfarbiteľný" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Wavy Tartan" msgstr "Vlnitý tartan" @@ -986,7 +927,6 @@ msgid "Tartan pattern with a wavy displacement and bevel around the edges" msgstr "Vzor tartan s vlnitým posunutím a vrstvením na okrajoch" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "3D Marble" msgstr "3D mramor" @@ -1003,7 +943,6 @@ msgid "3D warped, fibered wood texture" msgstr "3D deformovaná textúra vláknitého dreva" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "3D Mother of Pearl" msgstr "3D perleť" @@ -1012,7 +951,6 @@ msgid "3D warped, iridescent pearly shell texture" msgstr "3D deformovaná perleťová textúra lastúry" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Tiger Fur" msgstr "Tigria koža" @@ -1087,7 +1025,6 @@ msgid "Light areas turn to black" msgstr "Svetlé oblasti zmenené na čierne" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Film Grain" msgstr "Filmové zrno" @@ -1096,14 +1033,12 @@ msgid "Adds a small scale graininess" msgstr "Pridáva zrnitosť v malej miere" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Plaster Color" -msgstr "Vložiť farbu" +msgstr "Farba omietky" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Colored plaster emboss effect" -msgstr "Efekt oblačných vodových farieb" +msgstr "Reliéfny efekt farebnej omietky" #: ../share/filters/filters.svg.h:1 msgid "Velvet Bumps" @@ -1114,7 +1049,6 @@ msgid "Gives Smooth Bumps velvet like" msgstr "Dáva jemné akoby zamatové hrče" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Comics Cream" msgstr "Komiksový krém" @@ -1127,7 +1061,6 @@ msgid "Comics shader with creamy waves transparency" msgstr "Komiksové tieňovanie s priesvitnosťou krémových vĺn" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Chewing Gum" msgstr "Žuvačka" @@ -1140,7 +1073,6 @@ msgstr "" "priesečníkoch" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Dark And Glow" msgstr "Tma a žiara" @@ -1149,7 +1081,6 @@ msgid "Darkens the edge with an inner blur and adds a flexible glow" msgstr "Stmaví okraj s vnútorným rozostrením a pridá flexibilnú žiaru" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Warped Rainbow" msgstr "Posunutá dúha" @@ -1158,7 +1089,6 @@ msgid "Smooth rainbow colors warped along the edges and colorizable" msgstr "Jemné dúhové farby posunuté po okrajoch a vyfarbiteľné" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Rough and Dilate" msgstr "Drsné a rozšírené" @@ -1167,7 +1097,6 @@ msgid "Create a turbulent contour around" msgstr "Vytvorí turbulentnú kontúru" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Old Postcard" msgstr "Stará pohľadnica" @@ -1177,7 +1106,6 @@ msgstr "" "Jemná posterizácia a nakreslenie okrajov aké majú staré tlačené fotografie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Dots Transparency" msgstr "Bodová priesvitnosť" @@ -1186,17 +1114,14 @@ msgid "Gives a pointillist HSL sensitive transparency" msgstr "Dáva pointillistickú priesvitnosť citlivú na HSL" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Canvas Transparency" msgstr "Plátnová priesvitnosť" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Gives a canvas like HSL sensitive transparency." -msgstr "Dáva priesvitnosť citlivú na HSL podobnú plátnu" +msgstr "Dáva priesvitnosť citlivú na HSL podobnú plátnu." #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Smear Transparency" msgstr "Rozmazaná priesvitnosť" @@ -1208,7 +1133,6 @@ msgstr "" "farieb" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Thick Paint" msgstr "Hrubá farba" @@ -1225,7 +1149,6 @@ msgid "Burst balloon texture crumpled and with holes" msgstr "Popraskaná zmačkaná textúra s dierami" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Embossed Leather" msgstr "Reliéfna koža" @@ -1266,7 +1189,6 @@ msgid "" msgstr "Kombinácia HSL detekcie hrán s efektom matného a pokrčeného povrchu" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Rough Transparency" msgstr "Hrubá priesvitnosť" @@ -1283,7 +1205,6 @@ msgid "Partly opaque water color effect with bleed" msgstr "Efekt čiastočne nepriesvitných vodových farieb so spadávkou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Alpha Engraving" msgstr "Alfa rytina" @@ -1292,7 +1213,6 @@ msgid "Gives a transparent engraving effect with rough line and filling" msgstr "Dáva efekt priesvitnej rytiny s hrubými obrysmi a výplňou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Alpha Draw Liquid" msgstr "Alfa kresba, tekutá" @@ -1301,16 +1221,14 @@ msgid "Gives a transparent fluid drawing effect with rough line and filling" msgstr "Dáva efekt priesvitnej tekutiny s hrubými obrysmi a výplňou" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Liquid Drawing" -msgstr "Tekutá kresba kresba" +msgstr "Tekutá kresba" #: ../share/filters/filters.svg.h:1 msgid "Gives a fluid and wavy expressionist drawing effect to images" msgstr "Dáva obrázkom efekt tekutiny a vlnitej expresionistickej kresby" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Marbled Ink" msgstr "Mramorový atrament" @@ -1320,7 +1238,6 @@ msgstr "" "Efekt mramorovej priesvitnosti, ktorý zodpovedá zisteným hranám na obrázku" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Thick Acrylic" msgstr "Hrubá akrylová" @@ -1329,7 +1246,6 @@ msgid "Thick acrylic paint texture with high texture depth" msgstr "Hrubá akrylová textúra kresby s vysokou hĺbkou textúry" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Alpha Engraving B" msgstr "Alfa rytina B" @@ -1347,7 +1263,6 @@ msgid "Something like a water noise" msgstr "Niečo ako vodný šum" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Monochrome Transparency" msgstr "Jednofarebná priesvitnosť" @@ -1357,16 +1272,14 @@ msgstr "Jednofarebná priesvitnosť" #: ../src/extension/internal/filter/transparency.h:215 #: ../src/extension/internal/filter/transparency.h:288 #: ../src/extension/internal/filter/transparency.h:350 -#, fuzzy msgid "Fill and Transparency" -msgstr "Priesvitnosť dialógu:" +msgstr "Výplň a priesvitnosť" #: ../share/filters/filters.svg.h:1 msgid "Convert to a colorizable transparent positive or negative" msgstr "Previesť na zafarbiteľný priesvitný pozitív alebo negatív" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Saturation Map" msgstr "Mapa sýtosti" @@ -1386,7 +1299,6 @@ msgid "Riddle the surface and add bump to images" msgstr "Prederaviť povrch a pridať obrazu hrče" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Wrinkled Varnish" msgstr "Vrásčitá glazúra" @@ -1403,7 +1315,6 @@ msgid "Canvas texture with an HSL sensitive height map" msgstr "Textúra plátna s výškovou mapou citlivou na HSL" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Canvas Bumps Matte" msgstr "Hrče plátna, matné" @@ -1412,7 +1323,6 @@ msgid "Same as Canvas Bumps but with a diffuse light instead of a specular one" msgstr "Rovnaké ako Hrče plátna ale s difúznym svetlom namiesto zrkadlového" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Canvas Bumps Alpha" msgstr "Hrče plátna, priesvitnosť" @@ -1421,7 +1331,6 @@ msgid "Same as Canvas Bumps but with transparent highlights" msgstr "Rovnaké ako Hrče plátna, ale s priesvitným zvýraznením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Bright Metal" msgstr "Svetlý kov" @@ -1430,7 +1339,6 @@ msgid "Bright metallic effect for any color" msgstr "Jasný kovový efekt pre ľubovoľnú farbu" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Deep Colors Plastic" msgstr "Plast s hlbokými farbami" @@ -1439,7 +1347,6 @@ msgid "Transparent plastic with deep colors" msgstr "Priesvitný plast s hlbokými farbami" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Melted Jelly Matte" msgstr "Roztopené želé, matné" @@ -1448,7 +1355,6 @@ msgid "Matte bevel with blurred edges" msgstr "Matné vrstvenie s rozostrenými okrajmi" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Melted Jelly" msgstr "Roztopené želé" @@ -1457,7 +1363,6 @@ msgid "Glossy bevel with blurred edges" msgstr "Lesklé vrstvenie s rozostrenými okrajmi" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Combined Lighting" msgstr "Kombinované osvetlenie" @@ -1476,7 +1381,6 @@ msgstr "" "Efekt kovovej fólie kombinujúci dva typy osvetlenia a variabilné pokrčenie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Soft Colors" msgstr "Mäkké farby" @@ -1485,7 +1389,6 @@ msgid "Adds a colorizable edges glow inside objects and pictures" msgstr "Pridáva dovnútra objektov a obrázkov vyfarbiteľnú žiaru" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Relief Print" msgstr "Reliéfny odtlačok" @@ -1494,7 +1397,6 @@ msgid "Bumps effect with a bevel, color flood and complex lighting" msgstr "Efekt hŕč s vrstvením, vyplnením farbou a komplexným osvetlením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Growing Cells" msgstr "Rastúce bunky" @@ -1511,64 +1413,56 @@ msgid "Oversaturate colors which can be fluorescent in real world" msgstr "Presýtiť farby, ktoré môžu byť v skutočnom svete fluorescentné" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Pixellize" -msgstr "bod" +msgstr "Pixelizovať" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Pixel tools" -msgstr "body" +msgstr "Nástroje na prácu s pixlami" #: ../share/filters/filters.svg.h:1 msgid "Reduce or remove antialiasing around shapes" msgstr "Znížiť alebo vypnúť prekladanie okolo tvarov." #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Set Resolution" -msgstr "Rozlíšenie:" +msgstr "Nastaviť rozlíšenie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Set filter resolution" -msgstr "Štandardné rozlíšenie pre export:" +msgstr "Nastaviť rozlíšenie filtra" #: ../share/filters/filters.svg.h:1 msgid "Basic Diffuse Bump" msgstr "Základný difúzny reliéf" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Matte emboss effect" -msgstr "Žiadny efekt" +msgstr "Matný reliéfny efekt" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Basic Specular Bump" -msgstr "Spekulárny exponent" +msgstr "Základné nerovnosti s odrazom" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Specular emboss effect" -msgstr "Žiadny efekt" +msgstr "Reliéfny efekt s odrazom" #: ../share/filters/filters.svg.h:1 msgid "Basic Two Lights Bump" -msgstr "" +msgstr "Základné nerovnosti s dvomi svetlami" #: ../share/filters/filters.svg.h:1 msgid "Two types of lighting emboss effect" -msgstr "" +msgstr "Dva typy reliéfneho efektu s osvetlením" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Linen Canvas" -msgstr "Plátno" +msgstr "Ľanové plátno" #: ../share/filters/filters.svg.h:1 msgid "Painting canvas emboss effect" -msgstr "" +msgstr "Reliéfny efekt maliarskeho plátna" #: ../share/filters/filters.svg.h:1 #, fuzzy @@ -1576,9 +1470,8 @@ msgid "Plasticine" msgstr "Sadra" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Matte modeling paste emboss effect" -msgstr "Vložiť efekt živej cesty" +msgstr "Reliéfny efekt matnej modelíny" #: ../share/filters/filters.svg.h:1 msgid "Rough Canvas Painting" @@ -1589,33 +1482,28 @@ msgid "Paper Bump" msgstr "Papierový reliéf" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Paper like emboss effect" -msgstr "Vložiť efekt živej cesty" +msgstr "Reliéfny efekt podobný papieru" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Jelly Bump" -msgstr "Kvapka želé" +msgstr "Gélové nerovnosti" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Convert pictures to thick jelly" -msgstr "Konvertovať texty na cesty" +msgstr "Previesť obrázky na husté želé" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Blend Opposites" -msgstr "_Režim zmiešania:" +msgstr "Zmiešať protiklady" #: ../share/filters/filters.svg.h:1 msgid "Blend an image with its hue opposite" msgstr "Zmieša obrázok a jeho odtieňový opak" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Hue to White" -msgstr "Otočiť odtieň" +msgstr "Odtieň na bielu" #: ../share/filters/filters.svg.h:1 msgid "Fades hue progressively to white" @@ -1627,7 +1515,6 @@ msgid "Swirl" msgstr "Vírenie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "" "Paint objects with a transparent turbulence which wraps around color edges" msgstr "" @@ -1635,14 +1522,12 @@ msgstr "" "farieb" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Pointillism" -msgstr "body" +msgstr "Pointillizmus" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Gives a turbulent pointillist HSL sensitive transparency" -msgstr "Dáva pointillistickú priesvitnosť citlivú na HSL" +msgstr "Dáva turbulentnú pointillistickú priesvitnosť citlivú na HSL" #: ../share/filters/filters.svg.h:1 msgid "Silhouette Marbled" @@ -1653,29 +1538,24 @@ msgid "Basic noise transparency texture" msgstr "Základná textúra šumovej priesvitnosti" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Fill Background" -msgstr "Pozadie" +msgstr "Vyplniť pozadie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Adds a colorizable opaque background" -msgstr "Pridáva dovnútra vyfarbiteľný vrhaný tieň" +msgstr "Pridá vyfarbiteľné nepriehľadné pozadie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Flatten Transparency" -msgstr "Priesvitnosť dialógu:" +msgstr "Sploštiť priesvitnosť" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Adds a white opaque background" -msgstr "štandard pozadie" +msgstr "Pridá biele nepriehľadné pozadie" #: ../share/filters/filters.svg.h:1 -#, fuzzy msgid "Fill Area" -msgstr "Jednoduchá farba:" +msgstr "Vyplniť oblasť" #: ../share/filters/filters.svg.h:1 msgid "Fills object bounding box with color" -- cgit v1.2.3 From a9e16718924f28cf5e55706946720b2cc44a409d Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Wed, 29 Jan 2014 16:55:32 -0500 Subject: Revert sp-image until the refactoring takes. (bzr r12984) --- src/sp-image.cpp | 135 +++++++++++++++++++++++++++++++++++++------------------ src/sp-image.h | 5 --- 2 files changed, 92 insertions(+), 48 deletions(-) diff --git a/src/sp-image.cpp b/src/sp-image.cpp index f1ea737ff..8f7a60ca6 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -24,7 +24,6 @@ #include <2geom/rect.h> #include <2geom/transforms.h> #include -#include #include "display/drawing-image.h" #include "display/cairo-utils.h" @@ -76,6 +75,7 @@ static void sp_image_set_curve(SPImage *image); +static Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absref, gchar const *base ); static void sp_image_update_arenaitem (SPImage *img, Inkscape::DrawingImage *ai); static void sp_image_update_canvas_image (SPImage *image); @@ -169,7 +169,8 @@ void SPImage::release() { this->href = NULL; } - this->clear_image(); + delete this->pixbuf; + this->pixbuf = NULL; #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) if (this->color_profile) { @@ -327,38 +328,16 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { SPItem::update(ctx, flags); if (flags & SP_IMAGE_HREF_MODIFIED_FLAG) { - this->clear_image(); + delete this->pixbuf; + this->pixbuf = NULL; if (this->href) { Inkscape::Pixbuf *pixbuf = NULL; - gchar const* uri = this->getRepr()->attribute("xlink:href"); - - if(!uri) { - g_warning("Image tag has no valid href: %s", this->getId()); - - } else if (strncmp (uri, "data:", 5) == 0) { - uri += 5; - pixbuf = Inkscape::Pixbuf::create_from_data_uri(uri); - - } else if(g_str_has_suffix(uri, ".svg")) { - SPDocument *doc = this->document->createChildDoc(uri); - if(doc) { - this->child = SP_ITEM(doc); - g_warning("Loaded document: %s", uri); - } else { - g_warning("Could not load svg for image tag: %s",this->getId()); - } - } else { - pixbuf = Inkscape::Pixbuf::create_from_file(uri); - } - if(!pixbuf && !this->child) { - /* Nope: We do not find any valid pixmap file :-( */ - pixbuf = new Inkscape::Pixbuf( - gdk_pixbuf_new_from_xpm_data((const gchar **) brokenimage_xpm)); - - /* If the xpm doesn't load, our libraries are broken */ - g_assert (pixbuf != NULL); - } + pixbuf = sp_image_repr_read_image ( + this->getRepr()->attribute("xlink:href"), + this->getRepr()->attribute("sodipodi:absref"), + doc->getBase()); + if (pixbuf) { // BLIP #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) @@ -527,18 +506,6 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { sp_image_update_canvas_image ((SPImage *) this); } -// Remove references to image or child objects. -void SPImage::clear_image() { - if(this->pixbuf) { - delete this->pixbuf; - this->pixbuf = NULL; - } - if(this->child) { - this->detach(this->child); - this->child = NULL; - } -} - void SPImage::modified(unsigned int flags) { // SPItem::onModified(flags); @@ -679,6 +646,88 @@ Inkscape::DrawingItem* SPImage::show(Inkscape::Drawing &drawing, unsigned int /* return ai; } +Inkscape::Pixbuf *sp_image_repr_read_image(gchar const *href, gchar const *absref, gchar const *base) +{ + Inkscape::Pixbuf *inkpb = 0; + + gchar const *filename = href; + + if (filename != NULL) { + if (strncmp (filename,"file:",5) == 0) { + gchar *fullname = g_filename_from_uri(filename, NULL, NULL); + if (fullname) { + inkpb = Inkscape::Pixbuf::create_from_file(fullname); + g_free(fullname); + if (inkpb != NULL) { + return inkpb; + } + } + } else if (strncmp (filename,"data:",5) == 0) { + /* data URI - embedded image */ + filename += 5; + inkpb = Inkscape::Pixbuf::create_from_data_uri(filename); + if (inkpb != NULL) { + return inkpb; + } + } else { + + if (!g_path_is_absolute (filename)) { + /* try to load from relative pos combined with document base*/ + const gchar *docbase = base; + if (!docbase) { + docbase = "."; + } + gchar *fullname = g_build_filename(docbase, filename, NULL); + + // document base can be wrong (on the temporary doc when importing bitmap from a + // different dir) or unset (when doc is not saved yet), so we check for base+href existence first, + // and if it fails, we also try to use bare href regardless of its g_path_is_absolute + if (g_file_test (fullname, G_FILE_TEST_EXISTS) && !g_file_test (fullname, G_FILE_TEST_IS_DIR)) { + inkpb = Inkscape::Pixbuf::create_from_file(fullname); + if (inkpb != NULL) { + g_free (fullname); + return inkpb; + } + } + g_free (fullname); + } + + /* try filename as absolute */ + if (g_file_test (filename, G_FILE_TEST_EXISTS) && !g_file_test (filename, G_FILE_TEST_IS_DIR)) { + inkpb = Inkscape::Pixbuf::create_from_file(filename); + if (inkpb != NULL) { + return inkpb; + } + } + } + } + + /* at last try to load from sp absolute path name */ + filename = absref; + if (filename != NULL) { + // using absref is outside of SVG rules, so we must at least warn the user + if ( base != NULL && href != NULL ) { + g_warning (" did not resolve to a valid image file (base dir is %s), now trying sodipodi:absref=\"%s\"", href, base, absref); + } else { + g_warning ("xlink:href did not resolve to a valid image file, now trying sodipodi:absref=\"%s\"", absref); + } + + inkpb = Inkscape::Pixbuf::create_from_file(filename); + if (inkpb != NULL) { + return inkpb; + } + } + /* Nope: We do not find any valid pixmap file :-( */ + GdkPixbuf *pixbuf = gdk_pixbuf_new_from_xpm_data((const gchar **) brokenimage_xpm); + inkpb = new Inkscape::Pixbuf(pixbuf); + + /* It should be included xpm, so if it still does not does load, */ + /* our libraries are broken */ + g_assert (inkpb != NULL); + + return inkpb; +} + /* We assert that realpixbuf is either NULL or identical size to pixbuf */ static void sp_image_update_arenaitem (SPImage *image, Inkscape::DrawingImage *ai) diff --git a/src/sp-image.h b/src/sp-image.h index ad4fd4d54..3b7208487 100644 --- a/src/sp-image.h +++ b/src/sp-image.h @@ -53,10 +53,7 @@ public: gchar *color_profile; #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) - // When image is a raster image, we use pixbuf Inkscape::Pixbuf *pixbuf; - // When it's an svg file, we use an SPItem similar to sp-use - SPItem *child; virtual void build(SPDocument *document, Inkscape::XML::Node *repr); virtual void release(); @@ -72,8 +69,6 @@ public: virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); virtual void snappoints(std::vector &p, Inkscape::SnapPreferences const *snapprefs) const; virtual Geom::Affine set_transform(Geom::Affine const &transform); -private: - void clear_image(); }; /* Return duplicate of curve or NULL */ -- cgit v1.2.3 From 0605b3e5559d3124a89c1270ae9b453388c838c7 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 30 Jan 2014 11:22:46 +0100 Subject: Prevent crash if a symbols file does not have a title. (bzr r12985) --- src/ui/dialog/symbols.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index c33920117..7079ca001 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -562,10 +562,18 @@ void SymbolsDialog::get_symbols() { symbol_doc = SPDocument::createNewDoc( fullname, FALSE ); if( symbol_doc ) { - const gchar *title = g_dpgettext2(NULL, "Symbol", symbol_doc->getRoot()->title()); + + const gchar *title = symbol_doc->getRoot()->title(); + + // A user provided file may not have a title + if( title != NULL ) { + title = g_dpgettext2(NULL, "Symbol", title); // Translate + } + if( title == NULL ) { title = _("Unnamed Symbols"); } + symbolSets[Glib::ustring(title)] = symbol_doc; symbolSet->append(title); } -- cgit v1.2.3 From a4ce97ec6835fb6ea8dfd3dbee11abe103b064e4 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 30 Jan 2014 14:18:11 +0100 Subject: Correct positioning of custom markers. Fixes #230491. (bzr r12986) --- src/marker.cpp | 6 ++++-- src/marker.h | 2 +- src/selection-chemistry.cpp | 29 +++++++++++++++-------------- 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/marker.cpp b/src/marker.cpp index d145aadaf..b9464186d 100644 --- a/src/marker.cpp +++ b/src/marker.cpp @@ -654,7 +654,7 @@ sp_marker_view_remove (SPMarker *marker, SPMarkerView *view, unsigned int destro delete view; } -const gchar *generate_marker(GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine /*transform*/, Geom::Affine move) +const gchar *generate_marker(GSList *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(); @@ -668,6 +668,8 @@ const gchar *generate_marker(GSList *reprs, Geom::Rect bounds, SPDocument *docum sp_repr_set_svg_double(repr, "markerWidth", bounds.dimensions()[Geom::X]); sp_repr_set_svg_double(repr, "markerHeight", bounds.dimensions()[Geom::Y]); + sp_repr_set_svg_double(repr, "refX", center[Geom::X]); + sp_repr_set_svg_double(repr, "refY", center[Geom::Y]); repr->setAttribute("orient", "auto"); @@ -676,7 +678,7 @@ const gchar *generate_marker(GSList *reprs, Geom::Rect bounds, SPDocument *docum 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); + Inkscape::XML::Node *node = (Inkscape::XML::Node *)(i->data); SPItem *copy = SP_ITEM(mark_object->appendChildRepr(node)); Geom::Affine dup_transform; diff --git a/src/marker.h b/src/marker.h index 831b298ac..b780950de 100644 --- a/src/marker.h +++ b/src/marker.h @@ -97,7 +97,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 gchar *generate_marker (GSList *reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move); +const gchar *generate_marker (GSList *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/selection-chemistry.cpp b/src/selection-chemistry.cpp index 3082a2fe4..3f54ef8b9 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -2804,6 +2804,7 @@ void sp_selection_clone_original_path_lpe(SPDesktop *desktop) void sp_selection_to_marker(SPDesktop *desktop, bool apply) { + // sp_selection_tile has similar code if (desktop == NULL) { return; } @@ -2826,25 +2827,28 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply) return; } + // FIXME: Inverted Y coodinate + Geom::Point doc_height( 0, doc->getHeight().value("px")); + // calculate the transform to be applied to objects to move them to 0,0 - Geom::Point move_p = Geom::Point(0, doc->getHeight().value("px")) - *c; + Geom::Point corner( r->min()[Geom::X], r->max()[Geom::Y] ); // FIXME: Inverted Y coodinate + Geom::Point move_p = doc_height - corner; move_p[Geom::Y] = -move_p[Geom::Y]; Geom::Affine move = Geom::Affine(Geom::Translate(move_p)); + Geom::Point center( *c - corner ); // As defined by rotation center + center[Geom::Y] = -center[Geom::Y]; + GSList *items = g_slist_copy(const_cast(selection->itemList())); - items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position); + items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position); // Why needed? // bottommost object, after sorting SPObject *parent = SP_OBJECT(items->data)->parent; Geom::Affine parent_transform(SP_ITEM(parent)->i2doc_affine()); - // remember the position of the first item - gint pos = SP_OBJECT(items->data)->getRepr()->position(); - (void)pos; // TODO check why this was remembered - - // create a list of duplicates + // 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); @@ -2854,7 +2858,8 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply) 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 + // 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(i->data); item->deleteObject(false); @@ -2868,12 +2873,7 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply) int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED); prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED); - gchar const *mark_id = generate_marker(repr_copies, bbox, doc, - ( Geom::Affine(Geom::Translate(desktop->dt2doc( - Geom::Point(r->min()[Geom::X], - r->max()[Geom::Y])))) - * parent_transform.inverse() ), - parent_transform * move); + gchar const *mark_id = generate_marker(repr_copies, bbox, doc, center, parent_transform * move); (void)mark_id; // restore compensation setting @@ -3099,6 +3099,7 @@ void sp_selection_unsymbol(SPDesktop *desktop) void sp_selection_tile(SPDesktop *desktop, bool apply) { + // sp_selection_to_marker has similar code if (desktop == NULL) { return; } -- cgit v1.2.3 From 5072fa495b429536218ce602162098582df1707b Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 30 Jan 2014 16:38:53 +0100 Subject: Don't reverse object order when creating a marker. (bzr r12987) --- configure.ac | 2 +- src/selection-chemistry.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index dbffcfbde..944a58266 100644 --- a/configure.ac +++ b/configure.ac @@ -101,7 +101,7 @@ if test "$GCC" = "yes"; then fi # Uncomment for SVG2 stuff - # CPPFLAGS="-DWITH_MESH -DWITH_CSSBLEND -DWITH_CSSCOMPOSITE $CPPFLAGS" + CPPFLAGS="-DWITH_MESH -DWITH_CSSBLEND -DWITH_CSSCOMPOSITE $CPPFLAGS" #### # C-specific flags... diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 3f54ef8b9..ecf814f60 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -2841,7 +2841,7 @@ void sp_selection_to_marker(SPDesktop *desktop, bool apply) GSList *items = g_slist_copy(const_cast(selection->itemList())); - items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position); // Why needed? + //items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position); // Why needed? // bottommost object, after sorting SPObject *parent = SP_OBJECT(items->data)->parent; -- cgit v1.2.3 From 34c39f3ffdbb1999e38ce873132cd02204e7fe3b Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 30 Jan 2014 16:40:32 +0100 Subject: Restore default configure.ac, modified version committed by accident. (bzr r12988) --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 944a58266..dbffcfbde 100644 --- a/configure.ac +++ b/configure.ac @@ -101,7 +101,7 @@ if test "$GCC" = "yes"; then fi # Uncomment for SVG2 stuff - CPPFLAGS="-DWITH_MESH -DWITH_CSSBLEND -DWITH_CSSCOMPOSITE $CPPFLAGS" + # CPPFLAGS="-DWITH_MESH -DWITH_CSSBLEND -DWITH_CSSCOMPOSITE $CPPFLAGS" #### # C-specific flags... -- cgit v1.2.3 From 77e7d632cbfdd00b7c6d61c952608ed6f26872f6 Mon Sep 17 00:00:00 2001 From: Martin Owens Date: Fri, 31 Jan 2014 14:36:53 -0500 Subject: Fix spacing/remove tabs and eliminate extra conditional. (bzr r12989) --- src/ui/dialog/symbols.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index 7079ca001..b3efb58f7 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -563,16 +563,14 @@ void SymbolsDialog::get_symbols() { symbol_doc = SPDocument::createNewDoc( fullname, FALSE ); if( symbol_doc ) { - const gchar *title = symbol_doc->getRoot()->title(); - - // A user provided file may not have a title - if( title != NULL ) { - title = g_dpgettext2(NULL, "Symbol", title); // Translate - } - - if( title == NULL ) { - title = _("Unnamed Symbols"); - } + const gchar *title = symbol_doc->getRoot()->title(); + + // A user provided file may not have a title + if( title != NULL ) { + title = g_dpgettext2(NULL, "Symbol", title); // Translate + } else { + title = _("Unnamed Symbols"); + } symbolSets[Glib::ustring(title)] = symbol_doc; symbolSet->append(title); -- cgit v1.2.3 From a666cb5212b82f743913c5e45c11ac759077ec43 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Fri, 31 Jan 2014 16:54:37 -0500 Subject: simplify equations in get_scale_transform_for_variable_stroke() for the case of 'scaled stroke'/'optimized transforms' (bzr r12990) --- src/sp-item-transform.cpp | 47 ++++++++++++++++------------------------------- 1 file changed, 16 insertions(+), 31 deletions(-) diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp index 7fa591fee..05390c910 100644 --- a/src/sp-item-transform.cpp +++ b/src/sp-item-transform.cpp @@ -246,7 +246,7 @@ Geom::Affine get_scale_transform_for_variable_stroke(Geom::Rect const &bbox_visu // 1) We start with a visual bounding box (w0, h0) which we want to transfer into another visual bounding box (w1, h1) // 2) We will also know the geometric bounding box, which can be used to calculate the strokewidth. The strokewidth will however - // be different for each of the four sides (left/right/top/bottom: r0l, r0r, r0t, r0b) + // be different for each of the four sides (left/right/top/bottom: r0l, r0r, r0t, r0b) gdouble w0 = bbox_visual.width(); // will return a value >= 0, as required further down the road gdouble h0 = bbox_visual.height(); @@ -258,8 +258,10 @@ Geom::Affine get_scale_transform_for_variable_stroke(Geom::Rect const &bbox_visu // We will now try to calculate the affine transformation required to transform the first visual bounding box into // the second one, while accounting for strokewidth - gdouble r0w = w0 - bbox_geom.width(); // r0w is the average strokewidth of the left and right edges, i.e. 0.5*(r0l + r0r) + gdouble r0w = w0 - bbox_geom.width(); // r0w is the average strokewidth of the left and right edges, i.e. 0.5*(r0l + r0r) gdouble r0h = h0 - bbox_geom.height(); // r0h is the average strokewidth of the top and bottom edges, i.e. 0.5*(r0t + r0b) + if ((r0w == Geom::infinity()) || (fabs(r0w) < 1e-6)) r0w = 0; + if ((r0h == Geom::infinity()) || (fabs(r0h) < 1e-6)) r0h = 0; int flip_x = (w1 > 0) ? 1 : -1; int flip_y = (h1 > 0) ? 1 : -1; @@ -308,38 +310,21 @@ Geom::Affine get_scale_transform_for_variable_stroke(Geom::Rect const &bbox_visu * Desired area of the geometric bounding box: A1 = (w1-r1w)*(h1-r1h) * This is how the stroke should scale: r1w^2 = A1/A0 * r0w^2, AND * r1h^2 = A1/A0 * r0h^2 - * Now we have to solve this set of two equations and find r1w and r1h; this too complicated to do by hand, - * so I used wxMaxima for that (http://wxmaxima.sourceforge.net/). These lines can be copied into Maxima - * - * A1: (w1-r1w)*(h1-r1h); - * s: A1/A0; - * expr1a: r1w^2 = s*r0w^2; - * expr1b: r1h^2 = s*r0h^2; - * sol: solve([expr1a, expr1b], [r1h, r1w]); - * sol[1][1]; sol[2][1]; sol[3][1]; sol[4][1]; - * sol[1][2]; sol[2][2]; sol[3][2]; sol[4][2]; - * - * PS1: The last two lines are only needed for readability of the output, and can be omitted if desired - * PS2: A0 is known beforehand and assumed to be constant, instead of using A0 = (w0-r0w)*(h0-r0h). This reduces the - * length of the results significantly - * PS3: You'll get 8 solutions, 4 for each of the strokewidths r1w and r1h. Some experiments quickly showed which of the solutions - * lead to meaningful strokewidths + * These can be re-expressed as : r1w/r0w = r1h/r0h + * and : r1w*r1w*(w0 - r0w)*(h0 - r0h) = r0w*r0w*(w1 - r1w)*(h1 - r1h) + * This leads to a quadratic equation in r1w, solved as follows: * */ - gdouble r0h2 = r0h*r0h; - gdouble r0h3 = r0h2*r0h; - gdouble r0w2 = r0w*r0w; - gdouble w12 = w1*w1; - gdouble h12 = h1*h1; - gdouble A0 = bbox_geom.area(); - gdouble A02 = A0*A0; - - gdouble operant = 4*h1*w1*A0+r0h2*w12-2*h1*r0h*r0w*w1+h12*r0w2; - if (operant < 0) { + + gdouble A = w0*h0 - r0h*w0 - r0w*h0; + gdouble B = r0h*w1 + r0w*h1; + gdouble C = -w1*h1; + + if (B*B - 4*A*C < 0) { g_message("variable stroke scaling error : %d, %d, %f, %f, %f, %f, %f, %f", transform_stroke, preserve, r0w, r0h, w0, h0, w1, h1); } else { - // Of the eight roots, I verified experimentally that these are the two we need - r1h = fabs((r0h*sqrt(operant)-r0h2*w1-h1*r0h*r0w)/(2*A0-2*r0h*r0w)); - r1w = fabs(-((h1*r0w*A0+r0h2*r0w*w1)*sqrt(operant)+(-3*h1*r0h*r0w*w1-h12*r0w2)*A0-r0h3*r0w*w12+h1*r0h2*r0w2*w1)/((r0h*A0-r0h2*r0w)*sqrt(operant)-2*h1*A02+(3*h1*r0h*r0w-r0h2*w1)*A0+r0h3*r0w*w1-h1*r0h2*r0w2)); + gdouble det = (-B + sqrt(B*B - 4*A*C))/(2*A); + r1w = r0w*det; + r1h = r0h*det; // If w1 < 0 then the scale will be wrong if we just assume that scale_x = (w1 - r1)/(w0 - r0); // Therefore we here need the absolute values of w0, w1, h0, h1, and r0, as taken care of earlier scale_x = (w1 - r1w)/(w0 - r0w); -- cgit v1.2.3 From 54f21698664f3b4ae65a4ece376dc404212a2639 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Fri, 31 Jan 2014 22:56:58 +0100 Subject: Do not throw TypeNotRegistered exceptions for now, since they interfere with debugging via 'catch throw'. (bzr r12991) --- src/factory.h | 4 +++- src/sp-object.cpp | 34 ++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/factory.h b/src/factory.h index a1df55277..d7f4cb2b9 100644 --- a/src/factory.h +++ b/src/factory.h @@ -63,7 +63,9 @@ public: typename std::map::const_iterator it = this->_object_map.find(id); if (it == this->_object_map.end()) { - throw FactoryExceptions::TypeNotRegistered(id); + //throw FactoryExceptions::TypeNotRegistered(id); + g_warning("unknown type: %s", id.c_str()); + return NULL; } return it->second(); diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 0e6eef6ae..764b5f260 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -585,23 +585,22 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) void SPObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPObject* object = this; - try { - const std::string typeString = NodeTraits::get_type_string(*child); + const std::string type_string = NodeTraits::get_type_string(*child); - SPObject* ochild = SPFactory::instance().createObject(typeString); - - SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; - object->attach(ochild, prev); - sp_object_unref(ochild, NULL); - - ochild->invoke_build(object->document, child, object->cloned); - } catch (const FactoryExceptions::TypeNotRegistered& e) { + SPObject* ochild = SPFactory::instance().createObject(type_string); + if (ochild == NULL) { // Currenty, there are many node types that do not have // corresponding classes in the SPObject tree. // (rdf:RDF, inkscape:clipboard, ...) // Thus, simply ignore this case for now. return; } + + SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; + object->attach(ochild, prev); + sp_object_unref(ochild, NULL); + + ochild->invoke_build(object->document, child, object->cloned); } void SPObject::release() { @@ -645,21 +644,20 @@ void SPObject::build(SPDocument *document, Inkscape::XML::Node *repr) { object->readAttr("inkscape:collect"); for (Inkscape::XML::Node *rchild = repr->firstChild() ; rchild != NULL; rchild = rchild->next()) { - try { - const std::string typeString = NodeTraits::get_type_string(*rchild); - - SPObject* child = SPFactory::instance().createObject(typeString); + const std::string typeString = NodeTraits::get_type_string(*rchild); - object->attach(child, object->lastChild()); - sp_object_unref(child, NULL); - child->invoke_build(document, rchild, object->cloned); - } catch (const FactoryExceptions::TypeNotRegistered& e) { + SPObject* child = SPFactory::instance().createObject(typeString); + if (child == NULL) { // Currenty, there are many node types that do not have // corresponding classes in the SPObject tree. // (rdf:RDF, inkscape:clipboard, ...) // Thus, simply ignore this case for now. continue; } + + object->attach(child, object->lastChild()); + sp_object_unref(child, NULL); + child->invoke_build(document, rchild, object->cloned); } } -- cgit v1.2.3 From 69b758c9769ae3e38fea2e1ff04a6ed7450e75d9 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sat, 1 Feb 2014 12:14:58 +0100 Subject: Fix some formatting problems and add formatting info at end of file. (bzr r12992) --- src/ui/dialog/symbols.cpp | 134 +++++++++++++++++++++++++--------------------- 1 file changed, 74 insertions(+), 60 deletions(-) diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index b3efb58f7..98754fb4f 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -76,7 +76,7 @@ namespace UI { namespace Dialog { - // See: http://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeModelColumnRecord.html +// See: http://developer.gnome.org/gtkmm/stable/classGtk_1_1TreeModelColumnRecord.html class SymbolColumns : public Gtk::TreeModel::ColumnRecord { public: @@ -399,11 +399,13 @@ SPDocument* SymbolsDialog::selectedSymbols() { } Glib::ustring SymbolsDialog::selectedSymbolId() { - #if WITH_GTKMM_3_0 - std::vector iconArray = iconView->get_selected_items(); - #else - Gtk::IconView::ArrayHandle_TreePaths iconArray = iconView->get_selected_items(); - #endif + +#if WITH_GTKMM_3_0 + std::vector iconArray = iconView->get_selected_items(); +#else + Gtk::IconView::ArrayHandle_TreePaths iconArray = iconView->get_selected_items(); +#endif + if( !iconArray.empty() ) { Gtk::TreeModel::Path const & path = *iconArray.begin(); Gtk::ListStore::iterator row = store->get_iter(path); @@ -428,12 +430,12 @@ void SymbolsDialog::iconChanged() { // First look for default style stored in gchar const* style = symbol->getAttribute("inkscape:symbol-style"); if( !style ) { - // If no default style in , look in documents. - if( symbolDocument == currentDocument ) { - style = style_from_use( symbol_id.c_str(), currentDocument ); - } else { - style = symbolDocument->getReprRoot()->attribute("style"); - } + // If no default style in , look in documents. + if( symbolDocument == currentDocument ) { + style = style_from_use( symbol_id.c_str(), currentDocument ); + } else { + style = symbolDocument->getReprRoot()->attribute("style"); + } } ClipboardManager *cm = ClipboardManager::get(); @@ -497,8 +499,8 @@ SPDocument* read_vss( gchar* fullname, gchar* filename ) { while( std::getline( iss, line ) ) { // std::cout << line << std::endl; if( line.find( "svg:svg" ) == std::string::npos ) { - tmpSVGOutput += line; - tmpSVGOutput += "\n"; + tmpSVGOutput += line; + tmpSVGOutput += "\n"; } } @@ -519,11 +521,11 @@ void SymbolsDialog::get_symbols() { std::list directories; if( Inkscape::IO::file_test( INKSCAPE_SYMBOLSDIR, G_FILE_TEST_EXISTS ) && - Inkscape::IO::file_test( INKSCAPE_SYMBOLSDIR, G_FILE_TEST_IS_DIR ) ) { + Inkscape::IO::file_test( INKSCAPE_SYMBOLSDIR, G_FILE_TEST_IS_DIR ) ) { directories.push_back( INKSCAPE_SYMBOLSDIR ); } if( Inkscape::IO::file_test( profile_path("symbols"), G_FILE_TEST_EXISTS ) && - Inkscape::IO::file_test( profile_path("symbols"), G_FILE_TEST_IS_DIR ) ) { + Inkscape::IO::file_test( profile_path("symbols"), G_FILE_TEST_IS_DIR ) ) { directories.push_back( profile_path("symbols") ); } @@ -534,53 +536,53 @@ void SymbolsDialog::get_symbols() { GDir *dir = g_dir_open( (*it).c_str(), 0, &err ); if( dir ) { - gchar *filename = 0; - while( (filename = (gchar *)g_dir_read_name( dir ) ) != NULL) { + gchar *filename = 0; + while( (filename = (gchar *)g_dir_read_name( dir ) ) != NULL) { - gchar *fullname = g_build_filename((*it).c_str(), filename, NULL); + gchar *fullname = g_build_filename((*it).c_str(), filename, NULL); - if ( !Inkscape::IO::file_test( fullname, G_FILE_TEST_IS_DIR ) - && ( Glib::str_has_suffix(fullname, ".svg") || Glib::str_has_suffix(fullname, ".vss") ) ) { + if ( !Inkscape::IO::file_test( fullname, G_FILE_TEST_IS_DIR ) + && ( Glib::str_has_suffix(fullname, ".svg") || Glib::str_has_suffix(fullname, ".vss") ) ) { - Glib::ustring fn( filename ); - Glib::ustring tag = fn.substr( fn.find_last_of(".") + 1 ); + Glib::ustring fn( filename ); + Glib::ustring tag = fn.substr( fn.find_last_of(".") + 1 ); - SPDocument* symbol_doc = NULL; + SPDocument* symbol_doc = NULL; #ifdef WITH_LIBVISIO - if( tag.compare( "vss" ) == 0 ) { + if( tag.compare( "vss" ) == 0 ) { - symbol_doc = read_vss( fullname, filename ); - if( symbol_doc ) { - symbolSets[Glib::ustring(filename)]= symbol_doc; - symbolSet->append(filename); - } - } + symbol_doc = read_vss( fullname, filename ); + if( symbol_doc ) { + symbolSets[Glib::ustring(filename)]= symbol_doc; + symbolSet->append(filename); + } + } #endif - // Try to read all remaining files as SVG - if( !symbol_doc ) { + // Try to read all remaining files as SVG + if( !symbol_doc ) { + + symbol_doc = SPDocument::createNewDoc( fullname, FALSE ); + if( symbol_doc ) { - symbol_doc = SPDocument::createNewDoc( fullname, FALSE ); - if( symbol_doc ) { + const gchar *title = symbol_doc->getRoot()->title(); - const gchar *title = symbol_doc->getRoot()->title(); + // A user provided file may not have a title + if( title != NULL ) { + title = g_dpgettext2(NULL, "Symbol", title); // Translate + } else { + title = _("Unnamed Symbols"); + } - // A user provided file may not have a title - if( title != NULL ) { - title = g_dpgettext2(NULL, "Symbol", title); // Translate - } else { - title = _("Unnamed Symbols"); + symbolSets[Glib::ustring(title)] = symbol_doc; + symbolSet->append(title); + } } - symbolSets[Glib::ustring(title)] = symbol_doc; - symbolSet->append(title); } + g_free( fullname ); } - - } - g_free( fullname ); - } - g_dir_close( dir ); + g_dir_close( dir ); } } } @@ -642,16 +644,16 @@ gchar const* SymbolsDialog::style_from_use( gchar const* id, SPDocument* documen for( ; l != NULL; l = l->next ) { SPObject* use = SP_OBJECT(l->data); if( SP_IS_USE( use ) ) { - gchar const *href = use->getRepr()->attribute("xlink:href"); - if( href ) { - Glib::ustring href2(href); - Glib::ustring id2(id); - id2 = "#" + id2; - if( !href2.compare(id2) ) { - style = use->getRepr()->attribute("style"); - break; - } - } + gchar const *href = use->getRepr()->attribute("xlink:href"); + if( href ) { + Glib::ustring href2(href); + Glib::ustring id2(id); + id2 = "#" + id2; + if( !href2.compare(id2) ) { + style = use->getRepr()->attribute("style"); + break; + } + } } } return style; @@ -808,8 +810,8 @@ void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) if (this->currentDesktop != desktop) { this->currentDesktop = desktop; if( !symbolSets[symbolSet->get_active_text()] ) { - // Symbol set is from Current document, update - rebuild(); + // Symbol set is from Current document, update + rebuild(); } } } @@ -817,3 +819,15 @@ void SymbolsDialog::setTargetDesktop(SPDesktop *desktop) } //namespace Dialogs } //namespace UI } //namespace Inkscape + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-basic-offset:2 + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : -- cgit v1.2.3 From 4212daecf6d6315290ae74f7a3c1c0fda87fc738 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sat, 1 Feb 2014 15:38:03 -0500 Subject: remove vertical offset when stretching a horizontal line (Bug 1275077) Fixed bugs: - https://launchpad.net/bugs/1275077 (bzr r12993) --- src/sp-item-transform.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/sp-item-transform.cpp b/src/sp-item-transform.cpp index 05390c910..1ab8edd51 100644 --- a/src/sp-item-transform.cpp +++ b/src/sp-item-transform.cpp @@ -146,9 +146,13 @@ Geom::Affine get_scale_transform_for_uniform_stroke(Geom::Rect const &bbox_visua if ((fabs(w0 - stroke_x) < 1e-6) || w1 == 0) { // We have a vertical line at hand scale_y = h1/h0; scale_x = transform_stroke ? 1 : scale_y; + unbudge *= Geom::Translate (-flip_x * 0.5 * (scale_x - 1.0) * w0, 0); + unbudge *= Geom::Translate ( flip_x * 0.5 * (w1 - w0), 0); // compensate for the fact that this operation cannot be performed } else if ((fabs(h0 - stroke_y) < 1e-6) || h1 == 0) { // We have a horizontal line at hand scale_x = w1/w0; scale_y = transform_stroke ? 1 : scale_x; + unbudge *= Geom::Translate (0, -flip_y * 0.5 * (scale_y - 1.0) * h0); + unbudge *= Geom::Translate (0, flip_y * 0.5 * (h1 - h0)); // compensate for the fact that this operation cannot be performed } else { // We have a true 2D object at hand if (transform_stroke && !preserve) { /* Initial area of the geometric bounding box: A0 = (w0-r0)*(h0-r0) @@ -299,11 +303,13 @@ Geom::Affine get_scale_transform_for_variable_stroke(Geom::Rect const &bbox_visu if ((fabs(w0 - r0w) < 1e-6) || w1 == 0) { // We have a vertical line at hand scale_y = h1/h0; scale_x = transform_stroke ? 1 : scale_y; - unbudge *= Geom::Translate (flip_x * 0.5 * (w1 - w0), 0); // compensate for the fact that this operation cannot be performed + unbudge *= Geom::Translate (-flip_x * 0.5 * (scale_x - 1.0) * w0, 0); + unbudge *= Geom::Translate ( flip_x * 0.5 * (w1 - w0), 0); // compensate for the fact that this operation cannot be performed } else if ((fabs(h0 - r0h) < 1e-6) || h1 == 0) { // We have a horizontal line at hand scale_x = w1/w0; scale_y = transform_stroke ? 1 : scale_x; - unbudge *= Geom::Translate (0, flip_y * 0.5 * (h1 - h0)); // compensate for the fact that this operation cannot be performed + unbudge *= Geom::Translate (0, -flip_y * 0.5 * (scale_y - 1.0) * h0); + unbudge *= Geom::Translate (0, flip_y * 0.5 * (h1 - h0)); // compensate for the fact that this operation cannot be performed } else { // We have a true 2D object at hand if (transform_stroke && !preserve) { /* Initial area of the geometric bounding box: A0 = (w0-r0w)*(h0-r0h) -- cgit v1.2.3 From 926415fa1f9ea69f18df89a1f2a039ad7dbd3e58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Sun, 2 Feb 2014 19:00:38 +0100 Subject: added parameter to switch off auto alignment for engraving machines (bzr r12994) --- share/extensions/hpgl_encoder.py | 51 +++++++++++++++++++++++++++++++--------- share/extensions/hpgl_input.inx | 4 ++-- share/extensions/hpgl_output.inx | 19 +++++++-------- share/extensions/hpgl_output.py | 1 + share/extensions/plotter.inx | 22 ++++++++--------- share/extensions/plotter.py | 10 ++++---- 6 files changed, 69 insertions(+), 38 deletions(-) diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py index 98993cd79..2304ce261 100644 --- a/share/extensions/hpgl_encoder.py +++ b/share/extensions/hpgl_encoder.py @@ -61,15 +61,18 @@ class hpglEncoder: "precut":bool "offsetX":float "offsetY":float + "autoAlign":bool "debug":bool ''' - self.doc = effect.document.getroot() self.options = effect.options + self.doc = effect.document.getroot() self.documentUnit = self.doc.xpath('//sodipodi:namedview/@inkscape:document-units', namespaces=inkex.NSS) if self.documentUnit: self.documentUnit = self.documentUnit[0] else: self.documentUnit = 'px' + self.docWidth = self.unitToUserUnit(self.doc.get('width'), True) + self.docHeight = self.unitToUserUnit(self.doc.get('height'), True) self.divergenceX = 'False' self.divergenceY = 'False' self.sizeX = 'False' @@ -93,13 +96,12 @@ class hpglEncoder: self.mirrorY = 1.0 if self.options.debug: self.debugValues = [0, 0, 0, 0, 0, 0, 0, 0] + self.debugValues[0] = self.docWidth + self.debugValues[1] = self.docHeight # process viewBox attribute to correct page scaling - viewBox = self.doc.get('viewBox') self.viewBoxTransformX = 1 self.viewBoxTransformY = 1 - if self.options.debug: - self.debugValues[0] = self.unitToUserUnit(self.doc.get('width'), True) - self.debugValues[1] = self.unitToUserUnit(self.doc.get('height'), True) + viewBox = self.doc.get('viewBox') if viewBox: viewBox = string.split(viewBox, ' ') if viewBox[2] and viewBox[3]: @@ -108,8 +110,8 @@ class hpglEncoder: if self.options.debug: self.debugValues[2] = self.unitToUserUnit(viewBox[0]) self.debugValues[3] = self.unitToUserUnit(viewBox[1]) - self.viewBoxTransformX = self.unitToUserUnit(self.doc.get('width'), True) / self.unitToUserUnit(viewBox[0]) - self.viewBoxTransformY = self.unitToUserUnit(self.doc.get('height'), True) / self.unitToUserUnit(viewBox[1]) + self.viewBoxTransformX = self.docWidth / self.unitToUserUnit(viewBox[0]) + self.viewBoxTransformY = self.docHeight / self.unitToUserUnit(viewBox[1]) def getHpgl(self): # dryRun to find edges @@ -126,12 +128,39 @@ class hpglEncoder: self.debugValues[5] = self.sizeY - self.divergenceY self.debugValues[6] = self.unitToUserUnit(str(self.debugValues[4] / self.scaleX)) self.debugValues[7] = self.unitToUserUnit(str(self.debugValues[5] / self.scaleY)) - if self.options.center: - self.divergenceX += (self.sizeX - self.divergenceX) / 2 - self.divergenceY += (self.sizeY - self.divergenceY) / 2 - elif self.options.useToolOffset: + # move drawing according to various modifiers + if self.options.autoAlign: + if self.options.center: + self.divergenceX += (self.sizeX - self.divergenceX) / 2 + self.divergenceY += (self.sizeY - self.divergenceY) / 2 + else: + self.divergenceX = 0.0 + self.divergenceY = 0.0 + if self.options.center: + if self.options.orientation == '0': + self.offsetX -= (self.docWidth * self.scaleX) / 2 + self.offsetY += (self.docHeight * self.scaleY) / 2 + if self.options.orientation == '90': + self.offsetY += (self.docWidth * self.scaleX) / 2 + self.offsetX += (self.docHeight * self.scaleY) / 2 + if self.options.orientation == '180': + self.offsetX += (self.docWidth * self.scaleX) / 2 + self.offsetY -= (self.docHeight * self.scaleY) / 2 + if self.options.orientation == '270': + self.offsetY -= (self.docWidth * self.scaleX) / 2 + self.offsetX -= (self.docHeight * self.scaleY) / 2 + else: + if self.options.orientation == '0': + self.offsetY += self.docHeight * self.scaleY + if self.options.orientation == '90': + self.offsetY += self.docWidth * self.scaleX + self.offsetX += self.docHeight * self.scaleY + if self.options.orientation == '180': + self.offsetX += self.docWidth * self.scaleX + if not self.options.center and self.options.useToolOffset: self.offsetX += self.toolOffset self.offsetY += self.toolOffset + # initialize transformation matrix and cache groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, - self.divergenceX + self.offsetX], [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, - self.divergenceY + self.offsetY]] groupmat = simpletransform.composeTransform(groupmat, simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) diff --git a/share/extensions/hpgl_input.inx b/share/extensions/hpgl_input.inx index aba7a9308..f40fd4ec0 100644 --- a/share/extensions/hpgl_input.inx +++ b/share/extensions/hpgl_input.inx @@ -7,8 +7,8 @@ inkex.py <_param name="introduction" type="description">Please note that you can only open HPGL files written by Inkscape, to open other HPGL files please change their file extension to .plt, make sure you have UniConverter installed and open them again.   - 1016.0 - 1016.0 + 1016.0 + 1016.0 false .hpgl diff --git a/share/extensions/hpgl_output.inx b/share/extensions/hpgl_output.inx index a8ce7c7e0..bb0809386 100644 --- a/share/extensions/hpgl_output.inx +++ b/share/extensions/hpgl_output.inx @@ -6,15 +6,15 @@ hpgl_output.py hpgl_encoder.py inkex.py - <_param name="introduction" type="description">Please make sure that all objects you want to save are converted to paths. The drawing will be automatically aligned to the zero point. Please use the plotter extension (Extensions menu) to plot directly on a plotter. + <_param name="introduction" type="description">Please make sure that all objects you want to save are converted to paths. Please use the plotter extension (Extensions menu) to plot directly over a serial connection. - 1016.0 - 1016.0 + 1016.0 + 1016.0 1 0 - 0 - + 0 + @@ -30,14 +30,13 @@   true 0.25 - true -   - <_param name="offsetNote" type="description">Please note that using the tool offset correction will move your plot away from the zero point by one tool offset length. + true 1.2 - 0.00 - 0.00 + 0.00 + 0.00 + true <_param name="settingsHelp" type="description">All these settings depend on the plotter you use, for more information please consult the manual or homepage for your plotter. diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py index d6f6b8eec..02157eb95 100755 --- a/share/extensions/hpgl_output.py +++ b/share/extensions/hpgl_output.py @@ -49,6 +49,7 @@ class MyEffect(inkex.Effect): self.OptionParser.add_option('--precut', action='store', type='inkbool', dest='precut', default='TRUE', help='Use precut') self.OptionParser.add_option('--offsetX', action='store', type='float', dest='offsetX', default=0.0, help='X offset (mm)') self.OptionParser.add_option('--offsetY', action='store', type='float', dest='offsetY', default=0.0, help='Y offset (mm)') + self.OptionParser.add_option('--autoAlign', action='store', type='inkbool', dest='autoAlign', default='TRUE', help='Auto align') def effect(self): self.options.debug = False diff --git a/share/extensions/plotter.inx b/share/extensions/plotter.inx index 673922d2e..e30d61418 100644 --- a/share/extensions/plotter.inx +++ b/share/extensions/plotter.inx @@ -6,7 +6,7 @@ hpgl_decoder.py hpgl_encoder.py inkex.py - <_param name="introduction" type="description">Please make sure that all objects you want to plot are converted to paths. The plot will automatically be aligned to the zero point. + <_param name="introduction" type="description">Please make sure that all objects you want to plot are converted to paths. COM1 @@ -39,17 +39,17 @@   - <_param name="freezeHelp" type="description">Using wrong settings can under certain circumstances cause Inkscape to freeze. Always save your work before plotting. + <_param name="freezeHelp" type="description">Using wrong settings can under certain circumstances cause Inkscape to freeze. Always save your work before plotting! <_param name="serialHelp" type="description">This can be a physical serial connection or a USB-to-Serial bridge. Ask your plotter manufacturer for drivers if needed. <_param name="parallelHelp" type="description">Parallel (LPT) connections are not supported. - 1016.0 - 1016.0 + 1016.0 + 1016.0 1 0 - 0 - + 0 + @@ -65,14 +65,14 @@   true 0.25 - true -   - <_param name="offsetNote" type="description">Please note that using the tool offset correction will move your plot away from the zero point by one tool offset length. + true 1.2 - 0.00 - 0.00 + 0.00 + 0.00 + true +   false diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py index 394f83786..84027b132 100644 --- a/share/extensions/plotter.py +++ b/share/extensions/plotter.py @@ -36,6 +36,10 @@ class MyEffect(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option('--tab', action='store', type='string', dest='tab') + self.OptionParser.add_option('--serialPort', action='store', type='string', dest='serialPort', default='COM1', help='Serial port') + self.OptionParser.add_option('--serialBaudRate', action='store', type='string', dest='serialBaudRate', default='9600', help='Serial Baud rate') + self.OptionParser.add_option('--flowControl', action='store', type='string', dest='flowControl', default='0', help='Flow control') + self.OptionParser.add_option('--commandLanguage', action='store', type='string', dest='commandLanguage', default='hpgl', help='Command Language') self.OptionParser.add_option('--resolutionX', action='store', type='float', dest='resolutionX', default=1016.0, help='Resolution X (dpi)') self.OptionParser.add_option('--resolutionY', action='store', type='float', dest='resolutionY', default=1016.0, help='Resolution Y (dpi)') self.OptionParser.add_option('--pen', action='store', type='int', dest='pen', default=1, help='Pen number') @@ -53,10 +57,7 @@ class MyEffect(inkex.Effect): self.OptionParser.add_option('--precut', action='store', type='inkbool', dest='precut', default='TRUE', help='Use precut') self.OptionParser.add_option('--offsetX', action='store', type='float', dest='offsetX', default=0.0, help='X offset (mm)') self.OptionParser.add_option('--offsetY', action='store', type='float', dest='offsetY', default=0.0, help='Y offset (mm)') - self.OptionParser.add_option('--serialPort', action='store', type='string', dest='serialPort', default='COM1', help='Serial port') - self.OptionParser.add_option('--serialBaudRate', action='store', type='string', dest='serialBaudRate', default='9600', help='Serial Baud rate') - self.OptionParser.add_option('--flowControl', action='store', type='string', dest='flowControl', default='0', help='Flow control') - self.OptionParser.add_option('--commandLanguage', action='store', type='string', dest='commandLanguage', default='hpgl', help='Command Language') + self.OptionParser.add_option('--autoAlign', action='store', type='inkbool', dest='autoAlign', default='TRUE', help='Auto align') self.OptionParser.add_option('--debug', action='store', type='inkbool', dest='debug', default='FALSE', help='Show debug information') def effect(self): @@ -181,6 +182,7 @@ class MyEffect(inkex.Effect): inkex.errormsg(' Curve flatness: ' + str(self.options.flat)) inkex.errormsg(' X offset (mm): ' + str(self.options.offsetX)) inkex.errormsg(' Y offset (mm): ' + str(self.options.offsetY)) + inkex.errormsg(' Auto align: ' + str(self.options.autoAlign)) inkex.errormsg(' Show debug information: ' + str(self.options.debug)) inkex.errormsg("\nDocument properties:\n") version = self.document.getroot().xpath('//@inkscape:version', namespaces=inkex.NSS) -- cgit v1.2.3 From 157187379f241da2bb559f17e47b7d35b1684616 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Tue, 4 Feb 2014 07:49:51 +0100 Subject: Fix for Bug #1275146 (numerous messages of type unknown type: rdf:RDF). Fixed bugs: - https://launchpad.net/bugs/1275146 (bzr r12995) --- src/factory.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/factory.h b/src/factory.h index d7f4cb2b9..7e466f95a 100644 --- a/src/factory.h +++ b/src/factory.h @@ -64,7 +64,12 @@ public: if (it == this->_object_map.end()) { //throw FactoryExceptions::TypeNotRegistered(id); - g_warning("unknown type: %s", id.c_str()); + if (!(id.empty() // comments, usually + or id == "rdf:RDF" // no SP node yet + or id == "inkscape:clipboard" // SP node not necessary + or id == "inkscape:_templateinfo")) { + g_warning("unknown type: %s", id.c_str()); + } return NULL; } -- cgit v1.2.3 From 28faf1002334ac22523e7a0cf78f170de9e91f9a Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Tue, 4 Feb 2014 14:58:12 +0100 Subject: Workaround for Bug #1273510 (crash in in cc_generic_knot_handler() after tool-switch). (bzr r12996) --- src/ui/tools/connector-tool.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/ui/tools/connector-tool.cpp b/src/ui/tools/connector-tool.cpp index 62d52f6af..50cb00360 100644 --- a/src/ui/tools/connector-tool.cpp +++ b/src/ui/tools/connector-tool.cpp @@ -1080,7 +1080,12 @@ cc_generic_knot_handler(SPCanvasItem *, GdkEvent *event, SPKnot *knot) case GDK_LEAVE_NOTIFY: sp_knot_set_flag(knot, SP_KNOT_MOUSEOVER, FALSE); - cc->active_handle = NULL; + /* FIXME: the following test is a workaround for LP Bug #1273510. + * It seems that a signal is not correctly disconnected, maybe + * something missing in cc_clear_active_conn()? */ + if (cc) { + cc->active_handle = NULL; + } if (knot_tip) { knot->desktop->event_context->defaultMessageContext()->clear(); -- cgit v1.2.3 From c7731033ef400fccb6a49d830ded86068fcd3432 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Wed, 5 Feb 2014 12:29:11 +0100 Subject: Fix for Bug #1250685 (Unnecessary gender-specific terms in code). Fixed bugs: - https://launchpad.net/bugs/1250685 (bzr r12997) --- src/libnrtype/FontFactory.cpp | 4 +- src/libnrtype/FontInstance.cpp | 40 +-- src/libnrtype/TextWrapper.cpp | 2 +- src/libnrtype/font-instance.h | 2 +- src/livarot/AVL.cpp | 652 ++++++++++++++++++++--------------------- src/livarot/AVL.h | 6 +- src/livarot/PathCutting.cpp | 12 +- src/livarot/ShapeMisc.cpp | 12 +- src/livarot/sweep-event.cpp | 32 +- src/livarot/sweep-tree.cpp | 16 +- src/splivarot.cpp | 10 +- src/ui/tools/spray-tool.cpp | 56 ++-- 12 files changed, 422 insertions(+), 422 deletions(-) diff --git a/src/libnrtype/FontFactory.cpp b/src/libnrtype/FontFactory.cpp index 9fc553efd..f05b75aaa 100644 --- a/src/libnrtype/FontFactory.cpp +++ b/src/libnrtype/FontFactory.cpp @@ -973,12 +973,12 @@ font_instance *font_factory::Face(PangoFontDescription *descr, bool canFail) // point) whether loadedFaces[that_descr] is free or not (and overwriting // an entry will bring deallocation problems) res->descr = pango_font_description_copy(descr); - res->daddy = this; + res->parent = this; res->InstallFace(nFace); if ( res->pFont == NULL ) { // failed to install face -> bitmap font // printf("face failed\n"); - res->daddy = NULL; + res->parent = NULL; delete res; res = NULL; if ( canFail ) { diff --git a/src/libnrtype/FontInstance.cpp b/src/libnrtype/FontInstance.cpp index 434f3ee47..a5b782344 100644 --- a/src/libnrtype/FontInstance.cpp +++ b/src/libnrtype/FontInstance.cpp @@ -174,7 +174,7 @@ font_instance::font_instance(void) : pFont(0), descr(0), refCount(0), - daddy(0), + parent(0), nbGlyph(0), maxGlyph(0), glyphs(0), @@ -185,9 +185,9 @@ font_instance::font_instance(void) : font_instance::~font_instance(void) { - if ( daddy ) { - daddy->UnrefFace(this); - daddy = 0; + if ( parent ) { + parent->UnrefFace(this); + parent = 0; } //printf("font instance death\n"); @@ -389,13 +389,13 @@ void font_instance::InitTheFace() if ( !theFace ) { LOGFONT *lf=pango_win32_font_logfont(pFont); g_assert(lf != NULL); - theFace=pango_win32_font_cache_load(daddy->pangoFontCache,lf); + theFace=pango_win32_font_cache_load(parent->pangoFontCache,lf); g_free(lf); } XFORM identity = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0}; - SetWorldTransform(daddy->hScreenDC, &identity); - SetGraphicsMode(daddy->hScreenDC, GM_COMPATIBLE); - SelectObject(daddy->hScreenDC,theFace); + SetWorldTransform(parent->hScreenDC, &identity); + SetGraphicsMode(parent->hScreenDC, GM_COMPATIBLE); + SelectObject(parent->hScreenDC,theFace); #else theFace=pango_fc_font_lock_face(PANGO_FC_FONT(pFont)); if ( theFace ) { @@ -408,8 +408,8 @@ void font_instance::InitTheFace() void font_instance::FreeTheFace() { #ifdef USE_PANGO_WIN32 - SelectObject(daddy->hScreenDC,GetStockObject(SYSTEM_FONT)); - pango_win32_font_cache_unload(daddy->pangoFontCache,theFace); + SelectObject(parent->hScreenDC,GetStockObject(SYSTEM_FONT)); + pango_win32_font_cache_unload(parent->pangoFontCache,theFace); #else pango_fc_font_unlock_face(PANGO_FC_FONT(pFont)); #endif @@ -443,7 +443,7 @@ bool font_instance::IsOutlineFont(void) InitTheFace(); #ifdef USE_PANGO_WIN32 TEXTMETRIC tm; - return GetTextMetrics(daddy->hScreenDC,&tm) && tm.tmPitchAndFamily&(TMPF_TRUETYPE|TMPF_DEVICE); + return GetTextMetrics(parent->hScreenDC,&tm) && tm.tmPitchAndFamily&(TMPF_TRUETYPE|TMPF_DEVICE); #else return FT_IS_SCALABLE(theFace); #endif @@ -513,10 +513,10 @@ void font_instance::LoadGlyph(int glyph_id) MAT2 identity = {{0,1},{0,0},{0,0},{0,1}}; OUTLINETEXTMETRIC otm; - GetOutlineTextMetrics(daddy->hScreenDC, sizeof(otm), &otm); + GetOutlineTextMetrics(parent->hScreenDC, sizeof(otm), &otm); GLYPHMETRICS metrics; - DWORD bufferSize=GetGlyphOutline (daddy->hScreenDC, glyph_id, GGO_GLYPH_INDEX | GGO_NATIVE | GGO_UNHINTED, &metrics, 0, NULL, &identity); - double scale=1.0/daddy->fontSize; + DWORD bufferSize=GetGlyphOutline (parent->hScreenDC, glyph_id, GGO_GLYPH_INDEX | GGO_NATIVE | GGO_UNHINTED, &metrics, 0, NULL, &identity); + double scale=1.0/parent->fontSize; n_g.h_advance=metrics.gmCellIncX*scale; n_g.v_advance=otm.otmTextMetrics.tmHeight*scale; n_g.h_width=metrics.gmBlackBoxX*scale; @@ -528,7 +528,7 @@ void font_instance::LoadGlyph(int glyph_id) doAdd=true; } else { char *buffer = new char[bufferSize]; - if ( GetGlyphOutline (daddy->hScreenDC, glyph_id, GGO_GLYPH_INDEX | GGO_NATIVE | GGO_UNHINTED, &metrics, bufferSize, buffer, &identity) <= 0 ) { + if ( GetGlyphOutline (parent->hScreenDC, glyph_id, GGO_GLYPH_INDEX | GGO_NATIVE | GGO_UNHINTED, &metrics, bufferSize, buffer, &identity) <= 0 ) { // shit happened } else { // Platform SDK is rubbish, read KB87115 instead @@ -655,10 +655,10 @@ bool font_instance::FontMetrics(double &ascent,double &descent,double &leading) } #ifdef USE_PANGO_WIN32 OUTLINETEXTMETRIC otm; - if ( !GetOutlineTextMetrics(daddy->hScreenDC,sizeof(otm),&otm) ) { + if ( !GetOutlineTextMetrics(parent->hScreenDC,sizeof(otm),&otm) ) { return false; } - double scale=1.0/daddy->fontSize; + double scale=1.0/parent->fontSize; ascent=fabs(otm.otmAscent*scale); descent=fabs(otm.otmDescent*scale); leading=fabs(otm.otmLineGap*scale); @@ -688,10 +688,10 @@ bool font_instance::FontDecoration( } #ifdef USE_PANGO_WIN32 OUTLINETEXTMETRIC otm; - if ( !GetOutlineTextMetrics(daddy->hScreenDC,sizeof(otm),&otm) ) { + if ( !GetOutlineTextMetrics(parent->hScreenDC,sizeof(otm),&otm) ) { return false; } - double scale=1.0/daddy->fontSize; + double scale=1.0/parent->fontSize; underline_position = fabs(otm.otmUnderscorePosition *scale); underline_thickness = fabs(otm.otmUnderscoreSize *scale); linethrough_position = fabs(otm.otmStrikeoutPosition *scale); @@ -725,7 +725,7 @@ bool font_instance::FontSlope(double &run, double &rise) #ifdef USE_PANGO_WIN32 OUTLINETEXTMETRIC otm; - if ( !GetOutlineTextMetrics(daddy->hScreenDC,sizeof(otm),&otm) ) return false; + if ( !GetOutlineTextMetrics(parent->hScreenDC,sizeof(otm),&otm) ) return false; run=otm.otmsCharSlopeRun; rise=otm.otmsCharSlopeRise; #else diff --git a/src/libnrtype/TextWrapper.cpp b/src/libnrtype/TextWrapper.cpp index 32877e275..380e9ba3f 100644 --- a/src/libnrtype/TextWrapper.cpp +++ b/src/libnrtype/TextWrapper.cpp @@ -327,7 +327,7 @@ void text_wrapper::DoLayout(void) for (int i = 0; i < glyph_length; i++) { glyph_text[i].uni_st = uni32_codepoint[glyph_text[i].uni_st]; glyph_text[i].uni_en = uni32_codepoint[glyph_text[i].uni_en]; - glyph_text[i].x /= 512; // why is this not default_font->daddy->fontsize? + glyph_text[i].x /= 512; // why is this not default_font->parent->fontsize? glyph_text[i].y /= 512; } if ( glyph_length > 0 ) { diff --git a/src/libnrtype/font-instance.h b/src/libnrtype/font-instance.h index ef10a04d0..75106617b 100644 --- a/src/libnrtype/font-instance.h +++ b/src/libnrtype/font-instance.h @@ -29,7 +29,7 @@ public: // refcount int refCount; // font_factory owning this font_instance - font_factory* daddy; + font_factory* parent; // common glyph definitions for all the rasterfonts std::map id_to_no; diff --git a/src/livarot/AVL.cpp b/src/livarot/AVL.cpp index e8ece7f8c..17af5ee66 100644 --- a/src/livarot/AVL.cpp +++ b/src/livarot/AVL.cpp @@ -28,10 +28,10 @@ void AVLTree::MakeNew() for (int i = 0; i < 2; i++) { elem[i] = NULL; - son[i] = NULL; + child[i] = NULL; } - dad = NULL; + parent = NULL; balance = 0; } @@ -47,32 +47,32 @@ void AVLTree::MakeDelete() AVLTree *AVLTree::Leftmost() { - return leafFromDad(NULL, LEFT); + return leafFromParent(NULL, LEFT); } AVLTree *AVLTree::leaf(AVLTree *from, Side s) { - if (from == son[1 - s]) { - if (son[s]) { - return son[s]->leafFromDad(this, s); + if (from == child[1 - s]) { + if (child[s]) { + return child[s]->leafFromParent(this, s); } - else if (dad) { - return dad->leaf(this, s); + else if (parent) { + return parent->leaf(this, s); } } - else if (from == son[s]) { - if (dad) { - return dad->leaf(this, s); + else if (from == child[s]) { + if (parent) { + return parent->leaf(this, s); } } return NULL; } -AVLTree *AVLTree::leafFromDad(AVLTree */*from*/, Side s) +AVLTree *AVLTree::leafFromParent(AVLTree */*from*/, Side s) { - if (son[s]) { - return son[s]->leafFromDad(this, s); + if (child[s]) { + return child[s]->leafFromParent(this, s); } return this; @@ -83,60 +83,60 @@ AVLTree::RestoreBalances (AVLTree * from, AVLTree * &racine) { if (from == NULL) { - if (dad) - return dad->RestoreBalances (this, racine); + if (parent) + return parent->RestoreBalances (this, racine); } else { if (balance == 0) { - if (from == son[LEFT]) + if (from == child[LEFT]) balance = 1; - if (from == son[RIGHT]) + if (from == child[RIGHT]) balance = -1; - if (dad) - return dad->RestoreBalances (this, racine); + if (parent) + return parent->RestoreBalances (this, racine); return avl_no_err; } else if (balance > 0) { - if (from == son[RIGHT]) + if (from == child[RIGHT]) { balance = 0; return avl_no_err; } - if (son[LEFT] == NULL) + if (child[LEFT] == NULL) { // cout << "mierda\n"; return avl_bal_err; } AVLTree *a = this; - AVLTree *b = son[LEFT]; - AVLTree *e = son[RIGHT]; - AVLTree *c = son[LEFT]->son[LEFT]; - AVLTree *d = son[LEFT]->son[RIGHT]; - if (son[LEFT]->balance > 0) + AVLTree *b = child[LEFT]; + AVLTree *e = child[RIGHT]; + AVLTree *c = child[LEFT]->child[LEFT]; + AVLTree *d = child[LEFT]->child[RIGHT]; + if (child[LEFT]->balance > 0) { - AVLTree *r = dad; + AVLTree *r = parent; - a->dad = b; - b->son[RIGHT] = a; - a->son[RIGHT] = e; + a->parent = b; + b->child[RIGHT] = a; + a->child[RIGHT] = e; if (e) - e->dad = a; - a->son[LEFT] = d; + e->parent = a; + a->child[LEFT] = d; if (d) - d->dad = a; - b->son[LEFT] = c; + d->parent = a; + b->child[LEFT] = c; if (c) - c->dad = b; - b->dad = r; + c->parent = b; + b->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = b; - if (r->son[RIGHT] == a) - r->son[RIGHT] = b; + if (r->child[LEFT] == a) + r->child[LEFT] = b; + if (r->child[RIGHT] == a) + r->child[RIGHT] = b; } if (racine == a) racine = b; @@ -147,39 +147,39 @@ AVLTree::RestoreBalances (AVLTree * from, AVLTree * &racine) } else { - if (son[LEFT]->son[RIGHT] == NULL) + if (child[LEFT]->child[RIGHT] == NULL) { // cout << "mierda\n"; return avl_bal_err; } - AVLTree *f = son[LEFT]->son[RIGHT]->son[LEFT]; - AVLTree *g = son[LEFT]->son[RIGHT]->son[RIGHT]; - AVLTree *r = dad; - - a->dad = d; - d->son[RIGHT] = a; - b->dad = d; - d->son[LEFT] = b; - a->son[LEFT] = g; + AVLTree *f = child[LEFT]->child[RIGHT]->child[LEFT]; + AVLTree *g = child[LEFT]->child[RIGHT]->child[RIGHT]; + AVLTree *r = parent; + + a->parent = d; + d->child[RIGHT] = a; + b->parent = d; + d->child[LEFT] = b; + a->child[LEFT] = g; if (g) - g->dad = a; - a->son[RIGHT] = e; + g->parent = a; + a->child[RIGHT] = e; if (e) - e->dad = a; - b->son[LEFT] = c; + e->parent = a; + b->child[LEFT] = c; if (c) - c->dad = b; - b->son[RIGHT] = f; + c->parent = b; + b->child[RIGHT] = f; if (f) - f->dad = b; + f->parent = b; - d->dad = r; + d->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = d; - if (r->son[RIGHT] == a) - r->son[RIGHT] = d; + if (r->child[LEFT] == a) + r->child[LEFT] = d; + if (r->child[RIGHT] == a) + r->child[RIGHT] = d; } if (racine == a) racine = d; @@ -206,43 +206,43 @@ AVLTree::RestoreBalances (AVLTree * from, AVLTree * &racine) } else if (balance < 0) { - if (from == son[LEFT]) + if (from == child[LEFT]) { balance = 0; return avl_no_err; } - if (son[RIGHT] == NULL) + if (child[RIGHT] == NULL) { // cout << "mierda\n"; return avl_bal_err; } AVLTree *a = this; - AVLTree *b = son[RIGHT]; - AVLTree *e = son[LEFT]; - AVLTree *c = son[RIGHT]->son[RIGHT]; - AVLTree *d = son[RIGHT]->son[LEFT]; - AVLTree *r = dad; - if (son[RIGHT]->balance < 0) + AVLTree *b = child[RIGHT]; + AVLTree *e = child[LEFT]; + AVLTree *c = child[RIGHT]->child[RIGHT]; + AVLTree *d = child[RIGHT]->child[LEFT]; + AVLTree *r = parent; + if (child[RIGHT]->balance < 0) { - a->dad = b; - b->son[LEFT] = a; - a->son[LEFT] = e; + a->parent = b; + b->child[LEFT] = a; + a->child[LEFT] = e; if (e) - e->dad = a; - a->son[RIGHT] = d; + e->parent = a; + a->child[RIGHT] = d; if (d) - d->dad = a; - b->son[RIGHT] = c; + d->parent = a; + b->child[RIGHT] = c; if (c) - c->dad = b; - b->dad = r; + c->parent = b; + b->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = b; - if (r->son[RIGHT] == a) - r->son[RIGHT] = b; + if (r->child[LEFT] == a) + r->child[LEFT] = b; + if (r->child[RIGHT] == a) + r->child[RIGHT] = b; } if (racine == a) racine = b; @@ -252,38 +252,38 @@ AVLTree::RestoreBalances (AVLTree * from, AVLTree * &racine) } else { - if (son[RIGHT]->son[LEFT] == NULL) + if (child[RIGHT]->child[LEFT] == NULL) { // cout << "mierda\n"; return avl_bal_err; } - AVLTree *f = son[RIGHT]->son[LEFT]->son[RIGHT]; - AVLTree *g = son[RIGHT]->son[LEFT]->son[LEFT]; - - a->dad = d; - d->son[LEFT] = a; - b->dad = d; - d->son[RIGHT] = b; - a->son[RIGHT] = g; + AVLTree *f = child[RIGHT]->child[LEFT]->child[RIGHT]; + AVLTree *g = child[RIGHT]->child[LEFT]->child[LEFT]; + + a->parent = d; + d->child[LEFT] = a; + b->parent = d; + d->child[RIGHT] = b; + a->child[RIGHT] = g; if (g) - g->dad = a; - a->son[LEFT] = e; + g->parent = a; + a->child[LEFT] = e; if (e) - e->dad = a; - b->son[RIGHT] = c; + e->parent = a; + b->child[RIGHT] = c; if (c) - c->dad = b; - b->son[LEFT] = f; + c->parent = b; + b->child[LEFT] = f; if (f) - f->dad = b; + f->parent = b; - d->dad = r; + d->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = d; - if (r->son[RIGHT] == a) - r->son[RIGHT] = d; + if (r->child[LEFT] == a) + r->child[LEFT] = d; + if (r->child[RIGHT] == a) + r->child[RIGHT] = d; } if (racine == a) racine = d; @@ -319,12 +319,12 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) if (diff < 0) { balance = 0; - if (dad) + if (parent) { - if (this == dad->son[RIGHT]) - return dad->RestoreBalances (1, racine); - if (this == dad->son[LEFT]) - return dad->RestoreBalances (-1, racine); + if (this == parent->child[RIGHT]) + return parent->RestoreBalances (1, racine); + if (this == parent->child[LEFT]) + return parent->RestoreBalances (-1, racine); } return avl_no_err; } @@ -333,38 +333,38 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) } else if (diff > 0) { - if (son[LEFT] == NULL) + if (child[LEFT] == NULL) { // cout << "un probleme\n"; return avl_bal_err; } - AVLTree *r = dad; + AVLTree *r = parent; AVLTree *a = this; - AVLTree *b = son[RIGHT]; - AVLTree *e = son[LEFT]; - AVLTree *f = e->son[RIGHT]; - AVLTree *g = e->son[LEFT]; + AVLTree *b = child[RIGHT]; + AVLTree *e = child[LEFT]; + AVLTree *f = e->child[RIGHT]; + AVLTree *g = e->child[LEFT]; if (e->balance > 0) { - e->son[RIGHT] = a; - e->son[LEFT] = g; - a->son[RIGHT] = b; - a->son[LEFT] = f; + e->child[RIGHT] = a; + e->child[LEFT] = g; + a->child[RIGHT] = b; + a->child[LEFT] = f; if (a) - a->dad = e; + a->parent = e; if (g) - g->dad = e; + g->parent = e; if (b) - b->dad = a; + b->parent = a; if (f) - f->dad = a; - e->dad = r; + f->parent = a; + e->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = e; - if (r->son[RIGHT] == a) - r->son[RIGHT] = e; + if (r->child[LEFT] == a) + r->child[LEFT] = e; + if (r->child[RIGHT] == a) + r->child[RIGHT] = e; } if (racine == this) racine = e; @@ -372,34 +372,34 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) a->balance = 0; if (r) { - if (e == r->son[RIGHT]) + if (e == r->child[RIGHT]) return r->RestoreBalances (1, racine); - if (e == r->son[LEFT]) + if (e == r->child[LEFT]) return r->RestoreBalances (-1, racine); } return avl_no_err; } else if (e->balance == 0) { - e->son[RIGHT] = a; - e->son[LEFT] = g; - a->son[RIGHT] = b; - a->son[LEFT] = f; + e->child[RIGHT] = a; + e->child[LEFT] = g; + a->child[RIGHT] = b; + a->child[LEFT] = f; if (a) - a->dad = e; + a->parent = e; if (g) - g->dad = e; + g->parent = e; if (b) - b->dad = a; + b->parent = a; if (f) - f->dad = a; - e->dad = r; + f->parent = a; + e->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = e; - if (r->son[RIGHT] == a) - r->son[RIGHT] = e; + if (r->child[LEFT] == a) + r->child[LEFT] = e; + if (r->child[RIGHT] == a) + r->child[RIGHT] = e; } if (racine == this) racine = e; @@ -409,39 +409,39 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) } else if (e->balance < 0) { - if (son[LEFT]->son[RIGHT] == NULL) + if (child[LEFT]->child[RIGHT] == NULL) { // cout << "un probleme\n"; return avl_bal_err; } - AVLTree *i = son[LEFT]->son[RIGHT]->son[RIGHT]; - AVLTree *j = son[LEFT]->son[RIGHT]->son[LEFT]; - - f->son[RIGHT] = a; - f->son[LEFT] = e; - a->son[RIGHT] = b; - a->son[LEFT] = i; - e->son[RIGHT] = j; - e->son[LEFT] = g; + AVLTree *i = child[LEFT]->child[RIGHT]->child[RIGHT]; + AVLTree *j = child[LEFT]->child[RIGHT]->child[LEFT]; + + f->child[RIGHT] = a; + f->child[LEFT] = e; + a->child[RIGHT] = b; + a->child[LEFT] = i; + e->child[RIGHT] = j; + e->child[LEFT] = g; if (b) - b->dad = a; + b->parent = a; if (i) - i->dad = a; + i->parent = a; if (g) - g->dad = e; + g->parent = e; if (j) - j->dad = e; + j->parent = e; if (a) - a->dad = f; + a->parent = f; if (e) - e->dad = f; - f->dad = r; + e->parent = f; + f->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = f; - if (r->son[RIGHT] == a) - r->son[RIGHT] = f; + if (r->child[LEFT] == a) + r->child[LEFT] = f; + if (r->child[RIGHT] == a) + r->child[RIGHT] = f; } if (racine == this) racine = f; @@ -464,9 +464,9 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) } if (r) { - if (f == r->son[RIGHT]) + if (f == r->child[RIGHT]) return r->RestoreBalances (1, racine); - if (f == r->son[LEFT]) + if (f == r->child[LEFT]) return r->RestoreBalances (-1, racine); } return avl_no_err; @@ -492,38 +492,38 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) { if (diff < 0) { - if (son[RIGHT] == NULL) + if (child[RIGHT] == NULL) { // cout << "un probleme\n"; return avl_bal_err; } - AVLTree *r = dad; + AVLTree *r = parent; AVLTree *a = this; - AVLTree *b = son[LEFT]; - AVLTree *e = son[RIGHT]; - AVLTree *f = e->son[LEFT]; - AVLTree *g = e->son[RIGHT]; + AVLTree *b = child[LEFT]; + AVLTree *e = child[RIGHT]; + AVLTree *f = e->child[LEFT]; + AVLTree *g = e->child[RIGHT]; if (e->balance < 0) { - e->son[LEFT] = a; - e->son[RIGHT] = g; - a->son[LEFT] = b; - a->son[RIGHT] = f; + e->child[LEFT] = a; + e->child[RIGHT] = g; + a->child[LEFT] = b; + a->child[RIGHT] = f; if (a) - a->dad = e; + a->parent = e; if (g) - g->dad = e; + g->parent = e; if (b) - b->dad = a; + b->parent = a; if (f) - f->dad = a; - e->dad = r; + f->parent = a; + e->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = e; - if (r->son[RIGHT] == a) - r->son[RIGHT] = e; + if (r->child[LEFT] == a) + r->child[LEFT] = e; + if (r->child[RIGHT] == a) + r->child[RIGHT] = e; } if (racine == this) racine = e; @@ -531,34 +531,34 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) a->balance = 0; if (r) { - if (e == r->son[RIGHT]) + if (e == r->child[RIGHT]) return r->RestoreBalances (1, racine); - if (e == r->son[LEFT]) + if (e == r->child[LEFT]) return r->RestoreBalances (-1, racine); } return avl_no_err; } else if (e->balance == 0) { - e->son[LEFT] = a; - e->son[RIGHT] = g; - a->son[LEFT] = b; - a->son[RIGHT] = f; + e->child[LEFT] = a; + e->child[RIGHT] = g; + a->child[LEFT] = b; + a->child[RIGHT] = f; if (a) - a->dad = e; + a->parent = e; if (g) - g->dad = e; + g->parent = e; if (b) - b->dad = a; + b->parent = a; if (f) - f->dad = a; - e->dad = r; + f->parent = a; + e->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = e; - if (r->son[RIGHT] == a) - r->son[RIGHT] = e; + if (r->child[LEFT] == a) + r->child[LEFT] = e; + if (r->child[RIGHT] == a) + r->child[RIGHT] = e; } if (racine == this) racine = e; @@ -568,39 +568,39 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) } else if (e->balance > 0) { - if (son[RIGHT]->son[LEFT] == NULL) + if (child[RIGHT]->child[LEFT] == NULL) { // cout << "un probleme\n"; return avl_bal_err; } - AVLTree *i = son[RIGHT]->son[LEFT]->son[LEFT]; - AVLTree *j = son[RIGHT]->son[LEFT]->son[RIGHT]; - - f->son[LEFT] = a; - f->son[RIGHT] = e; - a->son[LEFT] = b; - a->son[RIGHT] = i; - e->son[LEFT] = j; - e->son[RIGHT] = g; + AVLTree *i = child[RIGHT]->child[LEFT]->child[LEFT]; + AVLTree *j = child[RIGHT]->child[LEFT]->child[RIGHT]; + + f->child[LEFT] = a; + f->child[RIGHT] = e; + a->child[LEFT] = b; + a->child[RIGHT] = i; + e->child[LEFT] = j; + e->child[RIGHT] = g; if (b) - b->dad = a; + b->parent = a; if (i) - i->dad = a; + i->parent = a; if (g) - g->dad = e; + g->parent = e; if (j) - j->dad = e; + j->parent = e; if (a) - a->dad = f; + a->parent = f; if (e) - e->dad = f; - f->dad = r; + e->parent = f; + f->parent = r; if (r) { - if (r->son[LEFT] == a) - r->son[LEFT] = f; - if (r->son[RIGHT] == a) - r->son[RIGHT] = f; + if (r->child[LEFT] == a) + r->child[LEFT] = f; + if (r->child[RIGHT] == a) + r->child[RIGHT] = f; } if (racine == this) racine = f; @@ -623,9 +623,9 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) } if (r) { - if (f == r->son[RIGHT]) + if (f == r->child[RIGHT]) return r->RestoreBalances (1, racine); - if (f == r->son[LEFT]) + if (f == r->child[LEFT]) return r->RestoreBalances (-1, racine); } return avl_no_err; @@ -637,12 +637,12 @@ AVLTree::RestoreBalances (int diff, AVLTree * &racine) else if (diff > 0) { balance = 0; - if (dad) + if (parent) { - if (this == dad->son[RIGHT]) - return dad->RestoreBalances (1, racine); - if (this == dad->son[LEFT]) - return dad->RestoreBalances (-1, racine); + if (this == parent->child[RIGHT]) + return parent->RestoreBalances (1, racine); + if (this == parent->child[LEFT]) + return parent->RestoreBalances (-1, racine); } return avl_no_err; } @@ -673,126 +673,126 @@ AVLTree::Remove (AVLTree * &racine, AVLTree * &startNode, int &diff) elem[RIGHT]->elem[LEFT] = elem[LEFT]; elem[LEFT] = elem[RIGHT] = NULL; - if (son[LEFT] && son[RIGHT]) + if (child[LEFT] && child[RIGHT]) { - AVLTree *newMe = son[LEFT]->leafFromDad(this, RIGHT); - if (newMe == NULL || newMe->son[RIGHT]) + AVLTree *newMe = child[LEFT]->leafFromParent(this, RIGHT); + if (newMe == NULL || newMe->child[RIGHT]) { // cout << "pas normal\n"; return avl_rm_err; } - if (newMe == son[LEFT]) + if (newMe == child[LEFT]) { startNode = newMe; diff = -1; - newMe->son[RIGHT] = son[RIGHT]; - son[RIGHT]->dad = newMe; - newMe->dad = dad; - if (dad) + newMe->child[RIGHT] = child[RIGHT]; + child[RIGHT]->parent = newMe; + newMe->parent = parent; + if (parent) { - if (dad->son[LEFT] == this) - dad->son[LEFT] = newMe; - if (dad->son[RIGHT] == this) - dad->son[RIGHT] = newMe; + if (parent->child[LEFT] == this) + parent->child[LEFT] = newMe; + if (parent->child[RIGHT] == this) + parent->child[RIGHT] = newMe; } } else { - AVLTree *oDad = newMe->dad; - startNode = oDad; + AVLTree *oParent = newMe->parent; + startNode = oParent; diff = 1; - oDad->son[RIGHT] = newMe->son[LEFT]; - if (newMe->son[LEFT]) - newMe->son[LEFT]->dad = oDad; + oParent->child[RIGHT] = newMe->child[LEFT]; + if (newMe->child[LEFT]) + newMe->child[LEFT]->parent = oParent; - newMe->dad = dad; - newMe->son[LEFT] = son[LEFT]; - newMe->son[RIGHT] = son[RIGHT]; - if (dad) + newMe->parent = parent; + newMe->child[LEFT] = child[LEFT]; + newMe->child[RIGHT] = child[RIGHT]; + if (parent) { - if (dad->son[LEFT] == this) - dad->son[LEFT] = newMe; - if (dad->son[RIGHT] == this) - dad->son[RIGHT] = newMe; + if (parent->child[LEFT] == this) + parent->child[LEFT] = newMe; + if (parent->child[RIGHT] == this) + parent->child[RIGHT] = newMe; } - if (son[LEFT]) - son[LEFT]->dad = newMe; - if (son[RIGHT]) - son[RIGHT]->dad = newMe; + if (child[LEFT]) + child[LEFT]->parent = newMe; + if (child[RIGHT]) + child[RIGHT]->parent = newMe; } newMe->balance = balance; if (racine == this) racine = newMe; } - else if (son[LEFT]) + else if (child[LEFT]) { - startNode = dad; + startNode = parent; diff = 0; - if (dad) + if (parent) { - if (this == dad->son[LEFT]) + if (this == parent->child[LEFT]) diff = -1; - if (this == dad->son[RIGHT]) + if (this == parent->child[RIGHT]) diff = 1; } - if (dad) + if (parent) { - if (dad->son[LEFT] == this) - dad->son[LEFT] = son[LEFT]; - if (dad->son[RIGHT] == this) - dad->son[RIGHT] = son[LEFT]; + if (parent->child[LEFT] == this) + parent->child[LEFT] = child[LEFT]; + if (parent->child[RIGHT] == this) + parent->child[RIGHT] = child[LEFT]; } - if (son[LEFT]->dad == this) - son[LEFT]->dad = dad; + if (child[LEFT]->parent == this) + child[LEFT]->parent = parent; if (racine == this) - racine = son[LEFT]; + racine = child[LEFT]; } - else if (son[RIGHT]) + else if (child[RIGHT]) { - startNode = dad; + startNode = parent; diff = 0; - if (dad) + if (parent) { - if (this == dad->son[LEFT]) + if (this == parent->child[LEFT]) diff = -1; - if (this == dad->son[RIGHT]) + if (this == parent->child[RIGHT]) diff = 1; } - if (dad) + if (parent) { - if (dad->son[LEFT] == this) - dad->son[LEFT] = son[RIGHT]; - if (dad->son[RIGHT] == this) - dad->son[RIGHT] = son[RIGHT]; + if (parent->child[LEFT] == this) + parent->child[LEFT] = child[RIGHT]; + if (parent->child[RIGHT] == this) + parent->child[RIGHT] = child[RIGHT]; } - if (son[RIGHT]->dad == this) - son[RIGHT]->dad = dad; + if (child[RIGHT]->parent == this) + child[RIGHT]->parent = parent; if (racine == this) - racine = son[RIGHT]; + racine = child[RIGHT]; } else { - startNode = dad; + startNode = parent; diff = 0; - if (dad) + if (parent) { - if (this == dad->son[LEFT]) + if (this == parent->child[LEFT]) diff = -1; - if (this == dad->son[RIGHT]) + if (this == parent->child[RIGHT]) diff = 1; } - if (dad) + if (parent) { - if (dad->son[LEFT] == this) - dad->son[LEFT] = NULL; - if (dad->son[RIGHT] == this) - dad->son[RIGHT] = NULL; + if (parent->child[LEFT] == this) + parent->child[LEFT] = NULL; + if (parent->child[RIGHT] == this) + parent->child[RIGHT] = NULL; } if (racine == this) racine = NULL; } - dad = son[RIGHT] = son[LEFT] = NULL; + parent = child[RIGHT] = child[LEFT] = NULL; balance = 0; return avl_no_err; } @@ -828,43 +828,43 @@ AVLTree::Insert (AVLTree * &racine, int insertType, AVLTree * insertL, } else if (insertType == found_on_left) { - if (insertR == NULL || insertR->son[LEFT]) + if (insertR == NULL || insertR->child[LEFT]) { // cout << "ngou?\n"; return avl_ins_err; } - insertR->son[LEFT] = this; - dad = insertR; + insertR->child[LEFT] = this; + parent = insertR; insertOn(LEFT, insertR); } else if (insertType == found_on_right) { - if (insertL == NULL || insertL->son[RIGHT]) + if (insertL == NULL || insertL->child[RIGHT]) { // cout << "ngou?\n"; return avl_ins_err; } - insertL->son[RIGHT] = this; - dad = insertL; + insertL->child[RIGHT] = this; + parent = insertL; insertOn(RIGHT, insertL); } else if (insertType == found_between) { if (insertR == NULL || insertL == NULL - || (insertR->son[LEFT] != NULL && insertL->son[RIGHT] != NULL)) + || (insertR->child[LEFT] != NULL && insertL->child[RIGHT] != NULL)) { // cout << "ngou?\n"; return avl_ins_err; } - if (insertR->son[LEFT] == NULL) + if (insertR->child[LEFT] == NULL) { - insertR->son[LEFT] = this; - dad = insertR; + insertR->child[LEFT] = this; + parent = insertR; } - else if (insertL->son[RIGHT] == NULL) + else if (insertL->child[RIGHT] == NULL) { - insertL->son[RIGHT] = this; - dad = insertL; + insertL->child[RIGHT] = this; + parent = insertL; } insertBetween (insertL, insertR); } @@ -877,22 +877,22 @@ AVLTree::Insert (AVLTree * &racine, int insertType, AVLTree * insertL, } // et on insere - if (insertL->son[RIGHT]) + if (insertL->child[RIGHT]) { - insertL = insertL->son[RIGHT]->leafFromDad(insertL, LEFT); - if (insertL->son[LEFT]) + insertL = insertL->child[RIGHT]->leafFromParent(insertL, LEFT); + if (insertL->child[LEFT]) { // cout << "ngou?\n"; return avl_ins_err; } - insertL->son[LEFT] = this; - this->dad = insertL; + insertL->child[LEFT] = this; + this->parent = insertL; insertBetween (insertL->elem[LEFT], insertL); } else { - insertL->son[RIGHT] = this; - dad = insertL; + insertL->child[RIGHT] = this; + parent = insertL; insertBetween (insertL, insertL->elem[RIGHT]); } } @@ -915,24 +915,24 @@ AVLTree::Relocate (AVLTree * to) to->elem[LEFT] = elem[LEFT]; to->elem[RIGHT] = elem[RIGHT]; - if (dad) + if (parent) { - if (dad->son[LEFT] == this) - dad->son[LEFT] = to; - if (dad->son[RIGHT] == this) - dad->son[RIGHT] = to; + if (parent->child[LEFT] == this) + parent->child[LEFT] = to; + if (parent->child[RIGHT] == this) + parent->child[RIGHT] = to; } - if (son[RIGHT]) + if (child[RIGHT]) { - son[RIGHT]->dad = to; + child[RIGHT]->parent = to; } - if (son[LEFT]) + if (child[LEFT]) { - son[LEFT]->dad = to; + child[LEFT]->parent = to; } - to->dad = dad; - to->son[RIGHT] = son[RIGHT]; - to->son[LEFT] = son[LEFT]; + to->parent = parent; + to->child[RIGHT] = child[RIGHT]; + to->child[LEFT] = child[LEFT]; } diff --git a/src/livarot/AVL.h b/src/livarot/AVL.h index cc0f095cc..741abfaf2 100644 --- a/src/livarot/AVL.h +++ b/src/livarot/AVL.h @@ -30,7 +30,7 @@ public: protected: - AVLTree *son[2]; + AVLTree *child[2]; AVLTree(); virtual ~AVLTree(); @@ -57,7 +57,7 @@ protected: private: - AVLTree *dad; + AVLTree *parent; int balance; @@ -78,7 +78,7 @@ private: void insertOn(Side s, AVLTree *of); void insertBetween(AVLTree *l, AVLTree *r); AVLTree *leaf(AVLTree *from, Side s); - AVLTree *leafFromDad(AVLTree *from, Side s); + AVLTree *leafFromParent(AVLTree *from, Side s); }; #endif diff --git a/src/livarot/PathCutting.cpp b/src/livarot/PathCutting.cpp index 201f64b54..0dc7ede50 100644 --- a/src/livarot/PathCutting.cpp +++ b/src/livarot/PathCutting.cpp @@ -641,21 +641,21 @@ Path** Path::SubPathsWithNesting(int &outNb,bool killNoSurf,int nbNest,int* } curAdd=NULL; } - Path* hasDad=NULL; + Path* hasParent=NULL; for (int j=0;j= 0 ) { - int dadMvt=conts[nesting[j]]; + int parentMvt=conts[nesting[j]]; for (int k=0;kdescr_cmd.empty() == false && res[k]->descr_cmd[0]->associated == dadMvt ) { - hasDad=res[k]; + if ( res[k] && res[k]->descr_cmd.empty() == false && res[k]->descr_cmd[0]->associated == parentMvt ) { + hasParent=res[k]; break; } } } if ( conts[j] > i ) break; } - if ( hasDad ) { - curAdd=hasDad; + if ( hasParent ) { + curAdd=hasParent; increment=true; } else { curAdd=new Path; diff --git a/src/livarot/ShapeMisc.cpp b/src/livarot/ShapeMisc.cpp index e5a98f0cf..c0bfe9428 100644 --- a/src/livarot/ShapeMisc.cpp +++ b/src/livarot/ShapeMisc.cpp @@ -373,7 +373,7 @@ Shape::ConvertToFormeNested (Path * dest, int nbP, Path * *orig, int /*wildPath* int lastPtUsed = 0; do { - int dadContour=-1; + int parentContour=-1; int childEdge = -1; bool foundChild = false; int startBord = -1; @@ -387,10 +387,10 @@ Shape::ConvertToFormeNested (Path * dest, int nbP, Path * *orig, int /*wildPath* { int askTo = pData[fi].askForWindingB; if (askTo < 0 || askTo >= numberOfEdges() ) { - dadContour=-1; + parentContour=-1; } else { - dadContour = GPOINTER_TO_INT(swdData[askTo].misc); - dadContour-=1; // pour compenser le decalage + parentContour = GPOINTER_TO_INT(swdData[askTo].misc); + parentContour-=1; // pour compenser le decalage childEdge = getPoint(fi).incidentEdge[FIRST]; } } @@ -463,7 +463,7 @@ Shape::ConvertToFormeNested (Path * dest, int nbP, Path * *orig, int /*wildPath* contStart=(int*)g_realloc(contStart,(nbNest+1)*sizeof(int)); contStart[nbNest]=dest->descr_cmd.size(); if (foundChild) { - nesting[nbNest++]=dadContour; + nesting[nbNest++]=parentContour; foundChild = false; } else { nesting[nbNest++]=-1; // contient des bouts de coupure -> a part @@ -504,7 +504,7 @@ Shape::ConvertToFormeNested (Path * dest, int nbP, Path * *orig, int /*wildPath* contStart=(int*)g_realloc(contStart,(nbNest+1)*sizeof(int)); contStart[nbNest]=dest->descr_cmd.size(); if (foundChild) { - nesting[nbNest++]=dadContour; + nesting[nbNest++]=parentContour; foundChild = false; } else { nesting[nbNest++]=-1; // contient des bouts de coupure -> a part diff --git a/src/livarot/sweep-event.cpp b/src/livarot/sweep-event.cpp index 6f3a4d246..48354fc46 100644 --- a/src/livarot/sweep-event.cpp +++ b/src/livarot/sweep-event.cpp @@ -146,11 +146,11 @@ void SweepEventQueue::remove(SweepEvent *e) } while (2 * curInd + 1 < nbEvt) { - int const son1 = 2 * curInd + 1; - int const son2 = son1 + 1; - int const no1 = inds[son1]; - int const no2 = inds[son2]; - if (son2 < nbEvt) { + int const child1 = 2 * curInd + 1; + int const child2 = child1 + 1; + int const no1 = inds[child1]; + int const no2 = inds[child2]; + if (child2 < nbEvt) { if (px[1] > events[no1].posx[1] || (px[1] == events[no1].posx[1] && px[0] > events[no1].posx[0])) @@ -159,28 +159,28 @@ void SweepEventQueue::remove(SweepEvent *e) || (events[no2].posx[1] == events[no1].posx[1] && events[no2].posx[0] > events[no1].posx[0])) { - events[to].ind = son1; + events[to].ind = child1; events[no1].ind = curInd; - inds[son1] = to; + inds[child1] = to; inds[curInd] = no1; - curInd = son1; + curInd = child1; } else { - events[to].ind = son2; + events[to].ind = child2; events[no2].ind = curInd; - inds[son2] = to; + inds[child2] = to; inds[curInd] = no2; - curInd = son2; + curInd = child2; } } else { if (px[1] > events[no2].posx[1] || (px[1] == events[no2].posx[1] && px[0] > events[no2].posx[0])) { - events[to].ind = son2; + events[to].ind = child2; events[no2].ind = curInd; - inds[son2] = to; + inds[child2] = to; inds[curInd] = no2; - curInd = son2; + curInd = child2; } else { break; } @@ -190,9 +190,9 @@ void SweepEventQueue::remove(SweepEvent *e) || (px[1] == events[no1].posx[1] && px[0] > events[no1].posx[0])) { - events[to].ind = son1; + events[to].ind = child1; events[no1].ind = curInd; - inds[son1] = to; + inds[child1] = to; inds[curInd] = no1; } diff --git a/src/livarot/sweep-tree.cpp b/src/livarot/sweep-tree.cpp index 0cfd6bc52..7a016a2ee 100644 --- a/src/livarot/sweep-tree.cpp +++ b/src/livarot/sweep-tree.cpp @@ -131,8 +131,8 @@ SweepTree::Find(Geom::Point const &px, SweepTree *newOne, SweepTree *&insertL, } } if (y < 0) { - if (son[LEFT]) { - return (static_cast(son[LEFT]))->Find(px, newOne, + if (child[LEFT]) { + return (static_cast(child[LEFT]))->Find(px, newOne, insertL, insertR, sweepSens); } else { @@ -145,8 +145,8 @@ SweepTree::Find(Geom::Point const &px, SweepTree *newOne, SweepTree *&insertL, } } } else { - if (son[RIGHT]) { - return (static_cast(son[RIGHT]))->Find(px, newOne, + if (child[RIGHT]) { + return (static_cast(child[RIGHT]))->Find(px, newOne, insertL, insertR, sweepSens); } else { @@ -189,9 +189,9 @@ SweepTree::Find(Geom::Point const &px, SweepTree * &insertL, } if (y < 0) { - if (son[LEFT]) + if (child[LEFT]) { - return (static_cast(son[LEFT]))->Find(px, insertL, + return (static_cast(child[LEFT]))->Find(px, insertL, insertR); } else @@ -210,9 +210,9 @@ SweepTree::Find(Geom::Point const &px, SweepTree * &insertL, } else { - if (son[RIGHT]) + if (child[RIGHT]) { - return (static_cast(son[RIGHT]))->Find(px, insertL, + return (static_cast(child[RIGHT]))->Find(px, insertL, insertR); } else diff --git a/src/splivarot.cpp b/src/splivarot.cpp index e5006884c..5c7b389ff 100644 --- a/src/splivarot.cpp +++ b/src/splivarot.cpp @@ -371,18 +371,18 @@ sp_selected_path_boolop(Inkscape::Selection *selection, SPDesktop *desktop, bool // objects are not in parent/child relationship; // find their lowest common ancestor - Inkscape::XML::Node *dad = LCA(a, b); - if (dad == NULL) { + Inkscape::XML::Node *parent = LCA(a, b); + if (parent == NULL) { boolop_display_error_message(desktop, _("Unable to determine the z-order of the objects selected for difference, XOR, division, or path cut.")); return; } // find the children of the LCA that lead from it to the a and b - Inkscape::XML::Node *as = AncetreFils(a, dad); - Inkscape::XML::Node *bs = AncetreFils(b, dad); + Inkscape::XML::Node *as = AncetreFils(a, parent); + Inkscape::XML::Node *bs = AncetreFils(b, parent); // find out which comes first - for (Inkscape::XML::Node *child = dad->firstChild(); child; child = child->next()) { + for (Inkscape::XML::Node *child = parent->firstChild(); child; child = child->next()) { if (child == as) { /* a first, so reverse. */ reverseOrderForOp = true; diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp index 0ded1e44b..91c606e8e 100644 --- a/src/ui/tools/spray-tool.cpp +++ b/src/ui/tools/spray-tool.cpp @@ -404,7 +404,7 @@ static bool sp_spray_recursive(SPDesktop *desktop, SPItem *item_copied; if(_fid <= population) { - // duplicate + // Duplicate SPDocument *doc = item->document; Inkscape::XML::Document* xml_doc = doc->getReprDoc(); Inkscape::XML::Node *old_repr = item->getRepr(); @@ -413,13 +413,13 @@ static bool sp_spray_recursive(SPDesktop *desktop, parent->appendChild(copy); SPObject *new_obj = doc->getObjectByRepr(copy); - item_copied = SP_ITEM(new_obj); //convertion object->item + item_copied = SP_ITEM(new_obj); // Convertion object->item Geom::Point center=item->getCenter(); sp_spray_scale_rel(center,desktop, item_copied, Geom::Scale(_scale,_scale)); sp_spray_scale_rel(center,desktop, item_copied, Geom::Scale(scale,scale)); sp_spray_rotate_rel(center,desktop,item_copied, Geom::Rotate(angle)); - //Move the cursor p + // Move the cursor p Geom::Point move = (Geom::Point(cos(tilt)*cos(dp)*dr/(1-ratio)+sin(tilt)*sin(dp)*dr/(1+ratio), -sin(tilt)*cos(dp)*dr/(1-ratio)+cos(tilt)*sin(dp)*dr/(1+ratio)))+(p-a->midpoint()); sp_item_move_rel(item_copied, Geom::Translate(move[Geom::X], -move[Geom::Y])); did = true; @@ -427,10 +427,10 @@ static bool sp_spray_recursive(SPDesktop *desktop, } } else if (mode == SPRAY_MODE_SINGLE_PATH) { - SPItem *father = NULL; //initial Object - SPItem *item_copied = NULL; //Projected Object - SPItem *unionResult = NULL; //previous union - SPItem *son = NULL; //father copy + SPItem *parent_item = NULL; // Initial object + SPItem *item_copied = NULL; // Projected object + SPItem *unionResult = NULL; // Previous union + SPItem *child_item = NULL; // Parent copy int i=1; for (GSList *items = g_slist_copy(const_cast(selection->itemList())); @@ -439,31 +439,31 @@ static bool sp_spray_recursive(SPDesktop *desktop, SPItem *item1 = SP_ITEM(items->data); if (i == 1) { - father = item1; + parent_item = item1; } if (i == 2) { unionResult = item1; } i++; } - SPDocument *doc = father->document; + SPDocument *doc = parent_item->document; Inkscape::XML::Document* xml_doc = doc->getReprDoc(); - Inkscape::XML::Node *old_repr = father->getRepr(); + Inkscape::XML::Node *old_repr = parent_item->getRepr(); Inkscape::XML::Node *parent = old_repr->parent(); - Geom::OptRect a = father->documentVisualBounds(); + Geom::OptRect a = parent_item->documentVisualBounds(); if (a) { if (i == 2) { Inkscape::XML::Node *copy1 = old_repr->duplicate(xml_doc); parent->appendChild(copy1); SPObject *new_obj1 = doc->getObjectByRepr(copy1); - son = SP_ITEM(new_obj1); // conversion object->item - unionResult = son; + child_item = SP_ITEM(new_obj1); // Conversion object->item + unionResult = child_item; Inkscape::GC::release(copy1); } if (_fid <= population) { // Rules the population of objects sprayed - // duplicates the father + // Duplicates the parent item Inkscape::XML::Node *copy2 = old_repr->duplicate(xml_doc); parent->appendChild(copy2); SPObject *new_obj2 = doc->getObjectByRepr(copy2); @@ -472,18 +472,18 @@ static bool sp_spray_recursive(SPDesktop *desktop, // Move around the cursor Geom::Point move = (Geom::Point(cos(tilt)*cos(dp)*dr/(1-ratio)+sin(tilt)*sin(dp)*dr/(1+ratio), -sin(tilt)*cos(dp)*dr/(1-ratio)+cos(tilt)*sin(dp)*dr/(1+ratio)))+(p-a->midpoint()); - Geom::Point center=father->getCenter(); + Geom::Point center = parent_item->getCenter(); sp_spray_scale_rel(center, desktop, item_copied, Geom::Scale(_scale, _scale)); sp_spray_scale_rel(center, desktop, item_copied, Geom::Scale(scale, scale)); sp_spray_rotate_rel(center, desktop, item_copied, Geom::Rotate(angle)); sp_item_move_rel(item_copied, Geom::Translate(move[Geom::X], -move[Geom::Y])); - // union and duplication + // Union and duplication selection->clear(); selection->add(item_copied); selection->add(unionResult); sp_selected_path_union_skip_undo(selection, selection->desktop()); - selection->add(father); + selection->add(parent_item); Inkscape::GC::release(copy2); did = true; } @@ -500,15 +500,15 @@ static bool sp_spray_recursive(SPDesktop *desktop, // Creation of the clone Inkscape::XML::Node *clone = xml_doc->createElement("svg:use"); - // Ad the clone to the list of the father's sons + // Ad the clone to the list of the parent's children parent->appendChild(clone); - // Generates the link between father and son attributes + // Generates the link between parent and child attributes gchar *href_str = g_strdup_printf("#%s", old_repr->attribute("id")); clone->setAttribute("xlink:href", href_str, false); g_free(href_str); SPObject *clone_object = doc->getObjectByRepr(clone); - // conversion object->item + // Conversion object->item item_copied = SP_ITEM(clone_object); Geom::Point center = item->getCenter(); sp_spray_scale_rel(center, desktop, item_copied, Geom::Scale(_scale, _scale)); @@ -582,9 +582,9 @@ static void sp_spray_update_area(SprayTool *tc) static void sp_spray_switch_mode(SprayTool *tc, gint mode, bool with_shift) { - // select the button mode + // Select the button mode SP_EVENT_CONTEXT(tc)->desktop->setToolboxSelectOneValue("spray_tool_mode", mode); - // need to set explicitly, because the prefs may not have changed by the previous + // Need to set explicitly, because the prefs may not have changed by the previous tc->mode = mode; tc->update_cursor(with_shift); } @@ -631,7 +631,7 @@ bool SprayTool::root_handler(GdkEvent* event) { Geom::Point motion_doc(desktop->dt2doc(motion_dt)); sp_spray_extinput(this, event); - // draw the dilating cursor + // Draw the dilating cursor double radius = get_dilate_radius(this); Geom::Affine const sm (Geom::Scale(radius/(1-this->ratio), radius/(1+this->ratio)) ); sp_canvas_item_affine_absolute(this->dilate_area, (sm*Geom::Rotate(this->tilt))*Geom::Translate(desktop->w2d(motion_w))); @@ -645,19 +645,19 @@ bool SprayTool::root_handler(GdkEvent* event) { this->message_context->flash(Inkscape::ERROR_MESSAGE, _("Nothing selected! Select objects to spray.")); } - // dilating: + // Dilating: if (this->is_drawing && ( event->motion.state & GDK_BUTTON1_MASK )) { sp_spray_dilate(this, motion_w, motion_doc, motion_doc - this->last_push, event->button.state & GDK_SHIFT_MASK? true : false); //this->last_push = motion_doc; this->has_dilated = true; - // it's slow, so prevent clogging up with events + // It's slow, so prevent clogging up with events gobble_motion_events(GDK_BUTTON1_MASK); return TRUE; } } break; - /*Spray with the scroll*/ + /* Spray with the scroll */ case GDK_SCROLL: { if (event->scroll.state & GDK_BUTTON1_MASK) { double temp ; @@ -708,7 +708,7 @@ bool SprayTool::root_handler(GdkEvent* event) { if (this->is_dilating && event->button.button == 1 && !this->space_panning) { if (!this->has_dilated) { - // if we did not rub, do a light tap + // If we did not rub, do a light tap this->pressure = 0.03; sp_spray_dilate(this, motion_w, desktop->dt2doc(motion_dt), Geom::Point(0,0), MOD__SHIFT(event)); } @@ -784,7 +784,7 @@ bool SprayTool::root_handler(GdkEvent* event) { if (this->width > 1.0) { this->width = 1.0; } - // the same spinbutton is for alt+x + // The same spinbutton is for alt+x desktop->setToolboxAdjustmentValue("altx-spray", this->width * 100); sp_spray_update_area(this); ret = TRUE; -- cgit v1.2.3 From 6d85f09d7bbba1f61710b0d365892608bbb52d15 Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Wed, 5 Feb 2014 18:42:44 +0100 Subject: typos in symbols (bzr r12998) --- share/symbols/AigaSymbols.svg | 16 ++++++++-------- share/symbols/MapSymbols.svg | 6 +++--- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/share/symbols/AigaSymbols.svg b/share/symbols/AigaSymbols.svg index 946633315..3ac907e61 100644 --- a/share/symbols/AigaSymbols.svg +++ b/share/symbols/AigaSymbols.svg @@ -241,7 +241,7 @@ - Bagage Lockers + Baggage Lockers @@ -251,7 +251,7 @@ - Bagage Lockers + Baggage Lockers @@ -1241,7 +1241,7 @@ - NPS Wheelchair Accessable - 1996 + NPS Wheelchair Accessible - 1996 @@ -1250,7 +1250,7 @@ - NPS Wheelchair Accessable - 1996 + NPS Wheelchair Accessible - 1996 @@ -1260,7 +1260,7 @@ - NPS Wheelchair Accessable + NPS Wheelchair Accessible @@ -1269,7 +1269,7 @@ - NPS Wheelchair Accessable + NPS Wheelchair Accessible @@ -1279,7 +1279,7 @@ - New Wheelchair Accessable + New Wheelchair Accessible @@ -1288,7 +1288,7 @@ - New Wheelchair Accessable + New Wheelchair Accessible diff --git a/share/symbols/MapSymbols.svg b/share/symbols/MapSymbols.svg index 0d3e1b0fa..4fccc0492 100644 --- a/share/symbols/MapSymbols.svg +++ b/share/symbols/MapSymbols.svg @@ -1911,7 +1911,7 @@ -Leasure Center +Leisure Center @@ -2098,7 +2098,7 @@ -Park / Picnick Area +Park / Picnic Area @@ -2134,7 +2134,7 @@ -Intormation +Information -- cgit v1.2.3 From 117355143b86a73456afde15eefea3b472f2b01c Mon Sep 17 00:00:00 2001 From: Yuri Chornoivan Date: Wed, 5 Feb 2014 18:48:21 +0100 Subject: Ukrainian translation update (bzr r12999) --- po/uk.po | 3851 +++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 2920 insertions(+), 931 deletions(-) diff --git a/po/uk.po b/po/uk.po index 27ee4e328..59fdd68bd 100644 --- a/po/uk.po +++ b/po/uk.po @@ -3,17 +3,17 @@ # This file is distributed under the same license as the Inkscape package. # Copyright (C) 2001, 2007, 2008, 2009 Free Software Foundation, Inc. # +#: ../share/filters/filters.svg.h:1 # Yuri Syrota , 2000. # Maxim Dziumanenko , 2004-2007. # Alex , 2005. -# Yuri Chornoivan , 2007, 2008, 2009, 2010, 2011, 2012, 2013. -#: ../share/filters/filters.svg.h:1 +# Yuri Chornoivan , 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014. msgid "" msgstr "" "Project-Id-Version: uk\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2013-12-31 11:34+0200\n" -"PO-Revision-Date: 2013-12-31 14:55+0200\n" +"POT-Creation-Date: 2014-02-05 19:26+0200\n" +"PO-Revision-Date: 2014-02-05 19:30+0200\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -1008,7 +1008,7 @@ msgstr "Чорне світло" #: ../src/extension/internal/filter/transparency.h:345 #: ../src/filter-enums.cpp:67 ../src/ui/dialog/clonetiler.cpp:832 #: ../src/ui/dialog/clonetiler.cpp:983 -#: ../src/ui/dialog/document-properties.cpp:153 +#: ../src/ui/dialog/document-properties.cpp:154 #: ../share/extensions/color_blackandwhite.inx.h:2 #: ../share/extensions/color_brighter.inx.h:2 #: ../share/extensions/color_custom.inx.h:15 @@ -3296,6 +3296,1862 @@ msgstr "Сукно (растр)" msgid "Old paint (bitmap)" msgstr "Стара картина (растр)" +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:2 +msgctxt "Symbol" +msgid "Flow Chart Shapes" +msgstr "Форми блок-схем" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:3 +msgctxt "Symbol" +msgid "Process" +msgstr "Обробляти" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:4 +msgctxt "Symbol" +msgid "Predefined Process" +msgstr "Наперед визначений процес" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:5 +msgctxt "Symbol" +msgid "Alternate Process" +msgstr "Альтернативний процес" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:6 +msgctxt "Symbol" +msgid "Extract" +msgstr "Видобування" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:7 +msgctxt "Symbol" +msgid "Manual Input" +msgstr "Ручний ввід" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:8 +msgctxt "Symbol" +msgid "Merge" +msgstr "Об’єднання" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:9 +msgctxt "Symbol" +msgid "Delay" +msgstr "Затримка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:10 +msgctxt "Symbol" +msgid "Data I/O" +msgstr "Введення-виведення даних" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:11 +msgctxt "Symbol" +msgid "Internal Storage" +msgstr "Внутрішня пам'ять" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:12 +msgctxt "Symbol" +msgid "Card" +msgstr "Картка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:13 +msgctxt "Symbol" +msgid "Document" +msgstr "Документ" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:14 +msgctxt "Symbol" +msgid "Direct Access Storage" +msgstr "Сховище даних безпосереднього доступу" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:15 +msgctxt "Symbol" +msgid "Stored Data" +msgstr "Збережені дані" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:16 +msgctxt "Symbol" +msgid "Magnetic Disk (Database)" +msgstr "Магнітний диск (база даних)" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:17 +msgctxt "Symbol" +msgid "Punched Tape" +msgstr "Перфострічка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:18 +msgctxt "Symbol" +msgid "Terminator" +msgstr "Завершення" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:19 +msgctxt "Symbol" +msgid "Thick Arrow" +msgstr "Товста стрілка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:20 +msgctxt "Symbol" +msgid "Transfer" +msgstr "Передавання" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:21 +msgctxt "Symbol" +msgid "Decision" +msgstr "Рішення" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:22 +msgctxt "Symbol" +msgid "Flow Arrow" +msgstr "Стрілка потоку" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:23 +msgctxt "Symbol" +msgid "Circle Arrow" +msgstr "Кругова стрілка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:24 +msgctxt "Symbol" +msgid "Off-Page Connector" +msgstr "З'єднання поза сторінкою" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:25 +msgctxt "Symbol" +msgid "Connector" +msgstr "З’єднання" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:26 +msgctxt "Symbol" +msgid "Logical Or" +msgstr "Логічне «АБО»" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:27 +msgctxt "Symbol" +msgid "Logical And" +msgstr "Логічне «ТА»" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:28 +msgctxt "Symbol" +msgid "Manual Operation" +msgstr "Ручна дія" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:29 +msgctxt "Symbol" +msgid "Preparation" +msgstr "Підготовка" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:30 +msgctxt "Symbol" +msgid "Display" +msgstr "Показ" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:31 +msgctxt "Symbol" +msgid "Sort" +msgstr "Упорядкування" + +#. Symbols: ./FlowSymbols.svg +#: ../share/symbols/symbols.h:32 +msgctxt "Symbol" +msgid "Collate" +msgstr "Об’єднання" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:33 +msgctxt "Symbol" +msgid "Word Balloons" +msgstr "Мовні бульки" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:34 +msgctxt "Symbol" +msgid "Thought Balloon" +msgstr "Бульки думок" + +#. Symbols: ./BalloonSymbols.svg +#: ../share/symbols/symbols.h:35 +msgctxt "Symbol" +msgid "Dream Speaking" +msgstr "Висловлення мрій" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:36 +msgctxt "Symbol" +msgid "Map Symbols" +msgstr "Символи карт" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:37 +msgctxt "Symbol" +msgid "Bed and Breakfast" +msgstr "Ночівля і сніданок" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:38 +msgctxt "Symbol" +msgid "Youth Hostel" +msgstr "Молодіжний гуртожиток" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:39 +msgctxt "Symbol" +msgid "Shelter" +msgstr "Притулок" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:40 +msgctxt "Symbol" +msgid "Motel" +msgstr "Мотель" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:41 +msgctxt "Symbol" +msgid "Hotel" +msgstr "Готель" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:42 +msgctxt "Symbol" +msgid "Hostel" +msgstr "Турбаза" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:43 +msgctxt "Symbol" +msgid "Chalet" +msgstr "Шале" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:44 +msgctxt "Symbol" +msgid "Caravan Park" +msgstr "Стоянка для фургонів" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:45 +msgctxt "Symbol" +msgid "Camping" +msgstr "Кемпінг" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:46 +msgctxt "Symbol" +msgid "Alpine Hut" +msgstr "Альпійська хижа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:47 +msgctxt "Symbol" +msgid "Bench or Park" +msgstr "Лава або парк" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:48 +msgctxt "Symbol" +msgid "Playground" +msgstr "Ігровий майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:49 +msgctxt "Symbol" +msgid "Fountain" +msgstr "Фонтан" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:50 +msgctxt "Symbol" +msgid "Library" +msgstr "Бібліотека" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:51 +msgctxt "Symbol" +msgid "Town Hall" +msgstr "Ратуша" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:52 +msgctxt "Symbol" +msgid "Court" +msgstr "Суд" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:53 +msgctxt "Symbol" +msgid "Fire Station / House" +msgstr "Пожежна станція" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:54 +msgctxt "Symbol" +msgid "Police Station" +msgstr "Поліційна дільниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:55 +msgctxt "Symbol" +msgid "Prison" +msgstr "В’язниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:56 +msgctxt "Symbol" +msgid "Post Office" +msgstr "Поштове відділення" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:57 +msgctxt "Symbol" +msgid "Public Building" +msgstr "Громадська будівля" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:58 +msgctxt "Symbol" +msgid "Recycling" +msgstr "Пункт переробки" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:59 +msgctxt "Symbol" +msgid "Survey Point" +msgstr "Оглядовий майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:60 +msgctxt "Symbol" +msgid "Toll Booth" +msgstr "Будка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:61 +msgctxt "Symbol" +msgid "Lift Gate" +msgstr "Підйомні ворота" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:62 +msgctxt "Symbol" +msgid "Steps" +msgstr "Сходи" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:63 +msgctxt "Symbol" +msgid "Stile" +msgstr "Турнікет" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:64 +msgctxt "Symbol" +msgid "Kissing Gate" +msgstr "Вузька хвіртка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:65 +msgctxt "Symbol" +msgid "Gate" +msgstr "Ворота" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:66 ../share/symbols/symbols.h:295 +#: ../share/symbols/symbols.h:296 +msgctxt "Symbol" +msgid "Exit" +msgstr "Вихід" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:67 +msgctxt "Symbol" +msgid "Entrance" +msgstr "Вхід" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:68 +msgctxt "Symbol" +msgid "Cycle Barrier" +msgstr "Круговий бар’єр" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:69 +msgctxt "Symbol" +msgid "Cattle Grid" +msgstr "Огорожа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:70 +msgctxt "Symbol" +msgid "Bollard" +msgstr "Пал" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:71 +msgctxt "Symbol" +msgid "University" +msgstr "Університет" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:72 +msgctxt "Symbol" +msgid "High/Secondary School" +msgstr "Школа третього ступеня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:73 +msgctxt "Symbol" +msgid "School" +msgstr "Школа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:74 +msgctxt "Symbol" +msgid "Kindergatten" +msgstr "Дитячий садок" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:75 ../share/symbols/symbols.h:229 +#: ../share/symbols/symbols.h:230 +msgctxt "Symbol" +msgid "Nursery" +msgstr "Ясла" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:76 ../share/symbols/symbols.h:255 +#: ../share/symbols/symbols.h:256 +msgctxt "Symbol" +msgid "Restaurant" +msgstr "Ресторан" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:77 +msgctxt "Symbol" +msgid "Pub" +msgstr "Пив’ярня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:78 +msgctxt "Symbol" +msgid "Deserts/Cakes Shop" +msgstr "Десерти та печиво" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:79 +msgctxt "Symbol" +msgid "Fast Food" +msgstr "Фастфуд" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:80 +msgctxt "Symbol" +msgid "Public Tap/Water" +msgstr "Соки і води" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:81 +msgctxt "Symbol" +msgid "Cafe" +msgstr "Кав’ярня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:82 +msgctxt "Symbol" +msgid "Beer Garden" +msgstr "Пивний сад" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:83 +msgctxt "Symbol" +msgid "Wine Bar" +msgstr "Бар" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:84 +msgctxt "Symbol" +msgid "Opticians/Eye Doctors" +msgstr "Окуліст" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:85 +msgctxt "Symbol" +msgid "Dentist" +msgstr "Дантист" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:86 +msgctxt "Symbol" +msgid "Veterinarian" +msgstr "Ветеринарія" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:87 +msgctxt "Symbol" +msgid "Drugs Dispensary" +msgstr "Аптека" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:88 +msgctxt "Symbol" +msgid "Pharmacy" +msgstr "Аптека" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:89 +msgctxt "Symbol" +msgid "Accident & Emergency" +msgstr "Служби реагування на надзвичайні ситуації" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:90 +msgctxt "Symbol" +msgid "Hospital" +msgstr "Лікарня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:91 +msgctxt "Symbol" +msgid "Doctors" +msgstr "Лікар" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:92 +msgctxt "Symbol" +msgid "Scrub Land" +msgstr "Чагарники" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:93 +msgctxt "Symbol" +msgid "Swamp" +msgstr "Болото" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:94 +msgctxt "Symbol" +msgid "Hills" +msgstr "Пагорби" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:95 +msgctxt "Symbol" +msgid "Grass Land" +msgstr "Луки" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:96 +msgctxt "Symbol" +msgid "Deciduous Forest" +msgstr "Листяний ліс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:97 +msgctxt "Symbol" +msgid "Mixed Forest" +msgstr "Мішаний ліс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:98 +msgctxt "Symbol" +msgid "Coniferous Forest" +msgstr "Хвойний ліс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:99 +msgctxt "Symbol" +msgid "Church or Place of Worship" +msgstr "Церква або місце поклоніння" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:100 +msgctxt "Symbol" +msgid "Bank" +msgstr "Банк" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:101 +msgctxt "Symbol" +msgid "Power Lines" +msgstr "Лінії електропередачі" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:102 +msgctxt "Symbol" +msgid "Watch Tower" +msgstr "Спостережна вежа" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:103 +msgctxt "Symbol" +msgid "Transmitter" +msgstr "Радіопередавач" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:104 +msgctxt "Symbol" +msgid "Village" +msgstr "Село" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:105 +msgctxt "Symbol" +msgid "Town" +msgstr "Місто" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:106 +msgctxt "Symbol" +msgid "Hamlet" +msgstr "Хутір" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:107 +msgctxt "Symbol" +msgid "City" +msgstr "Місто" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:108 +msgctxt "Symbol" +msgid "Peak" +msgstr "Пік" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:109 +msgctxt "Symbol" +msgid "Mountain Pass" +msgstr "Ущелина" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:110 +msgctxt "Symbol" +msgid "Mine" +msgstr "Шахта" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:111 +msgctxt "Symbol" +msgid "Military Complex" +msgstr "Військовий комплекс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:112 +msgctxt "Symbol" +msgid "Embassy" +msgstr "Посольство" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:113 +msgctxt "Symbol" +msgid "Toy Shop" +msgstr "Магазин іграшок" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:114 +msgctxt "Symbol" +msgid "Supermarket" +msgstr "Супермаркет" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:115 +msgctxt "Symbol" +msgid "Jewlers" +msgstr "Ювелірна крамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:116 +msgctxt "Symbol" +msgid "Hairdressers" +msgstr "Перукарня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:117 +msgctxt "Symbol" +msgid "Greengrocer" +msgstr "Овочевий магазин" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:118 +msgctxt "Symbol" +msgid "Gift Shop" +msgstr "Магазин подарунків" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:119 +msgctxt "Symbol" +msgid "Garden Center" +msgstr "Садовий центр" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:120 +msgctxt "Symbol" +msgid "Florist" +msgstr "Квіткова крамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:121 +msgctxt "Symbol" +msgid "Fish Monger" +msgstr "Торгівля рибою" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:122 +msgctxt "Symbol" +msgid "Real Estate" +msgstr "Агенція нерухомості" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:123 +msgctxt "Symbol" +msgid "Hardware / DIY" +msgstr "Обладнання і торгівля запчастинами" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:124 +msgctxt "Symbol" +msgid "Shop" +msgstr "Крамниці" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:125 +msgctxt "Symbol" +msgid "Confectioner" +msgstr "Кондитерська" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:126 +msgctxt "Symbol" +msgid "Computer Shop" +msgstr "Комп’ютерна крамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:127 +msgctxt "Symbol" +msgid "Clothing" +msgstr "Торгівля одягом" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:128 +msgctxt "Symbol" +msgid "Mechanic" +msgstr "Механічна майстерня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:129 +msgctxt "Symbol" +msgid "Car Dealer" +msgstr "Продаж автомобілів" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:130 +msgctxt "Symbol" +msgid "Butcher" +msgstr "Торгівля м’ясом" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:131 +msgctxt "Symbol" +msgid "Meat Shop" +msgstr "М’ясні вироби" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:132 +msgctxt "Symbol" +msgid "Bicycle Shop" +msgstr "Велокрамниця" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:133 +msgctxt "Symbol" +msgid "Baker" +msgstr "Пекарня" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:134 +msgctxt "Symbol" +msgid "Off License / Liquor Store" +msgstr "Торгівля спиртними напоями" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:135 +msgctxt "Symbol" +msgid "Wind Surfing" +msgstr "Віндсерфінг" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:136 +msgctxt "Symbol" +msgid "Tennis" +msgstr "Теніс" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:137 +msgctxt "Symbol" +msgid "Outdoor Pool" +msgstr "Відкритий басейн" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:138 +msgctxt "Symbol" +msgid "Indoor Pool" +msgstr "Критий басейн" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:139 +msgctxt "Symbol" +msgid "Skiing" +msgstr "Катання на лижах" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:140 +msgctxt "Symbol" +msgid "Sailing" +msgstr "Парусний спорт" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:141 +msgctxt "Symbol" +msgid "Leisure Center" +msgstr "Центр дозвілля" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:142 +msgctxt "Symbol" +msgid "Ice Skating" +msgstr "Катання на ковзанах" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:143 +msgctxt "Symbol" +msgid "Equine Sports" +msgstr "Кінний спорт" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:144 +msgctxt "Symbol" +msgid "Rock Climbing" +msgstr "Скелелазання" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:145 +msgctxt "Symbol" +msgid "Gym" +msgstr "Тренажерна зала" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:146 +msgctxt "Symbol" +msgid "Golf" +msgstr "Гольф" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:147 +msgctxt "Symbol" +msgid "Diving" +msgstr "Пірнання" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:148 +msgctxt "Symbol" +msgid "Archery" +msgstr "Стрільба з лука" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:149 +msgctxt "Symbol" +msgid "Zoo" +msgstr "Зоопарк" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:150 +msgctxt "Symbol" +msgid "Wreck" +msgstr "Місце катастрофи" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:151 +msgctxt "Symbol" +msgid "Water Wheel" +msgstr "Водяне колесо" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:152 +msgctxt "Symbol" +msgid "Point of Interest" +msgstr "Цікаве місце" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:153 +msgctxt "Symbol" +msgid "Theater" +msgstr "Театр" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:154 +msgctxt "Symbol" +msgid "Park / Picnic Area" +msgstr "Парк і місця для пікніків" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:155 +msgctxt "Symbol" +msgid "Monument" +msgstr "Монумент" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:156 ../share/symbols/symbols.h:235 +#: ../share/symbols/symbols.h:236 +msgctxt "Symbol" +msgid "Information" +msgstr "Довідкова служба" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:157 +msgctxt "Symbol" +msgid "Beach" +msgstr "Пляж" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:158 +msgctxt "Symbol" +msgid "Battle Location" +msgstr "Місце битви" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:159 +msgctxt "Symbol" +msgid "Archaeology / Ruins" +msgstr "Археологічна пам’ятка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:160 +msgctxt "Symbol" +msgid "Walking" +msgstr "Піший маршрут" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:161 +msgctxt "Symbol" +msgid "Train" +msgstr "Потяг" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:162 ../share/symbols/symbols.h:243 +#: ../share/symbols/symbols.h:244 +msgctxt "Symbol" +msgid "Taxi" +msgstr "Таксі" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:163 +msgctxt "Symbol" +msgid "Underground Rail" +msgstr "Метро" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:164 ../share/symbols/symbols.h:253 +#: ../share/symbols/symbols.h:254 +msgctxt "Symbol" +msgid "Car Rental" +msgstr "Оренда автомобілів" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:165 +msgctxt "Symbol" +msgid "Bike Rental" +msgstr "Оренда велосипедів" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:166 ../share/symbols/symbols.h:241 +#: ../share/symbols/symbols.h:242 +msgctxt "Symbol" +msgid "Heliport" +msgstr "Вертодром" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:167 +msgctxt "Symbol" +msgid "Carpool" +msgstr "Автостоп" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:168 +msgctxt "Symbol" +msgid "Flood Gate" +msgstr "Шлюз" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:169 +msgctxt "Symbol" +msgid "Shipping" +msgstr "Перевезення кораблем" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:170 +msgctxt "Symbol" +msgid "Disabled Parking" +msgstr "Паркування для осіб з обмеженими можливостями" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:171 +msgctxt "Symbol" +msgid "Paid Parking" +msgstr "Платний паркувальний майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:172 +msgctxt "Symbol" +msgid "Bike Parking" +msgstr "Велопаркінґ" + +#. Symbols: ./MapSymbols.svg +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:173 ../share/symbols/symbols.h:287 +#: ../share/symbols/symbols.h:288 +msgctxt "Symbol" +msgid "Parking" +msgstr "Паркувальний майданчик" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:174 +msgctxt "Symbol" +msgid "Marina" +msgstr "Пристань" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:175 +msgctxt "Symbol" +msgid "Fuel Station" +msgstr "Заправна станція" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:176 +msgctxt "Symbol" +msgid "Bus Stop" +msgstr "Автобусна зупинка" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:177 +msgctxt "Symbol" +msgid "Bus Station" +msgstr "Автостанція" + +#. Symbols: ./MapSymbols.svg +#: ../share/symbols/symbols.h:178 +msgctxt "Symbol" +msgid "Airport" +msgstr "Аеропорт" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:179 +msgctxt "Symbol" +msgid "Logic Symbols" +msgstr "Символи логіки" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:180 +msgctxt "Symbol" +msgid "Xnor Gate" +msgstr "Ключ виключне заперечувальне АБО»" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:181 +msgctxt "Symbol" +msgid "Xor Gate" +msgstr "Ключ виключне І" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:182 +msgctxt "Symbol" +msgid "Nor Gate" +msgstr "Ключ АБО-НІ" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:183 +msgctxt "Symbol" +msgid "Or Gate" +msgstr "Ключ АБО" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:184 +msgctxt "Symbol" +msgid "Nand Gate" +msgstr "Ключ І-НІ" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:185 +msgctxt "Symbol" +msgid "And Gate" +msgstr "Ключ І" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:186 +msgctxt "Symbol" +msgid "Buffer" +msgstr "Буфер" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:187 +msgctxt "Symbol" +msgid "Not Gate" +msgstr "Ключ НІ" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:188 +msgctxt "Symbol" +msgid "Buffer Small" +msgstr "Малий буфер" + +#. Symbols: ./LogicSymbols.svg +#: ../share/symbols/symbols.h:189 +msgctxt "Symbol" +msgid "Not Gate Small" +msgstr "Малий ключ НІ" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:190 +msgctxt "Symbol" +msgid "AIGA Symbol Signs" +msgstr "Знаки-символи AIGA" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:191 ../share/symbols/symbols.h:192 +msgctxt "Symbol" +msgid "Telephone" +msgstr "Телефон" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:193 ../share/symbols/symbols.h:194 +msgctxt "Symbol" +msgid "Mail" +msgstr "Пошта" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:195 ../share/symbols/symbols.h:196 +msgctxt "Symbol" +msgid "Currency Exchange" +msgstr "Обмін валют" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:197 ../share/symbols/symbols.h:198 +msgctxt "Symbol" +msgid "Currency Exchange - Euro" +msgstr "Обмін валют — євро" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:199 ../share/symbols/symbols.h:200 +msgctxt "Symbol" +msgid "Cashier" +msgstr "Каса" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:201 ../share/symbols/symbols.h:202 +msgctxt "Symbol" +msgid "First Aid" +msgstr "Перша допомога" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:203 ../share/symbols/symbols.h:204 +msgctxt "Symbol" +msgid "Lost and Found" +msgstr "Втрачено і знайдено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:205 ../share/symbols/symbols.h:206 +msgctxt "Symbol" +msgid "Coat Check" +msgstr "Гардероб" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:207 ../share/symbols/symbols.h:208 +msgctxt "Symbol" +msgid "Baggage Lockers" +msgstr "Шафи для зберігання речей" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:209 ../share/symbols/symbols.h:210 +msgctxt "Symbol" +msgid "Escalator" +msgstr "Ескалатор" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:211 ../share/symbols/symbols.h:212 +msgctxt "Symbol" +msgid "Escalator Down" +msgstr "Ескалатор вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:213 ../share/symbols/symbols.h:214 +msgctxt "Symbol" +msgid "Escalator Up" +msgstr "Ескалатор вгору" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:215 ../share/symbols/symbols.h:216 +msgctxt "Symbol" +msgid "Stairs" +msgstr "Сходи" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:217 ../share/symbols/symbols.h:218 +msgctxt "Symbol" +msgid "Stairs Down" +msgstr "Сходи вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:219 ../share/symbols/symbols.h:220 +msgctxt "Symbol" +msgid "Stairs Up" +msgstr "Сходи вгору" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:221 ../share/symbols/symbols.h:222 +msgctxt "Symbol" +msgid "Elevator" +msgstr "Ліфт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:223 ../share/symbols/symbols.h:224 +msgctxt "Symbol" +msgid "Toilets - Men" +msgstr "Чоловічий туалет" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:225 ../share/symbols/symbols.h:226 +msgctxt "Symbol" +msgid "Toilets - Women" +msgstr "Жіночий туалет" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:227 ../share/symbols/symbols.h:228 +msgctxt "Symbol" +msgid "Toilets" +msgstr "Туалети" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:231 ../share/symbols/symbols.h:232 +msgctxt "Symbol" +msgid "Drinking Fountain" +msgstr "Питний фонтанчик" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:233 ../share/symbols/symbols.h:234 +msgctxt "Symbol" +msgid "Waiting Room" +msgstr "Зала очікування" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:237 ../share/symbols/symbols.h:238 +msgctxt "Symbol" +msgid "Hotel Information" +msgstr "Інформація щодо готелів" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:239 ../share/symbols/symbols.h:240 +msgctxt "Symbol" +msgid "Air Transportation" +msgstr "Повітряний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:245 ../share/symbols/symbols.h:246 +msgctxt "Symbol" +msgid "Bus" +msgstr "Автобус" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:247 ../share/symbols/symbols.h:248 +msgctxt "Symbol" +msgid "Ground Transportation" +msgstr "Наземний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:249 ../share/symbols/symbols.h:250 +msgctxt "Symbol" +msgid "Rail Transportation" +msgstr "Залізничний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:251 ../share/symbols/symbols.h:252 +msgctxt "Symbol" +msgid "Water Transportation" +msgstr "Водний транспорт" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:257 ../share/symbols/symbols.h:258 +msgctxt "Symbol" +msgid "Coffeeshop" +msgstr "Кав’ярня" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:259 ../share/symbols/symbols.h:260 +msgctxt "Symbol" +msgid "Bar" +msgstr "Бар" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:261 ../share/symbols/symbols.h:262 +msgctxt "Symbol" +msgid "Shops" +msgstr "Крамниці" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:263 ../share/symbols/symbols.h:264 +msgctxt "Symbol" +msgid "Barber Shop - Beauty Salon" +msgstr "Перукарня і салон краси" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:265 ../share/symbols/symbols.h:266 +msgctxt "Symbol" +msgid "Barber Shop" +msgstr "Перукарня" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:267 ../share/symbols/symbols.h:268 +msgctxt "Symbol" +msgid "Beauty Salon" +msgstr "Салон краси" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:269 ../share/symbols/symbols.h:270 +msgctxt "Symbol" +msgid "Ticket Purchase" +msgstr "Придбання квитків" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:271 ../share/symbols/symbols.h:272 +msgctxt "Symbol" +msgid "Baggage Check In" +msgstr "Приймання багажу" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:273 ../share/symbols/symbols.h:274 +msgctxt "Symbol" +msgid "Baggage Claim" +msgstr "Видача багажу" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:275 ../share/symbols/symbols.h:276 +msgctxt "Symbol" +msgid "Customs" +msgstr "Митні послуги" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:277 ../share/symbols/symbols.h:278 +msgctxt "Symbol" +msgid "Immigration" +msgstr "Міграційна служба" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:279 ../share/symbols/symbols.h:280 +msgctxt "Symbol" +msgid "Departing Flights" +msgstr "Відправлення" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:281 ../share/symbols/symbols.h:282 +msgctxt "Symbol" +msgid "Arriving Flights" +msgstr "Прибуття" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:283 ../share/symbols/symbols.h:284 +msgctxt "Symbol" +msgid "Smoking" +msgstr "Місце для куріння" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:285 ../share/symbols/symbols.h:286 +msgctxt "Symbol" +msgid "No Smoking" +msgstr "Куріння заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:289 ../share/symbols/symbols.h:290 +msgctxt "Symbol" +msgid "No Parking" +msgstr "Паркування заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:291 ../share/symbols/symbols.h:292 +msgctxt "Symbol" +msgid "No Dogs" +msgstr "Вигулювання собак заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:293 ../share/symbols/symbols.h:294 +msgctxt "Symbol" +msgid "No Entry" +msgstr "Вхід заборонено" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:297 ../share/symbols/symbols.h:298 +msgctxt "Symbol" +msgid "Fire Extinguisher" +msgstr "Вогнегасник" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:299 ../share/symbols/symbols.h:300 +msgctxt "Symbol" +msgid "Right Arrow" +msgstr "Стрілка праворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:301 ../share/symbols/symbols.h:302 +msgctxt "Symbol" +msgid "Forward and Right Arrow" +msgstr "Стрілка вперед і праворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:303 ../share/symbols/symbols.h:304 +msgctxt "Symbol" +msgid "Up Arrow" +msgstr "Стрілка вгору" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:305 ../share/symbols/symbols.h:306 +msgctxt "Symbol" +msgid "Forward and Left Arrow" +msgstr "Стрілка вперед і ліворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:307 ../share/symbols/symbols.h:308 +msgctxt "Symbol" +msgid "Left Arrow" +msgstr "Стрілка ліворуч" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:309 ../share/symbols/symbols.h:310 +msgctxt "Symbol" +msgid "Left and Down Arrow" +msgstr "Стрілка ліворуч і вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:311 ../share/symbols/symbols.h:312 +msgctxt "Symbol" +msgid "Down Arrow" +msgstr "Стрілка вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:313 ../share/symbols/symbols.h:314 +msgctxt "Symbol" +msgid "Right and Down Arrow" +msgstr "Стрілка праворуч і вниз" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:315 ../share/symbols/symbols.h:316 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessible - 1996" +msgstr "Візок NPS — 1996" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:317 ../share/symbols/symbols.h:318 +msgctxt "Symbol" +msgid "NPS Wheelchair Accessible" +msgstr "Візок NPS" + +#. Symbols: ./AigaSymbols.svg +#: ../share/symbols/symbols.h:319 ../share/symbols/symbols.h:320 +msgctxt "Symbol" +msgid "New Wheelchair Accessible" +msgstr "Новий візок" + +#: ../share/templates/templates.h:1 +msgid "A4 Landscape Page" +msgstr "Сторінка A4, альбомна орієнтація" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 landscape sheet" +msgstr "Порожній аркуш A4, альбомна орієнтація" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty landscape" +msgstr "Порожній аркуш A4, альбомна орієнтація" + +#: ../share/templates/templates.h:1 +msgid "A4 Page" +msgstr "Сторінка A4" + +#: ../share/templates/templates.h:1 +msgid "Empty A4 sheet" +msgstr "Порожній аркуш A4" + +#: ../share/templates/templates.h:1 +msgid "A4 paper sheet empty" +msgstr "Порожній аркуш A4" + +#: ../share/templates/templates.h:1 +msgid "Black Opaque" +msgstr "Чорна непрозора" + +#: ../share/templates/templates.h:1 +msgid "Empty black page" +msgstr "Порожня чорна сторінка" + +#: ../share/templates/templates.h:1 +msgid "black opaque empty" +msgstr "порожня чорна непрозора" + +#: ../share/templates/templates.h:1 +msgid "White Opaque" +msgstr "Біла непрозора" + +#: ../share/templates/templates.h:1 +msgid "Empty white page" +msgstr "Порожня біла сторінка" + +#: ../share/templates/templates.h:1 +msgid "white opaque empty" +msgstr "порожня біла непрозора" + +#: ../share/templates/templates.h:1 +msgid "Business Card 85x54mm" +msgstr "Візитівка 85⨯54 мм" + +#: ../share/templates/templates.h:1 +msgid "Empty business card template." +msgstr "Шаблон порожньої візитівки." + +#: ../share/templates/templates.h:1 +msgid "business card empty 85x54" +msgstr "порожня візитівка 85⨯54" + +#: ../share/templates/templates.h:1 +msgid "Business Card 90x50mm" +msgstr "Візитівка 90⨯50 мм" + +#: ../share/templates/templates.h:1 +msgid "business card empty 90x50" +msgstr "порожня візитівка 90⨯50" + +#: ../share/templates/templates.h:1 +msgid "CD Cover 300dpi" +msgstr "Обкладинка для компакт-диска, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "Empty CD box cover." +msgstr "Порожня обкладинка для коробки з-під компакт-диска." + +#: ../share/templates/templates.h:1 +msgid "CD cover disc disk 300dpi box" +msgstr "Обкладинка для коробки з-під компакт-диска, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "CD Label 120x120 " +msgstr "Наліпка на компакт-диск 120⨯120 " + +#: ../share/templates/templates.h:1 +msgid "Simple CD Label template with disc's pattern." +msgstr "Простий шаблон наліпки на компакт диск з розміткою." + +#: ../share/templates/templates.h:1 +msgid "CD label 120x120 disc disk" +msgstr "Наліпка на компакт-диск, 120⨯120" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Regular 300dpi " +msgstr "Звичайна обкладинка для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD covers." +msgstr "Шаблон для двобічних обкладинок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover regular 300dpi" +msgstr "Звичайна обкладинка для DVD, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Slim 300dpi " +msgstr "Обкладинка тонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD slim covers." +msgstr "Шаблон для двобічних обкладинок тонких коробок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover slim 300dpi" +msgstr "Обкладинка тонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Superslim 300dpi " +msgstr "Обкладинка надтонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD superslim covers." +msgstr "Шаблон для двобічних надтонких обкладинок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover superslim 300dpi" +msgstr "Обкладинка надтонкої коробки для DVD, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "DVD Cover Ultraslim 300dpi " +msgstr "Обкладинка ультратонкої коробки для DVD, 300 т/д " + +#: ../share/templates/templates.h:1 +msgid "Template for both-sides DVD ultraslim covers." +msgstr "Шаблон для двобічних обкладинок ультратонких коробок для DVD." + +#: ../share/templates/templates.h:1 +msgid "DVD cover ultraslim 300dpi" +msgstr "Обкладинка ультратонкої коробки для DVD, 300 т/д" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1024x768" +msgstr "Стільниця 1024⨯768" + +#: ../share/templates/templates.h:1 +msgid "Empty desktop size sheet" +msgstr "Порожній аркуш розміром із зображення стільниці" + +#: ../share/templates/templates.h:1 +msgid "desktop 1024x768 wallpaper" +msgstr "шпалери для стільниці, 1024⨯768" + +#: ../share/templates/templates.h:1 +msgid "Desktop 1600x1200" +msgstr "Стільниця 1600⨯1200" + +#: ../share/templates/templates.h:1 +msgid "desktop 1600x1200 wallpaper" +msgstr "шпалери для стільниці, 1600⨯1200" + +#: ../share/templates/templates.h:1 +msgid "Desktop 640x480" +msgstr "Стільниця 640⨯480" + +#: ../share/templates/templates.h:1 +msgid "desktop 640x480 wallpaper" +msgstr "шпалери для стільниці, 640⨯480" + +#: ../share/templates/templates.h:1 +msgid "Desktop 800x600" +msgstr "Стільниця 800⨯600" + +#: ../share/templates/templates.h:1 +msgid "desktop 800x600 wallpaper" +msgstr "шпалери для стільниці, 800⨯600" + +#: ../share/templates/templates.h:1 +msgid "Fontforge Glyph" +msgstr "Гліф Fontforge" + +#: ../share/templates/templates.h:1 +msgid "font fontforge glyph 1000x1000" +msgstr "гліф шрифту fontforge, 1000⨯1000" + +#: ../share/templates/templates.h:1 +msgid "Icon 16x16" +msgstr "Піктограма 16⨯16" + +#: ../share/templates/templates.h:1 +msgid "Small 16x16 icon template." +msgstr "Шаблон малої піктограми 16⨯16." + +#: ../share/templates/templates.h:1 +msgid "icon 16x16 empty" +msgstr "порожня піктограма 16⨯16" + +#: ../share/templates/templates.h:1 +msgid "Icon 32x32" +msgstr "Піктограма 32⨯32" + +#: ../share/templates/templates.h:1 +msgid "32x32 icon template." +msgstr "Шаблон піктограми 32⨯32." + +#: ../share/templates/templates.h:1 +msgid "icon 32x32 empty" +msgstr "порожня піктограма 32⨯32" + +#: ../share/templates/templates.h:1 +msgid "Icon 48x48" +msgstr "Піктограма 48⨯48" + +#: ../share/templates/templates.h:1 +msgid "48x48 icon template." +msgstr "Шаблон піктограми 48⨯48." + +#: ../share/templates/templates.h:1 +msgid "icon 48x48 empty" +msgstr "порожня піктограма 48⨯48" + +#: ../share/templates/templates.h:1 +msgid "Icon 64x64" +msgstr "Піктограма 64⨯64" + +#: ../share/templates/templates.h:1 +msgid "64x64 icon template." +msgstr "Шаблон піктограми 64⨯64." + +#: ../share/templates/templates.h:1 +msgid "icon 64x64 empty" +msgstr "порожня піктограма 64⨯64" + +#: ../share/templates/templates.h:1 +msgid "Letter Landscape" +msgstr "Лист (альбомна орієнтація)" + +#: ../share/templates/templates.h:1 +msgid "Standard letter landscape sheet - 792x612" +msgstr "Стандартний аркуш листа, альбомна орієнтація — 792⨯612" + +#: ../share/templates/templates.h:1 +msgid "letter landscape 792x612 empty" +msgstr "порожній лист, альбомна орієнтація, 792⨯612" + +#: ../share/templates/templates.h:1 +msgid "Letter" +msgstr "Лист" + +#: ../share/templates/templates.h:1 +msgid "Standard letter sheet - 612x792" +msgstr "Стандартний аркуш листа — 612⨯792" + +#: ../share/templates/templates.h:1 +msgid "letter 612x792 empty" +msgstr "порожній лист 612⨯792" + +#: ../share/templates/templates.h:1 +msgid "No Borders" +msgstr "Без рамки" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no borders" +msgstr "Порожній аркуш без рамки" + +#: ../share/templates/templates.h:1 +msgid "no borders empty" +msgstr "порожній без рамки" + +#: ../share/templates/templates.h:1 +msgid "No Layers" +msgstr "Без шарів" + +#: ../share/templates/templates.h:1 +msgid "Empty sheet with no layers" +msgstr "Порожній аркуш без шарів" + +#: ../share/templates/templates.h:1 +msgid "no layers empty" +msgstr "порожній без шарів" + +#: ../share/templates/templates.h:1 +msgid "Video HDTV 1920x1080" +msgstr "Відео HDTV 1920⨯1080" + +#: ../share/templates/templates.h:1 +msgid "HDTV video template for 1920x1080 resolution." +msgstr "Шаблон відео HDTV для роздільної здатності 1920⨯1080." + +#: ../share/templates/templates.h:1 +msgid "HDTV video empty 1920x1080" +msgstr "порожній шаблон відео HDTV 1920⨯1080" + +#: ../share/templates/templates.h:1 +msgid "Video NTSC 720x486" +msgstr "Відео NTSC 720⨯486" + +#: ../share/templates/templates.h:1 +msgid "NTSC video template for 720x486 resolution." +msgstr "Шаблон відео NTSC для роздільної здатності 720⨯486." + +#: ../share/templates/templates.h:1 +msgid "NTSC video empty 720x486" +msgstr "Порожнє відео NTSC 720⨯486" + +#: ../share/templates/templates.h:1 +msgid "Video PAL 728x576" +msgstr "Відео PAL 728⨯576" + +#: ../share/templates/templates.h:1 +msgid "PAL video template for 728x576 resolution." +msgstr "Шаблон відео PAL для роздільної здатності 728⨯576." + +#: ../share/templates/templates.h:1 +msgid "PAL video empty 728x576" +msgstr "Порожнє відео PAL 728⨯576" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 468x60" +msgstr "Інтернет-банер 468⨯60" + +#: ../share/templates/templates.h:1 +msgid "Empty 468x60 web banner template." +msgstr "Шаблон порожнього інтернет-банера 468⨯60." + +#: ../share/templates/templates.h:1 +msgid "web banner 468x60 empty" +msgstr "порожній інтернет-банер 468⨯60" + +#: ../share/templates/templates.h:1 +msgid "Web Banner 728x90" +msgstr "Інтернет-банер 728⨯90" + +#: ../share/templates/templates.h:1 +msgid "Empty 728x90 web banner template." +msgstr "Порожній шаблон інтернет-банера, 728⨯90." + +#: ../share/templates/templates.h:1 +msgid "web banner 728x90 empty" +msgstr "порожній інтернет-банер 728⨯90" + +#: ../share/templates/templates.h:1 +msgid "LaTeX Beamer" +msgstr "Beamer, LaTeX" + +#: ../share/templates/templates.h:1 +msgid "LaTeX beamer template with helping grid." +msgstr "Шаблон beamer LaTeX з допоміжною сіткою." + +#: ../share/templates/templates.h:1 +msgid "LaTex LaTeX latex grid beamer" +msgstr "Сітка LaTeX beamer" + +#: ../share/templates/templates.h:1 +msgid "Typography Canvas" +msgstr "Типографічне полотно" + +#: ../share/templates/templates.h:1 +msgid "Empty typography canvas with helping guidelines." +msgstr "Порожнє типографічне полотно з допоміжними напрямними." + +#: ../share/templates/templates.h:1 +msgid "guidelines typography canvas" +msgstr "типографічне полотно з напрямними" + #. 3D box #: ../src/box3d.cpp:259 ../src/box3d.cpp:1329 #: ../src/ui/dialog/inkscape-preferences.cpp:398 @@ -3313,7 +5169,7 @@ msgstr "(некоректний рядок UTF-8)" #: ../src/color-profile.cpp:911 ../src/filter-enums.cpp:119 #: ../src/live_effects/lpe-ruler.cpp:32 -#: ../src/ui/dialog/filter-effects-dialog.cpp:518 +#: ../src/ui/dialog/filter-effects-dialog.cpp:549 #: ../src/ui/dialog/inkscape-preferences.cpp:332 #: ../src/ui/dialog/inkscape-preferences.cpp:641 #: ../src/ui/dialog/inkscape-preferences.cpp:1259 @@ -3346,11 +5202,11 @@ msgstr "" "Поточний рівень заблоковано. Розблокуйте його, щоб мати можливість " "креслити у ньому." -#: ../src/desktop.cpp:852 +#: ../src/desktop.cpp:859 msgid "No previous zoom." msgstr "Немає попереднього масштабу." -#: ../src/desktop.cpp:873 +#: ../src/desktop.cpp:880 msgid "No next zoom." msgstr "Немає наступного масштабу." @@ -3362,12 +5218,12 @@ msgstr "Створити напрямну" msgid "Move guide" msgstr "Пересунути напрямну" -#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:535 +#: ../src/desktop-events.cpp:477 ../src/desktop-events.cpp:536 #: ../src/ui/dialog/guides.cpp:144 msgid "Delete guide" msgstr "Вилучити напрямну" -#: ../src/desktop-events.cpp:515 +#: ../src/desktop-events.cpp:516 #, c-format msgid "Guideline: %s" msgstr "Напрямна: %s" @@ -3737,21 +5593,21 @@ msgstr "Кратність проміжку між лініями сітки" msgid " to " msgstr " у " -#: ../src/document.cpp:507 +#: ../src/document.cpp:546 #, c-format msgid "New document %d" msgstr "Новий документ %d" -#: ../src/document.cpp:512 +#: ../src/document.cpp:551 #, c-format msgid "Memory document %d" msgstr "Документ у пам'яті %d" -#: ../src/document.cpp:541 +#: ../src/document.cpp:580 msgid "Memory document %1" msgstr "Документ у пам'яті %1" -#: ../src/document.cpp:752 +#: ../src/document.cpp:792 #, c-format msgid "Unnamed document %d" msgstr "Документ без назви %d" @@ -3954,10 +5810,7 @@ msgstr "Ширина:" msgid "Height:" msgstr "Висота:" -#. Label #: ../src/extension/internal/bitmap/adaptiveThreshold.cpp:43 -#: ../src/widgets/gradient-toolbar.cpp:1174 -#: ../src/widgets/gradient-vector.cpp:926 #: ../share/extensions/printing_marks.inx.h:12 msgid "Offset:" msgstr "Зсув:" @@ -4015,8 +5868,8 @@ msgstr "Додати шум" #: ../src/extension/internal/filter/color.h:1585 #: ../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:2627 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 #: ../src/ui/dialog/object-attributes.cpp:49 #: ../share/extensions/jessyInk_effects.inx.h:5 #: ../share/extensions/jessyInk_export.inx.h:3 @@ -4068,7 +5921,7 @@ msgstr "Розмиття" #: ../src/extension/internal/bitmap/oilPaint.cpp:39 #: ../src/extension/internal/bitmap/sharpen.cpp:40 #: ../src/extension/internal/bitmap/unsharpmask.cpp:43 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2684 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2885 msgid "Radius:" msgstr "Радіус:" @@ -4404,7 +6257,7 @@ msgid "Opacity" msgstr "Непрозорість" #: ../src/extension/internal/bitmap/opacity.cpp:40 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2674 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2875 #: ../src/widgets/dropper-toolbar.cpp:107 msgid "Opacity:" msgstr "Непрозорість:" @@ -4587,100 +6440,100 @@ msgid "PostScript" msgstr "PostScript" #: ../src/extension/internal/cairo-ps-out.cpp:329 -#: ../src/extension/internal/cairo-ps-out.cpp:370 +#: ../src/extension/internal/cairo-ps-out.cpp:368 msgid "Restrict to PS level:" msgstr "Обмежувати рівень PS:" #: ../src/extension/internal/cairo-ps-out.cpp:330 -#: ../src/extension/internal/cairo-ps-out.cpp:371 +#: ../src/extension/internal/cairo-ps-out.cpp:369 msgid "PostScript level 3" msgstr "PostScript рівень 3" -#: ../src/extension/internal/cairo-ps-out.cpp:332 -#: ../src/extension/internal/cairo-ps-out.cpp:373 +#: ../src/extension/internal/cairo-ps-out.cpp:331 +#: ../src/extension/internal/cairo-ps-out.cpp:370 msgid "PostScript level 2" msgstr "PostScript level 2" -#: ../src/extension/internal/cairo-ps-out.cpp:335 -#: ../src/extension/internal/cairo-ps-out.cpp:376 +#: ../src/extension/internal/cairo-ps-out.cpp:333 +#: ../src/extension/internal/cairo-ps-out.cpp:372 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:250 -#: ../src/extension/internal/emf-inout.cpp:3551 -#: ../src/extension/internal/wmf-inout.cpp:3236 +#: ../src/extension/internal/emf-inout.cpp:3520 +#: ../src/extension/internal/wmf-inout.cpp:3088 msgid "Convert texts to paths" msgstr "Перетворити текст на контури" -#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:334 msgid "PS+LaTeX: Omit text in PS, and create LaTeX file" msgstr "PS+LaTeX: пропустити текст у PS і створити файл LaTeX" -#: ../src/extension/internal/cairo-ps-out.cpp:337 -#: ../src/extension/internal/cairo-ps-out.cpp:378 +#: ../src/extension/internal/cairo-ps-out.cpp:335 +#: ../src/extension/internal/cairo-ps-out.cpp:374 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:252 msgid "Rasterize filter effects" msgstr "Растеризувати ефекти фільтрування" -#: ../src/extension/internal/cairo-ps-out.cpp:338 -#: ../src/extension/internal/cairo-ps-out.cpp:379 +#: ../src/extension/internal/cairo-ps-out.cpp:336 +#: ../src/extension/internal/cairo-ps-out.cpp:375 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:253 msgid "Resolution for rasterization (dpi):" msgstr "Роздільна здатність для растеризації (у точках на дюйм):" -#: ../src/extension/internal/cairo-ps-out.cpp:339 -#: ../src/extension/internal/cairo-ps-out.cpp:380 +#: ../src/extension/internal/cairo-ps-out.cpp:337 +#: ../src/extension/internal/cairo-ps-out.cpp:376 msgid "Output page size" msgstr "Розмір сторінки-результату" -#: ../src/extension/internal/cairo-ps-out.cpp:340 -#: ../src/extension/internal/cairo-ps-out.cpp:381 +#: ../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 msgid "Use document's page size" msgstr "Використовувати розмір сторінки документа" -#: ../src/extension/internal/cairo-ps-out.cpp:341 -#: ../src/extension/internal/cairo-ps-out.cpp:382 +#: ../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 msgid "Use exported object's size" msgstr "Використати розмір експортованого об’єкта" -#: ../src/extension/internal/cairo-ps-out.cpp:343 +#: ../src/extension/internal/cairo-ps-out.cpp:341 #: ../src/extension/internal/cairo-renderer-pdf-out.cpp:258 msgid "Bleed/margin (mm):" msgstr "Випуск під обрізання (у мм):" -#: ../src/extension/internal/cairo-ps-out.cpp:344 -#: ../src/extension/internal/cairo-ps-out.cpp:385 +#: ../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 msgid "Limit export to the object with ID:" msgstr "Обмежити експорт об'єктом з вказаним ідентифікатором:" -#: ../src/extension/internal/cairo-ps-out.cpp:348 +#: ../src/extension/internal/cairo-ps-out.cpp:346 #: ../share/extensions/ps_input.inx.h:2 msgid "PostScript (*.ps)" msgstr "PostScript (*.ps)" -#: ../src/extension/internal/cairo-ps-out.cpp:349 +#: ../src/extension/internal/cairo-ps-out.cpp:347 msgid "PostScript File" msgstr "Файл Postscript" -#: ../src/extension/internal/cairo-ps-out.cpp:368 +#: ../src/extension/internal/cairo-ps-out.cpp:366 #: ../share/extensions/eps_input.inx.h:3 msgid "Encapsulated PostScript" msgstr "Інкапсульований PostScript" -#: ../src/extension/internal/cairo-ps-out.cpp:377 +#: ../src/extension/internal/cairo-ps-out.cpp:373 msgid "EPS+LaTeX: Omit text in EPS, and create LaTeX file" msgstr "EPS+LaTeX: пропустити текст у EPS і створити файл LaTeX" -#: ../src/extension/internal/cairo-ps-out.cpp:384 +#: ../src/extension/internal/cairo-ps-out.cpp:380 msgid "Bleed/margin (mm)" msgstr "Випуск/Поле під обрізання (у мм)" -#: ../src/extension/internal/cairo-ps-out.cpp:389 +#: ../src/extension/internal/cairo-ps-out.cpp:385 #: ../share/extensions/eps_input.inx.h:2 msgid "Encapsulated PostScript (*.eps)" msgstr "Інкапсульований PostScript (*.eps)" -#: ../src/extension/internal/cairo-ps-out.cpp:390 +#: ../src/extension/internal/cairo-ps-out.cpp:386 msgid "Encapsulated PostScript File" msgstr "Інкапсульований файл PostScript" @@ -4773,71 +6626,75 @@ msgstr "Файли обміну презентаціями Corel DRAW (*.cmx)" msgid "Open presentation exchange files saved in Corel DRAW" msgstr "Відкрити файли обміну презентаціями, збережені за допомогою Corel DRAW" -#: ../src/extension/internal/emf-inout.cpp:3535 +#: ../src/extension/internal/emf-inout.cpp:3504 msgid "EMF Input" msgstr "Імпорт EMF" -#: ../src/extension/internal/emf-inout.cpp:3540 +#: ../src/extension/internal/emf-inout.cpp:3509 msgid "Enhanced Metafiles (*.emf)" msgstr "Розширений метафайл (*.emf)" -#: ../src/extension/internal/emf-inout.cpp:3541 +#: ../src/extension/internal/emf-inout.cpp:3510 msgid "Enhanced Metafiles" msgstr "Розширені метафайли" -#: ../src/extension/internal/emf-inout.cpp:3549 +#: ../src/extension/internal/emf-inout.cpp:3518 msgid "EMF Output" msgstr "Експорт до EMF" -#: ../src/extension/internal/emf-inout.cpp:3552 -#: ../src/extension/internal/wmf-inout.cpp:3237 +#: ../src/extension/internal/emf-inout.cpp:3521 +#: ../src/extension/internal/wmf-inout.cpp:3089 msgid "Map Unicode to Symbol font" msgstr "Пов’язати Unicode зі шрифтом Symbol" -#: ../src/extension/internal/emf-inout.cpp:3553 -#: ../src/extension/internal/wmf-inout.cpp:3238 +#: ../src/extension/internal/emf-inout.cpp:3522 +#: ../src/extension/internal/wmf-inout.cpp:3090 msgid "Map Unicode to Wingdings" msgstr "Пов’язати Unicode з Wingdings" -#: ../src/extension/internal/emf-inout.cpp:3554 -#: ../src/extension/internal/wmf-inout.cpp:3239 +#: ../src/extension/internal/emf-inout.cpp:3523 +#: ../src/extension/internal/wmf-inout.cpp:3091 msgid "Map Unicode to Zapf Dingbats" msgstr "Пов’язати Unicode з Zapf Dingbats" -#: ../src/extension/internal/emf-inout.cpp:3555 -#: ../src/extension/internal/wmf-inout.cpp:3240 +#: ../src/extension/internal/emf-inout.cpp:3524 +#: ../src/extension/internal/wmf-inout.cpp:3092 msgid "Use MS Unicode PUA (0xF020-0xF0FF) for converted characters" msgstr "" "Використовувати для перетворених символів MS Unicode PUA (0xF020-0xF0FF)" -#: ../src/extension/internal/emf-inout.cpp:3556 -#: ../src/extension/internal/wmf-inout.cpp:3241 +#: ../src/extension/internal/emf-inout.cpp:3525 +#: ../src/extension/internal/wmf-inout.cpp:3093 msgid "Compensate for PPT font bug" msgstr "Компенсувати ваду щодо шрифтів у PPT" -#: ../src/extension/internal/emf-inout.cpp:3557 -#: ../src/extension/internal/wmf-inout.cpp:3242 +#: ../src/extension/internal/emf-inout.cpp:3526 +#: ../src/extension/internal/wmf-inout.cpp:3094 msgid "Convert dashed/dotted lines to single lines" msgstr "Перетворювати штрихову та пунктир у одну лінію" -#: ../src/extension/internal/emf-inout.cpp:3558 -#: ../src/extension/internal/wmf-inout.cpp:3243 +#: ../src/extension/internal/emf-inout.cpp:3527 +#: ../src/extension/internal/wmf-inout.cpp:3095 msgid "Convert gradients to colored polygon series" msgstr "Перетворити градієнти на послідовність кольорових багатокутників" -#: ../src/extension/internal/emf-inout.cpp:3559 +#: ../src/extension/internal/emf-inout.cpp:3528 +msgid "Use native rectangular linear gradients" +msgstr "Використовувати природні прямокутні лінійні градієнти" + +#: ../src/extension/internal/emf-inout.cpp:3529 msgid "Map all fill patterns to standard EMF hatches" msgstr "Пов’язати усі заповнення візерунками зі стандартними шаблонами EMF" -#: ../src/extension/internal/emf-inout.cpp:3560 +#: ../src/extension/internal/emf-inout.cpp:3530 msgid "Ignore image rotations" msgstr "Ігнорувати обертання зображення" -#: ../src/extension/internal/emf-inout.cpp:3564 +#: ../src/extension/internal/emf-inout.cpp:3534 msgid "Enhanced Metafile (*.emf)" msgstr "Розширений метафайл (*.emf)" -#: ../src/extension/internal/emf-inout.cpp:3565 +#: ../src/extension/internal/emf-inout.cpp:3535 msgid "Enhanced Metafile" msgstr "Розширений метафайл" @@ -4922,6 +6779,7 @@ msgstr "Колір підсвічення" #: ../src/extension/internal/filter/transparency.h:214 #: ../src/extension/internal/filter/transparency.h:287 #: ../src/extension/internal/filter/transparency.h:349 +#, c-format msgid "Filters" msgstr "Фільтри" @@ -5109,7 +6967,7 @@ msgstr "Ерозія" #: ../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:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "Background color" msgstr "Колір тла" @@ -5275,13 +7133,13 @@ msgstr "Параметри віддаленого джерела" #: ../src/extension/internal/filter/bumps.h:110 #: ../src/extension/internal/filter/bumps.h:332 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Azimuth" msgstr "Азимут" #: ../src/extension/internal/filter/bumps.h:111 #: ../src/extension/internal/filter/bumps.h:333 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Elevation" msgstr "Висота" @@ -5502,11 +7360,13 @@ msgstr "Тотожність" #: ../src/extension/internal/filter/color.h:428 #: ../src/extension/internal/filter/paint.h:498 ../src/filter-enums.cpp:108 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1050 msgid "Table" msgstr "Табличний" #: ../src/extension/internal/filter/color.h:429 #: ../src/extension/internal/filter/paint.h:499 ../src/filter-enums.cpp:109 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1053 msgid "Discrete" msgstr "Дискретний" @@ -5700,6 +7560,7 @@ msgstr "Тіні" #: ../src/extension/internal/filter/paint.h:356 ../src/filter-enums.cpp:32 #: ../src/live_effects/effect.cpp:97 ../src/live_effects/lpe-offset.cpp:31 #: ../src/live_effects/lpe-parallel.cpp:50 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1047 #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset" msgstr "Зміщення" @@ -5986,8 +7847,8 @@ msgid "Detect:" msgstr "Позначити:" #: ../src/extension/internal/filter/image.h:52 -#: ../src/ui/dialog/template-load-tab.cpp:104 -#: ../src/ui/dialog/template-load-tab.cpp:141 +#: ../src/ui/dialog/template-load-tab.cpp:105 +#: ../src/ui/dialog/template-load-tab.cpp:142 msgid "All" msgstr "Всі" @@ -6264,7 +8125,7 @@ msgstr "" #: ../src/extension/internal/filter/paint.h:331 #: ../src/ui/dialog/align-and-distribute.cpp:1004 -#: ../src/widgets/desktop-widget.cpp:2007 +#: ../src/widgets/desktop-widget.cpp:1998 msgid "Drawing" msgstr "Малюнок" @@ -6552,7 +8413,7 @@ msgid "Background" msgstr "Тло" #: ../src/extension/internal/filter/transparency.h:59 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2624 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2830 #: ../src/ui/dialog/input.cpp:1088 ../src/widgets/eraser-toolbar.cpp:123 #: ../src/widgets/pencil-toolbar.cpp:156 ../src/widgets/spray-toolbar.cpp:198 #: ../src/widgets/tweak-toolbar.cpp:268 ../share/extensions/extrude.inx.h:2 @@ -6607,20 +8468,24 @@ msgid "%s bitmap image import" msgstr "Імпортування растрового зображення %s" #: ../src/extension/internal/gdkpixbuf-input.cpp:176 +#, c-format msgid "Link or embed image:" msgstr "Пов'язати або вбудувати зображення:" #: ../src/extension/internal/gdkpixbuf-input.cpp:177 #: ../src/ui/dialog/inkscape-preferences.cpp:1445 +#, c-format msgid "Embed" msgstr "Вбудувати" #: ../src/extension/internal/gdkpixbuf-input.cpp:178 ../src/sp-anchor.cpp:119 #: ../src/ui/dialog/inkscape-preferences.cpp:1445 +#, c-format msgid "Link" msgstr "Пов'язати" #: ../src/extension/internal/gdkpixbuf-input.cpp:180 +#, c-format msgid "" "Embed results in stand-alone, larger SVG files. Link references a file " "outside this SVG document and all files must be moved together." @@ -6629,25 +8494,30 @@ msgstr "" "документом SVG і всі файли буде об'єднано у єдиному документі." #: ../src/extension/internal/gdkpixbuf-input.cpp:182 +#, c-format msgid "Scale image preference (image-rendering):" msgstr "Режим масштабування зображень (обробки зображення):" #: ../src/extension/internal/gdkpixbuf-input.cpp:183 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, c-format msgid "None (auto)" msgstr "Немає (автоматично)" #: ../src/extension/internal/gdkpixbuf-input.cpp:184 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, c-format msgid "Smooth (optimizeQuality)" msgstr "Згладжування (оптимальна якість)" #: ../src/extension/internal/gdkpixbuf-input.cpp:185 #: ../src/ui/dialog/inkscape-preferences.cpp:1452 +#, c-format msgid "Blocky (optimizeSpeed)" msgstr "Блоками (оптимальна швидкість)" #: ../src/extension/internal/gdkpixbuf-input.cpp:187 +#, c-format msgid "" "When an image is upscaled, apply smoothing or keep blocky (pixelated). (Will " "not work in all browsers.)" @@ -6657,11 +8527,13 @@ msgstr "" "(Працює не в усіх засобах перегляду.)" #: ../src/extension/internal/gdkpixbuf-input.cpp:189 +#, c-format msgid "Hide the dialog next time and always apply the same actions." msgstr "" "Не показувати це вікно наступного разу і завжди виконувати ті самі дії." #: ../src/extension/internal/gdkpixbuf-input.cpp:189 +#, c-format msgid "Don't ask again" msgstr "Більше не питати" @@ -6731,7 +8603,7 @@ msgid "Render" msgstr "Відтворення" #: ../src/extension/internal/grid.cpp:221 -#: ../src/ui/dialog/document-properties.cpp:151 +#: ../src/ui/dialog/document-properties.cpp:152 #: ../src/ui/dialog/inkscape-preferences.cpp:776 #: ../src/widgets/toolbox.cpp:1825 msgid "Grids" @@ -7052,33 +8924,33 @@ msgstr "Імпорт з VSDX" msgid "Microsoft Visio 2013 drawing (*.vsdx)" msgstr "Малюнок Microsoft Visio 2013 (*.vsdx)" -#: ../src/extension/internal/wmf-inout.cpp:3220 +#: ../src/extension/internal/wmf-inout.cpp:3072 msgid "WMF Input" msgstr "Імпорт WMF" -#: ../src/extension/internal/wmf-inout.cpp:3225 +#: ../src/extension/internal/wmf-inout.cpp:3077 msgid "Windows Metafiles (*.wmf)" msgstr "Метафайл Windows (*.wmf)" -#: ../src/extension/internal/wmf-inout.cpp:3226 +#: ../src/extension/internal/wmf-inout.cpp:3078 msgid "Windows Metafiles" msgstr "Метафайл Windows" -#: ../src/extension/internal/wmf-inout.cpp:3234 +#: ../src/extension/internal/wmf-inout.cpp:3086 msgid "WMF Output" msgstr "Експорт до WMF" -#: ../src/extension/internal/wmf-inout.cpp:3244 +#: ../src/extension/internal/wmf-inout.cpp:3096 msgid "Map all fill patterns to standard WMF hatches" msgstr "Пов’язати усі заповнення візерунками зі стандартними шаблонами WMF" -#: ../src/extension/internal/wmf-inout.cpp:3248 +#: ../src/extension/internal/wmf-inout.cpp:3100 #: ../share/extensions/wmf_input.inx.h:2 #: ../share/extensions/wmf_output.inx.h:2 msgid "Windows Metafile (*.wmf)" msgstr "Метафайл Windows (*.wmf)" -#: ../src/extension/internal/wmf-inout.cpp:3249 +#: ../src/extension/internal/wmf-inout.cpp:3101 msgid "Windows Metafile" msgstr "Метафайл Windows (WMF)" @@ -7114,7 +8986,7 @@ msgstr "типовий.svg" msgid "Broken links have been changed to point to existing files." msgstr "Помилкові посилання змінено так, щоб вони вказували на поточні файли." -#: ../src/file.cpp:331 ../src/file.cpp:1259 +#: ../src/file.cpp:331 ../src/file.cpp:1247 #, c-format msgid "Failed to load the requested file %s" msgstr "Не вдається завантажити потрібний файл %s" @@ -7125,28 +8997,27 @@ msgstr "" "Документ ще не був збережений. Неможливо повернутись до попереднього стану." #: ../src/file.cpp:363 -#, c-format -msgid "Changes will be lost! Are you sure you want to reload document %s?" +msgid "Changes will be lost! Are you sure you want to reload document %1?" msgstr "" -"Зміни будуть втрачені! Ви впевнені, що бажаєте завантажити документ %s знову?" +"Зміни буде втрачено! Ви впевнені, що бажаєте перезавантажити документ %1?" -#: ../src/file.cpp:392 +#: ../src/file.cpp:389 msgid "Document reverted." msgstr "Документ повернутий до попереднього стану." -#: ../src/file.cpp:394 +#: ../src/file.cpp:391 msgid "Document not reverted." msgstr "Документ не повернутий до попереднього стану." -#: ../src/file.cpp:544 +#: ../src/file.cpp:541 msgid "Select file to open" msgstr "Виберіть файл" -#: ../src/file.cpp:626 +#: ../src/file.cpp:623 msgid "Clean up document" msgstr "Очистити документ" -#: ../src/file.cpp:633 +#: ../src/file.cpp:630 #, c-format msgid "Removed %i unused definition in <defs>." msgid_plural "Removed %i unused definitions in <defs>." @@ -7154,11 +9025,11 @@ msgstr[0] "Вилучено %i непотрібний елемент у & msgstr[1] "Вилучено %i непотрібні елементи у <defs>." msgstr[2] "Вилучено %i непотрібних елементів у <defs>." -#: ../src/file.cpp:638 +#: ../src/file.cpp:635 msgid "No unused definitions in <defs>." msgstr "Немає непотрібних елементів у <defs>." -#: ../src/file.cpp:670 +#: ../src/file.cpp:667 #, c-format msgid "" "No Inkscape extension found to save document (%s). This may have been " @@ -7167,12 +9038,12 @@ msgstr "" "Не знайдено модуль збереження документа (%s). Можливо, невідомий суфікс " "назви файла." -#: ../src/file.cpp:671 ../src/file.cpp:679 ../src/file.cpp:687 -#: ../src/file.cpp:693 ../src/file.cpp:698 +#: ../src/file.cpp:668 ../src/file.cpp:676 ../src/file.cpp:684 +#: ../src/file.cpp:690 ../src/file.cpp:695 msgid "Document not saved." msgstr "Документ не збережено." -#: ../src/file.cpp:678 +#: ../src/file.cpp:675 #, c-format msgid "" "File %s is write protected. Please remove write protection and try again." @@ -7180,61 +9051,59 @@ msgstr "" "Файл %s захищено від запису. Будь ласка, зніміть захист від запису і " "повторіть спробу." -#: ../src/file.cpp:686 +#: ../src/file.cpp:683 #, c-format msgid "File %s could not be saved." msgstr "Файл %s неможливо зберегти." -#: ../src/file.cpp:716 ../src/file.cpp:718 +#: ../src/file.cpp:713 ../src/file.cpp:715 msgid "Document saved." msgstr "Документ збережено." #. We are saving for the first time; create a unique default filename -#: ../src/file.cpp:866 ../src/file.cpp:1422 -#, c-format -msgid "drawing%s" -msgstr "рисунок%s" - -#: ../src/file.cpp:872 -#, c-format -msgid "drawing-%d%s" -msgstr "рисунок-%d%s" +#: ../src/file.cpp:858 +msgid "drawing" +msgstr "рисунок" -#: ../src/file.cpp:876 -#, c-format -msgid "%s" -msgstr "%s" +#: ../src/file.cpp:863 +msgid "drawing-%1" +msgstr "рисунок-%1" -#: ../src/file.cpp:891 +#: ../src/file.cpp:880 msgid "Select file to save a copy to" msgstr "Оберіть файл для збереження копії" -#: ../src/file.cpp:893 +#: ../src/file.cpp:882 msgid "Select file to save to" msgstr "Виберіть файл для збереження" -#: ../src/file.cpp:999 ../src/file.cpp:1001 +#: ../src/file.cpp:987 ../src/file.cpp:989 msgid "No changes need to be saved." msgstr "Файл не було змінено. Збереження непотрібне." -#: ../src/file.cpp:1020 +#: ../src/file.cpp:1008 msgid "Saving document..." msgstr "Збереження документа…" -#: ../src/file.cpp:1256 ../src/ui/dialog/inkscape-preferences.cpp:1439 -#: ../src/ui/dialog/ocaldialogs.cpp:1245 +#: ../src/file.cpp:1244 ../src/ui/dialog/inkscape-preferences.cpp:1439 +#: ../src/ui/dialog/ocaldialogs.cpp:1246 msgid "Import" msgstr "Імпорт" -#: ../src/file.cpp:1306 +#: ../src/file.cpp:1294 msgid "Select file to import" msgstr "Виберіть файл для імпорту" -#: ../src/file.cpp:1444 +#: ../src/file.cpp:1410 +#, c-format +msgid "drawing%s" +msgstr "рисунок%s" + +#: ../src/file.cpp:1432 msgid "Select file to export to" msgstr "Оберіть файл для експорту" -#: ../src/file.cpp:1697 +#: ../src/file.cpp:1685 msgid "Import Clip Art" msgstr "Імпортування шаблонів" @@ -7401,7 +9270,7 @@ msgstr "Світліше" msgid "Arithmetic" msgstr "Арифметичний" -#: ../src/filter-enums.cpp:117 ../src/selection-chemistry.cpp:533 +#: ../src/filter-enums.cpp:117 ../src/selection-chemistry.cpp:534 msgid "Duplicate" msgstr "Дублювати" @@ -7441,7 +9310,7 @@ msgstr "Інвертувати кольори градієнта" msgid "Reverse gradient" msgstr "Обернути градієнт" -#: ../src/gradient-chemistry.cpp:1608 ../src/widgets/gradient-selector.cpp:228 +#: ../src/gradient-chemistry.cpp:1608 ../src/widgets/gradient-selector.cpp:245 msgid "Delete swatch" msgstr "Вилучити зразок" @@ -7691,6 +9560,12 @@ msgstr "" "\n" "Файл вже існує у «%s». Заміна призведе до перезапису його вмісту." +#: ../src/interface.cpp:1395 ../src/ui/dialog/export.cpp:1298 +#: ../src/widgets/desktop-widget.cpp:1127 +#: ../src/widgets/desktop-widget.cpp:1189 +msgid "_Cancel" +msgstr "_Скасувати" + #: ../src/interface.cpp:1396 ../share/extensions/web-set-att.inx.h:21 #: ../share/extensions/web-transmit-att.inx.h:19 msgid "Replace" @@ -7706,7 +9581,7 @@ msgid "Enter group #%1" msgstr "Увійти до групи №%1" #. Item dialog -#: ../src/interface.cpp:1644 ../src/verbs.cpp:2851 +#: ../src/interface.cpp:1644 ../src/verbs.cpp:2853 msgid "_Object Properties..." msgstr "В_ластивості об'єкта…" @@ -7844,12 +9719,12 @@ msgid "_Fill and Stroke..." msgstr "_Заповнення та штрих" #. Edit Text dialog -#: ../src/interface.cpp:2183 ../src/verbs.cpp:2833 +#: ../src/interface.cpp:2183 ../src/verbs.cpp:2835 msgid "_Text and Font..." msgstr "_Текст та шрифт…" #. Spellcheck dialog -#: ../src/interface.cpp:2189 ../src/verbs.cpp:2841 +#: ../src/interface.cpp:2189 ../src/verbs.cpp:2843 msgid "Check Spellin_g..." msgstr "Перевірити п_равопис…" @@ -8104,9 +9979,9 @@ msgstr "" #: ../src/libgdl/gdl-dock-notebook.c:132 #: ../src/ui/dialog/align-and-distribute.cpp:1003 -#: ../src/ui/dialog/document-properties.cpp:149 +#: ../src/ui/dialog/document-properties.cpp:150 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1551 -#: ../src/widgets/desktop-widget.cpp:2003 +#: ../src/widgets/desktop-widget.cpp:1994 #: ../share/extensions/voronoi2svg.inx.h:9 msgid "Page" msgstr "Сторінка" @@ -8118,7 +9993,7 @@ msgstr "Індекс поточної сторінки" #: ../src/libgdl/gdl-dock-object.c:125 #: ../src/ui/dialog/inkscape-preferences.cpp:1495 #: ../src/ui/widget/page-sizer.cpp:258 -#: ../src/widgets/gradient-selector.cpp:157 +#: ../src/widgets/gradient-selector.cpp:158 #: ../src/widgets/sp-xmlview-attr-list.cpp:54 msgid "Name" msgstr "Назва" @@ -8424,7 +10299,7 @@ msgstr "Лінійка" msgid "Power stroke" msgstr "Потужний штрих" -#: ../src/live_effects/effect.cpp:124 ../src/selection-chemistry.cpp:2790 +#: ../src/live_effects/effect.cpp:124 ../src/selection-chemistry.cpp:2797 msgid "Clone original path" msgstr "Клонувати початковий контур" @@ -8451,12 +10326,12 @@ msgstr "" "Будь ласка, вкажіть параметр контуру для геометричних побудов «%s» за " "допомогою %d клацань мишею" -#: ../src/live_effects/effect.cpp:632 +#: ../src/live_effects/effect.cpp:626 #, c-format msgid "Editing parameter %s." msgstr "Редагування параметра %s." -#: ../src/live_effects/effect.cpp:637 +#: ../src/live_effects/effect.cpp:631 msgid "None of the applied path effect's parameters can be edited on-canvas." msgstr "" "Жоден із застосованих параметрів ефекту контуру не можна редагувати на " @@ -8487,11 +10362,13 @@ msgid "Specifies the right end of the bisector" msgstr "Визначає довжину правої частини бісектриси" #: ../src/live_effects/lpe-angle_bisector.cpp:86 +#: ../src/live_effects/lpe-perp_bisector.cpp:159 msgid "Adjust the \"left\" end of the bisector" msgstr "Коригувати розташування «лівого» кінця бісектриси" #: ../src/live_effects/lpe-angle_bisector.cpp:92 -msgid "Adjust the \"right\" of the bisector" +#: ../src/live_effects/lpe-perp_bisector.cpp:165 +msgid "Adjust the \"right\" end of the bisector" msgstr "Коригувати розташування «правого» кінця бісектриси" #: ../src/live_effects/lpe-bendpath.cpp:53 @@ -8936,60 +10813,60 @@ msgstr "" "контуру траєкторії." #. initialise your parameters here: -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Fi_xed width:" msgstr "_Фіксована ширина:" -#: ../src/live_effects/lpe-knot.cpp:347 +#: ../src/live_effects/lpe-knot.cpp:350 msgid "Size of hidden region of lower string" msgstr "Розмір схованого фрагмента нижнього рядка" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "_In units of stroke width" msgstr "_У одиницях товщини штриха" -#: ../src/live_effects/lpe-knot.cpp:348 +#: ../src/live_effects/lpe-knot.cpp:351 msgid "Consider 'Interruption width' as a ratio of stroke width" msgstr "Обчислювати «ширину проміжку» відносно товщини штриха" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "St_roke width" msgstr "Тов_щина штриха" -#: ../src/live_effects/lpe-knot.cpp:349 +#: ../src/live_effects/lpe-knot.cpp:352 msgid "Add the stroke width to the interruption size" msgstr "Додати ширину штриха до розміру проміжку" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "_Crossing path stroke width" msgstr "Товщина штриха _контуру перетинання" -#: ../src/live_effects/lpe-knot.cpp:350 +#: ../src/live_effects/lpe-knot.cpp:353 msgid "Add crossed stroke width to the interruption size" msgstr "Додати ширину перпендикулярного штриха до розміру проміжку" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "S_witcher size:" msgstr "Розм_ір перемикача:" -#: ../src/live_effects/lpe-knot.cpp:351 +#: ../src/live_effects/lpe-knot.cpp:354 msgid "Orientation indicator/switcher size" msgstr "Розмір індикатора/перемикача орієнтації" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossing Signs" msgstr "Знаки перехресть" -#: ../src/live_effects/lpe-knot.cpp:352 +#: ../src/live_effects/lpe-knot.cpp:355 msgid "Crossings signs" msgstr "Знаки перехресть" -#: ../src/live_effects/lpe-knot.cpp:617 +#: ../src/live_effects/lpe-knot.cpp:620 msgid "Drag to select a crossing, click to flip it" msgstr "Перетягніть, щоб вибрати перехрестя, клацніть, щоб віддзеркалити його" #. / @todo Is this the right verb? -#: ../src/live_effects/lpe-knot.cpp:655 +#: ../src/live_effects/lpe-knot.cpp:658 msgid "Change knot crossing" msgstr "Змінити перехрестя у вузлі" @@ -9193,7 +11070,7 @@ msgstr "Скоригувати «правий» кінець паралельн #: ../src/live_effects/lpe-path_length.cpp:26 #: ../src/live_effects/lpe-sketch.cpp:58 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 #: ../share/extensions/render_alphabetsoup.inx.h:3 msgid "Scale:" msgstr "Масштаб:" @@ -9322,14 +11199,6 @@ msgid "Fuse ends closer than this number. 0 means don't fuse." msgstr "" "Об'єднувати кінці, ближчі за вказане значення. 0 означає «не об'єднувати»." -#: ../src/live_effects/lpe-perp_bisector.cpp:159 -msgid "Adjust the bisector's \"left\" end" -msgstr "Скоригувати «лівий» кінець бісектриси" - -#: ../src/live_effects/lpe-perp_bisector.cpp:165 -msgid "Adjust the bisector's \"right\" end" -msgstr "Скоригувати «правий» кінець бісектриси" - #. initialise your parameters here: #: ../src/live_effects/lpe-perspective_path.cpp:47 msgid "Scale x" @@ -10058,12 +11927,12 @@ msgstr "Змінити булівський параметр" msgid "Change enumeration parameter" msgstr "Зміна параметра нумерації" -#: ../src/live_effects/parameter/originalpath.cpp:70 -#: ../src/live_effects/parameter/path.cpp:194 +#: ../src/live_effects/parameter/originalpath.cpp:71 +#: ../src/live_effects/parameter/path.cpp:195 msgid "Link to path" msgstr "Пов'язати з контуром" -#: ../src/live_effects/parameter/originalpath.cpp:82 +#: ../src/live_effects/parameter/originalpath.cpp:83 msgid "Select original" msgstr "Позначити оригінал" @@ -10071,23 +11940,23 @@ msgstr "Позначити оригінал" msgid "Change scalar parameter" msgstr "Змінити скалярний параметр" -#: ../src/live_effects/parameter/path.cpp:164 +#: ../src/live_effects/parameter/path.cpp:165 msgid "Edit on-canvas" msgstr "Редагувати на полотні" -#: ../src/live_effects/parameter/path.cpp:174 +#: ../src/live_effects/parameter/path.cpp:175 msgid "Copy path" msgstr "Копіювати контур" -#: ../src/live_effects/parameter/path.cpp:184 +#: ../src/live_effects/parameter/path.cpp:185 msgid "Paste path" msgstr "Вставити контур" -#: ../src/live_effects/parameter/path.cpp:437 +#: ../src/live_effects/parameter/path.cpp:438 msgid "Paste path parameter" msgstr "Вставити параметр контуру" -#: ../src/live_effects/parameter/path.cpp:469 +#: ../src/live_effects/parameter/path.cpp:470 msgid "Link path parameter to path" msgstr "Пов'язати параметр контуру з контуром" @@ -10434,7 +12303,7 @@ msgstr "ІД-ОБ'ЄКТА" msgid "Start Inkscape in interactive shell mode." msgstr "Запустити Inkscape у режимі інтерактивної оболонки." -#: ../src/main.cpp:868 ../src/main.cpp:1267 +#: ../src/main.cpp:871 ../src/main.cpp:1270 msgid "" "[OPTIONS...] [FILE...]\n" "\n" @@ -10987,17 +12856,17 @@ msgstr "XML-фрагмент RDF-розділу «Ліцензія»" msgid "Fixup broken links" msgstr "Виправлення помилкових посилань" -#: ../src/selection-chemistry.cpp:394 +#: ../src/selection-chemistry.cpp:395 msgid "Delete text" msgstr "Вилучити текст" -#: ../src/selection-chemistry.cpp:402 +#: ../src/selection-chemistry.cpp:403 msgid "Nothing was deleted." msgstr "Нічого не було вилучено." -#: ../src/selection-chemistry.cpp:421 +#: ../src/selection-chemistry.cpp:422 #: ../src/ui/dialog/calligraphic-profile-rename.cpp:75 -#: ../src/ui/dialog/swatches.cpp:278 ../src/ui/tools/text-tool.cpp:994 +#: ../src/ui/dialog/swatches.cpp:278 ../src/ui/tools/text-tool.cpp:995 #: ../src/widgets/eraser-toolbar.cpp:110 #: ../src/widgets/gradient-toolbar.cpp:1196 #: ../src/widgets/gradient-toolbar.cpp:1210 @@ -11006,249 +12875,249 @@ msgstr "Нічого не було вилучено." msgid "Delete" msgstr "Вилучити" -#: ../src/selection-chemistry.cpp:449 +#: ../src/selection-chemistry.cpp:450 msgid "Select object(s) to duplicate." msgstr "Позначте об'єкт(и) для дублювання." -#: ../src/selection-chemistry.cpp:558 +#: ../src/selection-chemistry.cpp:559 msgid "Delete all" msgstr "Вилучити все" -#: ../src/selection-chemistry.cpp:748 +#: ../src/selection-chemistry.cpp:749 msgid "Select some objects to group." msgstr "Позначте два або більше об'єктів для групування." -#: ../src/selection-chemistry.cpp:763 ../src/sp-item-group.cpp:331 +#: ../src/selection-chemistry.cpp:764 ../src/sp-item-group.cpp:331 msgid "Group" msgstr "Згрупувати" -#: ../src/selection-chemistry.cpp:772 +#: ../src/selection-chemistry.cpp:773 msgid "Select a group to ungroup." msgstr "Позначте групу для розгрупування." -#: ../src/selection-chemistry.cpp:815 +#: ../src/selection-chemistry.cpp:816 msgid "No groups to ungroup in the selection." msgstr "У позначеному немає груп." -#: ../src/selection-chemistry.cpp:821 ../src/sp-item-group.cpp:564 +#: ../src/selection-chemistry.cpp:822 ../src/sp-item-group.cpp:564 msgid "Ungroup" msgstr "Розгрупувати" -#: ../src/selection-chemistry.cpp:902 +#: ../src/selection-chemistry.cpp:903 msgid "Select object(s) to raise." msgstr "Оберіть об'єкт(и) для підняття." -#: ../src/selection-chemistry.cpp:908 ../src/selection-chemistry.cpp:964 -#: ../src/selection-chemistry.cpp:992 ../src/selection-chemistry.cpp:1053 +#: ../src/selection-chemistry.cpp:909 ../src/selection-chemistry.cpp:965 +#: ../src/selection-chemistry.cpp:993 ../src/selection-chemistry.cpp:1054 msgid "" "You cannot raise/lower objects from different groups or layers." msgstr "" "Не можна піднімати/опускати об'єкти з різних груп чи шарів." #. TRANSLATORS: "Raise" means "to raise an object" in the undo history -#: ../src/selection-chemistry.cpp:948 +#: ../src/selection-chemistry.cpp:949 msgctxt "Undo action" msgid "Raise" msgstr "підняття" -#: ../src/selection-chemistry.cpp:956 +#: ../src/selection-chemistry.cpp:957 msgid "Select object(s) to raise to top." msgstr "Позначте об'єкт(и) для піднімання нагору." -#: ../src/selection-chemistry.cpp:979 +#: ../src/selection-chemistry.cpp:980 msgid "Raise to top" msgstr "Підняти на передній план" -#: ../src/selection-chemistry.cpp:986 +#: ../src/selection-chemistry.cpp:987 msgid "Select object(s) to lower." msgstr "Позначте об'єкт(и) для опускання." #. TRANSLATORS: "Lower" means "to lower an object" in the undo history -#: ../src/selection-chemistry.cpp:1037 +#: ../src/selection-chemistry.cpp:1038 msgctxt "Undo action" msgid "Lower" msgstr "опускання" -#: ../src/selection-chemistry.cpp:1045 +#: ../src/selection-chemistry.cpp:1046 msgid "Select object(s) to lower to bottom." msgstr "Позначте об'єкт(и) для опускання на низ." -#: ../src/selection-chemistry.cpp:1080 +#: ../src/selection-chemistry.cpp:1081 msgid "Lower to bottom" msgstr "Опустити на задній план" -#: ../src/selection-chemistry.cpp:1087 +#: ../src/selection-chemistry.cpp:1091 msgid "Nothing to undo." msgstr "Немає операцій, що можна скасувати." -#: ../src/selection-chemistry.cpp:1095 +#: ../src/selection-chemistry.cpp:1102 msgid "Nothing to redo." msgstr "Немає операцій, що можна вернути." -#: ../src/selection-chemistry.cpp:1162 +#: ../src/selection-chemistry.cpp:1169 msgid "Paste" msgstr "Вставити" -#: ../src/selection-chemistry.cpp:1170 +#: ../src/selection-chemistry.cpp:1177 msgid "Paste style" msgstr "Вставити стиль" -#: ../src/selection-chemistry.cpp:1180 +#: ../src/selection-chemistry.cpp:1187 msgid "Paste live path effect" msgstr "Вставити ефект динамічного контуру" -#: ../src/selection-chemistry.cpp:1202 +#: ../src/selection-chemistry.cpp:1209 msgid "Select object(s) to remove live path effects from." msgstr "Оберіть об'єкт(и) для вилучення анімованих ефектів контурів." -#: ../src/selection-chemistry.cpp:1214 +#: ../src/selection-chemistry.cpp:1221 msgid "Remove live path effect" msgstr "Вилучити анімований ефект контуру" -#: ../src/selection-chemistry.cpp:1225 +#: ../src/selection-chemistry.cpp:1232 msgid "Select object(s) to remove filters from." msgstr "Виберіть об'єкт(и), з яких слід вилучити фільтри." -#: ../src/selection-chemistry.cpp:1235 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1462 +#: ../src/selection-chemistry.cpp:1242 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1669 msgid "Remove filter" msgstr "Вилучити фільтр" -#: ../src/selection-chemistry.cpp:1244 +#: ../src/selection-chemistry.cpp:1251 msgid "Paste size" msgstr "Вставити розмір" -#: ../src/selection-chemistry.cpp:1253 +#: ../src/selection-chemistry.cpp:1260 msgid "Paste size separately" msgstr "Вставити розмір окремо" -#: ../src/selection-chemistry.cpp:1263 +#: ../src/selection-chemistry.cpp:1270 msgid "Select object(s) to move to the layer above." msgstr "Позначте об'єкти для переміщення на шар вище." -#: ../src/selection-chemistry.cpp:1289 +#: ../src/selection-chemistry.cpp:1296 msgid "Raise to next layer" msgstr "Піднятися на наступний шар" -#: ../src/selection-chemistry.cpp:1296 +#: ../src/selection-chemistry.cpp:1303 msgid "No more layers above." msgstr "Більше немає вищих шарів." -#: ../src/selection-chemistry.cpp:1308 +#: ../src/selection-chemistry.cpp:1315 msgid "Select object(s) to move to the layer below." msgstr "Позначте об'єкти для переміщення на шар нижче." -#: ../src/selection-chemistry.cpp:1334 +#: ../src/selection-chemistry.cpp:1341 msgid "Lower to previous layer" msgstr "Опуститися на попередній шар" -#: ../src/selection-chemistry.cpp:1341 +#: ../src/selection-chemistry.cpp:1348 msgid "No more layers below." msgstr "Немає нижчого шару." -#: ../src/selection-chemistry.cpp:1353 +#: ../src/selection-chemistry.cpp:1360 msgid "Select object(s) to move." msgstr "Позначте об'єкти для пересування." -#: ../src/selection-chemistry.cpp:1370 ../src/verbs.cpp:2581 +#: ../src/selection-chemistry.cpp:1377 ../src/verbs.cpp:2581 msgid "Move selection to layer" msgstr "Пересунути позначене до шару" -#: ../src/selection-chemistry.cpp:1594 +#: ../src/selection-chemistry.cpp:1601 msgid "Remove transform" msgstr "Прибрати трансформацію" -#: ../src/selection-chemistry.cpp:1697 +#: ../src/selection-chemistry.cpp:1704 msgid "Rotate 90° CCW" msgstr "Обернути на 90° проти годинникової стрілки" -#: ../src/selection-chemistry.cpp:1697 +#: ../src/selection-chemistry.cpp:1704 msgid "Rotate 90° CW" msgstr "Обернути на 90° за годинниковою стрілкою" -#: ../src/selection-chemistry.cpp:1718 ../src/seltrans.cpp:468 -#: ../src/ui/dialog/transformation.cpp:893 +#: ../src/selection-chemistry.cpp:1725 ../src/seltrans.cpp:468 +#: ../src/ui/dialog/transformation.cpp:894 msgid "Rotate" msgstr "Обертати" -#: ../src/selection-chemistry.cpp:2097 +#: ../src/selection-chemistry.cpp:2104 msgid "Rotate by pixels" msgstr "Обертати поточково" -#: ../src/selection-chemistry.cpp:2127 ../src/seltrans.cpp:465 -#: ../src/ui/dialog/transformation.cpp:868 +#: ../src/selection-chemistry.cpp:2134 ../src/seltrans.cpp:465 +#: ../src/ui/dialog/transformation.cpp:869 #: ../share/extensions/interp_att_g.inx.h:12 msgid "Scale" msgstr "Масштабувати" -#: ../src/selection-chemistry.cpp:2152 +#: ../src/selection-chemistry.cpp:2159 msgid "Scale by whole factor" msgstr "Масштабувати за повним коефіцієнтом" -#: ../src/selection-chemistry.cpp:2167 +#: ../src/selection-chemistry.cpp:2174 msgid "Move vertically" msgstr "Перемістити вертикально" -#: ../src/selection-chemistry.cpp:2170 +#: ../src/selection-chemistry.cpp:2177 msgid "Move horizontally" msgstr "Перемістити горизонтально" -#: ../src/selection-chemistry.cpp:2173 ../src/selection-chemistry.cpp:2199 +#: ../src/selection-chemistry.cpp:2180 ../src/selection-chemistry.cpp:2206 #: ../src/seltrans.cpp:462 ../src/ui/dialog/transformation.cpp:807 msgid "Move" msgstr "Перемістити" -#: ../src/selection-chemistry.cpp:2193 +#: ../src/selection-chemistry.cpp:2200 msgid "Move vertically by pixels" msgstr "Перемістити вертикально поточково" -#: ../src/selection-chemistry.cpp:2196 +#: ../src/selection-chemistry.cpp:2203 msgid "Move horizontally by pixels" msgstr "Перемістити горизонтально поточково" -#: ../src/selection-chemistry.cpp:2328 +#: ../src/selection-chemistry.cpp:2335 msgid "The selection has no applied path effect." msgstr "Обране не має застосованого ефекту контуру." -#: ../src/selection-chemistry.cpp:2497 ../src/ui/dialog/clonetiler.cpp:2218 +#: ../src/selection-chemistry.cpp:2504 ../src/ui/dialog/clonetiler.cpp:2218 msgid "Select an object to clone." msgstr "Позначте об'єкт для клонування." -#: ../src/selection-chemistry.cpp:2533 +#: ../src/selection-chemistry.cpp:2540 msgctxt "Action" msgid "Clone" msgstr "Клонувати" -#: ../src/selection-chemistry.cpp:2549 +#: ../src/selection-chemistry.cpp:2556 msgid "Select clones to relink." msgstr "Позначте клон для перез'єднання." -#: ../src/selection-chemistry.cpp:2556 +#: ../src/selection-chemistry.cpp:2563 msgid "Copy an object to clipboard to relink clones to." msgstr "" "Копіювати об'єкт до буфера обміну інформації для перез'єднання клонів." -#: ../src/selection-chemistry.cpp:2580 +#: ../src/selection-chemistry.cpp:2587 msgid "No clones to relink in the selection." msgstr "У позначеному немає клонів для перез'єднання." -#: ../src/selection-chemistry.cpp:2583 +#: ../src/selection-chemistry.cpp:2590 msgid "Relink clone" msgstr "Перез'єднати клон" -#: ../src/selection-chemistry.cpp:2597 +#: ../src/selection-chemistry.cpp:2604 msgid "Select clones to unlink." msgstr "Позначте клон для від'єднання." -#: ../src/selection-chemistry.cpp:2651 +#: ../src/selection-chemistry.cpp:2658 msgid "No clones to unlink in the selection." msgstr "У позначеному немає клонів." -#: ../src/selection-chemistry.cpp:2655 +#: ../src/selection-chemistry.cpp:2662 msgid "Unlink clone" msgstr "Від'єднати клон" -#: ../src/selection-chemistry.cpp:2668 +#: ../src/selection-chemistry.cpp:2675 msgid "" "Select a clone to go to its original. Select a linked offset " "to go to its source. Select a text on path to go to the path. Select " @@ -11258,7 +13127,7 @@ msgstr "" "перейти до її контуру; текст вздовж контуру, щоб перейти до його " "контуру. Позначте текст у рамці, щоб перейти до рамки." -#: ../src/selection-chemistry.cpp:2701 +#: ../src/selection-chemistry.cpp:2708 msgid "" "Cannot find the object to select (orphaned clone, offset, textpath, " "flowed text?)" @@ -11266,7 +13135,7 @@ msgstr "" "Не вдається знайти об'єкт, що позначається (осиротілий клон, втяжка, " "текст вздовж контуру чи текст у рамці?)" -#: ../src/selection-chemistry.cpp:2707 +#: ../src/selection-chemistry.cpp:2714 msgid "" "The object you're trying to select is not visible (it is in <" "defs>)" @@ -11274,135 +13143,135 @@ msgstr "" "Об'єкт, який ви намагаєтесь позначити, є невидимим (знаходиться у <" "defs>)" -#: ../src/selection-chemistry.cpp:2752 +#: ../src/selection-chemistry.cpp:2759 msgid "Select one path to clone." msgstr "Позначте один контур для клонування." -#: ../src/selection-chemistry.cpp:2756 +#: ../src/selection-chemistry.cpp:2763 msgid "Select one path to clone." msgstr "Позначте один контур для клонування." -#: ../src/selection-chemistry.cpp:2811 +#: ../src/selection-chemistry.cpp:2819 msgid "Select object(s) to convert to marker." msgstr "Позначте об'єкт(и) для перетворення у маркер." -#: ../src/selection-chemistry.cpp:2879 +#: ../src/selection-chemistry.cpp:2886 msgid "Objects to marker" msgstr "Об'єкти у маркер" -#: ../src/selection-chemistry.cpp:2903 +#: ../src/selection-chemistry.cpp:2910 msgid "Select object(s) to convert to guides." msgstr "Позначте об'єкт(и) для перетворення у напрямні." -#: ../src/selection-chemistry.cpp:2926 +#: ../src/selection-chemistry.cpp:2933 msgid "Objects to guides" msgstr "Об'єкти у напрямні" -#: ../src/selection-chemistry.cpp:2945 +#: ../src/selection-chemistry.cpp:2952 msgid "Select groups to convert to symbols." msgstr "Позначте групи для перетворення на символи." -#: ../src/selection-chemistry.cpp:2965 +#: ../src/selection-chemistry.cpp:2972 msgid "No groups converted to symbols." msgstr "На символи не перетвореною жодної групи." #. Group just disappears, nothing to select. -#: ../src/selection-chemistry.cpp:2972 +#: ../src/selection-chemistry.cpp:2979 msgid "Group to symbol" msgstr "Групу у символ" -#: ../src/selection-chemistry.cpp:3038 +#: ../src/selection-chemistry.cpp:3045 msgid "Select a symbol to extract objects from." msgstr "Позначте символ для видобування з нього об’єктів." -#: ../src/selection-chemistry.cpp:3047 +#: ../src/selection-chemistry.cpp:3054 msgid "Select only one symbol to convert to group." msgstr "Позначте лише один символ для перетворення на групу." -#: ../src/selection-chemistry.cpp:3088 +#: ../src/selection-chemistry.cpp:3096 msgid "Group from symbol" msgstr "Група з символу" -#: ../src/selection-chemistry.cpp:3105 +#: ../src/selection-chemistry.cpp:3114 msgid "Select object(s) to convert to pattern." msgstr "Позначте об'єкт(и) для перетворення у візерунок." -#: ../src/selection-chemistry.cpp:3195 +#: ../src/selection-chemistry.cpp:3204 msgid "Objects to pattern" msgstr "Об'єкти у візерунок" -#: ../src/selection-chemistry.cpp:3211 +#: ../src/selection-chemistry.cpp:3220 msgid "Select an object with pattern fill to extract objects from." msgstr "" "Позначте об'єкт із заповненням візерунком для витягування об'єктів з " "нього." -#: ../src/selection-chemistry.cpp:3266 +#: ../src/selection-chemistry.cpp:3275 msgid "No pattern fills in the selection." msgstr "У позначеному немає заповнення візерунком." -#: ../src/selection-chemistry.cpp:3269 +#: ../src/selection-chemistry.cpp:3278 msgid "Pattern to objects" msgstr "Візерунок у об'єкти" -#: ../src/selection-chemistry.cpp:3360 +#: ../src/selection-chemistry.cpp:3369 msgid "Select object(s) to make a bitmap copy." msgstr "Позначте об'єкти для створення їхньої растрової копії." -#: ../src/selection-chemistry.cpp:3364 +#: ../src/selection-chemistry.cpp:3373 msgid "Rendering bitmap..." msgstr "Показ растрового зображення…" -#: ../src/selection-chemistry.cpp:3543 +#: ../src/selection-chemistry.cpp:3552 msgid "Create bitmap" msgstr "Створення растрового зображення" -#: ../src/selection-chemistry.cpp:3575 +#: ../src/selection-chemistry.cpp:3584 msgid "Select object(s) to create clippath or mask from." msgstr "" "Оберіть об'єкт(и) для створення з них контуру вирізання або маски." -#: ../src/selection-chemistry.cpp:3578 +#: ../src/selection-chemistry.cpp:3587 msgid "Select mask object and object(s) to apply clippath or mask to." msgstr "" "Оберіть об'єкт-маску та об'єкт(и) для застосування вирізання або " "маскування." -#: ../src/selection-chemistry.cpp:3761 +#: ../src/selection-chemistry.cpp:3770 msgid "Set clipping path" msgstr "Задати контур вирізання" -#: ../src/selection-chemistry.cpp:3763 +#: ../src/selection-chemistry.cpp:3772 msgid "Set mask" msgstr "Задати маску" -#: ../src/selection-chemistry.cpp:3778 +#: ../src/selection-chemistry.cpp:3787 msgid "Select object(s) to remove clippath or mask from." msgstr "" "Оберіть об'єкт(и) для вилучення контуру вирізання або маскування." -#: ../src/selection-chemistry.cpp:3889 +#: ../src/selection-chemistry.cpp:3898 msgid "Release clipping path" msgstr "Від'єднати закріплений контур" -#: ../src/selection-chemistry.cpp:3891 +#: ../src/selection-chemistry.cpp:3900 msgid "Release mask" msgstr "Маску знято" -#: ../src/selection-chemistry.cpp:3910 +#: ../src/selection-chemistry.cpp:3919 msgid "Select object(s) to fit canvas to." msgstr "Оберіть об'єкт(и) для підбирання їхніх розмірів під полотно." #. Fit Page -#: ../src/selection-chemistry.cpp:3930 ../src/verbs.cpp:2907 +#: ../src/selection-chemistry.cpp:3939 ../src/verbs.cpp:2909 msgid "Fit Page to Selection" msgstr "Підігнати полотно до позначеної області" -#: ../src/selection-chemistry.cpp:3959 ../src/verbs.cpp:2909 +#: ../src/selection-chemistry.cpp:3968 ../src/verbs.cpp:2911 msgid "Fit Page to Drawing" msgstr "Підігнати полотно під намальоване" -#: ../src/selection-chemistry.cpp:3980 ../src/verbs.cpp:2911 +#: ../src/selection-chemistry.cpp:3989 ../src/verbs.cpp:2913 msgid "Fit Page to Selection or Drawing" msgstr "Підігнати полотно під позначену область чи область креслення" @@ -11493,7 +13362,7 @@ msgstr[0] "; %d фільтрований об'єкт " msgstr[1] "; %d фільтровані об'єкти " msgstr[2] "; %d фільтрованих об'єктів " -#: ../src/seltrans.cpp:471 ../src/ui/dialog/transformation.cpp:981 +#: ../src/seltrans.cpp:471 ../src/ui/dialog/transformation.cpp:982 msgid "Skew" msgstr "Нахил" @@ -11647,7 +13516,7 @@ msgid "Linked Flowed Text" msgstr "Пов’язаний контурний текст" #: ../src/sp-flowtext.cpp:298 ../src/sp-text.cpp:357 -#: ../src/ui/tools/text-tool.cpp:1599 +#: ../src/ui/tools/text-tool.cpp:1600 msgid " [truncated]" msgstr " (обрізано)" @@ -12067,15 +13936,15 @@ msgstr "У позначеному немає тексту на контурі msgid "Remove text from path" msgstr "Зняти текст з контуру" -#: ../src/text-chemistry.cpp:261 ../src/text-chemistry.cpp:282 +#: ../src/text-chemistry.cpp:262 ../src/text-chemistry.cpp:283 msgid "Select text(s) to remove kerns from." msgstr "Позначте текст для вилучення ручного міжлітерного інтервалу." -#: ../src/text-chemistry.cpp:285 +#: ../src/text-chemistry.cpp:286 msgid "Remove manual kerns" msgstr "Вилучити ручний міжлітерний інтервал" -#: ../src/text-chemistry.cpp:305 +#: ../src/text-chemistry.cpp:306 msgid "" "Select a text and one or more paths or shapes to flow text " "into frame." @@ -12083,31 +13952,31 @@ msgstr "" "Позначте текст та контур чи фігуру для розміщення тексту у " "рамку." -#: ../src/text-chemistry.cpp:375 +#: ../src/text-chemistry.cpp:376 msgid "Flow text into shape" msgstr "Верстання тексту у фігуру" -#: ../src/text-chemistry.cpp:397 +#: ../src/text-chemistry.cpp:398 msgid "Select a flowed text to unflow it." msgstr "Позначте текст у рамці, щоб вийняти його з рамки." -#: ../src/text-chemistry.cpp:471 +#: ../src/text-chemistry.cpp:472 msgid "Unflow flowed text" msgstr "Зробити текст неконтурним" -#: ../src/text-chemistry.cpp:483 +#: ../src/text-chemistry.cpp:484 msgid "Select flowed text(s) to convert." msgstr "Оберіть контурний текст(и) для перетворення." -#: ../src/text-chemistry.cpp:501 +#: ../src/text-chemistry.cpp:502 msgid "The flowed text(s) must be visible in order to be converted." msgstr "Для перетворення Текст-вздовж-контуру має бути видимим." -#: ../src/text-chemistry.cpp:529 +#: ../src/text-chemistry.cpp:530 msgid "Convert flowed text to text" msgstr "Перетворення контурного тексту на звичайний" -#: ../src/text-chemistry.cpp:534 +#: ../src/text-chemistry.cpp:535 msgid "No flowed text(s) to convert in the selection." msgstr "У позначеному немає контурного тексту(ів) для перетворення." @@ -12207,7 +14076,7 @@ msgstr "" "напрямної, Клавіші-стрілки — налаштування товщини (ліворуч/праворуч) " "і кута (вгору/вниз)." -#: ../src/tools-switch.cpp:103 ../src/ui/tools/text-tool.cpp:1626 +#: ../src/tools-switch.cpp:103 ../src/ui/tools/text-tool.cpp:1627 msgid "" "Click to select or create text, drag to create flowed text; " "then type." @@ -12493,53 +14362,53 @@ msgid "_Treat selection as group: " msgstr "Вва_жати вибране групою: " #. Align -#: ../src/ui/dialog/align-and-distribute.cpp:877 ../src/verbs.cpp:2939 -#: ../src/verbs.cpp:2940 +#: ../src/ui/dialog/align-and-distribute.cpp:877 ../src/verbs.cpp:2941 +#: ../src/verbs.cpp:2942 msgid "Align right edges of objects to the left edge of the anchor" msgstr "Вирівняти праві краї об'єктів до лівого краю якоря" -#: ../src/ui/dialog/align-and-distribute.cpp:880 ../src/verbs.cpp:2941 -#: ../src/verbs.cpp:2942 +#: ../src/ui/dialog/align-and-distribute.cpp:880 ../src/verbs.cpp:2943 +#: ../src/verbs.cpp:2944 msgid "Align left edges" msgstr "Вирівняти ліві сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:883 ../src/verbs.cpp:2943 -#: ../src/verbs.cpp:2944 +#: ../src/ui/dialog/align-and-distribute.cpp:883 ../src/verbs.cpp:2945 +#: ../src/verbs.cpp:2946 msgid "Center on vertical axis" msgstr "Центрувати за вертикальною віссю" -#: ../src/ui/dialog/align-and-distribute.cpp:886 ../src/verbs.cpp:2945 -#: ../src/verbs.cpp:2946 +#: ../src/ui/dialog/align-and-distribute.cpp:886 ../src/verbs.cpp:2947 +#: ../src/verbs.cpp:2948 msgid "Align right sides" msgstr "Вирівняти праві сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:889 ../src/verbs.cpp:2947 -#: ../src/verbs.cpp:2948 +#: ../src/ui/dialog/align-and-distribute.cpp:889 ../src/verbs.cpp:2949 +#: ../src/verbs.cpp:2950 msgid "Align left edges of objects to the right edge of the anchor" msgstr "Вирівняти ліві краї об'єктів до правого краю якоря" -#: ../src/ui/dialog/align-and-distribute.cpp:892 ../src/verbs.cpp:2949 -#: ../src/verbs.cpp:2950 +#: ../src/ui/dialog/align-and-distribute.cpp:892 ../src/verbs.cpp:2951 +#: ../src/verbs.cpp:2952 msgid "Align bottom edges of objects to the top edge of the anchor" msgstr "Вирівняти нижні краї об'єктів до верхнього краю якоря" -#: ../src/ui/dialog/align-and-distribute.cpp:895 ../src/verbs.cpp:2951 -#: ../src/verbs.cpp:2952 +#: ../src/ui/dialog/align-and-distribute.cpp:895 ../src/verbs.cpp:2953 +#: ../src/verbs.cpp:2954 msgid "Align top edges" msgstr "Вирівняти верхні сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:898 ../src/verbs.cpp:2953 -#: ../src/verbs.cpp:2954 +#: ../src/ui/dialog/align-and-distribute.cpp:898 ../src/verbs.cpp:2955 +#: ../src/verbs.cpp:2956 msgid "Center on horizontal axis" msgstr "Центрувати на горизонтальній осі" -#: ../src/ui/dialog/align-and-distribute.cpp:901 ../src/verbs.cpp:2955 -#: ../src/verbs.cpp:2956 +#: ../src/ui/dialog/align-and-distribute.cpp:901 ../src/verbs.cpp:2957 +#: ../src/verbs.cpp:2958 msgid "Align bottom edges" msgstr "Вирівняти нижні сторони" -#: ../src/ui/dialog/align-and-distribute.cpp:904 ../src/verbs.cpp:2957 -#: ../src/verbs.cpp:2958 +#: ../src/ui/dialog/align-and-distribute.cpp:904 ../src/verbs.cpp:2959 +#: ../src/verbs.cpp:2960 msgid "Align top edges of objects to the bottom edge of the anchor" msgstr "Вирівняти верхні краї об'єктів до нижнього краю якоря" @@ -12661,7 +14530,7 @@ msgstr "Найменший об'єкт" #: ../src/ui/dialog/align-and-distribute.cpp:1005 #: ../src/ui/dialog/filedialogimpl-gtkmm.cpp:1555 ../src/verbs.cpp:175 -#: ../src/widgets/desktop-widget.cpp:2011 +#: ../src/widgets/desktop-widget.cpp:2002 #: ../share/extensions/printing_marks.inx.h:18 msgid "Selection" msgstr "позначене" @@ -13455,57 +15324,57 @@ msgid "Release log messages" msgstr "Вимкнути повідомлення журналу" #: ../src/ui/dialog/document-metadata.cpp:88 -#: ../src/ui/dialog/document-properties.cpp:155 +#: ../src/ui/dialog/document-properties.cpp:156 msgid "Metadata" msgstr "Метадані" #: ../src/ui/dialog/document-metadata.cpp:89 -#: ../src/ui/dialog/document-properties.cpp:156 +#: ../src/ui/dialog/document-properties.cpp:157 msgid "License" msgstr "Ліцензія" #: ../src/ui/dialog/document-metadata.cpp:126 -#: ../src/ui/dialog/document-properties.cpp:966 +#: ../src/ui/dialog/document-properties.cpp:1002 msgid "Dublin Core Entities" msgstr "Пункти Dublin Core" #: ../src/ui/dialog/document-metadata.cpp:168 -#: ../src/ui/dialog/document-properties.cpp:1028 +#: ../src/ui/dialog/document-properties.cpp:1064 msgid "License" msgstr "Ліцензія" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:108 +#: ../src/ui/dialog/document-properties.cpp:109 msgid "Show page _border" msgstr "Показувати _рамку полотна" -#: ../src/ui/dialog/document-properties.cpp:108 +#: ../src/ui/dialog/document-properties.cpp:109 msgid "If set, rectangular page border is shown" msgstr "У разі встановлення буде показано прямокутну рамку сторінки" -#: ../src/ui/dialog/document-properties.cpp:109 +#: ../src/ui/dialog/document-properties.cpp:110 msgid "Border on _top of drawing" msgstr "Рамка полотна завжди _над малюнком" -#: ../src/ui/dialog/document-properties.cpp:109 +#: ../src/ui/dialog/document-properties.cpp:110 msgid "If set, border is always on top of the drawing" msgstr "У разі встановлення над малюнком завжди буде рамка полотна" -#: ../src/ui/dialog/document-properties.cpp:110 +#: ../src/ui/dialog/document-properties.cpp:111 msgid "_Show border shadow" msgstr "_Показувати тінь від рамки" -#: ../src/ui/dialog/document-properties.cpp:110 +#: ../src/ui/dialog/document-properties.cpp:111 msgid "If set, page border shows a shadow on its right and lower side" msgstr "" "У разі встановлення границі сторінок відбиватимуть тіні на правій та нижній " "сторонах" -#: ../src/ui/dialog/document-properties.cpp:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "Back_ground color:" msgstr "Ко_лір тла:" -#: ../src/ui/dialog/document-properties.cpp:111 +#: ../src/ui/dialog/document-properties.cpp:112 msgid "" "Color of the page background. Note: transparency setting ignored while " "editing but used when exporting to bitmap." @@ -13513,80 +15382,80 @@ msgstr "" "Колір тла сторінки. Зауваження: параметр прозорості буде проігноровано під " "час редагування, але враховано під час експортування до растра." -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Border _color:" msgstr "_Колір рамки:" -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Page border color" msgstr "Колір рамки полотна" -#: ../src/ui/dialog/document-properties.cpp:112 +#: ../src/ui/dialog/document-properties.cpp:113 msgid "Color of the page border" msgstr "Колір рамки полотна" -#: ../src/ui/dialog/document-properties.cpp:113 +#: ../src/ui/dialog/document-properties.cpp:114 msgid "Default _units:" msgstr "Типові о_диниці:" #. --------------------------------------------------------------- #. General snap options -#: ../src/ui/dialog/document-properties.cpp:117 +#: ../src/ui/dialog/document-properties.cpp:118 msgid "Show _guides" msgstr "Показувати _напрямні" -#: ../src/ui/dialog/document-properties.cpp:117 +#: ../src/ui/dialog/document-properties.cpp:118 msgid "Show or hide guides" msgstr "Показати/сховати напрямні" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Guide co_lor:" msgstr "Ко_лір напрямних:" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Guideline color" msgstr "Колір напрямних" -#: ../src/ui/dialog/document-properties.cpp:118 +#: ../src/ui/dialog/document-properties.cpp:119 msgid "Color of guidelines" msgstr "Колір напрямних" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "_Highlight color:" msgstr "Колір _підсвічення:" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "Highlighted guideline color" msgstr "Колір підсвіченої напрямної" -#: ../src/ui/dialog/document-properties.cpp:119 +#: ../src/ui/dialog/document-properties.cpp:120 msgid "Color of a guideline when it is under mouse" msgstr "Колір напрямної при наведенні на неї миші" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:121 +#: ../src/ui/dialog/document-properties.cpp:122 msgid "Snap _distance" msgstr "_Відстань для прилипання" -#: ../src/ui/dialog/document-properties.cpp:121 +#: ../src/ui/dialog/document-properties.cpp:122 msgid "Snap only when _closer than:" msgstr "Прилипати на відстані, _меншій за:" -#: ../src/ui/dialog/document-properties.cpp:121 -#: ../src/ui/dialog/document-properties.cpp:126 -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Always snap" msgstr "Повсюдне прилипання" -#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:123 msgid "Snapping distance, in screen pixels, for snapping to objects" msgstr "Дистанція прилипання до об'єктів, у точках" -#: ../src/ui/dialog/document-properties.cpp:122 +#: ../src/ui/dialog/document-properties.cpp:123 msgid "Always snap to objects, regardless of their distance" msgstr "Повсюдне прилипання до об'єктів, незалежно від відстані" -#: ../src/ui/dialog/document-properties.cpp:123 +#: ../src/ui/dialog/document-properties.cpp:124 msgid "" "If set, objects only snap to another object when it's within the range " "specified below" @@ -13595,23 +15464,23 @@ msgstr "" "знаходитимуться на відстані заданій нижче" #. Options for snapping to grids -#: ../src/ui/dialog/document-properties.cpp:126 +#: ../src/ui/dialog/document-properties.cpp:127 msgid "Snap d_istance" msgstr "_Відстань для прилипання" -#: ../src/ui/dialog/document-properties.cpp:126 +#: ../src/ui/dialog/document-properties.cpp:127 msgid "Snap only when c_loser than:" msgstr "Прилипати на відстані, м_еншій за:" -#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:128 msgid "Snapping distance, in screen pixels, for snapping to grid" msgstr "Дистанція прилипання до сітки, у точках" -#: ../src/ui/dialog/document-properties.cpp:127 +#: ../src/ui/dialog/document-properties.cpp:128 msgid "Always snap to grids, regardless of the distance" msgstr "Повсюдне прилипання до сітки, незалежно від відстані" -#: ../src/ui/dialog/document-properties.cpp:128 +#: ../src/ui/dialog/document-properties.cpp:129 msgid "" "If set, objects only snap to a grid line when it's within the range " "specified below" @@ -13620,23 +15489,23 @@ msgstr "" "знаходитимуться на заданій нижче відстані" #. Options for snapping to guides -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Snap dist_ance" msgstr "В_ідстань для прилипання" -#: ../src/ui/dialog/document-properties.cpp:131 +#: ../src/ui/dialog/document-properties.cpp:132 msgid "Snap only when close_r than:" msgstr "Прилипати на відстані, ме_ншій за:" -#: ../src/ui/dialog/document-properties.cpp:132 +#: ../src/ui/dialog/document-properties.cpp:133 msgid "Snapping distance, in screen pixels, for snapping to guides" msgstr "Дистанція прилипання до напрямних, у точках" -#: ../src/ui/dialog/document-properties.cpp:132 +#: ../src/ui/dialog/document-properties.cpp:133 msgid "Always snap to guides, regardless of the distance" msgstr "Повсюдне прилипання до напрямних, незалежно від відстані" -#: ../src/ui/dialog/document-properties.cpp:133 +#: ../src/ui/dialog/document-properties.cpp:134 msgid "" "If set, objects only snap to a guide when it's within the range specified " "below" @@ -13645,106 +15514,106 @@ msgstr "" "знаходитимуться на заданій нижче відстані" #. --------------------------------------------------------------- -#: ../src/ui/dialog/document-properties.cpp:136 +#: ../src/ui/dialog/document-properties.cpp:137 msgid "Snap to clip paths" msgstr "Прилипання до контурів обрізання" -#: ../src/ui/dialog/document-properties.cpp:136 +#: ../src/ui/dialog/document-properties.cpp:137 msgid "When snapping to paths, then also try snapping to clip paths" msgstr "Намагатися виконати прилипання до контурів обрізання" -#: ../src/ui/dialog/document-properties.cpp:137 +#: ../src/ui/dialog/document-properties.cpp:138 msgid "Snap to mask paths" msgstr "Прилипання до контурів масок" -#: ../src/ui/dialog/document-properties.cpp:137 +#: ../src/ui/dialog/document-properties.cpp:138 msgid "When snapping to paths, then also try snapping to mask paths" msgstr "Намагатися виконати прилипання до контурів масок" -#: ../src/ui/dialog/document-properties.cpp:138 +#: ../src/ui/dialog/document-properties.cpp:139 msgid "Snap perpendicularly" msgstr "Перпендикулярне прилипання" -#: ../src/ui/dialog/document-properties.cpp:138 +#: ../src/ui/dialog/document-properties.cpp:139 msgid "" "When snapping to paths or guides, then also try snapping perpendicularly" msgstr "" "Намагатися під час прилипання виконувати і прилипання у перпендикулярному " "напрямку" -#: ../src/ui/dialog/document-properties.cpp:139 +#: ../src/ui/dialog/document-properties.cpp:140 msgid "Snap tangentially" msgstr "Дотичне прилипання" -#: ../src/ui/dialog/document-properties.cpp:139 +#: ../src/ui/dialog/document-properties.cpp:140 msgid "When snapping to paths or guides, then also try snapping tangentially" msgstr "" "Намагатися під час прилипання виконувати і прилипання у дотичному напрямку" -#: ../src/ui/dialog/document-properties.cpp:142 +#: ../src/ui/dialog/document-properties.cpp:143 msgctxt "Grid" msgid "_New" msgstr "_Створити" -#: ../src/ui/dialog/document-properties.cpp:142 +#: ../src/ui/dialog/document-properties.cpp:143 msgid "Create new grid." msgstr "Створити нову напрямну." -#: ../src/ui/dialog/document-properties.cpp:143 +#: ../src/ui/dialog/document-properties.cpp:144 msgctxt "Grid" msgid "_Remove" msgstr "Ви_лучити" -#: ../src/ui/dialog/document-properties.cpp:143 +#: ../src/ui/dialog/document-properties.cpp:144 msgid "Remove selected grid." msgstr "Вилучити вибрану сітку." -#: ../src/ui/dialog/document-properties.cpp:150 +#: ../src/ui/dialog/document-properties.cpp:151 #: ../src/widgets/toolbox.cpp:1834 msgid "Guides" msgstr "Напрямні" -#: ../src/ui/dialog/document-properties.cpp:152 ../src/verbs.cpp:2748 +#: ../src/ui/dialog/document-properties.cpp:153 ../src/verbs.cpp:2748 msgid "Snap" msgstr "Прилипання" -#: ../src/ui/dialog/document-properties.cpp:154 +#: ../src/ui/dialog/document-properties.cpp:155 msgid "Scripting" msgstr "Запис сценаріїв" -#: ../src/ui/dialog/document-properties.cpp:317 +#: ../src/ui/dialog/document-properties.cpp:318 msgid "General" msgstr "Загальні" -#: ../src/ui/dialog/document-properties.cpp:319 +#: ../src/ui/dialog/document-properties.cpp:320 msgid "Color" msgstr "Колір" -#: ../src/ui/dialog/document-properties.cpp:321 +#: ../src/ui/dialog/document-properties.cpp:322 msgid "Border" msgstr "Рамка" -#: ../src/ui/dialog/document-properties.cpp:323 +#: ../src/ui/dialog/document-properties.cpp:324 msgid "Page Size" msgstr "Розмір сторінки" -#: ../src/ui/dialog/document-properties.cpp:356 +#: ../src/ui/dialog/document-properties.cpp:357 msgid "Guides" msgstr "Напрямні" -#: ../src/ui/dialog/document-properties.cpp:374 +#: ../src/ui/dialog/document-properties.cpp:375 msgid "Snap to objects" msgstr "Прилипання до об'єктів" -#: ../src/ui/dialog/document-properties.cpp:376 +#: ../src/ui/dialog/document-properties.cpp:377 msgid "Snap to grids" msgstr "Прилипання до сітки" -#: ../src/ui/dialog/document-properties.cpp:378 +#: ../src/ui/dialog/document-properties.cpp:379 msgid "Snap to guides" msgstr "Прилипання до напрямних" -#: ../src/ui/dialog/document-properties.cpp:380 +#: ../src/ui/dialog/document-properties.cpp:381 msgid "Miscellaneous" msgstr "Інше" @@ -13752,135 +15621,135 @@ msgstr "Інше" #. Inkscape::GC::release(defsRepr); #. inform the document, so we can undo #. Color Management -#: ../src/ui/dialog/document-properties.cpp:493 ../src/verbs.cpp:2923 +#: ../src/ui/dialog/document-properties.cpp:494 ../src/verbs.cpp:2925 msgid "Link Color Profile" msgstr "Пов'язати профіль кольорів" -#: ../src/ui/dialog/document-properties.cpp:594 +#: ../src/ui/dialog/document-properties.cpp:595 msgid "Remove linked color profile" msgstr "Вилучити пов'язаний профіль кольорів" -#: ../src/ui/dialog/document-properties.cpp:607 +#: ../src/ui/dialog/document-properties.cpp:608 msgid "Linked Color Profiles:" msgstr "Пов'язані профілі кольорів:" -#: ../src/ui/dialog/document-properties.cpp:609 +#: ../src/ui/dialog/document-properties.cpp:610 msgid "Available Color Profiles:" msgstr "Доступні профілі кольорів:" -#: ../src/ui/dialog/document-properties.cpp:611 +#: ../src/ui/dialog/document-properties.cpp:612 msgid "Link Profile" msgstr "Пов'язати з профілем" -#: ../src/ui/dialog/document-properties.cpp:614 +#: ../src/ui/dialog/document-properties.cpp:621 msgid "Unlink Profile" msgstr "Від'єднати від профілю" -#: ../src/ui/dialog/document-properties.cpp:692 +#: ../src/ui/dialog/document-properties.cpp:705 msgid "Profile Name" msgstr "Назва профілю" -#: ../src/ui/dialog/document-properties.cpp:728 +#: ../src/ui/dialog/document-properties.cpp:741 msgid "External scripts" msgstr "Зовнішні скрипти" -#: ../src/ui/dialog/document-properties.cpp:729 +#: ../src/ui/dialog/document-properties.cpp:742 msgid "Embedded scripts" msgstr "Вбудовані скрипти" -#: ../src/ui/dialog/document-properties.cpp:734 +#: ../src/ui/dialog/document-properties.cpp:747 msgid "External script files:" msgstr "Файли зовнішніх скриптів:" -#: ../src/ui/dialog/document-properties.cpp:736 +#: ../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:739 -#: ../src/ui/dialog/document-properties.cpp:817 +#: ../src/ui/dialog/document-properties.cpp:758 +#: ../src/ui/dialog/document-properties.cpp:847 #: ../src/ui/widget/selected-style.cpp:339 msgid "Remove" msgstr "Вилучити" -#: ../src/ui/dialog/document-properties.cpp:804 +#: ../src/ui/dialog/document-properties.cpp:828 msgid "Filename" msgstr "Назва файла" -#: ../src/ui/dialog/document-properties.cpp:812 +#: ../src/ui/dialog/document-properties.cpp:836 msgid "Embedded script files:" msgstr "Файли вбудованих скриптів:" -#: ../src/ui/dialog/document-properties.cpp:814 +#: ../src/ui/dialog/document-properties.cpp:838 msgid "New" msgstr "Створити" -#: ../src/ui/dialog/document-properties.cpp:881 +#: ../src/ui/dialog/document-properties.cpp:917 msgid "Script id" msgstr "Ід. скрипту" -#: ../src/ui/dialog/document-properties.cpp:887 +#: ../src/ui/dialog/document-properties.cpp:923 msgid "Content:" msgstr "Вміст:" -#: ../src/ui/dialog/document-properties.cpp:1004 +#: ../src/ui/dialog/document-properties.cpp:1040 msgid "_Save as default" msgstr "З_берегти як типові" -#: ../src/ui/dialog/document-properties.cpp:1005 +#: ../src/ui/dialog/document-properties.cpp:1041 msgid "Save this metadata as the default metadata" msgstr "Зберегти ці метадані як типові метадані" -#: ../src/ui/dialog/document-properties.cpp:1006 +#: ../src/ui/dialog/document-properties.cpp:1042 msgid "Use _default" msgstr "Використовувати _типові" -#: ../src/ui/dialog/document-properties.cpp:1007 +#: ../src/ui/dialog/document-properties.cpp:1043 msgid "Use the previously saved default metadata here" msgstr "Скористатися тут раніше збереженими типовими метаданими" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1080 +#: ../src/ui/dialog/document-properties.cpp:1116 msgid "Add external script..." msgstr "Додати зовнішній скрипт…" -#: ../src/ui/dialog/document-properties.cpp:1119 +#: ../src/ui/dialog/document-properties.cpp:1155 msgid "Select a script to load" msgstr "Виберіть скрипт для завантаження" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1147 +#: ../src/ui/dialog/document-properties.cpp:1183 msgid "Add embedded script..." msgstr "Додати вбудований скрипт…" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1178 +#: ../src/ui/dialog/document-properties.cpp:1214 msgid "Remove external script" msgstr "Вилучити зовнішній скрипт" #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1212 +#: ../src/ui/dialog/document-properties.cpp:1248 msgid "Remove embedded script" msgstr "Вилучити вбудований скрипт" #. TODO repr->set_content(_EmbeddedContent.get_buffer()->get_text()); #. inform the document, so we can undo -#: ../src/ui/dialog/document-properties.cpp:1312 +#: ../src/ui/dialog/document-properties.cpp:1348 msgid "Edit embedded script" msgstr "Редагувати вбудований скрипт" -#: ../src/ui/dialog/document-properties.cpp:1395 +#: ../src/ui/dialog/document-properties.cpp:1431 msgid "Creation" msgstr "Створення" -#: ../src/ui/dialog/document-properties.cpp:1396 +#: ../src/ui/dialog/document-properties.cpp:1432 msgid "Defined grids" msgstr "Визначені сітки" -#: ../src/ui/dialog/document-properties.cpp:1639 +#: ../src/ui/dialog/document-properties.cpp:1675 msgid "Remove grid" msgstr "Вилучити сітку" -#: ../src/ui/dialog/document-properties.cpp:1707 +#: ../src/ui/dialog/document-properties.cpp:1743 msgid "Changed document unit" msgstr "Змінено одиницю виміру у документі" @@ -14079,6 +15948,11 @@ msgstr "Малюнок експортовано до %s." msgid "Export aborted." msgstr "Експорт перервано." +#: ../src/ui/dialog/export.cpp:1299 ../src/ui/dialog/input.cpp:1082 +#: ../src/verbs.cpp:2361 ../src/widgets/desktop-widget.cpp:1128 +msgid "_Save" +msgstr "З_берегти" + #: ../src/ui/dialog/extension-editor.cpp:81 msgid "Information" msgstr "Інформація" @@ -14103,7 +15977,7 @@ msgstr "Інформація" #: ../share/extensions/gcodetools_prepare_path_for_plasma.inx.h:17 #: ../share/extensions/gcodetools_tools_library.inx.h:12 #: ../share/extensions/generate_voronoi.inx.h:5 -#: ../share/extensions/gimp_xcf.inx.h:6 +#: ../share/extensions/gimp_xcf.inx.h:7 #: ../share/extensions/interp_att_g.inx.h:27 #: ../share/extensions/jessyInk_autoTexts.inx.h:8 #: ../share/extensions/jessyInk_effects.inx.h:13 @@ -14286,7 +16160,7 @@ msgid "Stroke st_yle" msgstr "С_тиль штриха" #. TRANSLATORS: this dialog is accessible via menu Filters - Filter editor -#: ../src/ui/dialog/filter-effects-dialog.cpp:515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:546 msgid "" "This matrix determines a linear transform on color space. Each line affects " "one of the color components. Each column determines how much of each color " @@ -14299,38 +16173,58 @@ msgstr "" "не залежить від вхідних кольорів, отже, може бути використаний для " "визначення сталого значення у компоненті." -#: ../src/ui/dialog/filter-effects-dialog.cpp:625 +#: ../src/ui/dialog/filter-effects-dialog.cpp:656 msgid "Image File" msgstr "Файл зображення" -#: ../src/ui/dialog/filter-effects-dialog.cpp:628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:659 msgid "Selected SVG Element" msgstr "Вибраний елемент SVG" #. TODO: any image, not just svg -#: ../src/ui/dialog/filter-effects-dialog.cpp:698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:729 msgid "Select an image to be used as feImage input" msgstr "Оберіть зображення, що буде використано як вхідні дані feImage" -#: ../src/ui/dialog/filter-effects-dialog.cpp:790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:821 msgid "This SVG filter effect does not require any parameters." msgstr "Цей примітив ефекту SVG не потребує параметрів." -#: ../src/ui/dialog/filter-effects-dialog.cpp:796 +#: ../src/ui/dialog/filter-effects-dialog.cpp:827 msgid "This SVG filter effect is not yet implemented in Inkscape." msgstr "Цей фільтр ефекту SVG ще не реалізовано у Inkscape." -#: ../src/ui/dialog/filter-effects-dialog.cpp:984 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1041 +msgid "Slope" +msgstr "Перспектива" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1042 +msgid "Intercept" +msgstr "Перетин" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1045 +msgid "Amplitude" +msgstr "Амплітуда" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1046 +msgid "Exponent" +msgstr "Експонента" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1143 +msgid "New transfer function type" +msgstr "Тип нової функції перенесення" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:1178 msgid "Light Source:" msgstr "Джерело світла:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1001 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1195 msgid "Direction angle for the light source on the XY plane, in degrees" msgstr "" "Кут напрямку, під яким джерело світла знаходиться відносно площини XY (у " "градусах)" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1002 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1196 msgid "Direction angle for the light source on the YZ plane, in degrees" msgstr "" "Кут напрямку, під яким джерело світла знаходиться відносно площини YZ (у " @@ -14339,47 +16233,47 @@ msgstr "" #. default x: #. default y: #. default z: -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 msgid "Location:" msgstr "Розташування:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "X coordinate" msgstr "Координата X" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Y coordinate" msgstr "Координата Y" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1005 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1008 -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1199 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1202 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Z coordinate" msgstr "Координата Z" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1011 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1205 msgid "Points At" msgstr "Вказує на" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Specular Exponent" msgstr "Степінь відбиття" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1012 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1206 msgid "Exponent value controlling the focus for the light source" msgstr "Показник експоненти, що керує фокусом джерела світла" #. TODO: here I have used 100 degrees as default value. But spec says that if not specified, no limiting cone is applied. So, there should be a way for the user to set a "no limiting cone" option. -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "Cone Angle" msgstr "Кут конуса" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1014 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1208 msgid "" "This is the angle between the spot light axis (i.e. the axis between the " "light source and the point to which it is pointing at) and the spot light " @@ -14389,111 +16283,111 @@ msgstr "" "світла і точку, на яку його спрямовано) і конусом прожектора. За межі конуса " "світло не проектується." -#: ../src/ui/dialog/filter-effects-dialog.cpp:1077 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1274 msgid "New light source" msgstr "Нове джерело світла" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1118 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1325 msgid "_Duplicate" msgstr "_Дублювати" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1152 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1359 msgid "_Filter" msgstr "_Фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1174 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1381 msgid "R_ename" msgstr "Пере_йменувати" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1304 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1511 msgid "Rename filter" msgstr "Перейменувати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1349 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1556 msgid "Apply filter" msgstr "Застосувати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1419 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1626 msgid "filter" msgstr "фільтрувати" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1426 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1633 msgid "Add filter" msgstr "Додати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1478 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1685 msgid "Duplicate filter" msgstr "Дублювати фільтр" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1577 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1784 msgid "_Effect" msgstr "_Ефект" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1587 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1794 msgid "Connections" msgstr "З'єднання" -#: ../src/ui/dialog/filter-effects-dialog.cpp:1725 +#: ../src/ui/dialog/filter-effects-dialog.cpp:1932 msgid "Remove filter primitive" msgstr "Вилучити примітив фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2313 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2520 msgid "Remove merge node" msgstr "Вилучити вузол об'єднання" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2433 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2640 msgid "Reorder filter primitive" msgstr "Зміна порядку примітивів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2513 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2720 msgid "Add Effect:" msgstr "Додати ефект:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2514 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 msgid "No effect selected" msgstr "Не вибрано жодного ефекту" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2515 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2722 msgid "No filter selected" msgstr "Не вибрано жодного фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2561 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2767 msgid "Effect parameters" msgstr "Параметри ефекту" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2562 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2768 msgid "Filter General Settings" msgstr "Загальні параметри фільтра" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Coordinates:" msgstr "Координати:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "X coordinate of the left corners of filter effects region" msgstr "Координата X лівих кутів області дії ефектів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2620 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2826 msgid "Y coordinate of the upper corners of filter effects region" msgstr "Координата X верхніх кутів області дії ефектів фільтра" #. default width: #. default height: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Dimensions:" msgstr "Розміри:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Width of filter effects region" msgstr "Ширина області дії ефектів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2621 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2827 msgid "Height of filter effects region" msgstr "Висота області дії ефектів фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2627 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2833 msgid "" "Indicates the type of matrix operation. The keyword 'matrix' indicates that " "a full 5x4 matrix of values will be provided. The other keywords represent " @@ -14504,23 +16398,40 @@ msgstr "" "матрицю значень розміром 5×4. Інші варіанти — це простий спосіб виконати " "найпростіші операції без визначення всієї матриці вручну." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2628 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2834 msgid "Value(s):" msgstr "Значення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2643 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2838 +msgid "R:" +msgstr "Ч:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2839 +#: ../src/widgets/sp-color-icc-selector.cpp:359 +msgid "G:" +msgstr "З:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2840 +msgid "B:" +msgstr "С:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2841 +msgid "A:" +msgstr "П:" + +#: ../src/ui/dialog/filter-effects-dialog.cpp:2844 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "Operator:" msgstr "Оператор:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 msgid "K1:" msgstr "K1:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2644 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2845 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "" "If the arithmetic operation is chosen, each result pixel is computed using " "the formula k1*i1*i2 + k2*i1 + k3*i2 + k4 where i1 and i2 are the pixel " @@ -14530,38 +16441,38 @@ msgstr "" "за формулою k1*i1*i2 + k2*i1 + k3*i2 + k4, де i1 і i2 — значення пікселів " "першого і другого вхідних значень відповідно." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2645 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2846 msgid "K2:" msgstr "K2:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2646 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2847 msgid "K3:" msgstr "K3:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2647 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2848 msgid "K4:" msgstr "K4:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "Size:" msgstr "Розмір:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "width of the convolve matrix" msgstr "ширина матриці згортки" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2650 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2851 msgid "height of the convolve matrix" msgstr "висота матриці згортки" #. default x: #. default y: -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 #: ../src/ui/dialog/object-attributes.cpp:48 msgid "Target:" msgstr "Target:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "" "X coordinate of the target point in the convolve matrix. The convolution is " "applied to pixels around this point." @@ -14569,7 +16480,7 @@ msgstr "" "Координата X кінцевої точки матриці згортки. Згортка застосовується до " "пікселів навколо цієї точки." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2651 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2852 msgid "" "Y coordinate of the target point in the convolve matrix. The convolution is " "applied to pixels around this point." @@ -14578,11 +16489,11 @@ msgstr "" "пікселів навколо цієї точки." #. TRANSLATORS: for info on "Kernel", see http://en.wikipedia.org/wiki/Kernel_(matrix) -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "Kernel:" msgstr "Ядро:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2653 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2854 msgid "" "This matrix describes the convolve operation that is applied to the input " "image in order to calculate the pixel colors at the output. Different " @@ -14597,11 +16508,11 @@ msgstr "" "у той час, як матриця, заповнена сталим ненульовим значенням дасть звичайний " "ефект розмивання." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "Divisor:" msgstr "Дільник:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2655 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2856 msgid "" "After applying the kernelMatrix to the input image to yield a number, that " "number is divided by divisor to yield the final destination color value. A " @@ -14613,11 +16524,11 @@ msgstr "" "кольору. Дільник, що є сумою всіх значень матриці, приглушує загальну " "інтенсивність кольорів остаточного зображення." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "Bias:" msgstr "Зміщення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2656 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2857 msgid "" "This value is added to each component. This is useful to define a constant " "value as the zero response of the filter." @@ -14625,11 +16536,11 @@ msgstr "" "Це значення додається до кожного компонента. Корисно для задання сталої, як " "нульового відгуку фільтра." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "Edge Mode:" msgstr "Режим країв:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2657 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2858 msgid "" "Determines how to extend the input image as necessary with color values so " "that the matrix operations can be applied when the kernel is positioned at " @@ -14639,31 +16550,31 @@ msgstr "" "щоб матричні операції могли працювати з ядром, розташованим на краю " "зображення або поблизу нього." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "Preserve Alpha" msgstr "Зберігати α-канал" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2658 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2859 msgid "If set, the alpha channel won't be altered by this filter primitive." msgstr "Якщо встановлено, α-канал не буде змінено цим примітивом фільтра." #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 msgid "Diffuse Color:" msgstr "Колір дифузії:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2661 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2862 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Defines the color of the light source" msgstr "Визначає колір джерела світла" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "Surface Scale:" msgstr "Масштаб поверхні:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2662 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2695 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2863 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2896 msgid "" "This value amplifies the heights of the bump map defined by the input alpha " "channel" @@ -14671,59 +16582,59 @@ msgstr "" "Це значення визначає множник висоти карти рельєфу, що задається вхідним α-" "каналом" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "Constant:" msgstr "Константа:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2663 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2696 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2864 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2897 msgid "This constant affects the Phong lighting model." msgstr "Ця стала стосується моделі освітлення Фонга" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2664 -#: ../src/ui/dialog/filter-effects-dialog.cpp:2698 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2865 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2899 msgid "Kernel Unit Length:" msgstr "Одиниця довжини у ядрі:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2668 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2869 msgid "This defines the intensity of the displacement effect." msgstr "Ця величина визначає інтенсивність ефекту зміщення." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "X displacement:" msgstr "Зміщення за X:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2669 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 msgid "Color component that controls the displacement in the X direction" msgstr "Компонент кольору, що керує зміщенням у напрямку осі X" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Y displacement:" msgstr "Зміщення за Y:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2670 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2871 msgid "Color component that controls the displacement in the Y direction" msgstr "Компонент кольору, що керує зміщенням у напрямку осі Y" #. default: black -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "Flood Color:" msgstr "Колір заливки:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2673 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2874 msgid "The whole filter region will be filled with this color." msgstr "Всю область дії фільтра буде залито цим кольором." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "Standard Deviation:" msgstr "Стандартне відхилення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2677 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2878 msgid "The standard deviation for the blur operation." msgstr "Стандартне відхилення під час виконання операції розмивання" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2683 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2884 msgid "" "Erode: performs \"thinning\" of input image.\n" "Dilate: performs \"fattenning\" of input image." @@ -14731,41 +16642,41 @@ msgstr "" "Ерозія: виконує «витончення» вхідного зображення\n" "Розтягування: «потовщує» вхідне зображення" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2687 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2888 msgid "Source of Image:" msgstr "Джерело зображення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "Delta X:" msgstr "Крок за X:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2690 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2891 msgid "This is how far the input image gets shifted to the right" msgstr "Визначає як далеко вхідне зображення зміщується праворуч" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "Delta Y:" msgstr "Крок за Y:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2691 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2892 msgid "This is how far the input image gets shifted downwards" msgstr "Визначає як далеко вхідне зображення зміщується донизу" #. default: white -#: ../src/ui/dialog/filter-effects-dialog.cpp:2694 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2895 msgid "Specular Color:" msgstr "Колір відбиття:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 #: ../share/extensions/interp.inx.h:2 msgid "Exponent:" msgstr "Експонента:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2697 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2898 msgid "Exponent for specular term, larger is more \"shiny\"." msgstr "Степінь відбиття: більше значення дає «яскравіше»." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2706 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2907 msgid "" "Indicates whether the filter primitive should perform a noise or turbulence " "function." @@ -14773,27 +16684,27 @@ msgstr "" "Позначає чи повинен примітив виконувати функцію створення турбулентності або " "шуму." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2707 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2908 msgid "Base Frequency:" msgstr "Опорна частота:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2708 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2909 msgid "Octaves:" msgstr "Октави:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "Seed:" msgstr "Випадкове значення:" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2709 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2910 msgid "The starting number for the pseudo random number generator." msgstr "Початкове число для генератора псевдовипадкових чисел." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2721 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2922 msgid "Add filter primitive" msgstr "Додати примітив фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2738 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2939 msgid "" "The feBlend filter primitive provides 4 image blending modes: screen, " "multiply, darken and lighten." @@ -14801,7 +16712,7 @@ msgstr "" "Примітив фільтра feBlend надає можливість використовувати 4 режими " "змішування: просвічування, множення, темнішання та світлішання." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2742 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2943 msgid "" "The feColorMatrix filter primitive applies a matrix transformation to " "color of each rendered pixel. This allows for effects like turning object to " @@ -14811,7 +16722,7 @@ msgstr "" "кольору до кожної відображеної точки. Все це включає до себе перетворення " "об'єкта до півтонів сірого, зміну насиченості кольору і зміну відтінку." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2746 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2947 msgid "" "The feComponentTransfer filter primitive manipulates the input's " "color components (red, green, blue, and alpha) according to particular " @@ -14823,7 +16734,7 @@ msgstr "" "з окремими функціями переходу, роблячи можливим операції на зразок " "регулювання яскравості і контрасту, баланс кольорів та постеризацію." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2750 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2951 msgid "" "The feComposite filter primitive composites two images using one of " "the Porter-Duff blending modes or the arithmetic mode described in SVG " @@ -14835,7 +16746,7 @@ msgstr "" "описаного у стандарті SVG. Режими змішування Портера-Даффа по суті є " "булівськими операціями між значеннями кольорів відповідних точок зображень." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2754 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2955 msgid "" "The feConvolveMatrix lets you specify a Convolution to be applied on " "the image. Common effects created using convolution matrices are blur, " @@ -14850,7 +16761,7 @@ msgstr "" "за допомогою цього примітиву фільтра, особливий примітив фільтра для " "Гаусового розмивання є швидшим та незалежним від роздільної здатності." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2758 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2959 msgid "" "The feDiffuseLighting and feSpecularLighting filter primitives create " "\"embossed\" shadings. The input's alpha channel is used to provide depth " @@ -14862,7 +16773,7 @@ msgstr "" "використовується для відтворення глибини: непрозоріші області наближаються " "до глядача, а прозоріші — віддаляються." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2762 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2963 msgid "" "The feDisplacementMap filter primitive displaces the pixels in the " "first input using the second input as a displacement map, that shows from " @@ -14874,7 +16785,7 @@ msgstr "" "у якому напрямку і на яку відстань слід змістити точку. Класичними " "прикладами фільтра є ефекти «вихор» і «затискання»." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2766 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2967 msgid "" "The feFlood filter primitive fills the region with a given color and " "opacity. It is usually used as an input to other filters to apply color to " @@ -14884,7 +16795,7 @@ msgstr "" "непрозорістю. Зазвичай, його використовують як початковий для інших " "фільтрів, з метою надати графіці кольору." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2770 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2971 msgid "" "The feGaussianBlur filter primitive uniformly blurs its input. It is " "commonly used together with feOffset to create a drop shadow effect." @@ -14893,7 +16804,7 @@ msgstr "" "його застосовано. Зазвичай, він використовується разом з feOffset для " "створення ефекту відкидання тіні." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2774 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2975 msgid "" "The feImage filter primitive fills the region with an external image " "or another part of the document." @@ -14901,7 +16812,7 @@ msgstr "" "Примітив фільтра feImage заливає область зовнішнім зображенням або " "іншою частиною документа." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2778 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2979 msgid "" "The feMerge filter primitive composites several temporary images " "inside the filter primitive to a single image. It uses normal alpha " @@ -14914,7 +16825,7 @@ msgstr "" "кратне застосування примітивів feBlend у 'звичайному' режимі або кратне " "застосування примітивів feComposite у 'над'-режимі." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2782 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2983 msgid "" "The feMorphology filter primitive provides erode and dilate effects. " "For single-color objects erode makes the object thinner and dilate makes it " @@ -14924,7 +16835,7 @@ msgstr "" "ерозії та розширення. Для однокольорових об'єктів ерозія робить об'єкт " "меншим, а розширення — більшим." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2786 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2987 msgid "" "The feOffset filter primitive offsets the image by an user-defined " "amount. For example, this is useful for drop shadows, where the shadow is in " @@ -14934,7 +16845,7 @@ msgstr "" "відстань. Це, наприклад, корисно для відображення тіней, коли тінь " "розташовано з невеликим зсувом відносно об'єкта, що її відкидає." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2790 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2991 msgid "" "The feDiffuseLighting and feSpecularLighting filter primitives " "create \"embossed\" shadings. The input's alpha channel is used to provide " @@ -14946,14 +16857,14 @@ msgstr "" "матеріалу, використовується для відтворення глибини: непрозоріші області " "наближаються до глядача, а прозоріші — віддаляються." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2794 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2995 msgid "" "The feTile filter primitive tiles a region with its input graphic" msgstr "" "Примітив фільтра feTile заповнює область мозаїкою у формі вхідного " "графічного зображення" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2798 +#: ../src/ui/dialog/filter-effects-dialog.cpp:2999 msgid "" "The feTurbulence filter primitive renders Perlin noise. This kind of " "noise is useful in simulating several nature phenomena like clouds, fire and " @@ -14963,11 +16874,11 @@ msgstr "" "шумів корисний для імітації деяких природних явищ на зразок хмар, полум'я та " "диму, та під час створення складних текстур на зразок мармуру та граніту." -#: ../src/ui/dialog/filter-effects-dialog.cpp:2817 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3018 msgid "Duplicate filter primitive" msgstr "Дублювати примітив фільтра" -#: ../src/ui/dialog/filter-effects-dialog.cpp:2870 +#: ../src/ui/dialog/filter-effects-dialog.cpp:3071 msgid "Set filter primitive attribute" msgstr "Встановити атрибут примітива фільтра" @@ -16441,7 +18352,7 @@ msgstr "Стиль малювання об'єктів" #. Zoom #: ../src/ui/dialog/inkscape-preferences.cpp:376 -#: ../src/widgets/desktop-widget.cpp:635 +#: ../src/widgets/desktop-widget.cpp:636 msgid "Zoom" msgstr "Масштаб" @@ -16608,8 +18519,8 @@ msgstr "Відро з фарбою" #. Gradient #: ../src/ui/dialog/inkscape-preferences.cpp:478 -#: ../src/widgets/gradient-selector.cpp:151 -#: ../src/widgets/gradient-selector.cpp:303 +#: ../src/widgets/gradient-selector.cpp:152 +#: ../src/widgets/gradient-selector.cpp:320 msgid "Gradient" msgstr "Градієнт" @@ -17253,8 +19164,8 @@ msgid "_Time of opacity change animation:" msgstr "_Час зміни непрозорості у анімації:" #: ../src/ui/dialog/inkscape-preferences.cpp:703 -#: ../share/extensions/hpgl_output.inx.h:34 -#: ../share/extensions/plotter.inx.h:50 +#: ../share/extensions/hpgl_output.inx.h:33 +#: ../share/extensions/plotter.inx.h:49 msgid "Miscellaneous" msgstr "Інше" @@ -18046,7 +19957,7 @@ msgstr "Позначення" #. Transforms options #: ../src/ui/dialog/inkscape-preferences.cpp:1169 -#: ../src/widgets/select-toolbar.cpp:577 +#: ../src/widgets/select-toolbar.cpp:578 msgid "Scale stroke width" msgstr "Змінювати ширину штриха" @@ -18067,25 +19978,25 @@ msgid "Preserved" msgstr "Без оптимізації" #: ../src/ui/dialog/inkscape-preferences.cpp:1177 -#: ../src/widgets/select-toolbar.cpp:578 +#: ../src/widgets/select-toolbar.cpp:579 msgid "When scaling objects, scale the stroke width by the same proportion" msgstr "" "При зміні розміру об'єктів змінювати ширину штриха у відповідній пропорції" #: ../src/ui/dialog/inkscape-preferences.cpp:1179 -#: ../src/widgets/select-toolbar.cpp:589 +#: ../src/widgets/select-toolbar.cpp:590 msgid "When scaling rectangles, scale the radii of rounded corners" msgstr "" "При зміні розміру прямокутників міняти радіус округлених кутів у тій самій " "пропорції" #: ../src/ui/dialog/inkscape-preferences.cpp:1181 -#: ../src/widgets/select-toolbar.cpp:600 +#: ../src/widgets/select-toolbar.cpp:601 msgid "Move gradients (in fill or stroke) along with the objects" msgstr "Трансформувати градієнти (у заповненні чи штрихах) разом з об'єктом" #: ../src/ui/dialog/inkscape-preferences.cpp:1183 -#: ../src/widgets/select-toolbar.cpp:611 +#: ../src/widgets/select-toolbar.cpp:612 msgid "Move patterns (in fill or stroke) along with the objects" msgstr "Трансформувати візерунки (у заповненнях чи штрихах) разом з об'єктом" @@ -18736,7 +20647,7 @@ msgid "Shortcut file:" msgstr "Файл скорочень:" #: ../src/ui/dialog/inkscape-preferences.cpp:1484 -#: ../src/ui/dialog/template-load-tab.cpp:49 +#: ../src/ui/dialog/template-load-tab.cpp:48 msgid "Search:" msgstr "Шукати:" @@ -19005,10 +20916,6 @@ msgstr "" "Ви_користовувати графічний планшет чи інший пристрій (потребує " "перезавантаження)" -#: ../src/ui/dialog/input.cpp:1082 ../src/verbs.cpp:2361 -msgid "_Save" -msgstr "З_берегти" - #: ../src/ui/dialog/input.cpp:1086 msgid "Axes" msgstr "Вісі" @@ -19169,69 +21076,69 @@ msgstr "Додати ефект контуру" msgid "Add path effect" msgstr "Додати ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:113 +#: ../src/ui/dialog/livepatheffect-editor.cpp:119 msgid "Delete current path effect" msgstr "Вилучити поточний ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:117 +#: ../src/ui/dialog/livepatheffect-editor.cpp:129 msgid "Raise the current path effect" msgstr "Підняти поточний ефект контуру у списку" -#: ../src/ui/dialog/livepatheffect-editor.cpp:121 +#: ../src/ui/dialog/livepatheffect-editor.cpp:139 msgid "Lower the current path effect" msgstr "Опустити поточний ефект контуру у списку" -#: ../src/ui/dialog/livepatheffect-editor.cpp:289 +#: ../src/ui/dialog/livepatheffect-editor.cpp:313 msgid "Unknown effect is applied" msgstr "Застосовано невідомий ефект" -#: ../src/ui/dialog/livepatheffect-editor.cpp:292 +#: ../src/ui/dialog/livepatheffect-editor.cpp:316 msgid "Click button to add an effect" msgstr "Натисніть кнопку, щоб додати ефект" -#: ../src/ui/dialog/livepatheffect-editor.cpp:305 +#: ../src/ui/dialog/livepatheffect-editor.cpp:329 msgid "Click add button to convert clone" msgstr "Натисніть кнопку додавання, щоб перетворити клон" -#: ../src/ui/dialog/livepatheffect-editor.cpp:310 -#: ../src/ui/dialog/livepatheffect-editor.cpp:314 -#: ../src/ui/dialog/livepatheffect-editor.cpp:322 +#: ../src/ui/dialog/livepatheffect-editor.cpp:334 +#: ../src/ui/dialog/livepatheffect-editor.cpp:338 +#: ../src/ui/dialog/livepatheffect-editor.cpp:346 msgid "Select a path or shape" msgstr "Виберіть контур або форму" -#: ../src/ui/dialog/livepatheffect-editor.cpp:318 +#: ../src/ui/dialog/livepatheffect-editor.cpp:342 msgid "Only one item can be selected" msgstr "Можна вибрати тільки один пункт" -#: ../src/ui/dialog/livepatheffect-editor.cpp:350 +#: ../src/ui/dialog/livepatheffect-editor.cpp:374 msgid "Unknown effect" msgstr "Невідомий ефект" -#: ../src/ui/dialog/livepatheffect-editor.cpp:426 +#: ../src/ui/dialog/livepatheffect-editor.cpp:450 msgid "Create and apply path effect" msgstr "Створити і застосувати ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:461 +#: ../src/ui/dialog/livepatheffect-editor.cpp:485 msgid "Create and apply Clone original path effect" msgstr "Створити і застосувати ефект клонування початкового контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:481 +#: ../src/ui/dialog/livepatheffect-editor.cpp:505 msgid "Remove path effect" msgstr "Вилучити ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:498 +#: ../src/ui/dialog/livepatheffect-editor.cpp:522 msgid "Move path effect up" msgstr "Пересунути ефект контуру вгору" -#: ../src/ui/dialog/livepatheffect-editor.cpp:514 +#: ../src/ui/dialog/livepatheffect-editor.cpp:538 msgid "Move path effect down" msgstr "Пересунути ефект контуру вниз" -#: ../src/ui/dialog/livepatheffect-editor.cpp:553 +#: ../src/ui/dialog/livepatheffect-editor.cpp:577 msgid "Activate path effect" msgstr "Задіяти ефект контуру" -#: ../src/ui/dialog/livepatheffect-editor.cpp:553 +#: ../src/ui/dialog/livepatheffect-editor.cpp:577 msgid "Deactivate path effect" msgstr "Вимкнути ефект контуру" @@ -19322,13 +21229,13 @@ msgstr "URL:" #: ../src/ui/dialog/object-attributes.cpp:66 #: ../src/ui/dialog/object-attributes.cpp:75 ../src/ui/dialog/tile.cpp:618 -#: ../src/widgets/desktop-widget.cpp:670 ../src/widgets/node-toolbar.cpp:594 +#: ../src/widgets/desktop-widget.cpp:671 ../src/widgets/node-toolbar.cpp:594 msgid "X:" msgstr "X:" #: ../src/ui/dialog/object-attributes.cpp:67 #: ../src/ui/dialog/object-attributes.cpp:76 ../src/ui/dialog/tile.cpp:619 -#: ../src/widgets/desktop-widget.cpp:680 ../src/widgets/node-toolbar.cpp:612 +#: ../src/widgets/desktop-widget.cpp:681 ../src/widgets/node-toolbar.cpp:612 msgid "Y:" msgstr "Y:" @@ -19457,47 +21364,47 @@ msgstr "Сховати об'єкт" msgid "Unhide object" msgstr "Показати об'єкт" -#: ../src/ui/dialog/ocaldialogs.cpp:714 +#: ../src/ui/dialog/ocaldialogs.cpp:715 msgid "Clipart found" msgstr "Виявлено шаблон" -#: ../src/ui/dialog/ocaldialogs.cpp:763 +#: ../src/ui/dialog/ocaldialogs.cpp:764 msgid "Downloading image..." msgstr "Отримання зображення…" -#: ../src/ui/dialog/ocaldialogs.cpp:911 +#: ../src/ui/dialog/ocaldialogs.cpp:912 msgid "Could not download image" msgstr "Не вдалося отримати зображення" -#: ../src/ui/dialog/ocaldialogs.cpp:921 +#: ../src/ui/dialog/ocaldialogs.cpp:922 msgid "Clipart downloaded successfully" msgstr "Шаблон успішно отримано" -#: ../src/ui/dialog/ocaldialogs.cpp:935 +#: ../src/ui/dialog/ocaldialogs.cpp:936 msgid "Could not download thumbnail file" msgstr "Не вдалося отримати файл мініатюри" -#: ../src/ui/dialog/ocaldialogs.cpp:1010 +#: ../src/ui/dialog/ocaldialogs.cpp:1011 msgid "No description" msgstr "Немає опису" -#: ../src/ui/dialog/ocaldialogs.cpp:1078 +#: ../src/ui/dialog/ocaldialogs.cpp:1079 msgid "Searching clipart..." msgstr "Пошук шаблонів…" -#: ../src/ui/dialog/ocaldialogs.cpp:1098 ../src/ui/dialog/ocaldialogs.cpp:1119 +#: ../src/ui/dialog/ocaldialogs.cpp:1099 ../src/ui/dialog/ocaldialogs.cpp:1120 msgid "Could not connect to the Open Clip Art Library" msgstr "Не вдалося встановити зв'язок з бібліотекою Open Clip Art" -#: ../src/ui/dialog/ocaldialogs.cpp:1144 +#: ../src/ui/dialog/ocaldialogs.cpp:1145 msgid "Could not parse search results" msgstr "Не вдалося обробити результати пошуку" -#: ../src/ui/dialog/ocaldialogs.cpp:1178 +#: ../src/ui/dialog/ocaldialogs.cpp:1179 msgid "No clipart named %1 was found." msgstr "Не виявлено шаблонів з назвою %1." -#: ../src/ui/dialog/ocaldialogs.cpp:1180 +#: ../src/ui/dialog/ocaldialogs.cpp:1181 msgid "" "Please make sure all keywords are spelled correctly, or try again with " "different keywords." @@ -19505,25 +21412,25 @@ msgstr "" "Будь ласка, переконайтеся, що всі вказані ключові слова написано правильно " "або повторіть спробу пошуку, вказавши інші ключові слова." -#: ../src/ui/dialog/ocaldialogs.cpp:1232 +#: ../src/ui/dialog/ocaldialogs.cpp:1233 msgid "Search" msgstr "Пошук" -#: ../src/ui/dialog/ocaldialogs.cpp:1244 +#: ../src/ui/dialog/ocaldialogs.cpp:1245 msgid "Close" msgstr "Закрити" #: ../src/ui/dialog/pixelartdialog.cpp:162 -msgid "_Curves (multiplier)" -msgstr "_Криві (множник)" +msgid "_Curves (multiplier):" +msgstr "_Криві (множник):" #: ../src/ui/dialog/pixelartdialog.cpp:165 msgid "Favors connections that are part of a long curve" msgstr "Надавати перевагу з’єднанням, які є частиною довших кривих" #: ../src/ui/dialog/pixelartdialog.cpp:176 -msgid "_Islands (weight)" -msgstr "_Області (вага)" +msgid "_Islands (weight):" +msgstr "_Області (вага):" #: ../src/ui/dialog/pixelartdialog.cpp:179 msgid "Avoid single disconnected pixels" @@ -19534,16 +21441,16 @@ msgid "A constant vote value" msgstr "Стале значення рівня" #: ../src/ui/dialog/pixelartdialog.cpp:191 -msgid "Sparse pixels (window _radius)" -msgstr "Розріджені пікселі (_радіус вікна)" +msgid "Sparse pixels (window _radius):" +msgstr "Розріджені пікселі (_радіус вікна):" #: ../src/ui/dialog/pixelartdialog.cpp:200 msgid "The radius of the window analyzed" msgstr "Радіус вікна, яке буде проаналізовано" #: ../src/ui/dialog/pixelartdialog.cpp:201 -msgid "Sparse pixels (_multiplier)" -msgstr "Розріджені пікселі (_множник)" +msgid "Sparse pixels (_multiplier):" +msgstr "Розріджені пікселі (_множник):" #: ../src/ui/dialog/pixelartdialog.cpp:212 msgid "Favors connections that are part of foreground color" @@ -19874,8 +21781,8 @@ msgstr "Текст зразка" msgid "Preview Text:" msgstr "Перегляд тексту:" -#: ../src/ui/dialog/swatches.cpp:203 ../src/ui/tools/gradient-tool.cpp:369 -#: ../src/ui/tools/gradient-tool.cpp:467 +#: ../src/ui/dialog/swatches.cpp:203 ../src/ui/tools/gradient-tool.cpp:371 +#: ../src/ui/tools/gradient-tool.cpp:469 #: ../src/widgets/gradient-vector.cpp:814 msgid "Add gradient stop" msgstr "Додавання опорної точки градієнта" @@ -19904,36 +21811,36 @@ msgid "Palettes directory (%s) is unavailable." msgstr "Каталог з палітрами (%s) недоступний." #. ******************* Symbol Sets ************************ -#: ../src/ui/dialog/symbols.cpp:128 +#: ../src/ui/dialog/symbols.cpp:127 msgid "Symbol set: " msgstr "Набір символів: " #. Fill in later -#: ../src/ui/dialog/symbols.cpp:137 ../src/ui/dialog/symbols.cpp:138 +#: ../src/ui/dialog/symbols.cpp:136 ../src/ui/dialog/symbols.cpp:137 msgid "Current Document" msgstr "Поточний документ" -#: ../src/ui/dialog/symbols.cpp:205 +#: ../src/ui/dialog/symbols.cpp:204 msgid "Add Symbol from the current document." msgstr "Додати символ до поточного документа." -#: ../src/ui/dialog/symbols.cpp:214 +#: ../src/ui/dialog/symbols.cpp:213 msgid "Remove Symbol from the current document." msgstr "Вилучити символ з поточного документа." -#: ../src/ui/dialog/symbols.cpp:227 +#: ../src/ui/dialog/symbols.cpp:226 msgid "Make Icons bigger by zooming in." msgstr "Робити піктограми більшими збільшенням масштабу." -#: ../src/ui/dialog/symbols.cpp:236 +#: ../src/ui/dialog/symbols.cpp:235 msgid "Make Icons smaller by zooming out." msgstr "Робити піктограми меншими зменшенням масштабу." -#: ../src/ui/dialog/symbols.cpp:245 +#: ../src/ui/dialog/symbols.cpp:244 msgid "Toggle 'fit' symbols in icon space." msgstr "Вмикати/Вимикати символи підбирання розмірів у просторі піктограм." -#: ../src/ui/dialog/symbols.cpp:558 +#: ../src/ui/dialog/symbols.cpp:574 msgid "Unnamed Symbols" msgstr "Символи без назв" @@ -19941,10 +21848,6 @@ msgstr "Символи без назв" msgid "More info" msgstr "Додаткова інформація" -#: ../src/ui/dialog/template-widget.cpp:37 -msgid " " -msgstr " " - #: ../src/ui/dialog/template-widget.cpp:38 msgid "no template selected" msgstr "не вибрано шаблону" @@ -20011,7 +21914,7 @@ msgid "Text path offset" msgstr "Відступ тексту від контуру" #: ../src/ui/dialog/text-edit.cpp:588 ../src/ui/dialog/text-edit.cpp:662 -#: ../src/ui/tools/text-tool.cpp:1487 +#: ../src/ui/tools/text-tool.cpp:1488 msgid "Set text style" msgstr "Встановити стиль тексту" @@ -20370,7 +22273,7 @@ msgid "A_ngle:" msgstr "_Кут:" #: ../src/ui/dialog/transformation.cpp:84 -#: ../src/ui/dialog/transformation.cpp:1103 +#: ../src/ui/dialog/transformation.cpp:1104 msgid "Rotation angle (positive = counterclockwise)" msgstr "Кут повороту (додатній = проти годинникової стрілки)" @@ -20491,21 +22394,21 @@ msgstr "Обернути проти годинникової стрілки" msgid "Rotate in a clockwise direction" msgstr "Обернути за годинниковою стрілкою" -#: ../src/ui/dialog/transformation.cpp:907 -#: ../src/ui/dialog/transformation.cpp:918 -#: ../src/ui/dialog/transformation.cpp:932 -#: ../src/ui/dialog/transformation.cpp:951 -#: ../src/ui/dialog/transformation.cpp:962 -#: ../src/ui/dialog/transformation.cpp:972 -#: ../src/ui/dialog/transformation.cpp:996 +#: ../src/ui/dialog/transformation.cpp:908 +#: ../src/ui/dialog/transformation.cpp:919 +#: ../src/ui/dialog/transformation.cpp:933 +#: ../src/ui/dialog/transformation.cpp:952 +#: ../src/ui/dialog/transformation.cpp:963 +#: ../src/ui/dialog/transformation.cpp:973 +#: ../src/ui/dialog/transformation.cpp:997 msgid "Transform matrix is singular, not used." msgstr "Матриця перетворення є виродженою, не використовуємо її." -#: ../src/ui/dialog/transformation.cpp:1011 +#: ../src/ui/dialog/transformation.cpp:1012 msgid "Edit transformation matrix" msgstr "Редагування матриці трансформації" -#: ../src/ui/dialog/transformation.cpp:1110 +#: ../src/ui/dialog/transformation.cpp:1111 msgid "Rotation angle (positive = clockwise)" msgstr "Кут повороту (додатний = за годинниковою стрілкою)" @@ -20652,95 +22555,95 @@ msgstr "" "клацніть лівою кнопкою миші, щоб вставити вузол, клацніть один раз, щоб " "позначити (більше: Shift, Ctrl+Alt)" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 msgid "Retract handles" msgstr "Втягнути вуса" -#: ../src/ui/tool/multi-path-manipulator.cpp:326 ../src/ui/tool/node.cpp:270 +#: ../src/ui/tool/multi-path-manipulator.cpp:315 ../src/ui/tool/node.cpp:270 msgid "Change node type" msgstr "Змінити тип вузла" -#: ../src/ui/tool/multi-path-manipulator.cpp:334 +#: ../src/ui/tool/multi-path-manipulator.cpp:323 msgid "Straighten segments" msgstr "Розпрямляти сегменти" -#: ../src/ui/tool/multi-path-manipulator.cpp:336 +#: ../src/ui/tool/multi-path-manipulator.cpp:325 msgid "Make segments curves" msgstr "Зробити сегменти кривими" -#: ../src/ui/tool/multi-path-manipulator.cpp:344 +#: ../src/ui/tool/multi-path-manipulator.cpp:333 msgid "Add nodes" msgstr "Додати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:350 +#: ../src/ui/tool/multi-path-manipulator.cpp:339 msgid "Add extremum nodes" msgstr "Додати вузли у екстремумах" -#: ../src/ui/tool/multi-path-manipulator.cpp:357 +#: ../src/ui/tool/multi-path-manipulator.cpp:346 msgid "Duplicate nodes" msgstr "Дублювати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:420 +#: ../src/ui/tool/multi-path-manipulator.cpp:409 #: ../src/widgets/node-toolbar.cpp:421 msgid "Join nodes" msgstr "З'єднати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:427 +#: ../src/ui/tool/multi-path-manipulator.cpp:416 #: ../src/widgets/node-toolbar.cpp:432 msgid "Break nodes" msgstr "Розрізати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:434 +#: ../src/ui/tool/multi-path-manipulator.cpp:423 msgid "Delete nodes" msgstr "Вилучити вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:757 msgid "Move nodes" msgstr "Перемістити вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:771 +#: ../src/ui/tool/multi-path-manipulator.cpp:760 msgid "Move nodes horizontally" msgstr "Перемістити вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:764 msgid "Move nodes vertically" msgstr "Перемістити вузли вертикально" -#: ../src/ui/tool/multi-path-manipulator.cpp:779 -#: ../src/ui/tool/multi-path-manipulator.cpp:782 +#: ../src/ui/tool/multi-path-manipulator.cpp:768 +#: ../src/ui/tool/multi-path-manipulator.cpp:771 msgid "Rotate nodes" msgstr "Обертання вузлів" -#: ../src/ui/tool/multi-path-manipulator.cpp:786 -#: ../src/ui/tool/multi-path-manipulator.cpp:792 +#: ../src/ui/tool/multi-path-manipulator.cpp:775 +#: ../src/ui/tool/multi-path-manipulator.cpp:781 msgid "Scale nodes uniformly" msgstr "Масштабувати вузли однорідно" -#: ../src/ui/tool/multi-path-manipulator.cpp:789 +#: ../src/ui/tool/multi-path-manipulator.cpp:778 msgid "Scale nodes" msgstr "Масштабувати вузли" -#: ../src/ui/tool/multi-path-manipulator.cpp:796 +#: ../src/ui/tool/multi-path-manipulator.cpp:785 msgid "Scale nodes horizontally" msgstr "Масштабувати вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:800 +#: ../src/ui/tool/multi-path-manipulator.cpp:789 msgid "Scale nodes vertically" msgstr "Масштабувати вузли вертикально" -#: ../src/ui/tool/multi-path-manipulator.cpp:804 +#: ../src/ui/tool/multi-path-manipulator.cpp:793 msgid "Skew nodes horizontally" msgstr "Перекосити вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:808 +#: ../src/ui/tool/multi-path-manipulator.cpp:797 msgid "Skew nodes vertically" msgstr "Перекосити вузли вертикально" -#: ../src/ui/tool/multi-path-manipulator.cpp:812 +#: ../src/ui/tool/multi-path-manipulator.cpp:801 msgid "Flip nodes horizontally" msgstr "Віддзеркалити вузли горизонтально" -#: ../src/ui/tool/multi-path-manipulator.cpp:815 +#: ../src/ui/tool/multi-path-manipulator.cpp:804 msgid "Flip nodes vertically" msgstr "Віддзеркалити вузли вертикально" @@ -21037,22 +22940,22 @@ msgstr "Створити лінію з'єднання" msgid "Finishing connector" msgstr "Завершення лінії з'єднання" -#: ../src/ui/tools/connector-tool.cpp:1275 +#: ../src/ui/tools/connector-tool.cpp:1280 msgid "Connector endpoint: drag to reroute or connect to new shapes" msgstr "" "Кінцева з'єднувальна точка: перетягніть щоб змінити напрямок " "з'єднання або з'єднання з новими фігурами" -#: ../src/ui/tools/connector-tool.cpp:1415 +#: ../src/ui/tools/connector-tool.cpp:1420 msgid "Select at least one non-connector object." msgstr "Позначте принаймні два об'єкти для з'єднання." -#: ../src/ui/tools/connector-tool.cpp:1420 +#: ../src/ui/tools/connector-tool.cpp:1425 #: ../src/widgets/connector-toolbar.cpp:326 msgid "Make connectors avoid selected objects" msgstr "Змусити лінії огинати вибрані об'єкти" -#: ../src/ui/tools/connector-tool.cpp:1421 +#: ../src/ui/tools/connector-tool.cpp:1426 #: ../src/widgets/connector-toolbar.cpp:336 msgid "Make connectors ignore selected objects" msgstr "Змусити лінії ігнорувати вибрані об'єкти" @@ -21254,27 +23157,27 @@ msgstr[0] "Жодного вуса градієнта з %d в %d виб msgstr[1] "Жодного вуса градієнта з %d в %d вибраних об'єктах" msgstr[2] "Жодного вуса градієнта з %d в %d вибраних об'єктах" -#: ../src/ui/tools/gradient-tool.cpp:442 +#: ../src/ui/tools/gradient-tool.cpp:444 msgid "Simplify gradient" msgstr "Спростити градієнт" -#: ../src/ui/tools/gradient-tool.cpp:518 +#: ../src/ui/tools/gradient-tool.cpp:520 msgid "Create default gradient" msgstr "Створити типовий градієнт" -#: ../src/ui/tools/gradient-tool.cpp:577 ../src/ui/tools/mesh-tool.cpp:572 +#: ../src/ui/tools/gradient-tool.cpp:579 ../src/ui/tools/mesh-tool.cpp:572 msgid "Draw around handles to select them" msgstr "Обведіть вуса, щоб вибрати їх" -#: ../src/ui/tools/gradient-tool.cpp:700 +#: ../src/ui/tools/gradient-tool.cpp:702 msgid "Ctrl: snap gradient angle" msgstr "Ctrl: обмежити кут градієнта" -#: ../src/ui/tools/gradient-tool.cpp:701 +#: ../src/ui/tools/gradient-tool.cpp:703 msgid "Shift: draw gradient around the starting point" msgstr "Shift: малювати навколо початкової точки" -#: ../src/ui/tools/gradient-tool.cpp:955 ../src/ui/tools/mesh-tool.cpp:995 +#: ../src/ui/tools/gradient-tool.cpp:957 ../src/ui/tools/mesh-tool.cpp:995 #, c-format msgid "Gradient for %d object; with Ctrl to snap angle" msgid_plural "Gradient for %d objects; with Ctrl to snap angle" @@ -21282,7 +23185,7 @@ msgstr[0] "Градієнт для %d об'єкта; Ctrl обме msgstr[1] "Градієнт для %d об'єктів; Ctrl обмежує кут" msgstr[2] "Градієнт для %d об'єктів; Ctrl обмежує кут" -#: ../src/ui/tools/gradient-tool.cpp:959 ../src/ui/tools/mesh-tool.cpp:999 +#: ../src/ui/tools/gradient-tool.cpp:961 ../src/ui/tools/mesh-tool.cpp:999 msgid "Select objects on which to create gradient." msgstr "Позначте об'єкти до яких буде застосовано градієнт." @@ -21721,58 +23624,58 @@ msgstr "Зірка: радіус %s, кут %5g°; з Ctrl — msgid "Create star" msgstr "Створення зірки" -#: ../src/ui/tools/text-tool.cpp:392 +#: ../src/ui/tools/text-tool.cpp:393 msgid "Click to edit the text, drag to select part of the text." msgstr "" "Клацніть, щоб редагувати текст, перетягуванням можна позначити " "частину тексту." -#: ../src/ui/tools/text-tool.cpp:394 +#: ../src/ui/tools/text-tool.cpp:395 msgid "" "Click to edit the flowed text, drag to select part of the text." msgstr "" "Клацніть, щоб редагувати текст у рамці, перетягуванням можна " "позначити частину тексту." -#: ../src/ui/tools/text-tool.cpp:448 +#: ../src/ui/tools/text-tool.cpp:449 msgid "Create text" msgstr "Створити текст" -#: ../src/ui/tools/text-tool.cpp:473 +#: ../src/ui/tools/text-tool.cpp:474 msgid "Non-printable character" msgstr "Недрукований символ" -#: ../src/ui/tools/text-tool.cpp:488 +#: ../src/ui/tools/text-tool.cpp:489 msgid "Insert Unicode character" msgstr "Вставити символ з таблиці Unicode" -#: ../src/ui/tools/text-tool.cpp:523 +#: ../src/ui/tools/text-tool.cpp:524 #, c-format msgid "Unicode (Enter to finish): %s: %s" msgstr "Юнікод (Enter для завершення): %s: %s" -#: ../src/ui/tools/text-tool.cpp:525 ../src/ui/tools/text-tool.cpp:832 +#: ../src/ui/tools/text-tool.cpp:526 ../src/ui/tools/text-tool.cpp:833 msgid "Unicode (Enter to finish): " msgstr "Unicode (Enter для завершення): " -#: ../src/ui/tools/text-tool.cpp:608 +#: ../src/ui/tools/text-tool.cpp:609 #, c-format msgid "Flowed text frame: %s × %s" msgstr "Текст у рамці: %s × %s" -#: ../src/ui/tools/text-tool.cpp:666 +#: ../src/ui/tools/text-tool.cpp:667 msgid "Type text; Enter to start new line." msgstr "Введіть текст; Enter — початок нового рядка." -#: ../src/ui/tools/text-tool.cpp:677 +#: ../src/ui/tools/text-tool.cpp:678 msgid "Flowed text is created." msgstr "Текстову область створено." -#: ../src/ui/tools/text-tool.cpp:679 +#: ../src/ui/tools/text-tool.cpp:680 msgid "Create flowed text" msgstr "Створити контурний текст" -#: ../src/ui/tools/text-tool.cpp:681 +#: ../src/ui/tools/text-tool.cpp:682 msgid "" "The frame is too small for the current font size. Flowed text not " "created." @@ -21780,75 +23683,75 @@ msgstr "" "Рамка надто мала для поточного розміру шрифту. Текстову область не " "створено." -#: ../src/ui/tools/text-tool.cpp:817 +#: ../src/ui/tools/text-tool.cpp:818 msgid "No-break space" msgstr "Нерозривний пробіл" -#: ../src/ui/tools/text-tool.cpp:819 +#: ../src/ui/tools/text-tool.cpp:820 msgid "Insert no-break space" msgstr "Вставити нерозривний пробіл" -#: ../src/ui/tools/text-tool.cpp:856 +#: ../src/ui/tools/text-tool.cpp:857 msgid "Make bold" msgstr "Зробити жирним" -#: ../src/ui/tools/text-tool.cpp:874 +#: ../src/ui/tools/text-tool.cpp:875 msgid "Make italic" msgstr "Зробити курсивним" -#: ../src/ui/tools/text-tool.cpp:913 +#: ../src/ui/tools/text-tool.cpp:914 msgid "New line" msgstr "Новий рядок" -#: ../src/ui/tools/text-tool.cpp:955 +#: ../src/ui/tools/text-tool.cpp:956 msgid "Backspace" msgstr "Забій" -#: ../src/ui/tools/text-tool.cpp:1011 +#: ../src/ui/tools/text-tool.cpp:1012 msgid "Kern to the left" msgstr "Відбивка ліворуч" -#: ../src/ui/tools/text-tool.cpp:1036 +#: ../src/ui/tools/text-tool.cpp:1037 msgid "Kern to the right" msgstr "Відбивка праворуч" -#: ../src/ui/tools/text-tool.cpp:1061 +#: ../src/ui/tools/text-tool.cpp:1062 msgid "Kern up" msgstr "Відбивка нагору" -#: ../src/ui/tools/text-tool.cpp:1086 +#: ../src/ui/tools/text-tool.cpp:1087 msgid "Kern down" msgstr "Відбивка донизу" -#: ../src/ui/tools/text-tool.cpp:1162 +#: ../src/ui/tools/text-tool.cpp:1163 msgid "Rotate counterclockwise" msgstr "Обертати проти годинникової стрілки" -#: ../src/ui/tools/text-tool.cpp:1183 +#: ../src/ui/tools/text-tool.cpp:1184 msgid "Rotate clockwise" msgstr "Обертати за годинниковою стрілкою" -#: ../src/ui/tools/text-tool.cpp:1200 +#: ../src/ui/tools/text-tool.cpp:1201 msgid "Contract line spacing" msgstr "Скорочення міжрядкового проміжку" -#: ../src/ui/tools/text-tool.cpp:1207 +#: ../src/ui/tools/text-tool.cpp:1208 msgid "Contract letter spacing" msgstr "Зменшена відстань між літерами" -#: ../src/ui/tools/text-tool.cpp:1225 +#: ../src/ui/tools/text-tool.cpp:1226 msgid "Expand line spacing" msgstr "Збільшена відстань між рядками" -#: ../src/ui/tools/text-tool.cpp:1232 +#: ../src/ui/tools/text-tool.cpp:1233 msgid "Expand letter spacing" msgstr "Збільшення міжрядкового проміжку" -#: ../src/ui/tools/text-tool.cpp:1362 +#: ../src/ui/tools/text-tool.cpp:1363 msgid "Paste text" msgstr "Вставити текст" -#: ../src/ui/tools/text-tool.cpp:1616 +#: ../src/ui/tools/text-tool.cpp:1617 #, c-format msgid "" "Type or edit flowed text (%d character%s); Enter to start new " @@ -21866,7 +23769,7 @@ msgstr[2] "" "Введіть або змініть текст за контуром (%d символів%s); Enter починає " "новий абзац." -#: ../src/ui/tools/text-tool.cpp:1618 +#: ../src/ui/tools/text-tool.cpp:1619 #, c-format msgid "Type or edit text (%d character%s); Enter to start new line." msgid_plural "" @@ -21880,7 +23783,7 @@ msgstr[2] "" "Введіть або змініть текст (%d символів%s); Enter — початок нового " "рядка." -#: ../src/ui/tools/text-tool.cpp:1728 +#: ../src/ui/tools/text-tool.cpp:1729 msgid "Type text" msgstr "Друк тексту" @@ -23021,19 +24924,19 @@ msgstr "tutorial-elements.svg" msgid "tutorial-tips.svg" msgstr "tutorial-tips.svg" -#: ../src/verbs.cpp:2325 ../src/verbs.cpp:2915 +#: ../src/verbs.cpp:2325 ../src/verbs.cpp:2917 msgid "Unlock all objects in the current layer" msgstr "Розблокувати усі об'єкти у поточному шарі" -#: ../src/verbs.cpp:2329 ../src/verbs.cpp:2917 +#: ../src/verbs.cpp:2329 ../src/verbs.cpp:2919 msgid "Unlock all objects in all layers" msgstr "Розблокувати усі об'єкти в усіх шарах" -#: ../src/verbs.cpp:2333 ../src/verbs.cpp:2919 +#: ../src/verbs.cpp:2333 ../src/verbs.cpp:2921 msgid "Unhide all objects in the current layer" msgstr "Розблокувати усі об'єкти у поточному шарі" -#: ../src/verbs.cpp:2337 ../src/verbs.cpp:2921 +#: ../src/verbs.cpp:2337 ../src/verbs.cpp:2923 msgid "Unhide all objects in all layers" msgstr "Показати усі об'єкти в усіх шарах" @@ -24766,117 +26669,119 @@ msgstr "" "Редагування кольорів об'єкта, градієнтів, форми стрілок та інші параметри " "заповнення та штриха…" -#: ../src/verbs.cpp:2818 +#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-font" icon +#: ../src/verbs.cpp:2819 msgid "Gl_yphs..." msgstr "Г_ліфи…" -#: ../src/verbs.cpp:2819 +#: ../src/verbs.cpp:2820 msgid "Select characters from a glyphs palette" msgstr "Виберіть символи з палітри гліфів" +#. FIXME: Probably better to either use something from the icon naming spec or ship our own "select-color" icon #. TRANSLATORS: "Swatches" means: color samples -#: ../src/verbs.cpp:2821 +#: ../src/verbs.cpp:2823 msgid "S_watches..." msgstr "Зразки _кольорів…" -#: ../src/verbs.cpp:2822 +#: ../src/verbs.cpp:2824 msgid "Select colors from a swatches palette" msgstr "Виберіть колір з палітри зразків" -#: ../src/verbs.cpp:2823 +#: ../src/verbs.cpp:2825 msgid "S_ymbols..." msgstr "С_имволи…" -#: ../src/verbs.cpp:2824 +#: ../src/verbs.cpp:2826 msgid "Select symbol from a symbols palette" msgstr "Виберіть символ з палітри символів" -#: ../src/verbs.cpp:2825 +#: ../src/verbs.cpp:2827 msgid "Transfor_m..." msgstr "_Трансформувати…" -#: ../src/verbs.cpp:2826 +#: ../src/verbs.cpp:2828 msgid "Precisely control objects' transformations" msgstr "Контролювати точність перетворень об'єктів" -#: ../src/verbs.cpp:2827 +#: ../src/verbs.cpp:2829 msgid "_Align and Distribute..." msgstr "Вирів_няти та розподілити…" -#: ../src/verbs.cpp:2828 +#: ../src/verbs.cpp:2830 msgid "Align and distribute objects" msgstr "Вирівняти та розподілити об'єкти" -#: ../src/verbs.cpp:2829 +#: ../src/verbs.cpp:2831 msgid "_Spray options..." msgstr "Параметри _розкидання…" -#: ../src/verbs.cpp:2830 +#: ../src/verbs.cpp:2832 msgid "Some options for the spray" msgstr "Параметри розкидання" -#: ../src/verbs.cpp:2831 +#: ../src/verbs.cpp:2833 msgid "Undo _History..." msgstr "Істо_рія змін…" -#: ../src/verbs.cpp:2832 +#: ../src/verbs.cpp:2834 msgid "Undo History" msgstr "Історія для скасування змін" -#: ../src/verbs.cpp:2834 +#: ../src/verbs.cpp:2836 msgid "View and select font family, font size and other text properties" msgstr "" "Перегляд та вибір назви шрифту, його розміру та інших властивостей тексту" -#: ../src/verbs.cpp:2835 +#: ../src/verbs.cpp:2837 msgid "_XML Editor..." msgstr "Редактор _XML…" -#: ../src/verbs.cpp:2836 +#: ../src/verbs.cpp:2838 msgid "View and edit the XML tree of the document" msgstr "Перегляд та редагування дерева XML поточного документа" -#: ../src/verbs.cpp:2837 +#: ../src/verbs.cpp:2839 msgid "_Find/Replace..." msgstr "Знайти і з_амінити…" -#: ../src/verbs.cpp:2838 +#: ../src/verbs.cpp:2840 msgid "Find objects in document" msgstr "Знайти об'єкти у документі" -#: ../src/verbs.cpp:2839 +#: ../src/verbs.cpp:2841 msgid "Find and _Replace Text..." msgstr "Знайти і з_амінити текст…" -#: ../src/verbs.cpp:2840 +#: ../src/verbs.cpp:2842 msgid "Find and replace text in document" msgstr "Знайти і замінити текст у документі" -#: ../src/verbs.cpp:2842 +#: ../src/verbs.cpp:2844 msgid "Check spelling of text in document" msgstr "Перевірити правопис тексту у документі" -#: ../src/verbs.cpp:2843 +#: ../src/verbs.cpp:2845 msgid "_Messages..." msgstr "По_відомлення…" -#: ../src/verbs.cpp:2844 +#: ../src/verbs.cpp:2846 msgid "View debug messages" msgstr "Переглянути діагностичні повідомлення" -#: ../src/verbs.cpp:2845 +#: ../src/verbs.cpp:2847 msgid "Show/Hide D_ialogs" msgstr "Показати/сховати діало_ги" -#: ../src/verbs.cpp:2846 +#: ../src/verbs.cpp:2848 msgid "Show or hide all open dialogs" msgstr "Показати чи сховати всі активні діалогові вікна" -#: ../src/verbs.cpp:2847 +#: ../src/verbs.cpp:2849 msgid "Create Tiled Clones..." msgstr "Створити мозаїку з клонів…" -#: ../src/verbs.cpp:2848 +#: ../src/verbs.cpp:2850 msgid "" "Create multiple clones of selected object, arranging them into a pattern or " "scattering" @@ -24884,221 +26789,221 @@ msgstr "" "Створити множину клонів позначеного об'єкта, з розташуванням їх у формі " "візерунку або покриття" -#: ../src/verbs.cpp:2849 +#: ../src/verbs.cpp:2851 msgid "_Object attributes..." msgstr "_Атрибути об'єкта…" -#: ../src/verbs.cpp:2850 +#: ../src/verbs.cpp:2852 msgid "Edit the object attributes..." msgstr "Змінити атрибути об'єкта…" -#: ../src/verbs.cpp:2852 +#: ../src/verbs.cpp:2854 msgid "Edit the ID, locked and visible status, and other object properties" msgstr "" "Редагування ідентифікатора, стану заблокованості та видимості та інших " "властивостей об'єкта" -#: ../src/verbs.cpp:2853 +#: ../src/verbs.cpp:2855 msgid "_Input Devices..." msgstr "_Пристрої введення…" -#: ../src/verbs.cpp:2854 +#: ../src/verbs.cpp:2856 msgid "Configure extended input devices, such as a graphics tablet" msgstr "Налаштовування розширених пристроїв введення" -#: ../src/verbs.cpp:2855 +#: ../src/verbs.cpp:2857 msgid "_Extensions..." msgstr "_Про додатки…" -#: ../src/verbs.cpp:2856 +#: ../src/verbs.cpp:2858 msgid "Query information about extensions" msgstr "Зібрати інформацію про додатки" -#: ../src/verbs.cpp:2857 +#: ../src/verbs.cpp:2859 msgid "Layer_s..." msgstr "_Шари…" -#: ../src/verbs.cpp:2858 +#: ../src/verbs.cpp:2860 msgid "View Layers" msgstr "Переглянути шари" -#: ../src/verbs.cpp:2859 +#: ../src/verbs.cpp:2861 msgid "Path E_ffects ..." msgstr "Е_фекти контурів…" -#: ../src/verbs.cpp:2860 +#: ../src/verbs.cpp:2862 msgid "Manage, edit, and apply path effects" msgstr "Керування, редагування і застосування ефектів контурів" -#: ../src/verbs.cpp:2861 +#: ../src/verbs.cpp:2863 msgid "Filter _Editor..." msgstr "Р_едактор фільтрів…" -#: ../src/verbs.cpp:2862 +#: ../src/verbs.cpp:2864 msgid "Manage, edit, and apply SVG filters" msgstr "Керування, редагування і застосування фільтрів SVG" -#: ../src/verbs.cpp:2863 +#: ../src/verbs.cpp:2865 msgid "SVG Font Editor..." msgstr "Редактор шрифтів SVG…" -#: ../src/verbs.cpp:2864 +#: ../src/verbs.cpp:2866 msgid "Edit SVG fonts" msgstr "Редагувати шрифти SVG" -#: ../src/verbs.cpp:2865 +#: ../src/verbs.cpp:2867 msgid "Print Colors..." msgstr "Друкувати кольори…" -#: ../src/verbs.cpp:2866 +#: ../src/verbs.cpp:2868 msgid "" "Select which color separations to render in Print Colors Preview rendermode" msgstr "" "Вкажіть ділянки кольорів, які слід обробляти у режимі обробки попереднього " "перегляду кольорів друку." -#: ../src/verbs.cpp:2867 +#: ../src/verbs.cpp:2869 msgid "_Export PNG Image..." msgstr "_Експортувати як зображення PNG…" -#: ../src/verbs.cpp:2868 +#: ../src/verbs.cpp:2870 msgid "Export this document or a selection as a PNG image" msgstr "Експортувати документ чи позначену частину як зображення PNG" #. Help -#: ../src/verbs.cpp:2870 +#: ../src/verbs.cpp:2872 msgid "About E_xtensions" msgstr "Про _додатки" -#: ../src/verbs.cpp:2871 +#: ../src/verbs.cpp:2873 msgid "Information on Inkscape extensions" msgstr "Інформація про додатки Inkscape" -#: ../src/verbs.cpp:2872 +#: ../src/verbs.cpp:2874 msgid "About _Memory" msgstr "Про п_ам'ять" -#: ../src/verbs.cpp:2873 +#: ../src/verbs.cpp:2875 msgid "Memory usage information" msgstr "Інформація про використання пам'яті" -#: ../src/verbs.cpp:2874 +#: ../src/verbs.cpp:2876 msgid "_About Inkscape" msgstr "_Про програму Inkscape" -#: ../src/verbs.cpp:2875 +#: ../src/verbs.cpp:2877 msgid "Inkscape version, authors, license" msgstr "Версія, автори та ліцензія Inkscape" #. new HelpVerb(SP_VERB_SHOW_LICENSE, "ShowLicense", N_("_License"), #. N_("Distribution terms"), /*"show_license"*/"inkscape_options"), #. Tutorials -#: ../src/verbs.cpp:2880 +#: ../src/verbs.cpp:2882 msgid "Inkscape: _Basic" msgstr "Inkscape: _Початковий рівень" -#: ../src/verbs.cpp:2881 +#: ../src/verbs.cpp:2883 msgid "Getting started with Inkscape" msgstr "Починаємо роботу з Inkscape" #. "tutorial_basic" -#: ../src/verbs.cpp:2882 +#: ../src/verbs.cpp:2884 msgid "Inkscape: _Shapes" msgstr "Inkscape: _Фігури" -#: ../src/verbs.cpp:2883 +#: ../src/verbs.cpp:2885 msgid "Using shape tools to create and edit shapes" msgstr "Використання інструментів малювання та редагування фігур" -#: ../src/verbs.cpp:2884 +#: ../src/verbs.cpp:2886 msgid "Inkscape: _Advanced" msgstr "Inkscape: _Другий рівень" -#: ../src/verbs.cpp:2885 +#: ../src/verbs.cpp:2887 msgid "Advanced Inkscape topics" msgstr "Додаткові теми з Inkscape" #. "tutorial_advanced" #. TRANSLATORS: "to trace" means "to convert a bitmap to vector graphics" (to vectorize) -#: ../src/verbs.cpp:2887 +#: ../src/verbs.cpp:2889 msgid "Inkscape: T_racing" msgstr "Inkscape: _Векторизація" -#: ../src/verbs.cpp:2888 +#: ../src/verbs.cpp:2890 msgid "Using bitmap tracing" msgstr "Використання векторизації растру" #. "tutorial_tracing" -#: ../src/verbs.cpp:2889 +#: ../src/verbs.cpp:2891 msgid "Inkscape: Tracing Pixel Art" msgstr "Inkscape: Трасування растрової графіки" -#: ../src/verbs.cpp:2890 +#: ../src/verbs.cpp:2892 msgid "Using Trace Pixel Art dialog" msgstr "Користування діалоговим вікном трасування растрової графіки" -#: ../src/verbs.cpp:2891 +#: ../src/verbs.cpp:2893 msgid "Inkscape: _Calligraphy" msgstr "Inkscape: _Каліграфія" -#: ../src/verbs.cpp:2892 +#: ../src/verbs.cpp:2894 msgid "Using the Calligraphy pen tool" msgstr "Використання каліграфічного пера" -#: ../src/verbs.cpp:2893 +#: ../src/verbs.cpp:2895 msgid "Inkscape: _Interpolate" msgstr "Inkscape: _Інтерполяція" -#: ../src/verbs.cpp:2894 +#: ../src/verbs.cpp:2896 msgid "Using the interpolate extension" msgstr "Використання додатка інтерполяції" #. "tutorial_interpolate" -#: ../src/verbs.cpp:2895 +#: ../src/verbs.cpp:2897 msgid "_Elements of Design" msgstr "_Елементи дизайну" -#: ../src/verbs.cpp:2896 +#: ../src/verbs.cpp:2898 msgid "Principles of design in the tutorial form" msgstr "Підручник з принципів дизайну" #. "tutorial_design" -#: ../src/verbs.cpp:2897 +#: ../src/verbs.cpp:2899 msgid "_Tips and Tricks" msgstr "_Поради та прийоми" -#: ../src/verbs.cpp:2898 +#: ../src/verbs.cpp:2900 msgid "Miscellaneous tips and tricks" msgstr "Різноманітні поради та прийоми" #. "tutorial_tips" #. Effect -- renamed Extension -#: ../src/verbs.cpp:2901 +#: ../src/verbs.cpp:2903 msgid "Previous Exte_nsion" msgstr "Попередній _додаток" -#: ../src/verbs.cpp:2902 +#: ../src/verbs.cpp:2904 msgid "Repeat the last extension with the same settings" msgstr "" "Повторити ефекти використання попереднього додатка з тими самими параметрами" -#: ../src/verbs.cpp:2903 +#: ../src/verbs.cpp:2905 msgid "_Previous Extension Settings..." msgstr "П_араметри попереднього додатка…" -#: ../src/verbs.cpp:2904 +#: ../src/verbs.cpp:2906 msgid "Repeat the last extension with new settings" msgstr "Повторити останній ефект з новими параметрами" -#: ../src/verbs.cpp:2908 +#: ../src/verbs.cpp:2910 msgid "Fit the page to the current selection" msgstr "Підігнати полотно до поточного позначеної області" -#: ../src/verbs.cpp:2910 +#: ../src/verbs.cpp:2912 msgid "Fit the page to the drawing" msgstr "Підганяє полотно під вже намальоване" -#: ../src/verbs.cpp:2912 +#: ../src/verbs.cpp:2914 msgid "" "Fit the page to the current selection or the drawing if there is no selection" msgstr "" @@ -25106,75 +27011,75 @@ msgstr "" "креслення, якщо нічого не позначено" #. LockAndHide -#: ../src/verbs.cpp:2914 +#: ../src/verbs.cpp:2916 msgid "Unlock All" msgstr "Розблокувати все" -#: ../src/verbs.cpp:2916 +#: ../src/verbs.cpp:2918 msgid "Unlock All in All Layers" msgstr "Розблокувати все в усіх шарах" -#: ../src/verbs.cpp:2918 +#: ../src/verbs.cpp:2920 msgid "Unhide All" msgstr "Показати все" -#: ../src/verbs.cpp:2920 +#: ../src/verbs.cpp:2922 msgid "Unhide All in All Layers" msgstr "Показати все в усіх шарах" -#: ../src/verbs.cpp:2924 +#: ../src/verbs.cpp:2926 msgid "Link an ICC color profile" msgstr "Посилання на профіль кольорів ICC" -#: ../src/verbs.cpp:2925 +#: ../src/verbs.cpp:2927 msgid "Remove Color Profile" msgstr "Вилучити профіль кольорів" -#: ../src/verbs.cpp:2926 +#: ../src/verbs.cpp:2928 msgid "Remove a linked ICC color profile" msgstr "Вилучити пов'язаний профіль кольорів ICC" -#: ../src/verbs.cpp:2929 +#: ../src/verbs.cpp:2931 msgid "Add External Script" msgstr "Додати зовнішній скрипт" -#: ../src/verbs.cpp:2929 +#: ../src/verbs.cpp:2931 msgid "Add an external script" msgstr "Додати зовнішній скрипт" -#: ../src/verbs.cpp:2931 +#: ../src/verbs.cpp:2933 msgid "Add Embedded Script" msgstr "Додати вбудований скрипт" -#: ../src/verbs.cpp:2931 +#: ../src/verbs.cpp:2933 msgid "Add an embedded script" msgstr "Додати вбудований скрипт" -#: ../src/verbs.cpp:2933 +#: ../src/verbs.cpp:2935 msgid "Edit Embedded Script" msgstr "Редагувати вбудований скрипт" -#: ../src/verbs.cpp:2933 +#: ../src/verbs.cpp:2935 msgid "Edit an embedded script" msgstr "Редагувати вбудований скрипт" -#: ../src/verbs.cpp:2935 +#: ../src/verbs.cpp:2937 msgid "Remove External Script" msgstr "Вилучити зовнішній скрипт" -#: ../src/verbs.cpp:2935 +#: ../src/verbs.cpp:2937 msgid "Remove an external script" msgstr "Вилучити зовнішній скрипт" -#: ../src/verbs.cpp:2937 +#: ../src/verbs.cpp:2939 msgid "Remove Embedded Script" msgstr "Вилучити вбудований скрипт" -#: ../src/verbs.cpp:2937 +#: ../src/verbs.cpp:2939 msgid "Remove an embedded script" msgstr "Вилучити вбудований скрипт" -#: ../src/verbs.cpp:2959 ../src/verbs.cpp:2960 +#: ../src/verbs.cpp:2961 ../src/verbs.cpp:2962 msgid "Center on horizontal and vertical axis" msgstr "Центрувати на горизонтальній і вертикальній осі" @@ -25682,20 +27587,20 @@ msgstr "Пунктир" msgid "Pattern offset" msgstr "Зміщення пунктиру" -#: ../src/widgets/desktop-widget.cpp:465 +#: ../src/widgets/desktop-widget.cpp:466 msgid "Zoom drawing if window size changes" msgstr "Змінювати масштаб при зміні розмірів вікна" -#: ../src/widgets/desktop-widget.cpp:669 +#: ../src/widgets/desktop-widget.cpp:670 msgid "Cursor coordinates" msgstr "Координати курсора" -#: ../src/widgets/desktop-widget.cpp:695 +#: ../src/widgets/desktop-widget.cpp:696 msgid "Z:" msgstr "Z:" #. display the initial welcome message in the statusbar -#: ../src/widgets/desktop-widget.cpp:738 +#: ../src/widgets/desktop-widget.cpp:739 msgid "" "Welcome to Inkscape! Use shape or freehand tools to create objects; " "use selector (arrow) to move or transform them." @@ -25704,69 +27609,69 @@ msgstr "" "малювання для створення об'єктів; для їх переміщення чи трансформації " "використовуйте селектор (стрілку)." -#: ../src/widgets/desktop-widget.cpp:832 +#: ../src/widgets/desktop-widget.cpp:833 msgid "grayscale" msgstr "сірі півтони" -#: ../src/widgets/desktop-widget.cpp:833 +#: ../src/widgets/desktop-widget.cpp:834 msgid ", grayscale" msgstr ", сірі півтони" -#: ../src/widgets/desktop-widget.cpp:834 +#: ../src/widgets/desktop-widget.cpp:835 msgid "print colors preview" msgstr "друк попереднього перегляду кольорів" -#: ../src/widgets/desktop-widget.cpp:835 +#: ../src/widgets/desktop-widget.cpp:836 msgid ", print colors preview" msgstr ", друк попереднього перегляду кольорів" -#: ../src/widgets/desktop-widget.cpp:836 +#: ../src/widgets/desktop-widget.cpp:837 msgid "outline" msgstr "обрис" -#: ../src/widgets/desktop-widget.cpp:837 +#: ../src/widgets/desktop-widget.cpp:838 msgid "no filters" msgstr "без фільтрування" -#: ../src/widgets/desktop-widget.cpp:864 +#: ../src/widgets/desktop-widget.cpp:865 #, c-format msgid "%s%s: %d (%s%s) - Inkscape" msgstr "%s%s: %d (%s%s) – Inkscape" -#: ../src/widgets/desktop-widget.cpp:866 ../src/widgets/desktop-widget.cpp:870 +#: ../src/widgets/desktop-widget.cpp:867 ../src/widgets/desktop-widget.cpp:871 #, c-format msgid "%s%s: %d (%s) - Inkscape" msgstr "%s%s: %d (%s) — Inkscape" -#: ../src/widgets/desktop-widget.cpp:872 +#: ../src/widgets/desktop-widget.cpp:873 #, c-format msgid "%s%s: %d - Inkscape" msgstr "%s%s: %d — Inkscape" -#: ../src/widgets/desktop-widget.cpp:878 +#: ../src/widgets/desktop-widget.cpp:879 #, c-format msgid "%s%s (%s%s) - Inkscape" msgstr "%s%s (%s%s) — Inkscape" -#: ../src/widgets/desktop-widget.cpp:880 ../src/widgets/desktop-widget.cpp:884 +#: ../src/widgets/desktop-widget.cpp:881 ../src/widgets/desktop-widget.cpp:885 #, c-format msgid "%s%s (%s) - Inkscape" msgstr "%s%s (%s) — Inkscape" -#: ../src/widgets/desktop-widget.cpp:886 +#: ../src/widgets/desktop-widget.cpp:887 #, c-format msgid "%s%s - Inkscape" msgstr "%s%s — Inkscape" -#: ../src/widgets/desktop-widget.cpp:1055 +#: ../src/widgets/desktop-widget.cpp:1056 msgid "Color-managed display is enabled in this window" msgstr "Показ з керуванням кольорами у цьому вікні увімкнено" -#: ../src/widgets/desktop-widget.cpp:1057 +#: ../src/widgets/desktop-widget.cpp:1058 msgid "Color-managed display is disabled in this window" msgstr "Показ з керуванням кольорами у цьому вікні вимкнено" -#: ../src/widgets/desktop-widget.cpp:1112 +#: ../src/widgets/desktop-widget.cpp:1113 #, c-format msgid "" "Save changes to document \"%s\" before " @@ -25779,12 +27684,12 @@ msgstr "" "\n" "Якщо ви закриєте документ без збереження, усі зміни будуть втрачені." -#: ../src/widgets/desktop-widget.cpp:1122 -#: ../src/widgets/desktop-widget.cpp:1181 +#: ../src/widgets/desktop-widget.cpp:1123 +#: ../src/widgets/desktop-widget.cpp:1182 msgid "Close _without saving" msgstr "_Не зберігати" -#: ../src/widgets/desktop-widget.cpp:1171 +#: ../src/widgets/desktop-widget.cpp:1172 #, c-format msgid "" "The file \"%s\" was saved with a " @@ -25797,11 +27702,11 @@ msgstr "" "\n" "Зберегти документ у форматі SVG Inkscape?" -#: ../src/widgets/desktop-widget.cpp:1183 +#: ../src/widgets/desktop-widget.cpp:1184 msgid "_Save as Inkscape SVG" msgstr "_Зберегти як SVG Inkscape" -#: ../src/widgets/desktop-widget.cpp:1393 +#: ../src/widgets/desktop-widget.cpp:1394 msgid "Note:" msgstr "Примітка:" @@ -25903,20 +27808,20 @@ msgstr "Стиль" msgid "Font size:" msgstr "Розмір шрифту:" -#: ../src/widgets/gradient-selector.cpp:208 +#: ../src/widgets/gradient-selector.cpp:214 msgid "Create a duplicate gradient" msgstr "Створення дублікат градієнта" -#: ../src/widgets/gradient-selector.cpp:218 +#: ../src/widgets/gradient-selector.cpp:230 msgid "Edit gradient" msgstr "Змінити градієнт" -#: ../src/widgets/gradient-selector.cpp:289 +#: ../src/widgets/gradient-selector.cpp:306 #: ../src/widgets/paint-selector.cpp:244 msgid "Swatch" msgstr "Зразок" -#: ../src/widgets/gradient-selector.cpp:339 +#: ../src/widgets/gradient-selector.cpp:356 msgid "Rename gradient" msgstr "Перейменувати градієнт" @@ -26055,6 +27960,13 @@ msgstr "Позначте опорну точку поточного градіє msgid "Stops:" msgstr "Опорні точки:" +#. Label +#: ../src/widgets/gradient-toolbar.cpp:1174 +#: ../src/widgets/gradient-vector.cpp:926 +msgctxt "Gradient" +msgid "Offset:" +msgstr "Зсув:" + #: ../src/widgets/gradient-toolbar.cpp:1174 msgid "Offset of selected stop" msgstr "Відступ позначеної опорної точки" @@ -26170,7 +28082,7 @@ msgstr "Показувати відомості щодо виміру для в #. Add the units menu. #: ../src/widgets/lpe-toolbar.cpp:405 ../src/widgets/node-toolbar.cpp:626 #: ../src/widgets/paintbucket-toolbar.cpp:187 -#: ../src/widgets/rect-toolbar.cpp:382 ../src/widgets/select-toolbar.cpp:543 +#: ../src/widgets/rect-toolbar.cpp:382 ../src/widgets/select-toolbar.cpp:544 msgid "Units" msgstr "Одиниці" @@ -26783,23 +28695,23 @@ msgstr "Макс. розмір" msgid "Maximum size of the ruler" msgstr "Максимальний розмір лінійки" -#: ../src/widgets/select-toolbar.cpp:267 +#: ../src/widgets/select-toolbar.cpp:268 msgid "Transform by toolbar" msgstr "Трансформувати візерунки" -#: ../src/widgets/select-toolbar.cpp:346 +#: ../src/widgets/select-toolbar.cpp:347 msgid "Now stroke width is scaled when objects are scaled." msgstr "" "Тепер товщина штриха масштабується під час зміни масштабу " "об'єктів." -#: ../src/widgets/select-toolbar.cpp:348 +#: ../src/widgets/select-toolbar.cpp:349 msgid "Now stroke width is not scaled when objects are scaled." msgstr "" "Тепер товщина штриха не масштабується під час зміни масштабу " "об'єктів." -#: ../src/widgets/select-toolbar.cpp:359 +#: ../src/widgets/select-toolbar.cpp:360 msgid "" "Now rounded rectangle corners are scaled when rectangles are " "scaled." @@ -26807,7 +28719,7 @@ msgstr "" "Тепер закруглені кути прямокутника змінюватимуть масштаб під " "час зміни масштабу прямокутника." -#: ../src/widgets/select-toolbar.cpp:361 +#: ../src/widgets/select-toolbar.cpp:362 msgid "" "Now rounded rectangle corners are not scaled when rectangles " "are scaled." @@ -26815,7 +28727,7 @@ msgstr "" "Тепер закруглені кути прямокутника не змінюватимуть масштаб " "під час зміни масштабу прямокутника." -#: ../src/widgets/select-toolbar.cpp:372 +#: ../src/widgets/select-toolbar.cpp:373 msgid "" "Now gradients are transformed along with their objects when " "those are transformed (moved, scaled, rotated, or skewed)." @@ -26824,7 +28736,7 @@ msgstr "" "коли вони перетворюватимуться (переміщуватимуться, змінюватимуть масштаб, " "повертатимуться або нахилятимуться)." -#: ../src/widgets/select-toolbar.cpp:374 +#: ../src/widgets/select-toolbar.cpp:375 msgid "" "Now gradients remain fixed when objects are transformed " "(moved, scaled, rotated, or skewed)." @@ -26832,7 +28744,7 @@ msgstr "" "Тепер закруглені кути прямокутника не змінюватимуться під час " "зміни масштабу прямокутника." -#: ../src/widgets/select-toolbar.cpp:385 +#: ../src/widgets/select-toolbar.cpp:386 msgid "" "Now patterns are transformed along with their objects when " "those are transformed (moved, scaled, rotated, or skewed)." @@ -26841,7 +28753,7 @@ msgstr "" "коли вони перетворюватимуться (переміщуватимуться, змінюватимуть масштаб, " "повертатимуться або нахилятимуться)." -#: ../src/widgets/select-toolbar.cpp:387 +#: ../src/widgets/select-toolbar.cpp:388 msgid "" "Now patterns remain fixed when objects are transformed (moved, " "scaled, rotated, or skewed)." @@ -26851,79 +28763,79 @@ msgstr "" "повертатимуться або нахилятимуться)." #. four spinbuttons -#: ../src/widgets/select-toolbar.cpp:505 +#: ../src/widgets/select-toolbar.cpp:506 msgctxt "Select toolbar" msgid "X position" msgstr "Розташування за X" -#: ../src/widgets/select-toolbar.cpp:505 +#: ../src/widgets/select-toolbar.cpp:506 msgctxt "Select toolbar" msgid "X:" msgstr "X:" -#: ../src/widgets/select-toolbar.cpp:507 +#: ../src/widgets/select-toolbar.cpp:508 msgid "Horizontal coordinate of selection" msgstr "Горизонтальна координата позначення" -#: ../src/widgets/select-toolbar.cpp:511 +#: ../src/widgets/select-toolbar.cpp:512 msgctxt "Select toolbar" msgid "Y position" msgstr "Розташування за Y" -#: ../src/widgets/select-toolbar.cpp:511 +#: ../src/widgets/select-toolbar.cpp:512 msgctxt "Select toolbar" msgid "Y:" msgstr "Y:" -#: ../src/widgets/select-toolbar.cpp:513 +#: ../src/widgets/select-toolbar.cpp:514 msgid "Vertical coordinate of selection" msgstr "Вертикальна координата позначення" -#: ../src/widgets/select-toolbar.cpp:517 +#: ../src/widgets/select-toolbar.cpp:518 msgctxt "Select toolbar" msgid "Width" msgstr "Ширина" -#: ../src/widgets/select-toolbar.cpp:517 +#: ../src/widgets/select-toolbar.cpp:518 msgctxt "Select toolbar" msgid "W:" msgstr "Ш:" -#: ../src/widgets/select-toolbar.cpp:519 +#: ../src/widgets/select-toolbar.cpp:520 msgid "Width of selection" msgstr "Ширина позначення" -#: ../src/widgets/select-toolbar.cpp:526 +#: ../src/widgets/select-toolbar.cpp:527 msgid "Lock width and height" msgstr "Заблокувати ширину і висоту" -#: ../src/widgets/select-toolbar.cpp:527 +#: ../src/widgets/select-toolbar.cpp:528 msgid "When locked, change both width and height by the same proportion" msgstr "Коли заблоковано, пропорційно змінювати ширину та висоту" -#: ../src/widgets/select-toolbar.cpp:536 +#: ../src/widgets/select-toolbar.cpp:537 msgctxt "Select toolbar" msgid "Height" msgstr "Висота" -#: ../src/widgets/select-toolbar.cpp:536 +#: ../src/widgets/select-toolbar.cpp:537 msgctxt "Select toolbar" msgid "H:" msgstr "В:" -#: ../src/widgets/select-toolbar.cpp:538 +#: ../src/widgets/select-toolbar.cpp:539 msgid "Height of selection" msgstr "Висота позначення" -#: ../src/widgets/select-toolbar.cpp:588 +#: ../src/widgets/select-toolbar.cpp:589 msgid "Scale rounded corners" msgstr "Змінити розмір округлених кутів" -#: ../src/widgets/select-toolbar.cpp:599 +#: ../src/widgets/select-toolbar.cpp:600 msgid "Move gradients" msgstr "Перемістити градієнти" -#: ../src/widgets/select-toolbar.cpp:610 +#: ../src/widgets/select-toolbar.cpp:611 msgid "Move patterns" msgstr "Перемістити текстури" @@ -26951,10 +28863,6 @@ msgstr "_G:" msgid "_B:" msgstr "_B:" -#: ../src/widgets/sp-color-icc-selector.cpp:359 -msgid "G:" -msgstr "С:" - #: ../src/widgets/sp-color-icc-selector.cpp:359 msgid "Gray" msgstr "Сірий" @@ -28633,7 +30541,7 @@ msgstr "" msgid "An error occurred while processing the XCF file." msgstr "Під час спроби обробки файла XCF сталася помилка." -#: ../share/extensions/gimp_xcf.py:171 +#: ../share/extensions/gimp_xcf.py:177 msgid "This extension requires at least one non empty layer." msgstr "Для роботи цього додатка потрібен хоча б один непорожній шар." @@ -28663,7 +30571,7 @@ msgstr "" "кресленні не буде деяких елементів." #. issue error if no paths found -#: ../share/extensions/hpgl_output.py:62 +#: ../share/extensions/hpgl_output.py:63 msgid "" "No paths where found. Please convert all objects you want to save into paths." msgstr "" @@ -28689,7 +30597,12 @@ msgstr "" "Технічна інформація:\n" "%s" -#: ../share/extensions/inkex.py:260 +#: ../share/extensions/inkex.py:162 ../share/extensions/inkex.py:171 +#, python-format +msgid "Unable to open specified file: %s" +msgstr "Не вдалося відкрити вказаний файл: %s" + +#: ../share/extensions/inkex.py:276 #, python-format msgid "No matching node for expression: %s" msgstr "Не знайдено відповідного вузла для виразу: %s" @@ -28730,6 +30643,7 @@ msgstr "" "\n" #: ../share/extensions/jessyInk_autoTexts.py:54 +#, python-brace-format msgid "" "Node with id '{0}' is not a suitable text node and was therefore ignored.\n" "\n" @@ -28763,6 +30677,7 @@ msgstr "" "основного слайда.\n" #: ../share/extensions/jessyInk_summary.py:69 +#, python-brace-format msgid "JessyInk script version {0} installed." msgstr "Встановлено версію {0} скрипту JessyInk." @@ -28787,6 +30702,7 @@ msgstr "" "Слайд {0!s}:" #: ../share/extensions/jessyInk_summary.py:94 +#, python-brace-format msgid "{0}Layer name: {1}" msgstr "{0}Назва шару: {1}" @@ -28795,6 +30711,7 @@ msgid "{0}Transition in: {1} ({2!s} s)" msgstr "{0}Перехід у {1} ({2!s} с)" #: ../share/extensions/jessyInk_summary.py:104 +#, python-brace-format msgid "{0}Transition in: {1}" msgstr "{0}Перехід у {1}" @@ -28803,10 +30720,12 @@ msgid "{0}Transition out: {1} ({2!s} s)" msgstr "{0}Перехід з {1} ({2!s} с)" #: ../share/extensions/jessyInk_summary.py:113 +#, python-brace-format msgid "{0}Transition out: {1}" msgstr "{0}Вихідна позиція переходу: {1}" #: ../share/extensions/jessyInk_summary.py:120 +#, python-brace-format msgid "" "\n" "{0}Auto-texts:" @@ -28815,10 +30734,12 @@ msgstr "" "{0}Автотексти:" #: ../share/extensions/jessyInk_summary.py:123 +#, python-brace-format msgid "{0}\t\"{1}\" (object id \"{2}\") will be replaced by \"{3}\"." msgstr "{0}\t\"{1}\" (ідентифікатор об'єкта «{2}») буде замінено на «{3}»." #: ../share/extensions/jessyInk_summary.py:168 +#, python-brace-format msgid "" "\n" "{0}Initial effect (order number {1}):" @@ -28835,10 +30756,12 @@ msgstr "" "{0}Ефект {1!s} (порядковий номер {2}):" #: ../share/extensions/jessyInk_summary.py:174 +#, python-brace-format msgid "{0}\tView will be set according to object \"{1}\"" msgstr "{0}\tОбласть перегляду буде встановлено відповідно до об'єкта «{1}»" #: ../share/extensions/jessyInk_summary.py:176 +#, python-brace-format msgid "{0}\tObject \"{1}\"" msgstr "{0}\tОб'єкт «{1}»" @@ -28851,6 +30774,7 @@ msgid " will disappear" msgstr " зникне" #: ../share/extensions/jessyInk_summary.py:184 +#, python-brace-format msgid " using effect \"{0}\"" msgstr " з використанням ефекту «{0}»" @@ -28988,18 +30912,32 @@ msgstr "" "Спробуйте скористатися пунктом меню Контур -> Об'єкт у контур." #. issue error if no paths found -#: ../share/extensions/plotter.py:70 +#: ../share/extensions/plotter.py:71 msgid "" "No paths where found. Please convert all objects you want to plot into paths." msgstr "" "Контурів не знайдено. Будь ласка, перетворіть усі потрібні вам об’єкти для " "вирізання на контури." -#: ../share/extensions/plotter.py:131 -msgid "pySerial is not installed." -msgstr "Не встановлено pySerial." +#: ../share/extensions/plotter.py:132 +msgid "" +"pySerial is not installed.\n" +"\n" +"1. Download pySerial here (not the \".exe\"!): http://pypi.python.org/pypi/" +"pyserial\n" +"2. Extract the \"serial\" subfolder from the zip to the following folder: C:" +"\\[Program files]\\inkscape\\python\\Lib\\\n" +"3. Restart Inkscape." +msgstr "" +"pySerial не встановлено.\n" +"\n" +"1. Отримайте пакунок pySerial (не файл «.exe»!) тут: http://pypi.python.org/" +"pypi/pyserial\n" +"2. Виконайте видобування підтеки «serial» з архіву zip до цієї теки: C:" +"\\[Program files]\\inkscape\\python\\Lib\\\n" +"3. Перезапустіть Inkscape." -#: ../share/extensions/plotter.py:151 +#: ../share/extensions/plotter.py:152 msgid "" "Could not open port. Please check that your plotter is running, connected " "and the settings are correct." @@ -29141,8 +31079,18 @@ msgstr "Вам слід вибрати відповідне кодування #: ../share/extensions/uniconv-ext.py:56 #: ../share/extensions/uniconv_output.py:122 -msgid "You need to install the UniConvertor software.\n" -msgstr "Вам слід встановити UniConvertor.\n" +msgid "" +"You need to install the UniConvertor software.\n" +"For GNU/Linux: install the package python-uniconvertor.\n" +"For Windows: download it from\n" +"http://sk1project.org/modules.php?name=Products&product=uniconvertor\n" +"and install into your Inkscape's Python location\n" +msgstr "" +"Вам слід встановити програму UniConvertor.\n" +"У GNU/Linux: встановіть пакунок python-uniconvertor.\n" +"У Windows: отримайте пакунок зі сторінки\n" +"http://sk1project.org/modules.php?name=Products&product=uniconvertor\n" +"і встановіть його до теки Python Inkscape.\n" #: ../share/extensions/voronoi2svg.py:215 msgid "Please select objects!" @@ -31143,7 +33091,11 @@ msgstr "Зберегти сітку" msgid "Save Background" msgstr "Зберегти тло" -#: ../share/extensions/gimp_xcf.inx.h:7 +#: ../share/extensions/gimp_xcf.inx.h:6 +msgid "File Resolution:" +msgstr "Роздільність файла:" + +#: ../share/extensions/gimp_xcf.inx.h:8 msgid "" "This extension exports the document to Gimp XCF format according to the " "following options:\n" @@ -31151,6 +33103,7 @@ msgid "" " * Save Grid: convert the first rectangular grid to a Gimp grid (note " "that the default Inkscape grid is very narrow when shown in Gimp).\n" " * Save Background: add the document background to each converted layer.\n" +" * File Resolution: XCF file resolution, in DPI.\n" "\n" "Each first level layer is converted to a Gimp layer. Sublayers are " "concatenated and converted with their first level parent layer into a single " @@ -31163,12 +33116,14 @@ msgstr "" "(зауважте, що типову сітку Inkscape буде показано дуже вузькою у вікні " "Gimp).\n" " * Зберегти тло: додати тло документа до кожного з перетворених шарів.\n" +" * Роздільність файла: роздільна здатність даних у файлі XCF, у точках на " +"дюйм.\n" "\n" "Всі шари першого рівня буде перетворено у шари Gimp. Всі підлеглі шарити " "буде об'єднано і перетворено разом з відповідним батьківським шаром першого " "рівня у єдиний шар Gimp." -#: ../share/extensions/gimp_xcf.inx.h:13 +#: ../share/extensions/gimp_xcf.inx.h:15 msgid "GIMP XCF maintaining layers (*.xcf)" msgstr "GIMP XCF з підтримкою шарів (*.xcf)" @@ -31642,8 +33597,13 @@ msgid "Resolution X (dpi)" msgstr "Роздільна здатність за X (у т/дюйм):" #: ../share/extensions/hpgl_input.inx.h:4 -msgid "The amount of steps in one inch on the X axis. (Default: 1016.0)" -msgstr "Кількість кроків у одному дюймі за віссю X. (типове значення — 1016.0)" +#: ../share/extensions/hpgl_output.inx.h:5 +#: ../share/extensions/plotter.inx.h:21 +msgid "" +"The amount of steps the plotter moves if it moves for 1 inch on the X axis. " +"(Default: 1016.0)" +msgstr "" +"Кількість кроків різця у одному дюймі за віссю X (типове значення — 1016.0)" #: ../share/extensions/hpgl_input.inx.h:5 #: ../share/extensions/hpgl_output.inx.h:6 @@ -31652,8 +33612,13 @@ msgid "Resolution Y (dpi)" msgstr "Роздільна здатність за Y (у т/дюйм):" #: ../share/extensions/hpgl_input.inx.h:6 -msgid "The amount of steps in one inch on the Y axis. (Default: 1016.0)" -msgstr "Кількість кроків у одному дюймі за віссю Y. (типове значення — 1016.0)" +#: ../share/extensions/hpgl_output.inx.h:7 +#: ../share/extensions/plotter.inx.h:23 +msgid "" +"The amount of steps the plotter moves if it moves for 1 inch on the Y axis. " +"(Default: 1016.0)" +msgstr "" +"Кількість кроків різця у одному дюймі за віссю Y (типове значення — 1016.0)" #: ../share/extensions/hpgl_input.inx.h:7 msgid "Show movements between paths" @@ -31666,7 +33631,7 @@ msgstr "" "(Типове значення: не позначено)" #: ../share/extensions/hpgl_input.inx.h:9 -#: ../share/extensions/hpgl_output.inx.h:42 +#: ../share/extensions/hpgl_output.inx.h:43 msgid "HP Graphics Language file (*.hpgl)" msgstr "Файли графічної мови HP (*.hpgl)" @@ -31681,35 +33646,18 @@ msgstr "Експорт до HPGL" #: ../share/extensions/hpgl_output.inx.h:2 msgid "" "Please make sure that all objects you want to save are converted to paths. " -"The drawing will be automatically aligned to the zero point. Please use the " -"plotter extension (Extensions menu) to plot directly on a plotter." +"Please use the plotter extension (Extensions menu) to plot directly over a " +"serial connection." msgstr "" "Будь ласка, переконайтеся, що всі об’єкти, які слід вирізати, перетворено на " -"контури. Креслення буде автоматично вирівняно за нульовою точкою. " -"Скористайтеся додатком плотера (меню «Додатки»), щоб виконати вирізання " -"безпосередньо на плотері." +"контури. Скористайтеся додатком плотера (меню «Додатки»), щоб виконати " +"вирізання безпосередньо за допомогою послідовного з’єднання." #: ../share/extensions/hpgl_output.inx.h:3 #: ../share/extensions/plotter.inx.h:19 msgid "Plotter Settings" msgstr "Параметри вирізання" -#: ../share/extensions/hpgl_output.inx.h:5 -#: ../share/extensions/plotter.inx.h:21 -msgid "" -"The amount of steps the cutter moves if it moves for 1 inch on the X axis. " -"(Default: 1016.0)" -msgstr "" -"Кількість кроків різця у одному дюймі за віссю X (типове значення — 1016.0)" - -#: ../share/extensions/hpgl_output.inx.h:7 -#: ../share/extensions/plotter.inx.h:23 -msgid "" -"The amount of steps the cutter moves if it moves for 1 inch on the Y axis. " -"(Default: 1016.0)" -msgstr "" -"Кількість кроків різця у одному дюймі за віссю Y (типове значення — 1016.0)" - #: ../share/extensions/hpgl_output.inx.h:8 #: ../share/extensions/plotter.inx.h:24 msgid "Pen number" @@ -31730,26 +33678,27 @@ msgstr "Тиск різця (у грамах)" #: ../share/extensions/plotter.inx.h:27 msgid "" "The amount of force pushing down the pen in grams, set to 0 to omit command. " -"Most plotters ignore this command. (Default: 24)" +"Most plotters ignore this command. (Default: 0)" msgstr "" "Величина сили, що притискає різець, у грамах сили. Встановіть значення 0, " "якщо цю команду віддавати не слід. Більшість плотерів ігнорує цю команду. " -"(Типове значення: 24)" +"(Типове значення: 0)" #: ../share/extensions/hpgl_output.inx.h:12 #: ../share/extensions/plotter.inx.h:28 -msgid "Pen speed (cm/s)" -msgstr "Швидкість різця (у см/с)" +msgid "Pen speed (cm/s or mm/s)" +msgstr "Швидкість різця (у см/с або мм/с)" #: ../share/extensions/hpgl_output.inx.h:13 #: ../share/extensions/plotter.inx.h:29 msgid "" -"The speed the pen will move with in centimetres per second, set to 0 to omit " -"command. Most plotters ignore this command. (Default: 20)" +"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 "" -"Швидкість руху різця у сантиметрах на секунду. Встановіть значення 0, щоб " -"вимкнути команду. Більшість плотерів ігнорує цю команду. (Типове значення: " -"20)" +"Швидкість руху різця у сантиметрах або міліметрах на секунду (залежно від " +"моделі плотера). Встановіть значення 0, щоб вимкнути команду. Більшість " +"плотерів ігнорує цю команду. (Типове значення: 20)" #: ../share/extensions/hpgl_output.inx.h:14 #: ../share/extensions/plotter.inx.h:30 @@ -31758,7 +33707,7 @@ msgstr "Обертання за годинниковою стрілкою" #: ../share/extensions/hpgl_output.inx.h:15 #: ../share/extensions/plotter.inx.h:31 -msgid "Rotation of the plot. (Default: 0°)" +msgid "Rotation of the drawing. (Default: 0°)" msgstr "Кут обертання креслення. (Типове значення: 0°)" #: ../share/extensions/hpgl_output.inx.h:16 @@ -31866,30 +33815,20 @@ msgstr "Використовувати підрізання" #: ../share/extensions/hpgl_output.inx.h:32 #: ../share/extensions/plotter.inx.h:48 msgid "" -"Check this to plot a small line before the real plot to align the tool " -"orientation for the first real plot. (Default: Checked)" +"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:33 -#: ../share/extensions/plotter.inx.h:49 -msgid "" -"Please note that using the tool offset correction will move your plot away " -"from the zero point by one tool offset length." -msgstr "" -"Будь ласка, зауважте, що у результаті використання виправлення відступу " -"інструмента різець буде відсунуто від нульової точки на довжину одного " -"відступу інструмента." - -#: ../share/extensions/hpgl_output.inx.h:35 -#: ../share/extensions/plotter.inx.h:51 +#: ../share/extensions/hpgl_output.inx.h:34 +#: ../share/extensions/plotter.inx.h:50 msgid "Curve flatness" msgstr "Пласкість кривої" -#: ../share/extensions/hpgl_output.inx.h:36 -#: ../share/extensions/plotter.inx.h:52 +#: ../share/extensions/hpgl_output.inx.h:35 +#: ../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')" @@ -31897,36 +33836,49 @@ msgstr "" "Криві буде розділено на прямі відрізки. Це значення керує точністю такого " "поділу. Чим меншим воно буде, тим точнішим буде поділ. (Типове значення: 1.2)" -#: ../share/extensions/hpgl_output.inx.h:37 -#: ../share/extensions/plotter.inx.h:53 +#: ../share/extensions/hpgl_output.inx.h:36 +#: ../share/extensions/plotter.inx.h:52 msgid "X offset (mm)" msgstr "Відступ за X (у мм)" -#: ../share/extensions/hpgl_output.inx.h:38 -#: ../share/extensions/plotter.inx.h:54 -msgid "" -"The offset to move your plot away from the zero point on the X axis in mm. " -"(Default: '0.00')" +#: ../share/extensions/hpgl_output.inx.h:37 +#: ../share/extensions/plotter.inx.h:53 +msgid "Shifts your drawing on the X axis in mm. (Default: '0.00')" msgstr "" "Відступ вашого креслення від початкової точки за віссю X у мм. (Типове " "значення: 0.00)" -#: ../share/extensions/hpgl_output.inx.h:39 -#: ../share/extensions/plotter.inx.h:55 +#: ../share/extensions/hpgl_output.inx.h:38 +#: ../share/extensions/plotter.inx.h:54 msgid "Y offset (mm)" msgstr "Відступ за Y (у мм)" -#: ../share/extensions/hpgl_output.inx.h:40 -#: ../share/extensions/plotter.inx.h:56 -msgid "" -"The offset to move your plot away from the zero point on the Y axis in mm. " -"(Default: '0.00')" +#: ../share/extensions/hpgl_output.inx.h:39 +#: ../share/extensions/plotter.inx.h:55 +msgid "Shifts your drawing on the Y axis in mm. (Default: '0.00')" msgstr "" "Відступ вашого креслення від початкової точки за віссю Y у мм. (Типове " "значення: 0.00)" +#: ../share/extensions/hpgl_output.inx.h:40 +#: ../share/extensions/plotter.inx.h:56 +msgid "Auto align" +msgstr "Автовирівнювання" + #: ../share/extensions/hpgl_output.inx.h:41 -#: ../share/extensions/plotter.inx.h:59 +#: ../share/extensions/plotter.inx.h:57 +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 " +"are within the document border! (Default: Checked)" +msgstr "" +"Позначте цей пункт, щоб креслення було автоматично вирівняно за нульовою " +"точкою (плюс відступ інструмента, якщо він використовується). Якщо пункт не " +"буде позначено, слід переконатися, що усіх частини креслення перебувають у " +"межах документа! (Типовий стан: позначено)" + +#: ../share/extensions/hpgl_output.inx.h:42 +#: ../share/extensions/plotter.inx.h:60 msgid "" "All these settings depend on the plotter you use, for more information " "please consult the manual or homepage for your plotter." @@ -31935,7 +33887,7 @@ msgstr "" "Докладнішу інформацію можна отримати з підручника до плотера або домашньої " "сторінки компанії-виробника." -#: ../share/extensions/hpgl_output.inx.h:43 +#: ../share/extensions/hpgl_output.inx.h:44 msgid "Export an HP Graphics Language file" msgstr "Експортувати до файла графічної мови HP" @@ -33261,11 +35213,10 @@ msgstr "Різання" #: ../share/extensions/plotter.inx.h:2 msgid "" -"Please make sure that all objects you want to plot are converted to paths. " -"The plot will automatically be aligned to the zero point." +"Please make sure that all objects you want to plot are converted to paths." msgstr "" "Будь ласка, переконайтеся, що всі об’єкти, які слід вирізати, перетворено на " -"контури. Креслення буде автоматично вирівняно за нульовою точкою." +"контури." #: ../share/extensions/plotter.inx.h:3 msgid "Connection" @@ -33328,7 +35279,7 @@ msgstr "апаратне (DSR/DTR + RTS/CTS)" #: ../share/extensions/plotter.inx.h:16 msgid "" "Using wrong settings can under certain circumstances cause Inkscape to " -"freeze. Always save your work before plotting." +"freeze. Always save your work before plotting!" msgstr "" "Використання помилкових параметрів, за певних обставин, може призвести до " "зависання Inkscape. Завжди зберігайте вашу роботу до того, як розпочати " @@ -33347,11 +35298,11 @@ msgstr "" msgid "Parallel (LPT) connections are not supported." msgstr "Підтримки паралельних з’єднань (LPT) не передбачено." -#: ../share/extensions/plotter.inx.h:57 +#: ../share/extensions/plotter.inx.h:58 msgid "Show debug information" msgstr "Показувати діагностичну інформацію" -#: ../share/extensions/plotter.inx.h:58 +#: ../share/extensions/plotter.inx.h:59 msgid "" "Check this to get verbose information about the plot without actually " "sending something to the plotter (A.k.a. data dump). (Default: Unchecked)" @@ -33360,7 +35311,7 @@ msgstr "" "вирізання без надсилання даних на плотер (тобто отримувати дамп даних). " "(Типове значення: не позначено)" -#: ../share/extensions/plotter.inx.h:60 +#: ../share/extensions/plotter.inx.h:61 msgid "Plotter" msgstr "Плотер" @@ -35107,6 +37058,47 @@ msgstr "Популярний графічний формат для кліпар msgid "XAML Input" msgstr "Імпорт з XAML" +#~ msgctxt "Symbol" +#~ msgid "Intormation" +#~ msgstr "Інформація" + +#~ msgid "drawing-%d%s" +#~ msgstr "рисунок-%d%s" + +#~ msgid "%s" +#~ msgstr "%s" + +#~ msgid "Adjust the bisector's \"left\" end" +#~ msgstr "Скоригувати «лівий» кінець бісектриси" + +#~ msgid "Adjust the bisector's \"right\" end" +#~ msgstr "Скоригувати «правий» кінець бісектриси" + +#~ msgid " " +#~ msgstr " " + +#~ msgid "pySerial is not installed." +#~ msgstr "Не встановлено pySerial." + +#~ msgid "You need to install the UniConvertor software.\n" +#~ msgstr "Вам слід встановити UniConvertor.\n" + +#~ msgid "The amount of steps in one inch on the X axis. (Default: 1016.0)" +#~ msgstr "" +#~ "Кількість кроків у одному дюймі за віссю X. (типове значення — 1016.0)" + +#~ msgid "The amount of steps in one inch on the Y axis. (Default: 1016.0)" +#~ msgstr "" +#~ "Кількість кроків у одному дюймі за віссю Y. (типове значення — 1016.0)" + +#~ msgid "" +#~ "Please note that using the tool offset correction will move your plot " +#~ "away from the zero point by one tool offset length." +#~ msgstr "" +#~ "Будь ласка, зауважте, що у результаті використання виправлення відступу " +#~ "інструмента різець буде відсунуто від нульової точки на довжину одного " +#~ "відступу інструмента." + #~ msgid "(%d characters%s)" #~ msgstr "(%d символів%s)" @@ -35119,9 +37111,6 @@ msgstr "Імпорт з XAML" #~ msgid "8x8" #~ msgstr "8x8" -#~ msgid "16x16" -#~ msgstr "16x16" - #~ msgid "Oversample bitmaps:" #~ msgstr "Усереднювати растр по точках:" -- cgit v1.2.3 From 625688469342db74aaa3dca548377562af807da0 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Wed, 5 Feb 2014 20:05:05 +0100 Subject: Dutch translation update (bzr r13000) --- po/nl.po | 96 ++++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/po/nl.po b/po/nl.po index 9bcb5d711..5be75b04b 100644 --- a/po/nl.po +++ b/po/nl.po @@ -59,7 +59,7 @@ msgstr "" "Project-Id-Version: inkscape 0.49\n" "Report-Msgid-Bugs-To: inkscape-devel@lists.sourceforge.net\n" "POT-Creation-Date: 2014-01-19 16:41+0100\n" -"PO-Revision-Date: 2014-01-19 22:01+0100\n" +"PO-Revision-Date: 2014-02-05 19:58+0100\n" "Last-Translator: Kris De Gussem \n" "Language-Team: Dutch\n" "MIME-Version: 1.0\n" @@ -3742,49 +3742,49 @@ msgstr "Tekstballonnen" #: ../share/symbols/symbols.h:134 msgctxt "Symbol" msgid "Thought Balloon" -msgstr "" +msgstr "Gedachtenballon" #. Symbols: ./BalloonSymbols.svg #: ../share/symbols/symbols.h:135 msgctxt "Symbol" msgid "Dream Speaking" -msgstr "" +msgstr "Wensballon" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:136 msgctxt "Symbol" msgid "Flow Chart Shapes" -msgstr "" +msgstr "Stroomdiagramvormen" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:137 msgctxt "Symbol" msgid "Process" -msgstr "" +msgstr "Proces" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:138 msgctxt "Symbol" msgid "Predefined Process" -msgstr "" +msgstr "Voorgedefinieerd proces" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:139 msgctxt "Symbol" msgid "Alternate Process" -msgstr "" +msgstr "Alternatief proces" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:140 msgctxt "Symbol" msgid "Extract" -msgstr "" +msgstr "Extraheren" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:141 msgctxt "Symbol" msgid "Manual Input" -msgstr "" +msgstr "Manuele invoer" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:142 @@ -3796,25 +3796,25 @@ msgstr "Samenvoegen" #: ../share/symbols/symbols.h:143 msgctxt "Symbol" msgid "Delay" -msgstr "" +msgstr "Vertraging" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:144 msgctxt "Symbol" msgid "Data I/O" -msgstr "" +msgstr "Data I/O" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:145 msgctxt "Symbol" msgid "Internal Storage" -msgstr "" +msgstr "Interne opslag" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:146 msgctxt "Symbol" msgid "Card" -msgstr "" +msgstr "Kaart" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:147 @@ -3826,49 +3826,49 @@ msgstr "Document" #: ../share/symbols/symbols.h:148 msgctxt "Symbol" msgid "Direct Access Storage" -msgstr "" +msgstr "Opslag met directe toegang" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:149 msgctxt "Symbol" msgid "Stored Data" -msgstr "" +msgstr "Opgeslagen data" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:150 msgctxt "Symbol" msgid "Magnetic Disk (Database)" -msgstr "" +msgstr "Magneetschijf (database)" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:151 msgctxt "Symbol" msgid "Punched Tape" -msgstr "" +msgstr "Ponskaart" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:152 msgctxt "Symbol" msgid "Terminator" -msgstr "" +msgstr "Terminator" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:153 msgctxt "Symbol" msgid "Thick Arrow" -msgstr "" +msgstr "Dikke pijl" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:154 msgctxt "Symbol" msgid "Transfer" -msgstr "" +msgstr "Transfer" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:155 msgctxt "Symbol" msgid "Decision" -msgstr "" +msgstr "Beslissing" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:156 @@ -3892,19 +3892,19 @@ msgstr "" #: ../share/symbols/symbols.h:159 msgctxt "Symbol" msgid "Connector" -msgstr "" +msgstr "Verbinding" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:160 msgctxt "Symbol" msgid "Logical Or" -msgstr "" +msgstr "Logische of" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:161 msgctxt "Symbol" msgid "Logical And" -msgstr "" +msgstr "Logische en" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:162 @@ -3922,7 +3922,7 @@ msgstr "Voorbereiding" #: ../share/symbols/symbols.h:164 msgctxt "Symbol" msgid "Display" -msgstr "" +msgstr "Display" #. Symbols: ./FlowSymbols.svg #: ../share/symbols/symbols.h:165 @@ -3934,7 +3934,7 @@ msgstr "Sorteren" #: ../share/symbols/symbols.h:166 msgctxt "Symbol" msgid "Collate" -msgstr "" +msgstr "Vergelijken" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:167 @@ -3946,61 +3946,61 @@ msgstr "Logicasymbolen" #: ../share/symbols/symbols.h:168 msgctxt "Symbol" msgid "Xnor Gate" -msgstr "" +msgstr "Xnor-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:169 msgctxt "Symbol" msgid "Xor Gate" -msgstr "" +msgstr "Xor-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:170 msgctxt "Symbol" msgid "Nor Gate" -msgstr "" +msgstr "Nor-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:171 msgctxt "Symbol" msgid "Or Gate" -msgstr "" +msgstr "Of-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:172 msgctxt "Symbol" msgid "Nand Gate" -msgstr "" +msgstr "Nand-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:173 msgctxt "Symbol" msgid "And Gate" -msgstr "" +msgstr "En-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:174 msgctxt "Symbol" msgid "Buffer" -msgstr "" +msgstr "Buffer" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:175 msgctxt "Symbol" msgid "Not Gate" -msgstr "" +msgstr "Not-poort" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:176 msgctxt "Symbol" msgid "Buffer Small" -msgstr "" +msgstr "Buffer klein" #. Symbols: ./LogicSymbols.svg #: ../share/symbols/symbols.h:177 msgctxt "Symbol" msgid "Not Gate Small" -msgstr "" +msgstr "Not-poort klein" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:178 @@ -4024,13 +4024,13 @@ msgstr "Jeugdhotel" #: ../share/symbols/symbols.h:181 msgctxt "Symbol" msgid "Shelter" -msgstr "" +msgstr "Onderdak" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:182 msgctxt "Symbol" msgid "Motel" -msgstr "" +msgstr "Motel" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:183 @@ -4054,7 +4054,7 @@ msgstr "Chalet" #: ../share/symbols/symbols.h:186 msgctxt "Symbol" msgid "Caravan Park" -msgstr "" +msgstr "Camperplaats" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:187 @@ -4096,49 +4096,49 @@ msgstr "Bibliotheek" #: ../share/symbols/symbols.h:193 msgctxt "Symbol" msgid "Town Hall" -msgstr "Stadshuis" +msgstr "Stadhuis" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:194 msgctxt "Symbol" msgid "Court" -msgstr "" +msgstr "Gerechtsgebouw" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:195 msgctxt "Symbol" msgid "Fire Station / House" -msgstr "" +msgstr "Brandweer" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:196 msgctxt "Symbol" msgid "Police Station" -msgstr "" +msgstr "Politiekantoor" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:197 msgctxt "Symbol" msgid "Prison" -msgstr "" +msgstr "Gevangenis" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:198 msgctxt "Symbol" msgid "Post Office" -msgstr "" +msgstr "Postkantoor" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:199 msgctxt "Symbol" msgid "Public Building" -msgstr "" +msgstr "Publiek gebouw" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:200 msgctxt "Symbol" msgid "Recycling" -msgstr "" +msgstr "Recyclage" #. Symbols: ./MapSymbols.svg #: ../share/symbols/symbols.h:201 @@ -26602,7 +26602,7 @@ msgstr "Selecteer een overgang voor het huidige kleurverloop" #: ../src/widgets/gradient-toolbar.cpp:1162 msgid "Stops:" -msgstr "Overgangen:" +msgstr "Overgang:" #. Label #: ../src/widgets/gradient-toolbar.cpp:1174 -- cgit v1.2.3 From f08bd308b4c3a75bf770c01fb38cd02915d3aa19 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Wed, 5 Feb 2014 20:01:41 -0500 Subject: Extensions->Render submenu. Scaling of input parameters into document units, Part 1 (Bug 1240455) Fixed bugs: - https://launchpad.net/bugs/1240455 (bzr r13001) --- share/extensions/draw_from_triangle.py | 10 ++++++---- share/extensions/foldablebox.py | 2 +- share/extensions/render_alphabetsoup.py | 2 +- share/extensions/render_gear_rack.py | 6 +++--- share/extensions/render_gears.py | 2 +- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/share/extensions/draw_from_triangle.py b/share/extensions/draw_from_triangle.py index 414363e86..42cda7035 100755 --- a/share/extensions/draw_from_triangle.py +++ b/share/extensions/draw_from_triangle.py @@ -148,6 +148,8 @@ def get_n_points_from_path( node, n):#returns a list of first n points (x,y) in if len(xi) == n and len(yi) == n: points = [] # returned pairs of points for i in range(n): + xi[i] = Draw_From_Triangle.unittouu(e, str(xi[i]) + 'px') + yi[i] = Draw_From_Triangle.unittouu(e, str(yi[i]) + 'px') points.append( [ xi[i], yi[i] ] ) else: #inkex.errormsg(_('Error: Not enough nodes to gather coordinates.')) #fail silently and exit, rather than invoke an error console @@ -190,17 +192,17 @@ class Style(object): #container for style information def __init__(self, options): #dot markers self.d_rad = 4 #dot marker radius - self.d_th = 2 #stroke width + self.d_th = Draw_From_Triangle.unittouu(e, '2px') #stroke width self.d_fill= '#aaaaaa' #fill colour self.d_col = '#000000' #stroke colour #lines - self.l_th = 2 + self.l_th = Draw_From_Triangle.unittouu(e, '2px') self.l_fill= 'none' self.l_col = '#000000' #circles - self.c_th = 2 + self.c_th = Draw_From_Triangle.unittouu(e, '2px') self.c_fill= 'none' self.c_col = '#000000' @@ -314,7 +316,7 @@ class Draw_From_Triangle(inkex.Effect): if len(pts) == 3: #if we have right number of nodes, else skip and end program st = Style(so)#style for dots, lines and circles - + #CREATE A GROUP TO HOLD ALL GENERATED ELEMENTS IN #Hold relative to point A (pt[0]) group_translation = 'translate(' + str( pts[0][0] ) + ','+ str( pts[0][1] ) + ')' diff --git a/share/extensions/foldablebox.py b/share/extensions/foldablebox.py index 5d5945dd9..b504de89f 100755 --- a/share/extensions/foldablebox.py +++ b/share/extensions/foldablebox.py @@ -70,7 +70,7 @@ class FoldableBox(inkex.Effect): box_id = self.uniqueId('box') self.box = g = inkex.etree.SubElement(self.current_layer, 'g', {'id':box_id}) - line_style = simplestyle.formatStyle({ 'stroke': '#000000', 'fill': 'none' }) + line_style = simplestyle.formatStyle({ 'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px')) }) #self.createGuide( 0, docH, 0 ); diff --git a/share/extensions/render_alphabetsoup.py b/share/extensions/render_alphabetsoup.py index ad43163e4..083f03af9 100755 --- a/share/extensions/render_alphabetsoup.py +++ b/share/extensions/render_alphabetsoup.py @@ -514,7 +514,7 @@ class AlphabetSoup(inkex.Effect): help="Generate random (unreadable) text") def effect(self): - zoom = self.options.zoom + zoom = self.unittouu( str(self.options.zoom) + 'px') if self.options.randomize: imagelist = generate_random_string(self.options.text, zoom) diff --git a/share/extensions/render_gear_rack.py b/share/extensions/render_gear_rack.py index 13eaf1017..68c5d050e 100644 --- a/share/extensions/render_gear_rack.py +++ b/share/extensions/render_gear_rack.py @@ -65,8 +65,8 @@ class RackGear(inkex.Effect): help="Contact Angle") def effect(self): - length = self.options.length - spacing = self.options.spacing + length = self.unittouu(str(self.options.length) + 'px') + spacing = self.unittouu(str(self.options.spacing) + 'px') angle = radians(self.options.angle) # generate points: list of (x, y) pairs @@ -93,7 +93,7 @@ class RackGear(inkex.Effect): g = inkex.etree.SubElement(self.current_layer, 'g', g_attribs) # Create SVG Path for gear - style = {'stroke': '#000000', 'fill': 'none'} + style = {'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px'))} gear_attribs = { 'style': simplestyle.formatStyle(style), 'd': path} diff --git a/share/extensions/render_gears.py b/share/extensions/render_gears.py index 5201e553b..d5c8131a8 100644 --- a/share/extensions/render_gears.py +++ b/share/extensions/render_gears.py @@ -164,7 +164,7 @@ class Gears(inkex.Effect): g = inkex.etree.SubElement(self.current_layer, 'g', g_attribs) # Create SVG Path for gear - style = { 'stroke': '#000000', 'fill': 'none' } + style = { 'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px')) } gear_attribs = {'style':simplestyle.formatStyle(style), 'd':path} gear = inkex.etree.SubElement(g, inkex.addNS('path','svg'), gear_attribs ) if(centerdiameter > 0.0): -- cgit v1.2.3 From 7dd239eed97761b22ef635b6896a8f65c4939462 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 6 Feb 2014 15:29:15 +0100 Subject: Added new base class to handle viewBox and preserveAspectRatio. Updated sp-root, sp-symbol, sp-image, sp-pattern, marker to use new class. Fixed some viewport issues when % used. (bzr r13002) --- src/CMakeLists.txt | 3 +- src/Makefile_insert | 3 +- src/document.cpp | 10 -- src/marker.cpp | 257 ++++---------------------------------- src/marker.h | 14 +-- src/sp-image.cpp | 347 ++++++++++++++++++++-------------------------------- src/sp-image.h | 14 +-- src/sp-pattern.cpp | 55 ++------- src/sp-pattern.h | 6 +- src/sp-root.cpp | 327 ++++++++++--------------------------------------- src/sp-root.h | 15 +-- src/sp-symbol.cpp | 234 ++--------------------------------- src/sp-symbol.h | 15 +-- src/viewbox.cpp | 277 +++++++++++++++++++++++++++++++++++++++++ src/viewbox.h | 66 ++++++++++ 15 files changed, 601 insertions(+), 1042 deletions(-) create mode 100644 src/viewbox.cpp create mode 100644 src/viewbox.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 54b15d342..d1a3d194e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -78,7 +78,7 @@ set(sp_SRC sp-use-reference.cpp sp-use.cpp splivarot.cpp - + viewbox.cpp # ------- # Headers @@ -163,6 +163,7 @@ set(sp_SRC sp-tspan.h sp-use-reference.h sp-use.h + viewbox.h ) set(inkscape_SRC diff --git a/src/Makefile_insert b/src/Makefile_insert index 5e441560a..7aedb38ee 100644 --- a/src/Makefile_insert +++ b/src/Makefile_insert @@ -228,7 +228,8 @@ ink_common_sources += \ uri-references.cpp uri-references.h \ vanishing-point.cpp vanishing-point.h \ verbs.cpp verbs.h \ - version.cpp version.h + version.cpp version.h \ + viewbox.cpp viewbox.h # Additional dependencies diff --git a/src/document.cpp b/src/document.cpp index 634462001..6f957cace 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -381,16 +381,6 @@ SPDocument *SPDocument::createDoc(Inkscape::XML::Document *rdoc, rroot->setAttribute("inkscape:version", Inkscape::version_string); /* fixme: Again, I moved these here to allow version determining in ::build (Lauris) */ - /* Quick hack 2 - get default image size into document */ - if (!rroot->attribute("width")) rroot->setAttribute("width", "100%"); - if (!rroot->attribute("height")) rroot->setAttribute("height", "100%"); - /* End of quick hack 2 */ - - /* Quick hack 3 - Set uri attributes */ -// if (uri) { // this is done in do_change_uri() -// rroot->setAttribute("sodipodi:docname", uri); -// } - /* End of quick hack 3 */ /* Eliminate obsolete sodipodi:docbase, for privacy reasons */ rroot->setAttribute("sodipodi:docbase", NULL); diff --git a/src/marker.cpp b/src/marker.cpp index b9464186d..f6e55b3ec 100644 --- a/src/marker.cpp +++ b/src/marker.cpp @@ -47,18 +47,15 @@ namespace { bool markerRegistered = SPFactory::instance().registerObject("svg:marker", createMarker); } -SPMarker::SPMarker() : SPGroup() { - this->aspect_clip = 0; - this->aspect_align = 0; - this->aspect_set = 0; - this->markerUnits = 0; - this->orient_auto = 0; - this->markerUnits_set = 0; - this->orient_set = 0; - this->orient = 0; - - this->viewBox = Geom::OptRect(); - this->c2p.setIdentity(); +SPMarker::SPMarker() : SPGroup(), SPViewBox() { + + this->markerUnits = 0; + this->markerUnits_set = 0; + + this->orient_auto = 0; + this->orient_set = 0; + this->orient = 0; + this->views = NULL; } @@ -177,133 +174,14 @@ void SPMarker::set(unsigned int key, const gchar* value) { break; case SP_ATTR_VIEWBOX: - this->viewBox = Geom::OptRect(); - - if (value) { - double x, y, width, height; - char *eptr; - - /* fixme: We have to take original item affine into account */ - /* fixme: Think (Lauris) */ - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - if ((width > 0) && (height > 0)) { - /* Set viewbox */ - this->viewBox = Geom::Rect(Geom::Point(x, y), Geom::Point(x + width, y + height)); - } - } - - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - break; + set_viewBox( value ); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_NONE; - this->aspect_clip = SP_ASPECT_MEET; - - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; - - while (*p && *p == 32) { - p += 1; - } - - if (!*p) { - break; - } - - e = p; - - while (*e && *e != 32) { - e += 1; - } - - len = e - p; - - if (len > 8) { - break; - } - - memcpy (c, value, len); - - c[len] = 0; - - /* Now the actual part */ - if (!strcmp (c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp (c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp (c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp (c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp (c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp (c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp (c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp (c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp (c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp (c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) { - e += 1; - } - - if (*e) { - if (!strcmp (e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp (e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_set = TRUE; - this->aspect_align = align; - this->aspect_clip = clip; - } - break; + set_preserveAspectRatio( value ); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; default: SPGroup::set(key, value); @@ -312,112 +190,23 @@ void SPMarker::set(unsigned int key, const gchar* value) { } void SPMarker::update(SPCtx *ctx, guint flags) { - SPItemCtx rctx; - // fixme: We have to set up clip here too + SPItemCtx ictx; // Copy parent context - rctx.flags = ctx->flags; + ictx.flags = ctx->flags; // Initialize transformations - rctx.i2doc = Geom::identity(); - rctx.i2vp = Geom::identity(); + ictx.i2doc = Geom::identity(); + ictx.i2vp = Geom::identity(); // Set up viewport - rctx.viewport = Geom::Rect::from_xywh(0, 0, this->markerWidth.computed, this->markerHeight.computed); - - // Start with identity transform - this->c2p.setIdentity(); + ictx.viewport = Geom::Rect::from_xywh(0, 0, this->markerWidth.computed, this->markerHeight.computed); - // Viewbox is always present, either implicitly or explicitly - Geom::Rect vb; - if (this->viewBox) { - vb = *this->viewBox; - } else { - vb = rctx.viewport; - } + SPItemCtx rctx = get_rctx( &ictx ); - // Now set up viewbox transformation - - // Determine actual viewbox in viewport coordinates - // double x = 0; - // double y = 0; - double width = 0; - double height = 0; - - if (this->aspect_align == SP_ASPECT_NONE) { - // x = 0.0; - // y = 0.0; - width = rctx.viewport.width(); - height = rctx.viewport.height(); - } else { - double scalex, scaley, scale; - // Things are getting interesting - scalex = rctx.viewport.width() / (vb.width()); - scaley = rctx.viewport.height() / (vb.height()); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); - width = (vb.width()) * scale; - height = (vb.height()) * scale; - - // Now place viewbox to requested position - /*switch (marker->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - case SP_ASPECT_XMID_YMIN: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMAX_YMIN: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMID: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMID: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMAX: - x = 0.5 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMAX: - x = 1.0 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - default: - x = 0.0; - y = 0.0; - break; - }*/ - } - - // TODO fixme: all that work is done to figure out x and y, which are just ignored. Check why. - - // viewbox transformation and reference translation - this->c2p = Geom::Translate(-this->refX.computed, -this->refY.computed) * - Geom::Scale(width / vb.width(), height / vb.height()); - - rctx.i2doc = this->c2p * rctx.i2doc; - - // If viewBox is set reinitialize child viewport - // Otherwise it already correct - if (this->viewBox) { - rctx.viewport = *this->viewBox; - rctx.i2vp = Geom::identity(); - } + // Shift according to refX, refY + this->c2p = Geom::Translate(this->viewBox.left()-this->refX.computed, this->viewBox.top()-this->refY.computed) * this->c2p; // And invoke parent method SPGroup::update((SPCtx *) &rctx, flags); diff --git a/src/marker.h b/src/marker.h index b780950de..d41df69b4 100644 --- a/src/marker.h +++ b/src/marker.h @@ -31,8 +31,9 @@ struct SPMarkerView; #include "sp-item-group.h" #include "sp-marker-loc.h" #include "uri-references.h" +#include "viewbox.h" -class SPMarker : public SPGroup { +class SPMarker : public SPGroup, public SPViewBox { public: SPMarker(); virtual ~SPMarker(); @@ -54,17 +55,6 @@ public: unsigned int orient_auto : 1; float orient; - /* viewBox; */ - Geom::OptRect viewBox; - - /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - - /* Child to parent additional transform */ - Geom::Affine c2p; - /* Private views */ SPMarkerView *views; diff --git a/src/sp-image.cpp b/src/sp-image.cpp index 8f7a60ca6..5f630f7b7 100644 --- a/src/sp-image.cpp +++ b/src/sp-image.cpp @@ -119,14 +119,12 @@ SPObject* createImage() { bool imageRegistered = SPFactory::instance().registerObject("svg:image", createImage); } -SPImage::SPImage() : SPItem() { - this->aspect_clip = 0; +SPImage::SPImage() : SPItem(), SPViewBox() { this->x.unset(); this->y.unset(); this->width.unset(); this->height.unset(); - this->aspect_align = SP_ASPECT_NONE; this->clipbox = Geom::Rect(); this->sx = this->sy = 1.0; this->ox = this->oy = 0.0; @@ -195,8 +193,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_X: - if (!this->x.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->x.read(value)) { this->x.unset(); } @@ -204,8 +202,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_Y: - if (!this->y.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->y.read(value)) { this->y.unset(); } @@ -213,8 +211,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_WIDTH: - if (!this->width.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->width.read(value)) { this->width.unset(); } @@ -222,8 +220,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_HEIGHT: - if (!this->height.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + /* ex, em not handled correctly. */ + if (!this->height.read(value)) { this->height.unset(); } @@ -231,67 +229,8 @@ void SPImage::set(unsigned int key, const gchar* value) { break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_align = SP_ASPECT_NONE; - this->aspect_clip = SP_ASPECT_MEET; + set_preserveAspectRatio( value ); this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; - while (*p && *p == 32) p += 1; - if (!*p) break; - e = p; - while (*e && *e != 32) e += 1; - len = e - p; - if (len > 8) break; - memcpy (c, value, len); - c[len] = 0; - /* Now the actual part */ - if (!strcmp (c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp (c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp (c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp (c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp (c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp (c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp (c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp (c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp (c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp (c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) e += 1; - - if (*e) { - if (!strcmp (e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp (e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_align = align; - this->aspect_clip = clip; - } break; #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) @@ -322,7 +261,79 @@ void SPImage::set(unsigned int key, const gchar* value) { sp_image_set_curve(this); //creates a curve at the image's boundary for snapping } +// BLIP +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) +void SPImage::apply_profile(Inkscape::Pixbuf *pixbuf) { + + // TODO: this will prevent using MIME data when exporting. + // Integrate color correction into loading. + pixbuf->ensurePixelFormat(Inkscape::Pixbuf::PF_GDK); + int imagewidth = pixbuf->width(); + int imageheight = pixbuf->height(); + int rowstride = pixbuf->rowstride();; + guchar* px = pixbuf->pixels(); + + if ( px ) { + DEBUG_MESSAGE( lcmsFive, "in 's sp_image_update. About to call colorprofile_get_handle()" ); + + guint profIntent = Inkscape::RENDERING_INTENT_UNKNOWN; + cmsHPROFILE prof = Inkscape::CMSSystem::getHandle( this->document, + &profIntent, + this->color_profile ); + if ( prof ) { + cmsProfileClassSignature profileClass = cmsGetDeviceClass( prof ); + if ( profileClass != cmsSigNamedColorClass ) { + int intent = INTENT_PERCEPTUAL; + + switch ( profIntent ) { + case Inkscape::RENDERING_INTENT_RELATIVE_COLORIMETRIC: + intent = INTENT_RELATIVE_COLORIMETRIC; + break; + case Inkscape::RENDERING_INTENT_SATURATION: + intent = INTENT_SATURATION; + break; + case Inkscape::RENDERING_INTENT_ABSOLUTE_COLORIMETRIC: + intent = INTENT_ABSOLUTE_COLORIMETRIC; + break; + case Inkscape::RENDERING_INTENT_PERCEPTUAL: + case Inkscape::RENDERING_INTENT_UNKNOWN: + case Inkscape::RENDERING_INTENT_AUTO: + default: + intent = INTENT_PERCEPTUAL; + } + + cmsHPROFILE destProf = cmsCreate_sRGBProfile(); + cmsHTRANSFORM transf = cmsCreateTransform( prof, + TYPE_RGBA_8, + destProf, + TYPE_RGBA_8, + intent, 0 ); + if ( transf ) { + guchar* currLine = px; + for ( int y = 0; y < imageheight; y++ ) { + // Since the types are the same size, we can do the transformation in-place + cmsDoTransform( transf, currLine, currLine, imagewidth ); + currLine += rowstride; + } + + cmsDeleteTransform( transf ); + } else { + DEBUG_MESSAGE( lcmsSix, "in 's sp_image_update. Unable to create LCMS transform." ); + } + + cmsCloseProfile( destProf ); + } else { + DEBUG_MESSAGE( lcmsSeven, "in 's sp_image_update. Profile type is named color. Can't transform." ); + } + } else { + DEBUG_MESSAGE( lcmsEight, "in 's sp_image_update. No profile found." ); + } + } +} +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + void SPImage::update(SPCtx *ctx, unsigned int flags) { + SPDocument *doc = this->document; SPItem::update(ctx, flags); @@ -339,170 +350,84 @@ void SPImage::update(SPCtx *ctx, unsigned int flags) { doc->getBase()); if (pixbuf) { -// BLIP #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) - if ( this->color_profile ) - { - // TODO: this will prevent using MIME data when exporting. - // Integrate color correction into loading. - pixbuf->ensurePixelFormat(Inkscape::Pixbuf::PF_GDK); - int imagewidth = pixbuf->width(); - int imageheight = pixbuf->height(); - int rowstride = pixbuf->rowstride();; - guchar* px = pixbuf->pixels(); - - if ( px ) { - DEBUG_MESSAGE( lcmsFive, "in 's sp_image_update. About to call colorprofile_get_handle()" ); - - guint profIntent = Inkscape::RENDERING_INTENT_UNKNOWN; - cmsHPROFILE prof = Inkscape::CMSSystem::getHandle( this->document, - &profIntent, - this->color_profile ); - if ( prof ) { - cmsProfileClassSignature profileClass = cmsGetDeviceClass( prof ); - if ( profileClass != cmsSigNamedColorClass ) { - int intent = INTENT_PERCEPTUAL; - - switch ( profIntent ) { - case Inkscape::RENDERING_INTENT_RELATIVE_COLORIMETRIC: - intent = INTENT_RELATIVE_COLORIMETRIC; - break; - case Inkscape::RENDERING_INTENT_SATURATION: - intent = INTENT_SATURATION; - break; - case Inkscape::RENDERING_INTENT_ABSOLUTE_COLORIMETRIC: - intent = INTENT_ABSOLUTE_COLORIMETRIC; - break; - case Inkscape::RENDERING_INTENT_PERCEPTUAL: - case Inkscape::RENDERING_INTENT_UNKNOWN: - case Inkscape::RENDERING_INTENT_AUTO: - default: - intent = INTENT_PERCEPTUAL; - } - - cmsHPROFILE destProf = cmsCreate_sRGBProfile(); - cmsHTRANSFORM transf = cmsCreateTransform( prof, - TYPE_RGBA_8, - destProf, - TYPE_RGBA_8, - intent, 0 ); - if ( transf ) { - guchar* currLine = px; - for ( int y = 0; y < imageheight; y++ ) { - // Since the types are the same size, we can do the transformation in-place - cmsDoTransform( transf, currLine, currLine, imagewidth ); - currLine += rowstride; - } - - cmsDeleteTransform( transf ); - } else { - DEBUG_MESSAGE( lcmsSix, "in 's sp_image_update. Unable to create LCMS transform." ); - } - - cmsCloseProfile( destProf ); - } else { - DEBUG_MESSAGE( lcmsSeven, "in 's sp_image_update. Profile type is named color. Can't transform." ); - } - } else { - DEBUG_MESSAGE( lcmsEight, "in 's sp_image_update. No profile found." ); - } - } - } -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) - + if ( this->color_profile ) apply_profile( pixbuf ); +#endif this->pixbuf = pixbuf; } } } + SPItemCtx *ictx = (SPItemCtx *) ctx; + + // Why continue without a pixbuf? So we can display "Missing Image" png. + // Eventually, we should properly support SVG image type (i.e. render it ourselves). + if (this->pixbuf) { - /* fixme: We are slightly violating spec here (Lauris) */ + if (!this->x._set) { + this->x.unit = SVGLength::PX; + this->x.computed = 0; + } + + if (!this->y._set) { + this->y.unit = SVGLength::PX; + this->y.computed = 0; + } + if (!this->width._set) { + this->width.unit = SVGLength::PX; this->width.computed = this->pixbuf->width(); } if (!this->height._set) { + this->height.unit = SVGLength::PX; this->height.computed = this->pixbuf->height(); } } - this->clipbox = Geom::Rect::from_xywh( - this->x.computed, this->y.computed, - this->width.computed, this->height.computed); + + // Calculate x, y, width, height from parent/initial viewport, see sp-root.cpp + if (this->x.unit == SVGLength::PERCENT) { + this->x.computed = this->x.value * ictx->viewport.width(); + } + + if (this->y.unit == SVGLength::PERCENT) { + this->y.computed = this->y.value * ictx->viewport.height(); + } + + if (this->width.unit == SVGLength::PERCENT) { + this->width.computed = this->width.value * ictx->viewport.width(); + } + + if (this->height.unit == SVGLength::PERCENT) { + this->height.computed = this->height.value * ictx->viewport.height(); + } + + // Image creates a new viewport + ictx->viewport= Geom::Rect::from_xywh( this->x.computed, this->y.computed, + this->width.computed, this->height.computed); + + this->clipbox = ictx->viewport; this->ox = this->x.computed; this->oy = this->y.computed; if (this->pixbuf) { - int pixwidth = this->pixbuf->width(); - int pixheight = this->pixbuf->height(); - - this->sx = this->width.computed / pixwidth; - this->sy = this->height.computed / pixheight; - - // preserveAspectRatio calculate bounds / clipping rectangle -- EAF - if (this->aspect_align != SP_ASPECT_NONE) { - double x, y; - - switch (this->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - case SP_ASPECT_XMID_YMIN: - x = 0.5; - y = 0.0; - break; - case SP_ASPECT_XMAX_YMIN: - x = 1.0; - y = 0.0; - break; - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5; - break; - case SP_ASPECT_XMID_YMID: - x = 0.5; - y = 0.5; - break; - case SP_ASPECT_XMAX_YMID: - x = 1.0; - y = 0.5; - break; - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0; - break; - case SP_ASPECT_XMID_YMAX: - x = 0.5; - y = 1.0; - break; - case SP_ASPECT_XMAX_YMAX: - x = 1.0; - y = 1.0; - break; - default: - x = 0.0; - y = 0.0; - break; - } - if (this->aspect_clip == SP_ASPECT_SLICE) { - double scale = std::max(this->sx, this->sy); - this->sx = scale; - this->sy = scale; - } else { - double scale = std::min(this->sx, this->sy); - this->sx = scale; - this->sy = scale; - } + // Viewbox is either from SVG (not supported) or dimensions of pixbuf (PNG, JPG) + this->viewBox = Geom::Rect::from_xywh(0, 0, this->pixbuf->width(), this->pixbuf->height()); + this->viewBox_set = true; - double vw = pixwidth * this->sx; - double vh = pixheight * this->sy; - this->ox += x * (this->width.computed - vw); - this->oy += y * (this->height.computed - vh); - } + // SPItemCtx rctx = + get_rctx( ictx ); + + this->ox = c2p[4]; + this->oy = c2p[5]; + this->sx = c2p[0]; + this->sy = c2p[3]; } + + // TODO: eliminate ox, oy, sx, sy sp_image_update_canvas_image ((SPImage *) this); } diff --git a/src/sp-image.h b/src/sp-image.h index 3b7208487..50eb731d7 100644 --- a/src/sp-image.h +++ b/src/sp-image.h @@ -18,6 +18,7 @@ #include #include "svg/svg-length.h" #include "sp-shape.h" +#include "viewbox.h" #define SP_IMAGE(obj) (dynamic_cast((SPObject*)obj)) #define SP_IS_IMAGE(obj) (dynamic_cast((SPObject*)obj) != NULL) @@ -25,7 +26,7 @@ #define SP_IMAGE_HREF_MODIFIED_FLAG SP_OBJECT_USER_MODIFIED_FLAG_A namespace Inkscape { class Pixbuf; } -class SPImage : public SPItem { +class SPImage : public SPItem, public SPViewBox { public: SPImage(); virtual ~SPImage(); @@ -39,13 +40,6 @@ public: double sx, sy; double ox, oy; - // Added by EAF - /* preserveAspectRatio */ - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - //int trimx, trimy, trimwidth, trimheight; - //double viewx, viewy, viewwidth, viewheight; - SPCurve *curve; // This curve is at the image's boundary for snapping gchar *href; @@ -69,6 +63,10 @@ public: virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); virtual void snappoints(std::vector &p, Inkscape::SnapPreferences const *snapprefs) const; virtual Geom::Affine set_transform(Geom::Affine const &transform); + +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) + void apply_profile(Inkscape::Pixbuf *pixbuf); +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) }; /* Return duplicate of curve or NULL */ diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp index ad5449f34..711f26428 100644 --- a/src/sp-pattern.cpp +++ b/src/sp-pattern.cpp @@ -53,7 +53,7 @@ namespace { bool patternRegistered = SPFactory::instance().registerObject("svg:pattern", createPattern); } -SPPattern::SPPattern() : SPPaintServer() { +SPPattern::SPPattern() : SPPaintServer(), SPViewBox() { this->href = NULL; this->ref = new SPPatternReference(this); @@ -72,8 +72,6 @@ SPPattern::SPPattern() : SPPaintServer() { this->y.unset(); this->width.unset(); this->height.unset(); - - this->viewBox_set = FALSE; } SPPattern::~SPPattern() { @@ -90,6 +88,7 @@ void SPPattern::build(SPDocument* doc, Inkscape::XML::Node* repr) { this->readAttr( "width" ); this->readAttr( "height" ); this->readAttr( "viewBox" ); + this->readAttr( "preserveAspectRatio" ); this->readAttr( "xlink:href" ); /* Register ourselves */ @@ -180,50 +179,16 @@ void SPPattern::set(unsigned int key, const gchar* value) { this->requestModified(SP_OBJECT_MODIFIED_FLAG); break; - case SP_ATTR_VIEWBOX: { - /* fixme: Think (Lauris) */ - double x, y, width, height; - char *eptr; - - if (value) { - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } + case SP_ATTR_VIEWBOX: + set_viewBox( value ); + this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; - if ((width > 0) && (height > 0)) { - this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; - } else { - this->viewBox_set = FALSE; - } - } else { - this->viewBox_set = FALSE; - } + case SP_ATTR_PRESERVEASPECTRATIO: + set_preserveAspectRatio( value ); + this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); + break; - this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - break; - } case SP_ATTR_XLINK_HREF: if ( value && this->href && ( strcmp(value, this->href) == 0 ) ) { /* Href unchanged, do nothing. */ diff --git a/src/sp-pattern.h b/src/sp-pattern.h index 4e3657ccf..f69ba10b3 100644 --- a/src/sp-pattern.h +++ b/src/sp-pattern.h @@ -25,12 +25,13 @@ class SPPatternReference; #include "svg/svg-length.h" #include "sp-paint-server.h" #include "uri-references.h" +#include "viewbox.h" #include #include -class SPPattern : public SPPaintServer { +class SPPattern : public SPPaintServer, public SPViewBox { public: SPPattern(); virtual ~SPPattern(); @@ -52,9 +53,6 @@ public: SVGLength y; SVGLength width; SVGLength height; - /* VieBox */ - Geom::Rect viewBox; - guint viewBox_set : 1; sigc::connection modified_connection; diff --git a/src/sp-root.cpp b/src/sp-root.cpp index 5466649a2..bc870b116 100644 --- a/src/sp-root.cpp +++ b/src/sp-root.cpp @@ -42,12 +42,9 @@ SPObject *createRoot() bool rootRegistered = SPFactory::instance().registerObject("svg:svg", createRoot); } -SPRoot::SPRoot() : SPGroup() +SPRoot::SPRoot() : SPGroup(), SPViewBox() { - this->aspect_set = 0; - this->aspect_align = 0; this->onload = NULL; - this->aspect_clip = 0; static Inkscape::Version const zero_version(0, 0); @@ -57,15 +54,11 @@ SPRoot::SPRoot() : SPGroup() this->version.inkscape = zero_version; this->original.inkscape = zero_version; - this->x.unset(); - this->y.unset(); + this->x.unset(SVGLength::PERCENT, 0.0, 0.0); // Ignored for root SVG element + this->y.unset(SVGLength::PERCENT, 0.0, 0.0); this->width.unset(SVGLength::PERCENT, 1.0, 1.0); this->height.unset(SVGLength::PERCENT, 1.0, 1.0); - this->viewBox_set = false; - - this->c2p.setIdentity(); - this->defs = NULL; } @@ -129,9 +122,9 @@ void SPRoot::set(unsigned int key, const gchar *value) break; case SP_ATTR_X: - if (!this->x.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ - this->x.unset(); + /* Valid for non-root SVG elements; ex, em not handled correctly. */ + if (!this->x.read(value)) { + this->x.unset(SVGLength::PERCENT, 0.0, 0.0); } /* fixme: I am almost sure these do not require viewport flag (Lauris) */ @@ -139,9 +132,9 @@ void SPRoot::set(unsigned int key, const gchar *value) break; case SP_ATTR_Y: - if (!this->y.readAbsolute(value)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ - this->y.unset(); + /* Valid for non-root SVG elements; ex, em not handled correctly. */ + if (!this->y.read(value)) { + this->y.unset(SVGLength::PERCENT, 0.0, 0.0); } /* fixme: I am almost sure these do not require viewport flag (Lauris) */ @@ -149,153 +142,27 @@ void SPRoot::set(unsigned int key, const gchar *value) break; case SP_ATTR_WIDTH: - if (!this->width.readAbsolute(value) || !(this->width.computed > 0.0)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + if (!this->width.read(value) || !(this->width.computed > 0.0)) { this->width.unset(SVGLength::PERCENT, 1.0, 1.0); } - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_HEIGHT: - if (!this->height.readAbsolute(value) || !(this->height.computed > 0.0)) { - /* fixme: em, ex, % are probably valid, but require special treatment (Lauris) */ + if (!this->height.read(value) || !(this->height.computed > 0.0)) { this->height.unset(SVGLength::PERCENT, 1.0, 1.0); } - this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_VIEWBOX: - if (value) { - double x, y, width, height; - char *eptr; - - /* fixme: We have to take original item affine into account */ - /* fixme: Think (Lauris) */ - eptr = (gchar *) value; - x = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod(eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - if ((width > 0) && (height > 0)) { - /* Set viewbox */ - this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; - } else { - this->viewBox_set = FALSE; - } - } else { - this->viewBox_set = FALSE; - } - + set_viewBox( value ); this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_XMID_YMID; - this->aspect_clip = SP_ASPECT_MEET; - + set_preserveAspectRatio( value ); this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - gchar const *p, *e; - unsigned int align, clip; - p = value; - - while (*p && *p == 32) { - p += 1; - } - - if (!*p) { - break; - } - - e = p; - - while (*e && *e != 32) { - e += 1; - } - - len = e - p; - - if (len > 8) { - break; - } - - memcpy(c, value, len); - - c[len] = 0; - - /* Now the actual part */ - if (!strcmp(c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp(c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp(c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp(c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp(c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp(c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp(c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp(c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp(c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp(c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) { - e += 1; - } - - if (*e) { - if (!strcmp(e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp(e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_set = TRUE; - this->aspect_align = align; - this->aspect_clip = clip; - } break; case SP_ATTR_ONLOAD: @@ -356,141 +223,75 @@ void SPRoot::update(SPCtx *ctx, guint flags) { SPItemCtx *ictx = (SPItemCtx *) ctx; - /* fixme: This will be invoked too often (Lauris) */ - /* fixme: We should calculate only if parent viewport has changed (Lauris) */ - /* If position is specified as percentage, calculate actual values */ - if (this->x.unit == SVGLength::PERCENT) { - this->x.computed = this->x.value * ictx->viewport.width(); - } - - if (this->y.unit == SVGLength::PERCENT) { - this->y.computed = this->y.value * ictx->viewport.height(); - } - - if (this->width.unit == SVGLength::PERCENT) { - this->width.computed = this->width.value * ictx->viewport.width(); - } - - if (this->height.unit == SVGLength::PERCENT) { - this->height.computed = this->height.value * ictx->viewport.height(); - } - - /* Create copy of item context */ - SPItemCtx rctx = *ictx; - - /* Calculate child to parent transformation */ - this->c2p.setIdentity(); + if( !this->parent ) { - if (this->parent) { /* - * fixme: I am not sure whether setting x and y does or does not - * fixme: translate the content of inner SVG. - * fixme: Still applying translation and setting viewport to width and - * fixme: height seems natural, as this makes the inner svg element - * fixme: self-contained. The spec is vague here. + * This is the root SVG element: + * + * x, y, width, and height apply to positioning the SVG element inside a parent. + * For the root SVG in Inkscape there is no parent, thus special rules apply: + * If width, height not set, width = 100%, height = 100% (as always). + * If width and height are in percent, they are percent of viewBox width/height. + * If width, height, and viewBox are not set... pick "random" width/height. + * x, y are ignored. + * initial viewport = (0 0 width height) */ - this->c2p = Geom::Affine(Geom::Translate(this->x.computed, this->y.computed)); - } - - if (this->viewBox_set) { - double x, y, width, height; - /* Determine actual viewbox in viewport coordinates */ - if (this->aspect_align == SP_ASPECT_NONE) { - x = 0.0; - y = 0.0; - width = this->width.computed; - height = this->height.computed; - } else { - double scalex, scaley, scale; - /* Things are getting interesting */ - scalex = this->width.computed / this->viewBox.width(); - scaley = this->height.computed / this->viewBox.height(); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN(scalex, scaley) : MAX(scalex, scaley); - width = this->viewBox.width() * scale; - height = this->viewBox.height() * scale; - - /* Now place viewbox to requested position */ - /* todo: Use an array lookup to find the 0.0/0.5/1.0 coefficients, - as is done for dialogs/align.cpp. */ - switch (this->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - - case SP_ASPECT_XMID_YMIN: - x = 0.5 * (this->width.computed - width); - y = 0.0; - break; - - case SP_ASPECT_XMAX_YMIN: - x = 1.0 * (this->width.computed - width); - y = 0.0; - break; - - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5 * (this->height.computed - height); - break; - - case SP_ASPECT_XMID_YMID: - x = 0.5 * (this->width.computed - width); - y = 0.5 * (this->height.computed - height); - break; + if( this->viewBox_set ) { - case SP_ASPECT_XMAX_YMID: - x = 1.0 * (this->width.computed - width); - y = 0.5 * (this->height.computed - height); - break; + if( this->width._set ) { + // Check if this is necessary + if (this->width.unit == SVGLength::PERCENT) { + this->width.computed = this->width.value * this->viewBox.width(); + } + } else { + this->width.set( SVGLength::PX, this->viewBox.width(), this->viewBox.width() ); + } - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0 * (this->height.computed - height); - break; + if( this->height._set ) { + if (this->height.unit == SVGLength::PERCENT) { + this->height.computed = this->height.value * this->viewBox.height(); + } + } else { + this->height.set(SVGLength::PX, this->viewBox.height(), this->viewBox.height() ); + } - case SP_ASPECT_XMID_YMAX: - x = 0.5 * (this->width.computed - width); - y = 1.0 * (this->height.computed - height); - break; + } else { - case SP_ASPECT_XMAX_YMAX: - x = 1.0 * (this->width.computed - width); - y = 1.0 * (this->height.computed - height); - break; + if( !this->width._set ) { + this->width.set( SVGLength::PX, 100, 100 ); // Random default + } - default: - x = 0.0; - y = 0.0; - break; + if( !this->height._set ) { + this->height.set( SVGLength::PX, 100, 100 ); // Random default } } - /* Compose additional transformation from scale and position */ - Geom::Scale const viewBox_length(this->viewBox.dimensions()); - Geom::Scale const new_length(width, height); + // Ignore x, y values for root element + this->x.unset(SVGLength::PERCENT, 0.0, 0.0); + this->y.unset(SVGLength::PERCENT, 0.0, 0.0); + } - /* Append viewbox transformation */ - /* TODO: The below looks suspicious to me (pjrm): I wonder whether the RHS - expression should have c2p at the beginning rather than at the end. Test it. */ - this->c2p = Geom::Translate(-this->viewBox.min()) * (new_length * viewBox_length.inverse()) * Geom::Translate(x, y) * this->c2p; + // Calculate x, y, width, height from parent/initial viewport + if (this->x.unit == SVGLength::PERCENT) { + this->x.computed = this->x.value * ictx->viewport.width(); } - rctx.i2doc = this->c2p * rctx.i2doc; + if (this->y.unit == SVGLength::PERCENT) { + this->y.computed = this->y.value * ictx->viewport.height(); + } - /* Initialize child viewport */ - if (this->viewBox_set) { - rctx.viewport = this->viewBox; - } else { - /* fixme: I wonder whether this logic is correct (Lauris) */ - Geom::Point minp(0, 0); - if (this->parent) { - minp = Geom::Point(this->x.computed, this->y.computed); - } + if (this->width.unit == SVGLength::PERCENT) { + this->width.computed = this->width.value * ictx->viewport.width(); + } - rctx.viewport = Geom::Rect::from_xywh(minp[Geom::X], minp[Geom::Y], this->width.computed, this->height.computed); + if (this->height.unit == SVGLength::PERCENT) { + this->height.computed = this->height.value * ictx->viewport.height(); } - rctx.i2vp = Geom::identity(); + // Calculate new viewport + ictx->viewport = Geom::Rect::from_xywh( this->x.computed, this->y.computed, + this->width.computed, this->height.computed ); + SPItemCtx rctx = get_rctx( ictx ); /* And invoke parent method */ SPGroup::update((SPCtx *) &rctx, flags); diff --git a/src/sp-root.h b/src/sp-root.h index 2931391ff..1c9faed9b 100644 --- a/src/sp-root.h +++ b/src/sp-root.h @@ -18,6 +18,7 @@ #include "svg/svg-length.h" #include "enums.h" #include "sp-item-group.h" +#include "viewbox.h" #define SP_ROOT(obj) (dynamic_cast((SPObject*)obj)) #define SP_IS_ROOT(obj) (dynamic_cast((SPObject*)obj) != NULL) @@ -25,7 +26,7 @@ class SPDefs; /** \ element */ -class SPRoot : public SPGroup { +class SPRoot : public SPGroup, public SPViewBox { public: SPRoot(); virtual ~SPRoot(); @@ -40,18 +41,6 @@ public: SVGLength width; SVGLength height; - /* viewBox; */ - bool viewBox_set; - Geom::Rect viewBox; - - /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - - /** Child to parent additional transform. */ - Geom::Affine c2p; - gchar *onload; /** diff --git a/src/sp-symbol.cpp b/src/sp-symbol.cpp index 8ffc2ab2c..817411a32 100644 --- a/src/sp-symbol.cpp +++ b/src/sp-symbol.cpp @@ -36,13 +36,7 @@ namespace { bool symbolRegistered = SPFactory::instance().registerObject("svg:symbol", createSymbol); } -SPSymbol::SPSymbol() : SPGroup() { - this->aspect_align = 0; - this->aspect_clip = 0; - this->aspect_set = 0; - - this->viewBox_set = FALSE; - this->c2p = Geom::identity(); +SPSymbol::SPSymbol() : SPGroup(), SPViewBox() { } SPSymbol::~SPSymbol() { @@ -62,134 +56,15 @@ void SPSymbol::release() { void SPSymbol::set(unsigned int key, const gchar* value) { switch (key) { case SP_ATTR_VIEWBOX: - if (value) { - double x, y, width, height; - char *eptr; - - /* fixme: We have to take original item affine into account */ - /* fixme: Think (Lauris) */ - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - y = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - width = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - height = g_ascii_strtod (eptr, &eptr); - - while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { - eptr++; - } - - if ((width > 0) && (height > 0)) { - /* Set viewbox */ - this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; - } else { - this->viewBox_set = FALSE; - } - } else { - this->viewBox_set = FALSE; - } - + set_viewBox( value ); + std::cout << "Symbol: ViewBox: " << viewBox << std::endl; this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_PRESERVEASPECTRATIO: - /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_NONE; - this->aspect_clip = SP_ASPECT_MEET; + set_preserveAspectRatio( value ); + std::cout << "Symbol: Preserve aspect ratio: " << aspect_align << ", " << aspect_clip << std::endl; this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); - - if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; - - while (*p && *p == 32) { - p += 1; - } - - if (!*p) { - break; - } - - e = p; - - while (*e && *e != 32) { - e += 1; - } - - len = e - p; - - if (len > 8) { - break; - } - - memcpy (c, value, len); - - c[len] = 0; - - /* Now the actual part */ - if (!strcmp (c, "none")) { - align = SP_ASPECT_NONE; - } else if (!strcmp (c, "xMinYMin")) { - align = SP_ASPECT_XMIN_YMIN; - } else if (!strcmp (c, "xMidYMin")) { - align = SP_ASPECT_XMID_YMIN; - } else if (!strcmp (c, "xMaxYMin")) { - align = SP_ASPECT_XMAX_YMIN; - } else if (!strcmp (c, "xMinYMid")) { - align = SP_ASPECT_XMIN_YMID; - } else if (!strcmp (c, "xMidYMid")) { - align = SP_ASPECT_XMID_YMID; - } else if (!strcmp (c, "xMaxYMid")) { - align = SP_ASPECT_XMAX_YMID; - } else if (!strcmp (c, "xMinYMax")) { - align = SP_ASPECT_XMIN_YMAX; - } else if (!strcmp (c, "xMidYMax")) { - align = SP_ASPECT_XMID_YMAX; - } else if (!strcmp (c, "xMaxYMax")) { - align = SP_ASPECT_XMAX_YMAX; - } else { - break; - } - - clip = SP_ASPECT_MEET; - - while (*e && *e == 32) { - e += 1; - } - - if (*e) { - if (!strcmp (e, "meet")) { - clip = SP_ASPECT_MEET; - } else if (!strcmp (e, "slice")) { - clip = SP_ASPECT_SLICE; - } else { - break; - } - } - - this->aspect_set = TRUE; - this->aspect_align = align; - this->aspect_clip = clip; - } break; default: @@ -204,105 +79,10 @@ void SPSymbol::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) void SPSymbol::update(SPCtx *ctx, guint flags) { - SPItemCtx *ictx = (SPItemCtx *) ctx; - SPItemCtx rctx; - if (this->cloned) { - /* Cloned is actually renderable */ - - /* fixme: We have to set up clip here too */ - - /* Create copy of item context */ - rctx = *ictx; - - /* Calculate child to parent transformation */ - /* Apply parent translation (set up as vewport) */ - this->c2p = Geom::Translate(rctx.viewport.min()); - - if (this->viewBox_set) { - double x, y, width, height; - - /* Determine actual viewbox in viewport coordinates */ - if (this->aspect_align == SP_ASPECT_NONE) { - x = 0.0; - y = 0.0; - width = rctx.viewport.width(); - height = rctx.viewport.height(); - } else { - double scalex, scaley, scale; - /* Things are getting interesting */ - scalex = rctx.viewport.width() / this->viewBox.width(); - scaley = rctx.viewport.height() / this->viewBox.height(); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); - width = this->viewBox.width() * scale; - height = this->viewBox.height() * scale; - - /* Now place viewbox to requested position */ - switch (this->aspect_align) { - case SP_ASPECT_XMIN_YMIN: - x = 0.0; - y = 0.0; - break; - case SP_ASPECT_XMID_YMIN: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMAX_YMIN: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.0; - break; - case SP_ASPECT_XMIN_YMID: - x = 0.0; - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMID: - x = 0.5 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMID: - x = 1.0 * (rctx.viewport.width() - width); - y = 0.5 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMIN_YMAX: - x = 0.0; - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMID_YMAX: - x = 0.5 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - case SP_ASPECT_XMAX_YMAX: - x = 1.0 * (rctx.viewport.width() - width); - y = 1.0 * (rctx.viewport.height() - height); - break; - default: - x = 0.0; - y = 0.0; - break; - } - } - - /* Compose additional transformation from scale and position */ - Geom::Affine q; - q[0] = width / this->viewBox.width(); - q[1] = 0.0; - q[2] = 0.0; - q[3] = height / this->viewBox.height(); - q[4] = -this->viewBox.left() * q[0] + x; - q[5] = -this->viewBox.top() * q[3] + y; - - /* Append viewbox transformation */ - this->c2p = q * this->c2p; - } - rctx.i2doc = this->c2p * (Geom::Affine)rctx.i2doc; - - /* If viewBox is set initialize child viewport */ - /* Otherwise has set it up already */ - if (this->viewBox_set) { - rctx.viewport = this->viewBox; - rctx.i2vp = Geom::identity(); - } + SPItemCtx *ictx = (SPItemCtx *) ctx; + SPItemCtx rctx = get_rctx( ictx ); // And invoke parent method SPGroup::update((SPCtx *) &rctx, flags); diff --git a/src/sp-symbol.h b/src/sp-symbol.h index 7a43ed658..d1e62e923 100644 --- a/src/sp-symbol.h +++ b/src/sp-symbol.h @@ -25,24 +25,13 @@ #include "svg/svg-length.h" #include "enums.h" #include "sp-item-group.h" +#include "viewbox.h" -class SPSymbol : public SPGroup { +class SPSymbol : public SPGroup, public SPViewBox { public: SPSymbol(); virtual ~SPSymbol(); - /* viewBox; */ - unsigned int viewBox_set : 1; - Geom::Rect viewBox; - - /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; - - /* Child to parent additional transform */ - Geom::Affine c2p; - virtual void build(SPDocument *document, Inkscape::XML::Node *repr); virtual void release(); virtual void set(unsigned int key, gchar const* value); diff --git a/src/viewbox.cpp b/src/viewbox.cpp new file mode 100644 index 000000000..2314cbf6a --- /dev/null +++ b/src/viewbox.cpp @@ -0,0 +1,277 @@ +/* + * viewBox helper class, common code used by root, symbol, marker, pattern, image, view + * + * Authors: + * Lauris Kaplinski (code extracted from symbol.cpp) + * Tavmjong Bah + * + * Copyright (C) 2013 Tavmjong Bah, authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + * + */ + +#include <2geom/transforms.h> + +#include "viewbox.h" +#include "attributes.h" +#include "enums.h" +#include "sp-item.h" + +SPViewBox::SPViewBox() { + + this->viewBox_set = FALSE; + + this->aspect_set = FALSE; + this->aspect_align = SP_ASPECT_XMID_YMID; // Default per spec; + this->aspect_clip = SP_ASPECT_MEET; + + this->c2p = Geom::identity(); +} + +SPViewBox::~SPViewBox() { +} + +void SPViewBox::set_viewBox(const gchar* value) { + + if (value) { + double x, y, width, height; + char *eptr; + + eptr = (gchar *) value; + x = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + y = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + width = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + height = g_ascii_strtod (eptr, &eptr); + + while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { + eptr++; + } + + if ((width > 0) && (height > 0)) { + /* Set viewbox */ + this->viewBox = Geom::Rect::from_xywh(x, y, width, height); + this->viewBox_set = TRUE; + } else { + this->viewBox_set = FALSE; + } + } else { + this->viewBox_set = FALSE; + } + + // The C++ way? + // std::string sv( value ); + // std::replace( sv.begin(), sv.end(), ',', ' '); + // std::stringstream ss( sv ); + // double x, y, width, height; + // ss >> x >> y >> width >> height; +} + +void SPViewBox::set_preserveAspectRatio(const gchar* value) { + + /* Do setup before, so we can use break to escape */ + this->aspect_set = FALSE; + this->aspect_align = SP_ASPECT_XMID_YMID; // Default per spec + this->aspect_clip = SP_ASPECT_MEET; + + if (value) { + int len; + gchar c[256]; + const gchar *p, *e; + unsigned int align, clip; + p = value; + + while (*p && *p == 32) { + p += 1; + } + + if (!*p) { + return; + } + + e = p; + + while (*e && *e != 32) { + e += 1; + } + + len = e - p; + + if (len > 8) { + return; + } + + memcpy (c, value, len); + + c[len] = 0; + + /* Now the actual part */ + if (!strcmp (c, "none")) { + align = SP_ASPECT_NONE; + } else if (!strcmp (c, "xMinYMin")) { + align = SP_ASPECT_XMIN_YMIN; + } else if (!strcmp (c, "xMidYMin")) { + align = SP_ASPECT_XMID_YMIN; + } else if (!strcmp (c, "xMaxYMin")) { + align = SP_ASPECT_XMAX_YMIN; + } else if (!strcmp (c, "xMinYMid")) { + align = SP_ASPECT_XMIN_YMID; + } else if (!strcmp (c, "xMidYMid")) { + align = SP_ASPECT_XMID_YMID; + } else if (!strcmp (c, "xMaxYMid")) { + align = SP_ASPECT_XMAX_YMID; + } else if (!strcmp (c, "xMinYMax")) { + align = SP_ASPECT_XMIN_YMAX; + } else if (!strcmp (c, "xMidYMax")) { + align = SP_ASPECT_XMID_YMAX; + } else if (!strcmp (c, "xMaxYMax")) { + align = SP_ASPECT_XMAX_YMAX; + } else { + return; + } + + clip = SP_ASPECT_MEET; + + while (*e && *e == 32) { + e += 1; + } + + if (*e) { + if (!strcmp (e, "meet")) { + clip = SP_ASPECT_MEET; + } else if (!strcmp (e, "slice")) { + clip = SP_ASPECT_SLICE; + } else { + return; + } + } + + this->aspect_set = TRUE; + this->aspect_align = align; + this->aspect_clip = clip; + } +} + +// Apply scaling from viewbox +void SPViewBox::apply_viewbox(const Geom::Rect& in) { + + /* Determine actual viewbox in viewport coordinates */ + double x = 0.0; + double y = 0.0; + double width = in.width(); + double height = in.height(); + // std::cout << " width: " << width << " height: " << height << std::endl; + + if (this->aspect_align != SP_ASPECT_NONE) { + double scalex, scaley, scale; + /* Things are getting interesting */ + scalex = in.width() / this->viewBox.width(); + scaley = in.height() / this->viewBox.height(); + scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); + width = this->viewBox.width() * scale; + height = this->viewBox.height() * scale; + + /* Now place viewbox to requested position */ + switch (this->aspect_align) { + case SP_ASPECT_XMIN_YMIN: + break; + case SP_ASPECT_XMID_YMIN: + x = 0.5 * (in.width() - width); + break; + case SP_ASPECT_XMAX_YMIN: + x = 1.0 * (in.width() - width); + break; + case SP_ASPECT_XMIN_YMID: + y = 0.5 * (in.height() - height); + break; + case SP_ASPECT_XMID_YMID: + x = 0.5 * (in.width() - width); + y = 0.5 * (in.height() - height); + break; + case SP_ASPECT_XMAX_YMID: + x = 1.0 * (in.width() - width); + y = 0.5 * (in.height() - height); + break; + case SP_ASPECT_XMIN_YMAX: + y = 1.0 * (in.height() - height); + break; + case SP_ASPECT_XMID_YMAX: + x = 0.5 * (in.width() - width); + y = 1.0 * (in.height() - height); + break; + case SP_ASPECT_XMAX_YMAX: + x = 1.0 * (in.width() - width); + y = 1.0 * (in.height() - height); + break; + default: + break; + } + } + + /* Viewbox transform from scale and position */ + Geom::Affine q; + q[0] = width / this->viewBox.width(); + q[1] = 0.0; + q[2] = 0.0; + q[3] = height / this->viewBox.height(); + q[4] = -this->viewBox.left() * q[0] + x; + q[5] = -this->viewBox.top() * q[3] + y; + + // std::cout << " q\n" << q << std::endl; + + /* Append viewbox transformation */ + this->c2p = q * this->c2p; +} + +SPItemCtx SPViewBox::get_rctx(const SPItemCtx* ictx) { + + /* Create copy of item context */ + SPItemCtx rctx = *ictx; + + /* Calculate child to parent transformation */ + /* Apply parent translation (set up as viewport) */ + this->c2p = Geom::Translate(rctx.viewport.min()); + + if (this->viewBox_set) { + // Adjusts c2p for viewbox + apply_viewbox( rctx.viewport ); + } + + rctx.i2doc = this->c2p * rctx.i2doc; + + /* If viewBox is set initialize child viewport */ + /* Otherwise it is already correct */ + if (this->viewBox_set) { + rctx.viewport = this->viewBox; + rctx.i2vp = Geom::identity(); + } + + return rctx; +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-basic-offset:2 + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : diff --git a/src/viewbox.h b/src/viewbox.h new file mode 100644 index 000000000..24356ed17 --- /dev/null +++ b/src/viewbox.h @@ -0,0 +1,66 @@ +#ifndef __SP_VIEWBOX_H__ +#define __SP_VIEWBOX_H__ + +/* + * viewBox helper class, common code used by root, symbol, marker, pattern, image, view + * + * Authors: + * Lauris Kaplinski (code extracted from sp-symbol.h) + * Tavmjong Bah + * + * Copyright (C) 2013 Tavmjong Bah, authors + * + * Released under GNU GPL, read the file 'COPYING' for more information + * + */ + +#include <2geom/rect.h> +#include + +namespace Geom { +class Rect; +} +class SPItemCtx; + +class SPViewBox { + + public: + + SPViewBox(); + ~SPViewBox(); + + /* viewBox; */ + unsigned int viewBox_set : 1; + Geom::Rect viewBox; // Could use optrect + + /* preserveAspectRatio */ + unsigned int aspect_set : 1; + unsigned int aspect_align : 4; + unsigned int aspect_clip : 1; + + /* Child to parent additional transform */ + Geom::Affine c2p; + + void set_viewBox(const gchar* value); + void set_preserveAspectRatio(const gchar* value); + + /* Adjusts c2p for viewbox */ + void apply_viewbox(const Geom::Rect& in); + + SPItemCtx get_rctx( const SPItemCtx* ictx); + +}; + +#endif + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-basic-offset:2 + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=2:tabstop=8:softtabstop=2:fileencoding=utf-8:textwidth=99 : -- cgit v1.2.3 From 837c1a0ef4f2e0eb5000b4b993fd0b40d0a531db Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Thu, 6 Feb 2014 20:28:35 +0100 Subject: Markers are never shown directly, even if outside of section. (bzr r13003) --- src/marker.cpp | 10 +++++++--- src/marker.h | 1 + 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/marker.cpp b/src/marker.cpp index f6e55b3ec..900f8a2ca 100644 --- a/src/marker.cpp +++ b/src/marker.cpp @@ -283,8 +283,12 @@ Inkscape::XML::Node* SPMarker::write(Inkscape::XML::Document *xml_doc, Inkscape: } Inkscape::DrawingItem* SPMarker::show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { - // CPPIFY: correct? - return SPGroup::show(drawing, key, flags); + // Markers in tree are never shown directly even if outside of . + return 0; +} + +Inkscape::DrawingItem* SPMarker::private_show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { + return SPGroup::show(drawing, key, flags); } void SPMarker::hide(unsigned int key) { @@ -364,7 +368,7 @@ sp_marker_show_instance ( SPMarker *marker, Inkscape::DrawingItem *parent, } if (!v->items[pos]) { /* Parent class ::show method */ - v->items[pos] = marker->show(parent->drawing(), key, SP_ITEM_REFERENCE_FLAGS); + v->items[pos] = marker->private_show(parent->drawing(), key, SP_ITEM_REFERENCE_FLAGS); if (v->items[pos]) { /* fixme: Position (Lauris) */ diff --git a/src/marker.h b/src/marker.h index d41df69b4..21ad63a41 100644 --- a/src/marker.h +++ b/src/marker.h @@ -65,6 +65,7 @@ public: virtual Inkscape::XML::Node* write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags); virtual Inkscape::DrawingItem* show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); + virtual Inkscape::DrawingItem* private_show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags); virtual void hide(unsigned int key); virtual Geom::OptRect bbox(Geom::Affine const &transform, SPItem::BBoxType type) const; -- cgit v1.2.3 From 9dc9db77232e264edcfec1e6ba6437130ac4c0eb Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Fri, 7 Feb 2014 13:27:42 +0100 Subject: Prevent attempt to initialize/compare std::string with/to null pointer. (bzr r13004) --- src/document.cpp | 2 +- src/uri-references.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/document.cpp b/src/document.cpp index 6f957cace..470d0cc5a 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -473,7 +473,7 @@ SPDocument *SPDocument::createChildDoc(std::string const &uri) SPDocument *parent = this; SPDocument *document = NULL; - while(parent != NULL && document == NULL) { + while(parent != NULL && parent->getURI() != NULL && document == NULL) { // Check myself and any parents int he chain if(uri == parent->getURI()) { document = parent; diff --git a/src/uri-references.cpp b/src/uri-references.cpp index abe16ec9d..de293716b 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -58,7 +58,7 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // The path contains references to seperate document files to load. if(document && uri.getPath()) { - std::string base = std::string(document->getBase()); + std::string base = std::string(document->getBase() ? document->getBase() : ""); std::string path = uri.getFullPath(base); if(!path.empty()) document = document->createChildDoc(path); @@ -184,3 +184,14 @@ sp_uri_reference_resolve (SPDocument *document, const gchar *uri) return ref; } + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : -- cgit v1.2.3 From f11d3869c683c6aeb40ca7ff84d3a721f8e86ba2 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Fri, 7 Feb 2014 13:38:46 +0100 Subject: Slightly improved fix to previous check-in. (bzr r13005) --- src/uri-references.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/uri-references.cpp b/src/uri-references.cpp index de293716b..ea8078b28 100644 --- a/src/uri-references.cpp +++ b/src/uri-references.cpp @@ -58,7 +58,7 @@ void URIReference::attach(const URI &uri) throw(BadURIException) // The path contains references to seperate document files to load. if(document && uri.getPath()) { - std::string base = std::string(document->getBase() ? document->getBase() : ""); + std::string base = document->getBase() ? document->getBase() : ""; std::string path = uri.getFullPath(base); if(!path.empty()) document = document->createChildDoc(path); -- cgit v1.2.3 From ec4c32a8921fc72e855f2ca8ec608af499dc34d2 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Fri, 7 Feb 2014 21:08:10 +0100 Subject: Fix for Bug #1275443 (Including picture results in crash). Fixed bugs: - https://launchpad.net/bugs/1275443 (bzr r13006) --- src/extension/internal/image-resolution.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/extension/internal/image-resolution.cpp b/src/extension/internal/image-resolution.cpp index aee46aaba..18eb97f80 100644 --- a/src/extension/internal/image-resolution.cpp +++ b/src/extension/internal/image-resolution.cpp @@ -322,6 +322,12 @@ void ImageResolution::readjfif(char const *fn) { y_ = cinfo.Y_density * 2.54; ok_ = true; } + /* According to http://www.jpeg.org/public/jfif.pdf (page 7): + * "Xdensity and Ydensity should always be non-zero". + * but in some cases, they are (see LP bug #1275443) */ + if (x_ == 0 or y_ == 0) { + ok_ = false; + } } jpeg_destroy_decompress(&cinfo); fclose(ifd); -- cgit v1.2.3 From 71cc176ac4cd1da4ef5ad3a5b50ddb8f71098695 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Fri, 7 Feb 2014 19:16:27 -0500 Subject: Extensions->Render submenu. Scaling of input parameters into document units, Part 2 (Bug 1240455) Fixed bugs: - https://launchpad.net/bugs/1240455 (bzr r13007) --- share/extensions/grid_cartesian.py | 12 +++++++++++- share/extensions/grid_isometric.py | 6 ++++++ share/extensions/grid_polar.py | 11 ++++++++++- share/extensions/guides_creator.py | 4 ++-- share/extensions/lindenmayer.py | 3 ++- share/extensions/rtree.py | 4 +++- share/extensions/spirograph.py | 5 ++++- share/extensions/triangle.py | 7 +++++-- share/extensions/wireframe_sphere.py | 3 ++- 9 files changed, 45 insertions(+), 10 deletions(-) diff --git a/share/extensions/grid_cartesian.py b/share/extensions/grid_cartesian.py index 85716a6fd..23df0ff84 100755 --- a/share/extensions/grid_cartesian.py +++ b/share/extensions/grid_cartesian.py @@ -122,7 +122,17 @@ class Grid_Polar(inkex.Effect): def effect(self): - + + self.options.border_th = self.unittouu(str(self.options.border_th) + 'px') + self.options.dx = self.unittouu(str(self.options.dx) + 'px') + self.options.x_divs_th = self.unittouu(str(self.options.x_divs_th) + 'px') + self.options.x_subdivs_th = self.unittouu(str(self.options.x_subdivs_th) + 'px') + self.options.x_subsubdivs_th = self.unittouu(str(self.options.x_subsubdivs_th) + 'px') + self.options.dy = self.unittouu(str(self.options.dy) + 'px') + self.options.y_divs_th = self.unittouu(str(self.options.y_divs_th) + 'px') + self.options.y_subdivs_th = self.unittouu(str(self.options.y_subdivs_th) + 'px') + self.options.y_subsubdivs_th = self.unittouu(str(self.options.y_subsubdivs_th) + 'px') + #find the pixel dimensions of the overall grid ymax = self.options.dy * self.options.y_divs xmax = self.options.dx * self.options.x_divs diff --git a/share/extensions/grid_isometric.py b/share/extensions/grid_isometric.py index 27951a0a8..8ac407613 100755 --- a/share/extensions/grid_isometric.py +++ b/share/extensions/grid_isometric.py @@ -84,6 +84,12 @@ class Grid_Polar(inkex.Effect): def effect(self): + self.options.dx = self.unittouu(str(self.options.dx) + 'px') + self.options.divs_th = self.unittouu(str(self.options.divs_th) + 'px') + self.options.subdivs_th = self.unittouu(str(self.options.subdivs_th) + 'px') + self.options.subsubdivs_th = self.unittouu(str(self.options.subsubdivs_th) + 'px') + self.options.border_th = self.unittouu(str(self.options.border_th) + 'px') + #Can't generate a grid too flat #If the Y dimension is smallest than half the X dimension, fix it. if self.options.y_divs<((self.options.x_divs+1)/2): diff --git a/share/extensions/grid_polar.py b/share/extensions/grid_polar.py index 3ae3fac34..17c3499cb 100755 --- a/share/extensions/grid_polar.py +++ b/share/extensions/grid_polar.py @@ -119,7 +119,16 @@ class Grid_Polar(inkex.Effect): help="The radial outset of the circumferential labels") def effect(self): - + + self.options.dr = self.unittouu(str(self.options.dr) + 'px') + self.options.r_divs_th = self.unittouu(str(self.options.r_divs_th) + 'px') + self.options.r_subdivs_th = self.unittouu(str(self.options.r_subdivs_th) + 'px') + self.options.a_divs_th = self.unittouu(str(self.options.a_divs_th) + 'px') + self.options.a_subdivs_th = self.unittouu(str(self.options.a_subdivs_th) + 'px') + self.options.c_dot_dia = self.unittouu(str(self.options.c_dot_dia) + 'px') + self.options.a_label_size = self.unittouu(str(self.options.a_label_size) + 'px') + self.options.a_label_outset = self.unittouu(str(self.options.a_label_outset) + 'px') + # Embed grid in group #Put in in the centre of the current view t = 'translate(' + str( self.view_center[0] ) + ',' + str( self.view_center[1] ) + ')' diff --git a/share/extensions/guides_creator.py b/share/extensions/guides_creator.py index abd41c6fc..21df1cd50 100755 --- a/share/extensions/guides_creator.py +++ b/share/extensions/guides_creator.py @@ -297,8 +297,8 @@ class Guides_Creator(inkex.Effect): svg = self.document.getroot() # getting the width and height attributes of the canvas - width = self.unittouu(svg.get('width')) - height = self.unittouu(svg.attrib['height']) + width = float(svg.get('width')) + height = float(svg.get('height')) # getting edges coordinates h_orientation = '0,' + str(round(width,4)) diff --git a/share/extensions/lindenmayer.py b/share/extensions/lindenmayer.py index f9abce3ec..2e058f541 100755 --- a/share/extensions/lindenmayer.py +++ b/share/extensions/lindenmayer.py @@ -104,7 +104,8 @@ class LSystem(inkex.Effect): return level_string def effect(self): - s = {'stroke-linejoin': 'miter', 'stroke-width': '1.0px', + self.options.step = self.unittouu(str(self.options.step) + 'px') + s = {'stroke-linejoin': 'miter', 'stroke-width': str(self.unittouu('1px')), 'stroke-opacity': '1.0', 'fill-opacity': '1.0', 'stroke': '#000000', 'stroke-linecap': 'butt', 'fill': 'none'} diff --git a/share/extensions/rtree.py b/share/extensions/rtree.py index 3231d284e..db677d0d5 100755 --- a/share/extensions/rtree.py +++ b/share/extensions/rtree.py @@ -44,7 +44,9 @@ class RTreeTurtle(inkex.Effect): dest="minimum", default=4.0, help="minimum branch size") def effect(self): - s = {'stroke-linejoin': 'miter', 'stroke-width': '1.0px', + self.options.size = self.unittouu(str(self.options.size) + 'px') + self.options.minimum = self.unittouu(str(self.options.minimum) + 'px') + s = {'stroke-linejoin': 'miter', 'stroke-width': str(self.unittouu('1px')), 'stroke-opacity': '1.0', 'fill-opacity': '1.0', 'stroke': '#000000', 'stroke-linecap': 'butt', 'fill': 'none'} diff --git a/share/extensions/spirograph.py b/share/extensions/spirograph.py index cb9d1ac24..77a258d5f 100755 --- a/share/extensions/spirograph.py +++ b/share/extensions/spirograph.py @@ -47,6 +47,9 @@ class Spirograph(inkex.Effect): help="The quality of the calculated output") def effect(self): + self.options.primaryr = self.unittouu(str(self.options.primaryr) + 'px') + self.options.secondaryr = self.unittouu(str(self.options.secondaryr) + 'px') + self.options.penr = self.unittouu(str(self.options.penr) + 'px') if self.options.secondaryr == 0: return @@ -68,7 +71,7 @@ class Spirograph(inkex.Effect): rotation = - math.pi * self.options.rotation / 180; new = inkex.etree.Element(inkex.addNS('path','svg')) - s = { 'stroke': '#000000', 'fill': 'none' } + s = { 'stroke': '#000000', 'fill': 'none', 'stroke-width': str(self.unittouu('1px')) } new.set('style', simplestyle.formatStyle(s)) pathString = '' diff --git a/share/extensions/triangle.py b/share/extensions/triangle.py index 81945f370..ad26c6891 100755 --- a/share/extensions/triangle.py +++ b/share/extensions/triangle.py @@ -82,7 +82,7 @@ def draw_tri_from_3_sides(s_a, s_b, s_c, offset, parent): #draw a triangle from offy = c[1]/2 #c is the highest point offset = ( offset[0]-offx , offset[1]-offy ) #add the centre of the triangle to the offset - draw_SVG_tri(a, b, c , offset, 2, 'Triangle', parent) + draw_SVG_tri(a, b, c , offset, Grid_Polar.unittouu(e, '2px'), 'Triangle', parent) else: sys.stderr.write('Error:Invalid Triangle Specifications.\n') @@ -122,7 +122,10 @@ class Grid_Polar(inkex.Effect): tri = self.current_layer offset = (self.view_center[0],self.view_center[1]) #the offset require to centre the triangle - + self.options.s_a = self.unittouu(str(self.options.s_a) + 'px') + self.options.s_b = self.unittouu(str(self.options.s_b) + 'px') + self.options.s_c = self.unittouu(str(self.options.s_c) + 'px') + if self.options.mode == '3_sides': s_a = self.options.s_a s_b = self.options.s_b diff --git a/share/extensions/wireframe_sphere.py b/share/extensions/wireframe_sphere.py index 5804a1b45..b8947869c 100755 --- a/share/extensions/wireframe_sphere.py +++ b/share/extensions/wireframe_sphere.py @@ -66,7 +66,7 @@ inkex.localize() def draw_SVG_ellipse((rx, ry), (cx, cy), parent, start_end=(0,2*pi),transform='' ): style = { 'stroke' : '#000000', - 'stroke-width' : '1', + 'stroke-width' : str(Wireframe_Sphere.unittouu(e, '1px')), 'fill' : 'none' } circ_attribs = {'style':simplestyle.formatStyle(style), inkex.addNS('cx','sodipodi') :str(cx), @@ -120,6 +120,7 @@ class Wireframe_Sphere(inkex.Effect): else: flip = '' #no flip + so.RADIUS = self.unittouu(str(so.RADIUS) + 'px') so.TILT = abs(so.TILT)*(pi/180) #Convert to radians so.ROT_OFFSET = so.ROT_OFFSET*(pi/180) #Convert to radians -- cgit v1.2.3 From 042cc81dd7c3ca2f0d42b68356f4b450074c8473 Mon Sep 17 00:00:00 2001 From: David Mathog Date: Sat, 8 Feb 2014 08:17:30 +0100 Subject: EMF/WMF support: Various changes (see bug #1263242 c35 for details) EMF support: - linear gradients: improve numeric stability on round-trip editing - linear gradients: fix scaling issue libTERE/text_reassemble update: - improve handling of whitespace created with large x kerns - fix handling of absolute RTL-positioning of LTR text in EMF files WMF support: - fix support for 'textout' records and Placeable headers - add support for CREATEPATTERNBRUSH - fix offset on load if opened via GUI (bug #1250250) Fixed bugs: - https://launchpad.net/bugs/1263242 - https://launchpad.net/bugs/1250250 (bzr r13008) --- src/extension/internal/emf-inout.cpp | 2 + src/extension/internal/emf-inout.h | 1 + src/extension/internal/emf-print.cpp | 40 +++++---- src/extension/internal/emf-print.h | 3 +- src/extension/internal/text_reassemble.c | 137 ++++++++++++++++++++----------- src/extension/internal/text_reassemble.h | 7 +- src/extension/internal/wmf-inout.cpp | 44 +++++++++- src/libuemf/README | 6 ++ src/libuemf/uemf_utf.c | 95 +++++++++++++++------ src/libuemf/uwmf.c | 22 ++--- 10 files changed, 250 insertions(+), 107 deletions(-) diff --git a/src/extension/internal/emf-inout.cpp b/src/extension/internal/emf-inout.cpp index cca541c5b..276dee362 100644 --- a/src/extension/internal/emf-inout.cpp +++ b/src/extension/internal/emf-inout.cpp @@ -4,6 +4,7 @@ /* Authors: * Ulf Erikson * Jon A. Cruz + * David Mathog * Abhishek Sharma * * Copyright (C) 2006-2008 Authors @@ -1563,6 +1564,7 @@ int Emf::myEnhMetaFileProc(char *contents, unsigned int length, PEMF_CALLBACK_DA tsp.vadvance = 0.0; /* meaningful only when a complex contains two or more lines */ tsp.taln = ALILEFT + ALIBASE; tsp.ldir = LDIR_LR; + tsp.spaces = 0; // this field is only used for debugging tsp.color.Red = 0; /* RGB Black */ tsp.color.Green = 0; /* RGB Black */ tsp.color.Blue = 0; /* RGB Black */ diff --git a/src/extension/internal/emf-inout.h b/src/extension/internal/emf-inout.h index 97f93e71b..a97cb0a54 100644 --- a/src/extension/internal/emf-inout.h +++ b/src/extension/internal/emf-inout.h @@ -3,6 +3,7 @@ */ /* Authors: * Ulf Erikson + * David Mathog * * Copyright (C) 2006-2008 Authors * diff --git a/src/extension/internal/emf-print.cpp b/src/extension/internal/emf-print.cpp index 2680718cf..6d5bb6f4b 100644 --- a/src/extension/internal/emf-print.cpp +++ b/src/extension/internal/emf-print.cpp @@ -124,7 +124,7 @@ unsigned int PrintEmf::begin(Inkscape::Extension::Print *mod, SPDocument *doc) char *rec; gchar const *utf8_fn = mod->get_param_string("destination"); - // Typially PX2WORLD is 1200/90, using inkscape's default dpi + // Typically PX2WORLD is 1200/90, using inkscape's default dpi PX2WORLD = 1200.0 / Inkscape::Util::Quantity::convert(1.0, "in", "px"); FixPPTCharPos = mod->get_param_bool("FixPPTCharPos"); FixPPTDashLine = mod->get_param_bool("FixPPTDashLine"); @@ -848,7 +848,7 @@ Geom::Path PrintEmf::pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, int vertices; Geom::Path pR = pathv_to_simple_polygon(pathv, &vertices); *is_rect = false; - if(vertices==4){ // or else it cannot be a rectangle rectangle + if(vertices==4){ // or else it cannot be a rectangle int vertex_count=0; /* Get the ends of the LAST line segment. Find minimum rotation to align rectangle with X,Y axes. (Very degenerate if it is rotated 45 degrees.) */ @@ -862,12 +862,17 @@ Geom::Path PrintEmf::pathv_to_rect(Geom::PathVector const &pathv, bool *is_rect, if(fabs(ang) < fabs(*angle))*angle = -ang; // y increases down, flips sign on angle } } + + /* For increased numerical stability, snap the angle to the nearest 1/100th of a degree. */ + double convert = 36000.0/ (2.0 * M_PI); + *angle = round(*angle * convert)/convert; for(Geom::Path::const_iterator cit = pR.begin(); cit != pR.end_open();++cit) { P1_lead = cit->finalPoint(); v1 = unit_vector(P1 - P1_trail); v2 = unit_vector(P1_lead - P1 ); - if(!Geom::are_near(dot(v1,v2), 0.0, 1e-5))break; // P1 is center of a turn that is not 90 degrees + // P1 is center of a turn that is not 90 degrees. Limit comes from cos(89.9) = .001745 + if(!Geom::are_near(dot(v1,v2), 0.0, 2e-3))break; P1_trail = P1; P1 = P1_lead; vertex_count++; @@ -985,12 +990,13 @@ unsigned int PrintEmf::fill( int rectDir=0; Geom::Path pathRect; if(FixPPTLinGrad && brush_stat && gv.mode == DRAW_LINEAR_GRADIENT){ - pathRect = pathv_to_rect(pathv, &is_Rect, &angle); + Geom::PathVector pvr = pathv * fill_transform; + pathRect = pathv_to_rect(pvr, &is_Rect, &angle); if(is_Rect){ /* Gradientfill records can only be used if the gradient is parallel to the sides of the rectangle. That must be checked here so that we can fall back to another form of gradient fill if it is not the case. */ - rectDir = vector_rect_alignment(angle, gv.p2 - gv.p1); + rectDir = vector_rect_alignment(angle, (gv.p2 - gv.p1) * fill_transform); if(!rectDir)is_Rect = false; } if(!is_Rect && !FixPPTGrad2Polys)brush_stat=0; // fall all the way back to a solid fill @@ -1094,26 +1100,27 @@ unsigned int PrintEmf::fill( U_XFORM tmpTransform; double wRect, hRect; - /* coordinates, w,h and transform for the ENTIRE retangle */ - ul = get_pathrect_corner(pathRect, angle, 0) * fill_transform * PX2WORLD; - ur = get_pathrect_corner(pathRect, angle, 1) * fill_transform * PX2WORLD; - lr = get_pathrect_corner(pathRect, angle, 2) * fill_transform * PX2WORLD; + /* coordinates: upper left, upper right, and lower right corners of the rectangle. + inkscape transform already applied, but needs to be scaled to EMF coordinates. */ + ul = get_pathrect_corner(pathRect, angle, 0) * PX2WORLD; + ur = get_pathrect_corner(pathRect, angle, 1) * PX2WORLD; + lr = get_pathrect_corner(pathRect, angle, 2) * PX2WORLD; wRect = Geom::distance(ul,ur); hRect = Geom::distance(ur,lr); /* The basic rectangle for all of these is placed with its UL corner at 0,0 with a size wRect,hRect. Apply a world transform to place/scale it into the appropriate position on the drawing. Actual gradientfill records are either this entire rectangle or slices of it as defined by the stops. + This rectangle has already been transformed by tf (whatever rotation/scale) Inkscape had applied to it. */ Geom::Affine tf2 = Geom::Rotate(-angle); // the rectangle may be drawn skewed to the coordinate system - tf2 *= tf; // the coordinate system of the rectangular path may be rotated tmpTransform.eM11 = tf2[0]; tmpTransform.eM12 = tf2[1]; tmpTransform.eM21 = tf2[2]; tmpTransform.eM22 = tf2[3]; - tmpTransform.eDx = (ul)[Geom::X]; - tmpTransform.eDy = (ul)[Geom::Y]; + tmpTransform.eDx = round((ul)[Geom::X]); // use explicit round for better stability + tmpTransform.eDy = round((ul)[Geom::Y]); rec = U_EMRSAVEDC_set(); if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { @@ -1138,10 +1145,10 @@ unsigned int PrintEmf::fill( gMode = U_GRADIENT_FILL_RECT_V; } doff_base = doff_range; - rcb.left = outUL[X]; - rcb.top = outUL[Y]; - rcb.right = outLR[X]; - rcb.bottom = outLR[Y]; + rcb.left = round(outUL[X]); // use explicit round for better stability + rcb.top = round(outUL[Y]); + rcb.right = round(outLR[X]); + rcb.bottom = round(outLR[Y]); sp_color_get_rgb_floatv(&tg->vector.stops[istop].color, rgb); opa = tg->vector.stops[istop].opacity; c2 = U_RGBA(255 * rgb[0], 255 * rgb[1], 255 * rgb[2], 255 * opa); @@ -1157,7 +1164,6 @@ unsigned int PrintEmf::fill( c1 = c2; // for next stop ug4.UpperLeft = 0; ug4.LowerRight= 1; - /* NEED to push world transform here for rotations */ rec = U_EMRGRADIENTFILL_set(rcb, 2, 1, gMode, ut, (uint32_t *) &ug4 ); if (!rec || emf_append((PU_ENHMETARECORD)rec, et, U_REC_FREE)) { g_error("Fatal programming error in PrintEmf::fill at U_EMRGRADIENTFILL_set"); diff --git a/src/extension/internal/emf-print.h b/src/extension/internal/emf-print.h index 8fc9908e3..1e4970a46 100644 --- a/src/extension/internal/emf-print.h +++ b/src/extension/internal/emf-print.h @@ -1,8 +1,9 @@ /** @file * @brief Enhanced Metafile printing - implementation */ -/* Author: +/* Authors: * Ulf Erikson + * David Mathog * * Copyright (C) 2006-2008 Authors * diff --git a/src/extension/internal/text_reassemble.c b/src/extension/internal/text_reassemble.c index cd84910fc..e28e5effb 100644 --- a/src/extension/internal/text_reassemble.c +++ b/src/extension/internal/text_reassemble.c @@ -67,11 +67,11 @@ Optional compiler switches for development: File: text_reassemble.c -Version: 0.0.10 -Date: 06-MAY-2013 +Version: 0.0.12 +Date: 07-FEB-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -665,7 +665,7 @@ FT_INFO *ftinfo_clear(FT_INFO *fti){ free(fsp->file); /* release memory holding copies of paths */ free(fsp->fontspec); /* release memory holding copies of font names */ FcPatternDestroy(fsp->fpat); /* release memory for FontConfig fpats */ - FcFontSetDestroy(fti->fonts[i].fontset); + FcFontSetDestroy(fsp->fontset); if(fsp->alts){ free(fsp->alts); } } free(fti->fonts); @@ -726,9 +726,10 @@ int ftinfo_find_loaded_by_src(const FT_INFO *fti, const uint8_t *filename){ */ int ftinfo_load_fontname(FT_INFO *fti, const char *fontspec){ - FcPattern *pattern, *fpat; - FcFontSet *fontset; - FcResult result = FcResultMatch; + FcPattern *pattern = NULL; + FcPattern *fpat = NULL; + FcFontSet *fontset = NULL; + FcResult result = FcResultMatch; char *filename; double fd; FNT_SPECS *fsp; @@ -738,38 +739,45 @@ int ftinfo_load_fontname(FT_INFO *fti, const char *fontspec){ if(!fti)return(-1); /* If it is already loaded, do not load it again */ - if((status = ftinfo_find_loaded_by_spec(fti, (uint8_t *) fontspec))>=0){ - return(status); - } + status = ftinfo_find_loaded_by_spec(fti, (uint8_t *) fontspec); + if(status >= 0){ return(status); } + status = 0; /* was -1, reset to 0 */ ftinfo_make_insertable(fti); fi_idx = fti->used; - if(!(pattern = FcNameParse((const FcChar8 *)fontspec)) )return(2); - if(!FcConfigSubstitute(NULL, pattern, FcMatchPattern) )return(3); - FcDefaultSubstitute(pattern); - /* get a fontset, trimmed to only those with new glyphs as needed, so that missing glyph's may be handled */ - if(!(fontset = FcFontSort (NULL,pattern, FcTrue, NULL, &result)) - || result != FcResultMatch)return(4); - if(!(fpat = FcFontRenderPrepare(NULL, pattern, fontset->fonts[0])) )return(405); - if(FcPatternGetString( fpat, FC_FILE, 0, (FcChar8 **)&filename) != FcResultMatch)return(5); - if(FcPatternGetDouble( fpat, FC_SIZE, 0, &fd) != FcResultMatch)return(6); - - /* copy these into memory for external use */ - fsp = &(fti->fonts[fti->used]); - fsp->fontset = fontset; - fsp->alts = NULL; /* Initially no links to alternate fonts */ - fsp->space = 0; - fsp->file = (uint8_t *) U_strdup((char *) filename); - fsp->fontspec = (uint8_t *) U_strdup((char *) fontspec); - fsp->fpat = fpat; - fsp->fsize = fd; - + pattern = FcNameParse((const FcChar8 *)fontspec); + while(1) { /* this is NOT a loop, it uses breaks to avoid gotos and deep nesting */ + if(!(pattern)){ status = -2; break; } + if(!FcConfigSubstitute(NULL, pattern, FcMatchPattern)){ status = -3; break; }; + FcDefaultSubstitute(pattern); + /* get a fontset, trimmed to only those with new glyphs as needed, so that missing glyph's may be handled */ + if(!(fontset = FcFontSort (NULL,pattern, FcTrue, NULL, &result)) || (result != FcResultMatch)){ status = -4; break; } + if(!(fpat = FcFontRenderPrepare(NULL, pattern, fontset->fonts[0]))){ status = -405; break; } + if(FcPatternGetString( fpat, FC_FILE, 0, (FcChar8 **)&filename) != FcResultMatch){ status = -5; break; } + if(FcPatternGetDouble( fpat, FC_SIZE, 0, &fd) != FcResultMatch){ status = -6; break; } + + /* copy these into memory for external use */ + fsp = &(fti->fonts[fti->used]); + fsp->fontset = fontset; + fsp->alts = NULL; /* Initially no links to alternate fonts */ + fsp->space = 0; + fsp->file = (uint8_t *) U_strdup((char *) filename); + fsp->fontspec = (uint8_t *) U_strdup((char *) fontspec); + fsp->fpat = fpat; + fsp->fsize = fd; + break; + } /* release FC's own memory related to this call that does not need to be kept around so that face will work */ - FcPatternDestroy(pattern); + if(pattern)FcPatternDestroy(pattern); /* done with this memory */ + if(status<0){ + if(fontset)FcFontSetDestroy(fontset); + if(fpat)FcPatternDestroy(fpat); + return(status); + } /* get the current face */ - if(FT_New_Face( fti->library, (const char *) fsp->file, 0, &(fsp->face) )){ return(8); } + if(FT_New_Face( fti->library, (const char *) fsp->file, 0, &(fsp->face) )){ return(-8); } if(FT_Set_Char_Size( fsp->face, /* handle to face object */ @@ -777,12 +785,12 @@ int ftinfo_load_fontname(FT_INFO *fti, const char *fontspec){ fd*64, /* char_height in 1/64th of points */ 72, /* horizontal device resolution, DPI */ 72) /* vebrical device resolution, DPI */ - ){ return(9); } + ){ return(-9); } /* The space advance is needed in various places. Get it now, and get it in the font units, so that it can be scaled later with the text size */ status = TR_getadvance(fti, fsp,' ',0,FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP, FT_KERNING_UNSCALED, NULL, NULL); - if(status < 0)return(7); + if(status < 0)return(-7); fsp->spcadv = ((double) status)/(64.0); fti->used++; @@ -1380,7 +1388,7 @@ printf("Overlap rprect (LL,UR) dst:(%lf,%lf),(%lf,%lf) src:(%lf,%lf),(%lf,%lf)\n } /** - \brief Check for a text element upstream from the start element and in the reversed direction. + \brief Check for various sorts of invalid text elements upstream (language dir changes, draw order backwards from language direction) \returns 0 on success (not upstream), 1 if upstream, anything else is an error. \param bri pointer to the BR_INFO structure \param dst index of the destination bounding rectangle. @@ -1405,6 +1413,12 @@ int brinfo_upstream(BR_INFO *bri, int dst, int src, int ddir, int sdir){ else if( ddir == LDIR_LR && sdir == LDIR_RL){ if((br_src->xll + br_src->xur)/2.0 <= br_dst->xll ){ status = 1; } } + else if( ddir == LDIR_RL && sdir == LDIR_RL){ + if(br_dst->xur <= (br_src->xll + br_src->xur)/2.0){ status = 1; } + } + else if( ddir == LDIR_LR && sdir == LDIR_LR){ + if((br_src->xll + br_src->xur)/2.0 <= br_dst->xll ){ status = 1; } + } return(status); } @@ -1490,13 +1504,19 @@ TR_INFO *trinfo_init(TR_INFO *tri){ !(tri->bri = brinfo_init()) || !(tri->cxi = cxinfo_init()) ){ tri = trinfo_release(tri); } + tri->out = NULL; /* This will allocate as needed, it might not ever be needed. */ + tri->qe = 0.0; + tri->esc = 0.0; + tri->x = DBL_MAX; + tri->y = DBL_MAX; + tri->dirty = 0; tri->use_kern = 1; - tri->usebk = BKCLR_NONE; tri->load_flags = FT_LOAD_NO_SCALE; tri->kern_mode = FT_KERNING_UNSCALED; - tri->out = NULL; /* This will allocate as needed, it might not ever be needed. */ tri->outspace = 0; tri->outused = 0; + tri->usebk = BKCLR_NONE; + memset(&(tri->bkcolor),0,sizeof(TRCOLORREF)); return(tri); } @@ -1552,9 +1572,6 @@ TR_INFO *trinfo_release_except_FC(TR_INFO *tri){ */ TR_INFO *trinfo_clear(TR_INFO *tri){ if(tri){ - tri->dirty = 0; /* set these back to their defaults */ - tri->esc = 0.0; - /* Do NOT modify use_kern, usebk, load_flags, or kern_mode */ if(tri->bri)tri->bri=brinfo_release(tri->bri); if(tri->tpi)tri->tpi=tpinfo_release(tri->tpi); @@ -1565,6 +1582,11 @@ TR_INFO *trinfo_clear(TR_INFO *tri){ tri->outused = 0; tri->outspace = 0; }; + /* Do NOT modify: qe, use_kern, usebk, load_flags, kern_mode, or bkcolor. Set the rest back to their defaults */ + tri->esc = 0.0; + tri->x = DBL_MAX; + tri->y = DBL_MAX; + tri->dirty = 0; if(!(tri->tpi = tpinfo_init()) || /* re-init the pieces just released */ !(tri->bri = brinfo_init()) || !(tri->cxi = cxinfo_init()) @@ -1958,7 +1980,7 @@ void TR_layout_2_svg(TR_INFO *tri){ cutat=strcspn((char *)fti->fonts[tsp->fi_idx].fontspec,":"); sprintf(obuf,"font-family:%.*s;",cutat,fti->fonts[tsp->fi_idx].fontspec); TRPRINT(tri, obuf); - sprintf(obuf,"\n\">%s\n",tsp->string); + sprintf(obuf,"\n\">%s\n",&tsp->string[tsp->spaces]); TRPRINT(tri, obuf); #endif /* DBG_TR_INPUT debugging code, original text objects */ } @@ -2278,7 +2300,10 @@ int TR_layout_analyze(TR_INFO *tri){ next logical piece of text is "upstream" positionally of its logical predecessor. The meaning of such a construct is at best ambiguous. The test is only applied with respect to the first text chunk. This sort of construct may appear when a valid initial construct like [1->English][2<-Hebrew][3->English] is edited - and the leading chunk of text removed. + and the leading chunk of text removed. + + Also reject reversed order text as in (English) (draw order) arranged as . This happens + if the language direction field is incorrect, perhaps due to a corrupt or malformed input file. */ if(brinfo_upstream(bri, dst_rt, /* index into bri for dst */ @@ -2422,10 +2447,28 @@ int TR_layout_analyze(TR_INFO *tri){ } } - /* if x or y kern is less than the quantization error it is probably noise, set it to zero */ - if(fabs(tspj->xkern)qe)tspj->xkern = 0.0; - if(fabs(tspj->ykern)qe)tspj->ykern = 0.0; - + /* if x or y kern is less than twice the quantization error it is probably noise, set it to zero */ + if(fabs(tspj->xkern) <= 2.0*tri->qe)tspj->xkern = 0.0; + if(fabs(tspj->ykern) <= 2.0*tri->qe)tspj->ykern = 0.0; + + /* reintroduce spaces on the leading edge of text "j" if the kerning can be in part or in whole replaced + with 1 or 2 spaces */ + if(tspj->ykern == 0.0){ + double spaces = tspj->xkern/spcadv; /* negative on RL language, positive on LR */ + if((ldir == LDIR_RL && (spaces <= -0.9 && spaces >= -2.1)) || + (ldir == LDIR_LR && (spaces >= 0.9 && spaces <= 2.1)) ){ + int ispaces = lround(spaces); + tspj->xkern -= ((double)ispaces*spcadv); + if(ispaces<0)ispaces=-ispaces; + size_t slen = strlen((char *)tspj->string); + uint8_t *newstring = malloc(1 + ispaces + slen); + sprintf((char *)newstring," "); /* start with two spaces, possibly overwrite one in the next line */ + memcpy(newstring+ispaces,tspj->string,slen+1); /* copy existing string to proper position */ + free(tspj->string); + tspj->string = newstring; + tspj->spaces = ispaces; // only needed to fix optional debugging SVG output later + } + } tspi = tspj; lastldir = ldir; @@ -2699,7 +2742,7 @@ int main(int argc, char *argv[]){ tsp.weight = 80; tsp.condensed = 100; tsp.decoration = 0; /* none */ - tsp.co = 0; + tsp.spaces = 0; /* none */ tsp.fi_idx = -1; /* set to an invalid */ tsp.rt_tidx = -1; /* set to an invalid */ tsp.xkern = tsp.ykern = 0.0; diff --git a/src/extension/internal/text_reassemble.h b/src/extension/internal/text_reassemble.h index d85b233be..6c1acafe5 100644 --- a/src/extension/internal/text_reassemble.h +++ b/src/extension/internal/text_reassemble.h @@ -4,11 +4,11 @@ See text_reassemble.c for notes File: text_reassemble.h -Version: 0.0.12 -Date: 14-MAY-2013 +Version: 0.0.13 +Date: 06-FEB-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifndef _TEXT_REASSEMBLE_ @@ -189,6 +189,7 @@ typedef struct { int weight; /**< weight, as in FontConfig */ int condensed; /**< condensed, as in FontConfig */ int decoration; /**< text decorations, ignored during assembly, used during output */ + int spaces; /**< count of spaces converted from wide kerning (1 or 2) */ TRCOLORREF decColor; /**< text decoration color, ignored during assembly, used during output */ int co; /**< condensed override, if set Font name included narrow */ int rt_tidx; /**< index of rectangle that contains it */ diff --git a/src/extension/internal/wmf-inout.cpp b/src/extension/internal/wmf-inout.cpp index a72c16a88..fc54350df 100644 --- a/src/extension/internal/wmf-inout.cpp +++ b/src/extension/internal/wmf-inout.cpp @@ -4,6 +4,7 @@ /* Authors: * Ulf Erikson * Jon A. Cruz + * David Mathog * Abhishek Sharma * * Copyright (C) 2006-2008 Authors @@ -1079,6 +1080,28 @@ Wmf::select_brush(PWMF_CALLBACK_DATA d, int index) g_message("Please send WMF file to developers - select_brush U_WMR_DIBCREATEPATTERNBRUSH not bm16 or dib, not handled"); } } + else if(iType == U_WMR_CREATEPATTERNBRUSH){ + uint32_t tidx; + int cbPx; + U_BITMAP16 Bm16h; + const char *px; + if(U_WMRCREATEPATTERNBRUSH_get(record, &Bm16h, &cbPx, &px)){ + tidx = add_bm16_image(d, Bm16h, px); + if(tidx == 0xFFFFFFFF){ // Problem with the image, for instance, an unsupported bitmap16 type + double r, g, b; + r = SP_COLOR_U_TO_F( U_RGBAGetR(d->dc[d->level].textColor)); + g = SP_COLOR_U_TO_F( U_RGBAGetG(d->dc[d->level].textColor)); + b = SP_COLOR_U_TO_F( U_RGBAGetB(d->dc[d->level].textColor)); + d->dc[d->level].style.fill.value.color.set( r, g, b ); + d->dc[d->level].fill_mode = DRAW_PAINT; + } + else { + d->dc[d->level].fill_idx = tidx; + d->dc[d->level].fill_mode = DRAW_IMAGE; + } + d->dc[d->level].fill_set = true; + } + } } @@ -1488,6 +1511,7 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK tsp.vadvance = 0.0; /* meaningful only when a complex contains two or more lines */ tsp.taln = ALILEFT + ALIBASE; tsp.ldir = LDIR_LR; + tsp.spaces = 0; // this field is only used for debugging tsp.color.Red = 0; /* RGB Black */ tsp.color.Green = 0; /* RGB Black */ tsp.color.Blue = 0; /* RGB Black */ @@ -1498,6 +1522,7 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK tsp.condensed = 100; tsp.co = 0; tsp.fi_idx = -1; /* set to an invalid */ + tsp.rt_tidx = -1; /* set to an invalid */ SVGOStringStream dbg_str; @@ -1568,7 +1593,10 @@ int Wmf::myMetaFileProc(const char *contents, unsigned int length, PWMF_CALLBACK d->dc[d->level].sizeView.x = d->dc[d->level].sizeWnd.x = 0; d->dc[d->level].sizeView.y = d->dc[d->level].sizeWnd.y = 0; - // Upper left corner in device units, usually both 0, but not always + /* Upper left corner in device units, usually both 0, but not always. + If a placeable header is used, and later a windoworg/windowext are found, then + the placeable information will be ignored. + */ d->ulCornerInX = Placeable.Dst.left; d->ulCornerInY = Placeable.Dst.top; @@ -1805,6 +1833,8 @@ std::cout << "BEFORE DRAW" { dbg_str << "\n"; nSize = U_WMRSETWINDOWORG_get(contents, &d->dc[d->level].winorg); + d->ulCornerOutX = 0.0; // In the examples seen to date if this record is used with a placeable header, that header is ignored + d->ulCornerOutY = 0.0; break; } case U_WMR_SETWINDOWEXT: @@ -2322,12 +2352,12 @@ std::cout << "BEFORE DRAW" break; case U_WMR_CREATEBRUSHINDIRECT: case U_WMR_DIBCREATEPATTERNBRUSH: + case U_WMR_CREATEPATTERNBRUSH: // <- this one did not display properly on XP, DIBCREATEPATTERNBRUSH works select_brush(d, index); break; case U_WMR_CREATEFONTINDIRECT: select_font(d, index); break; - case U_WMR_CREATEPATTERNBRUSH: // <- this one did not display properly on XP, DIBCREATEPATTERNBRUSH works case U_WMR_CREATEPALETTE: case U_WMR_CREATEBITMAPINDIRECT: case U_WMR_CREATEBITMAP: @@ -2376,6 +2406,7 @@ std::cout << "BEFORE DRAW" if(iType == U_WMR_TEXTOUT){ dbg_str << "\n"; nSize = U_WMRTEXTOUT_get(contents, &Dst, &tlen, &text); + Opts=0; } else { dbg_str << "\n"; @@ -3053,7 +3084,14 @@ Wmf::open( Inkscape::Extension::Input * /*mod*/, const gchar *uri ) // Scale and translate objects double scale = Inkscape::Util::Quantity::convert(1, "px", doc_unit); ShapeEditor::blockSetItem(true); - doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, doc->getHeight().value("px"))); + double dh; + if(SP_ACTIVE_DOCUMENT){ // for file menu open or import, or paste from clipboard + dh = SP_ACTIVE_DOCUMENT->getHeight().value("px"); + } + else { // for open via --file on command line + dh = doc->getHeight().value("px"); + } + doc->getRoot()->scaleChildItemsRec(Geom::Scale(scale), Geom::Point(0, dh)); ShapeEditor::blockSetItem(false); Inkscape::DocumentUndo::setUndoSensitive(doc, saved); diff --git a/src/libuemf/README b/src/libuemf/README index 4c23cdd52..cfa322178 100644 --- a/src/libuemf/README +++ b/src/libuemf/README @@ -366,6 +366,12 @@ 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.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) + Added error handling to uemf_utf.c for cases where src is a null pointer. + Added a test of createpatternbrush to testlib_wmf + 0.1.10 2014-01-14 Slight changes in documentation for uemf.h. Fixed typo in uemf_endian.c. diff --git a/src/libuemf/uemf_utf.c b/src/libuemf/uemf_utf.c index f329e74d9..bce60af4d 100644 --- a/src/libuemf/uemf_utf.c +++ b/src/libuemf/uemf_utf.c @@ -12,11 +12,11 @@ /* File: uemf_utf.c -Version: 0.0.4 -Date: 19-MAR-2013 +Version: 0.0.5 +Date: 29-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -68,9 +68,14 @@ These functions are used for development and debugging and should be be includie void wchar8show( const char *src ){ - printf("char show\n"); - size_t srclen = 0; - while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + if(!src){ + printf("char show \n"); + } + else { + printf("char show\n"); + size_t srclen = 0; + while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + } } /** @@ -80,9 +85,14 @@ void wchar8show( void wchar16show( const uint16_t *src ){ - printf("uint16_t show\n"); - size_t srclen = 0; - while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + if(!src){ + printf("uint16_t show \n"); + } + else { + printf("uint16_t show\n"); + size_t srclen = 0; + while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + } } /** @@ -91,9 +101,14 @@ void wchar16show( void wchar32show( const uint32_t *src ){ - printf("uint32_t show\n"); - size_t srclen = 0; - while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + if(!src){ + printf("uint32_t show \n"); + } + else { + printf("uint32_t show\n"); + size_t srclen = 0; + while(*src){ printf("%d %d %x\n",(int) srclen,*src,*src); srclen++; src++; } + } } /** @@ -104,13 +119,19 @@ void wchartshow( const wchar_t *src ){ uint32_t val; - printf("wchar_t show\n"); - size_t srclen = 0; - while(*src){ - val = *src; // because *src is wchar_t is not strictly an integer type, can cause warnings on next line - printf("%d %d %x\n",(int) srclen,val,val); - srclen++; - src++; + if(!src){ + printf("wchar_t show \n"); + } + else { + printf("wchar_t show\n"); + size_t srclen = 0; + if(!src)return; + while(*src){ + val = *src; // because *src is wchar_t is not strictly an integer type, can cause warnings on next line + printf("%d %d %x\n",(int) srclen,val,val); + srclen++; + src++; + } } } @@ -127,7 +148,9 @@ size_t wchar16len( const uint16_t *src ){ size_t srclen = 0; - while(*src){ srclen++; src++; } + if(src){ + while(*src){ srclen++; src++; } + } return(srclen); } @@ -139,7 +162,9 @@ size_t wchar32len( const uint32_t *src ){ size_t srclen = 0; - while(*src){ srclen++; src++; } + if(src){ + while(*src){ srclen++; src++; } + } return(srclen); } @@ -154,9 +179,11 @@ void wchar16strncpy( const uint16_t *src, size_t nchars ){ - for(;nchars;nchars--,dst++,src++){ - *dst = *src; - if(!*src)break; + if(src){ + for(;nchars;nchars--,dst++,src++){ + *dst = *src; + if(!*src)break; + } } } @@ -172,8 +199,10 @@ void wchar16strncpypad( const uint16_t *src, size_t nchars ){ - for(;*src && nchars;nchars--,dst++,src++){ *dst = *src; } - for(;nchars;nchars--,dst++){ *dst = 0; } // Pad the remainder + if(src){ + for(;*src && nchars;nchars--,dst++,src++){ *dst = *src; } + for(;nchars;nchars--,dst++){ *dst = 0; } // Pad the remainder + } } /* For the following converstion functions, remember that iconv() modifies ALL of its parameters, @@ -197,6 +226,7 @@ uint16_t *U_Utf32leToUtf16le( char *dst,*dst2; size_t srclen,dstlen,status; + if(!src)return(NULL); if(max){ srclen = 4*max; } else { srclen = 4 + 4*wchar32len(src); } //include terminator, length in BYTES @@ -226,6 +256,8 @@ uint32_t *U_Utf16leToUtf32le( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 2*max; } else { srclen = 2*wchar16len(src)+2; } // include terminator, length in BYTES dstlen = 2*(2 + srclen); // This should always work @@ -261,6 +293,8 @@ uint32_t *U_Latin1ToUtf32le( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = max; } else { srclen = strlen(src)+1; } // include terminator, length in BYTES dstlen = sizeof(uint32_t)*(1 + srclen); // This should always work but might waste some space @@ -290,6 +324,8 @@ uint32_t *U_Utf8ToUtf32le( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = max; } else { srclen = strlen(src)+1; } // include terminator, length in BYTES dstlen = sizeof(uint32_t)*(1 + srclen); // This should always work but might waste some space @@ -319,6 +355,8 @@ char *U_Utf32leToUtf8( char *dst,*dst2; char *src2 = (char *) src; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 4*max; } else { srclen = 4*(1 + wchar32len(src)); } //include terminator, length in BYTES dstlen = 1 + srclen; // This should always work but might waste some space @@ -349,6 +387,7 @@ uint16_t *U_Utf8ToUtf16le( size_t srclen,dstlen,status; iconv_t conv; + if(!src)return(NULL); if(max){ srclen = max; } else { srclen = strlen(src)+1; } // include terminator, length in BYTES dstlen = 2 * (1 + srclen); // this will always work, but may waste space @@ -378,6 +417,8 @@ char *U_Utf16leToUtf8( char *dst, *dst2; char *ret=NULL; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 2*max; } else { srclen = 2*(1 +wchar16len(src)); } //include terminator, length in BYTES dstlen = 1 + 2*srclen; // this will always work, but may waste space @@ -410,6 +451,8 @@ char *U_Utf16leToLatin1( char *dst, *dst2; char *ret=NULL; size_t srclen,dstlen,status; + + if(!src)return(NULL); if(max){ srclen = 2*max; } else { srclen = 2*(1 +wchar16len(src)); } //include terminator, length in BYTES dstlen = 1 + srclen; // this will always work as latin1 is always 1 byte/character diff --git a/src/libuemf/uwmf.c b/src/libuemf/uwmf.c index a6ac963cb..be1feadea 100644 --- a/src/libuemf/uwmf.c +++ b/src/libuemf/uwmf.c @@ -19,11 +19,11 @@ /* File: uwmf.c -Version: 0.0.12 -Date: 25-NOV-2013 +Version: 0.0.13 +Date: 30-JAN-2014 Author: David Mathog, Biology Division, Caltech email: mathog@caltech.edu -Copyright: 2013 David Mathog and California Institute of Technology (Caltech) +Copyright: 2014 David Mathog and California Institute of Technology (Caltech) */ #ifdef __cplusplus @@ -4271,13 +4271,12 @@ char *U_WMRCREATEPATTERNBRUSH_set( if(!Bm16 || !Pattern)return(NULL); cbPat = (((Bm16->Width * Bm16->BitsPixel + 15) >> 4) << 1) * Bm16->Height; - irecsize = U_SIZE_METARECORD + 14 + 4 + 18 + cbPat; /* core WMR + truncated Bm16 + pattern */ + irecsize = U_SIZE_METARECORD + 14 + 18 + cbPat; /* core WMR + truncated Bm16 + 18 spaces bytes + pattern */ record = malloc(irecsize); if(record){ U_WMRCORE_SETRECHEAD(record,irecsize,U_WMR_CREATEPATTERNBRUSH); off = U_SIZE_METARECORD; - memcpy(record + off, Bm16, 14); off+=14; /* Truncated bitmap16 object*/ - memset(record + off, 0, 4); off+=4; /* 4 bytes of its "bits", which are ignored */ + memcpy(record + off, Bm16, 14); off+=14; /* Truncated bitmap16 object, last 4 bytes are to be ignored*/ memset(record + off, 0, 18); off+=18; /* 18 bytes of zero, which are ignored */ memcpy(record + off, Pattern, cbPat); /* The pattern array */ } @@ -5359,7 +5358,7 @@ int U_WMRTEXTOUT_get( ){ int16_t L2; int off; - int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRPATBLT)); + int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRTEXTOUT)); if(!size)return(0); *Length = *(int16_t *)(contents + offsetof(U_WMRTEXTOUT, Length)); *string = contents + offsetof(U_WMRTEXTOUT, String); /* May not be null terminated!!! */ @@ -6851,12 +6850,15 @@ int U_WMRCREATEPATTERNBRUSH_get( const char **Pattern ){ int off = U_SIZE_METARECORD; - int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_WMRSETDIBTODEV)); + /* size in next one is + 6 (core header) + 14 (truncated bitmap16) + 18 bytes reserved + 2 bytes (at least) for data */ + int size = U_WMRCORE_RECSAFE_get(contents, (U_SIZE_METARECORD + 14 + 18 + 2)); if(!size)return(0); memset(Bm16, 0, U_SIZE_BITMAP16); - memcpy(Bm16, contents + off, 14); /* BM16 is truncated in this record type */ + /* BM16 is truncated in this record type to 14 bytes, last 4 bytes must be ignored, so they are not even copied */ + memcpy(Bm16, contents + off, 10); *pasize = (((Bm16->Width * Bm16->BitsPixel + 15) >> 4) << 1) * Bm16->Height; - off += 36; /* skip [truncated bitmap16 object and 18 bytes of reserved */ + off += 32; /* skip [14 bytes of truncated bitmap16 object and 18 bytes of reserved */ *Pattern = (contents + off); return(size); } -- cgit v1.2.3 From d4ba8eaa4a621ac60d99a4aad7531d080cece2cd Mon Sep 17 00:00:00 2001 From: David Mathog Date: Sat, 8 Feb 2014 09:44:12 +0100 Subject: DrawingContext: change variable names ct to dc (bug #1272073) Fixed bugs: - https://launchpad.net/bugs/1272073 (bzr r13009) --- src/display/canvas-arena.cpp | 8 +-- src/display/drawing-context.cpp | 22 +++---- src/display/drawing-context.h | 6 +- src/display/drawing-group.cpp | 12 ++-- src/display/drawing-group.h | 4 +- src/display/drawing-image.cpp | 52 ++++++++-------- src/display/drawing-image.h | 2 +- src/display/drawing-item.cpp | 96 ++++++++++++++--------------- src/display/drawing-item.h | 10 ++-- src/display/drawing-shape.cpp | 54 ++++++++--------- src/display/drawing-shape.h | 4 +- src/display/drawing-surface.cpp | 24 ++++---- src/display/drawing-surface.h | 2 +- src/display/drawing-text.cpp | 120 ++++++++++++++++++------------------- src/display/drawing-text.h | 8 +-- src/display/drawing.cpp | 16 ++--- src/display/drawing.h | 2 +- src/display/nr-filter-image.cpp | 12 ++-- src/display/nr-filter-slot.cpp | 6 +- src/display/nr-filter-slot.h | 2 +- src/display/nr-filter.cpp | 4 +- src/display/nr-filter.h | 4 +- src/display/nr-style.cpp | 32 +++++----- src/display/nr-style.h | 8 +-- src/helper/pixbuf-ops.cpp | 4 +- src/helper/png-write.cpp | 12 ++-- src/sp-mesh-array.cpp | 4 +- src/sp-pattern.cpp | 12 ++-- src/ui/cache/svg_preview_cache.cpp | 4 +- src/ui/dialog/clonetiler.cpp | 4 +- src/ui/tools/flood-tool.cpp | 12 ++-- src/widgets/icon.cpp | 4 +- 32 files changed, 283 insertions(+), 283 deletions(-) diff --git a/src/display/canvas-arena.cpp b/src/display/canvas-arena.cpp index 8e25c1843..404a94828 100644 --- a/src/display/canvas-arena.cpp +++ b/src/display/canvas-arena.cpp @@ -216,10 +216,10 @@ sp_canvas_arena_render (SPCanvasItem *item, SPCanvasBuf *buf) Geom::OptIntRect r = buf->rect; if (!r || r->hasZeroArea()) return; - Inkscape::DrawingContext ct(buf->ct, r->min()); + Inkscape::DrawingContext dc(buf->ct, r->min()); arena->drawing.update(Geom::IntRect::infinite(), arena->ctx); - arena->drawing.render(ct, *r); + arena->drawing.render(dc, *r); } static double @@ -386,9 +386,9 @@ sp_canvas_arena_render_surface (SPCanvasArena *ca, cairo_surface_t *surface, Geo g_return_if_fail (ca != NULL); g_return_if_fail (SP_IS_CANVAS_ARENA (ca)); - Inkscape::DrawingContext ct(surface, r.min()); + Inkscape::DrawingContext dc(surface, r.min()); ca->drawing.update(Geom::IntRect::infinite(), ca->ctx); - ca->drawing.render(ct, r); + ca->drawing.render(dc, r); } /* diff --git a/src/display/drawing-context.cpp b/src/display/drawing-context.cpp index de5beb0f6..319136e06 100644 --- a/src/display/drawing-context.cpp +++ b/src/display/drawing-context.cpp @@ -25,27 +25,27 @@ using Geom::Y; */ DrawingContext::Save::Save() - : _ct(NULL) + : _dc(NULL) {} -DrawingContext::Save::Save(DrawingContext &ct) - : _ct(&ct) +DrawingContext::Save::Save(DrawingContext &dc) + : _dc(&dc) { - _ct->save(); + _dc->save(); } DrawingContext::Save::~Save() { - if (_ct) { - _ct->restore(); + if (_dc) { + _dc->restore(); } } -void DrawingContext::Save::save(DrawingContext &ct) +void DrawingContext::Save::save(DrawingContext &dc) { - if (_ct) { + if (_dc) { // TODO: it might be better to treat this occurence as a bug - _ct->restore(); + _dc->restore(); } - _ct = &ct; - _ct->save(); + _dc = &dc; + _dc->save(); } /** diff --git a/src/display/drawing-context.h b/src/display/drawing-context.h index 35be9a86b..d990bcb73 100644 --- a/src/display/drawing-context.h +++ b/src/display/drawing-context.h @@ -31,11 +31,11 @@ public: class Save { public: Save(); - Save(DrawingContext &ct); + Save(DrawingContext &dc); ~Save(); - void save(DrawingContext &ct); + void save(DrawingContext &dc); private: - DrawingContext *_ct; + DrawingContext *_dc; }; DrawingContext(cairo_t *ct, Geom::Point const &origin); diff --git a/src/display/drawing-group.cpp b/src/display/drawing-group.cpp index b5ce18891..38ace001f 100644 --- a/src/display/drawing-group.cpp +++ b/src/display/drawing-group.cpp @@ -98,12 +98,12 @@ DrawingGroup::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, u } unsigned -DrawingGroup::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) +DrawingGroup::_renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) { if (stop_at == NULL) { // normal rendering for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { - i->render(ct, area, flags, stop_at); + i->render(dc, area, flags, stop_at); } } else { // background rendering @@ -111,11 +111,11 @@ DrawingGroup::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne if (&*i == stop_at) return RENDER_OK; // do not render the stop_at item at all if (i->isAncestorOf(stop_at)) { // render its ancestors without masks, opacity or filters - i->render(ct, area, flags | RENDER_FILTER_BACKGROUND, stop_at); + i->render(dc, area, flags | RENDER_FILTER_BACKGROUND, stop_at); // stop further rendering return RENDER_OK; } else { - i->render(ct, area, flags, stop_at); + i->render(dc, area, flags, stop_at); } } } @@ -123,10 +123,10 @@ DrawingGroup::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne } void -DrawingGroup::_clipItem(DrawingContext &ct, Geom::IntRect const &area) +DrawingGroup::_clipItem(DrawingContext &dc, Geom::IntRect const &area) { for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { - i->clip(ct, area); + i->clip(dc, area); } } diff --git a/src/display/drawing-group.h b/src/display/drawing-group.h index 775fec8c4..651e9d8af 100644 --- a/src/display/drawing-group.h +++ b/src/display/drawing-group.h @@ -34,9 +34,9 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); - virtual void _clipItem(DrawingContext &ct, Geom::IntRect const &area); + virtual void _clipItem(DrawingContext &dc, Geom::IntRect const &area); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); virtual bool _canClip(); diff --git a/src/display/drawing-image.cpp b/src/display/drawing-image.cpp index 1b9214c49..8fd81caac 100644 --- a/src/display/drawing-image.cpp +++ b/src/display/drawing-image.cpp @@ -102,22 +102,22 @@ DrawingImage::_updateItem(Geom::IntRect const &, UpdateContext const &, unsigned return STATE_ALL; } -unsigned DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) +unsigned DrawingImage::_renderItem(DrawingContext &dc, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) { bool outline = _drawing.outline(); if (!outline) { if (!_pixbuf) return RENDER_OK; - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); - ct.newPath(); - ct.rectangle(_clipbox); - ct.clip(); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); + dc.newPath(); + dc.rectangle(_clipbox); + dc.clip(); - ct.translate(_origin); - ct.scale(_scale); - ct.setSource(_pixbuf->getSurfaceRaw(), 0, 0); + dc.translate(_origin); + dc.scale(_scale); + dc.setSource(_pixbuf->getSurfaceRaw(), 0, 0); if (_style) { // See: http://www.w3.org/TR/SVG/painting.html#ImageRenderingProperty @@ -128,24 +128,24 @@ unsigned DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &/*ar // Do nothing break; case SP_CSS_COLOR_RENDERING_OPTIMIZEQUALITY: - ct.patternSetFilter( CAIRO_FILTER_BEST ); + dc.patternSetFilter( CAIRO_FILTER_BEST ); break; case SP_CSS_COLOR_RENDERING_OPTIMIZESPEED: default: - ct.patternSetFilter( CAIRO_FILTER_NEAREST ); + dc.patternSetFilter( CAIRO_FILTER_NEAREST ); break; } } - ct.paint(_opacity); + dc.paint(_opacity); } else { // outline; draw a rect instead Inkscape::Preferences *prefs = Inkscape::Preferences::get(); guint32 rgba = prefs->getInt("/options/wireframecolors/images", 0xff0000ff); - { Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); - ct.newPath(); + { Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); + dc.newPath(); Geom::Rect r = bounds(); Geom::Point c00 = r.corner(0); @@ -153,21 +153,21 @@ unsigned DrawingImage::_renderItem(DrawingContext &ct, Geom::IntRect const &/*ar Geom::Point c11 = r.corner(2); Geom::Point c10 = r.corner(1); - ct.moveTo(c00); + dc.moveTo(c00); // the box - ct.lineTo(c10); - ct.lineTo(c11); - ct.lineTo(c01); - ct.lineTo(c00); + dc.lineTo(c10); + dc.lineTo(c11); + dc.lineTo(c01); + dc.lineTo(c00); // the diagonals - ct.lineTo(c11); - ct.moveTo(c10); - ct.lineTo(c01); + dc.lineTo(c11); + dc.moveTo(c10); + dc.lineTo(c01); } - ct.setLineWidth(0.5); - ct.setSource(rgba); - ct.stroke(); + dc.setLineWidth(0.5); + dc.setSource(rgba); + dc.stroke(); } return RENDER_OK; } diff --git a/src/display/drawing-image.h b/src/display/drawing-image.h index cebaafc85..64e4517b0 100644 --- a/src/display/drawing-image.h +++ b/src/display/drawing-image.h @@ -38,7 +38,7 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); diff --git a/src/display/drawing-item.cpp b/src/display/drawing-item.cpp index a9b07bb6e..13e7b61eb 100644 --- a/src/display/drawing-item.cpp +++ b/src/display/drawing-item.cpp @@ -24,60 +24,60 @@ namespace Inkscape { #ifdef WITH_CSSBLEND -void set_cairo_blend_operator( DrawingContext &ct, unsigned blend_mode ) { +void set_cairo_blend_operator( DrawingContext &dc, unsigned blend_mode ) { // All of the blend modes are implemented in Cairo as of 1.10. // For a detailed description, see: // http://cairographics.org/operators/ switch (blend_mode) { case SP_CSS_BLEND_MULTIPLY: - ct.setOperator(CAIRO_OPERATOR_MULTIPLY); + dc.setOperator(CAIRO_OPERATOR_MULTIPLY); break; case SP_CSS_BLEND_SCREEN: - ct.setOperator(CAIRO_OPERATOR_SCREEN); + dc.setOperator(CAIRO_OPERATOR_SCREEN); break; case SP_CSS_BLEND_DARKEN: - ct.setOperator(CAIRO_OPERATOR_DARKEN); + dc.setOperator(CAIRO_OPERATOR_DARKEN); break; case SP_CSS_BLEND_LIGHTEN: - ct.setOperator(CAIRO_OPERATOR_LIGHTEN); + dc.setOperator(CAIRO_OPERATOR_LIGHTEN); break; case SP_CSS_BLEND_OVERLAY: - ct.setOperator(CAIRO_OPERATOR_OVERLAY); + dc.setOperator(CAIRO_OPERATOR_OVERLAY); break; case SP_CSS_BLEND_COLORDODGE: - ct.setOperator(CAIRO_OPERATOR_COLOR_DODGE); + dc.setOperator(CAIRO_OPERATOR_COLOR_DODGE); break; case SP_CSS_BLEND_COLORBURN: - ct.setOperator(CAIRO_OPERATOR_COLOR_BURN); + dc.setOperator(CAIRO_OPERATOR_COLOR_BURN); break; case SP_CSS_BLEND_HARDLIGHT: - ct.setOperator(CAIRO_OPERATOR_HARD_LIGHT); + dc.setOperator(CAIRO_OPERATOR_HARD_LIGHT); break; case SP_CSS_BLEND_SOFTLIGHT: - ct.setOperator(CAIRO_OPERATOR_SOFT_LIGHT); + dc.setOperator(CAIRO_OPERATOR_SOFT_LIGHT); break; case SP_CSS_BLEND_DIFFERENCE: - ct.setOperator(CAIRO_OPERATOR_DIFFERENCE); + dc.setOperator(CAIRO_OPERATOR_DIFFERENCE); break; case SP_CSS_BLEND_EXCLUSION: - ct.setOperator(CAIRO_OPERATOR_EXCLUSION); + dc.setOperator(CAIRO_OPERATOR_EXCLUSION); break; case SP_CSS_BLEND_HUE: - ct.setOperator(CAIRO_OPERATOR_HSL_HUE); + dc.setOperator(CAIRO_OPERATOR_HSL_HUE); break; case SP_CSS_BLEND_SATURATION: - ct.setOperator(CAIRO_OPERATOR_HSL_SATURATION); + dc.setOperator(CAIRO_OPERATOR_HSL_SATURATION); break; case SP_CSS_BLEND_COLOR: - ct.setOperator(CAIRO_OPERATOR_HSL_COLOR); + dc.setOperator(CAIRO_OPERATOR_HSL_COLOR); break; case SP_CSS_BLEND_LUMINOSITY: - ct.setOperator(CAIRO_OPERATOR_HSL_LUMINOSITY); + dc.setOperator(CAIRO_OPERATOR_HSL_LUMINOSITY); break; case SP_CSS_BLEND_NORMAL: default: - ct.setOperator(CAIRO_OPERATOR_OVER); + dc.setOperator(CAIRO_OPERATOR_OVER); break; } } @@ -545,7 +545,7 @@ struct MaskLuminanceToAlpha { * @param flags Rendering options. This deals mainly with cache control. */ unsigned -DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) +DrawingItem::render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) { bool outline = _drawing.outline(); bool render_filters = _drawing.renderFilters(); @@ -560,7 +560,7 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag // TODO convert outline rendering to a separate virtual function if (outline) { - _renderOutline(ct, area, flags); + _renderOutline(dc, area, flags); return RENDER_OK; } @@ -573,9 +573,9 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag if (_cache) { _cache->prepare(); #ifdef WITH_CSSBLEND - set_cairo_blend_operator( ct, _blend_mode ); + set_cairo_blend_operator( dc, _blend_mode ); #endif - _cache->paintFromCache(ct, carea); + _cache->paintFromCache(dc, carea); if (!carea) return RENDER_OK; } else { // There is no cache. This could be because caching of this item @@ -625,7 +625,7 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag // filters and opacity do not apply when rendering the ancestors of the filtered // element if ((flags & RENDER_FILTER_BACKGROUND) || !needs_intermediate_rendering) { - return _renderItem(ct, *carea, flags & ~RENDER_FILTER_BACKGROUND, stop_at); + return _renderItem(dc, *carea, flags & ~RENDER_FILTER_BACKGROUND, stop_at); } // iarea is the bounding box for intermediate rendering @@ -688,9 +688,9 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag } if (bg_root) { DrawingSurface bg(*iarea); - DrawingContext bgct(bg); - bg_root->render(bgct, *iarea, flags | RENDER_FILTER_BACKGROUND, this); - _filter->render(this, ict, &bgct); + DrawingContext bgdc(bg); + bg_root->render(bgdc, *iarea, flags | RENDER_FILTER_BACKGROUND, this); + _filter->render(this, ict, &bgdc); rendered = true; } } @@ -716,20 +716,20 @@ DrawingItem::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flag cachect.fill(); _cache->markClean(*carea); } - ct.rectangle(*carea); - ct.setSource(&intermediate); + dc.rectangle(*carea); + dc.setSource(&intermediate); #ifdef WITH_CSSBLEND - set_cairo_blend_operator( ct, _blend_mode ); + set_cairo_blend_operator( dc, _blend_mode ); #endif - ct.fill(); - ct.setSource(0,0,0,0); - // the call above is to clear a ref on the intermediate surface held by ct + dc.fill(); + dc.setSource(0,0,0,0); + // the call above is to clear a ref on the intermediate surface held by dc return render_result; } void -DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsigned flags) +DrawingItem::_renderOutline(DrawingContext &dc, Geom::IntRect const &area, unsigned flags) { // intersect with bbox rather than drawbox, as we want to render things outside // of the clipping path as well @@ -738,7 +738,7 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig // just render everything: item, clip, mask // First, render the object itself - _renderItem(ct, *carea, flags, NULL); + _renderItem(dc, *carea, flags, NULL); // render clip and mask, if any guint32 saved_rgba = _drawing.outlinecolor; // save current outline color @@ -746,12 +746,12 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig Inkscape::Preferences *prefs = Inkscape::Preferences::get(); if (_clip) { _drawing.outlinecolor = prefs->getInt("/options/wireframecolors/clips", 0x00ff00ff); // green clips - _clip->render(ct, *carea, flags); + _clip->render(dc, *carea, flags); } // render mask as an object, using a different color if (_mask) { _drawing.outlinecolor = prefs->getInt("/options/wireframecolors/masks", 0x0000ffff); // blue masks - _mask->render(ct, *carea, flags); + _mask->render(dc, *carea, flags); } _drawing.outlinecolor = saved_rgba; // restore outline color } @@ -765,31 +765,31 @@ DrawingItem::_renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsig * of render() for details. */ void -DrawingItem::clip(Inkscape::DrawingContext &ct, Geom::IntRect const &area) +DrawingItem::clip(Inkscape::DrawingContext &dc, Geom::IntRect const &area) { // don't bother if the object does not implement clipping (e.g. DrawingImage) if (!_canClip()) return; if (!_visible) return; if (!area.intersects(_bbox)) return; - ct.setSource(0,0,0,1); - ct.pushGroup(); + dc.setSource(0,0,0,1); + dc.pushGroup(); // rasterize the clipping path - _clipItem(ct, area); + _clipItem(dc, area); if (_clip) { // The item used as the clipping path itself has a clipping path. // Render this item's clipping path onto a temporary surface, then composite it // with the item using the IN operator - ct.pushGroup(); - _clip->clip(ct, area); - ct.popGroupToSource(); - ct.setOperator(CAIRO_OPERATOR_IN); - ct.paint(); + dc.pushGroup(); + _clip->clip(dc, area); + dc.popGroupToSource(); + dc.setOperator(CAIRO_OPERATOR_IN); + dc.paint(); } - ct.popGroupToSource(); - ct.setOperator(CAIRO_OPERATOR_OVER); - ct.paint(); - ct.setSource(0,0,0,0); + dc.popGroupToSource(); + dc.setOperator(CAIRO_OPERATOR_OVER); + dc.paint(); + dc.setSource(0,0,0,0); } /** diff --git a/src/display/drawing-item.h b/src/display/drawing-item.h index 1796d29d6..913706021 100644 --- a/src/display/drawing-item.h +++ b/src/display/drawing-item.h @@ -123,8 +123,8 @@ public: void *data() const { return _user_data; } void update(Geom::IntRect const &area = Geom::IntRect::infinite(), UpdateContext const &ctx = UpdateContext(), unsigned flags = STATE_ALL, unsigned reset = 0); - unsigned render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags = 0, DrawingItem *stop_at = NULL); - void clip(DrawingContext &ct, Geom::IntRect const &area); + unsigned render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags = 0, DrawingItem *stop_at = NULL); + void clip(DrawingContext &dc, Geom::IntRect const &area); DrawingItem *pick(Geom::Point const &p, double delta, unsigned flags = 0); protected: @@ -141,7 +141,7 @@ protected: RENDER_OK = 0, RENDER_STOP = 1 }; - void _renderOutline(DrawingContext &ct, Geom::IntRect const &area, unsigned flags); + void _renderOutline(DrawingContext &dc, Geom::IntRect const &area, unsigned flags); void _markForUpdate(unsigned state, bool propagate); void _markForRendering(); void _invalidateFilterBackground(Geom::IntRect const &area); @@ -150,9 +150,9 @@ protected: Geom::OptIntRect _cacheRect(); virtual unsigned _updateItem(Geom::IntRect const &/*area*/, UpdateContext const &/*ctx*/, unsigned /*flags*/, unsigned /*reset*/) { return 0; } - virtual unsigned _renderItem(DrawingContext &/*ct*/, Geom::IntRect const &/*area*/, unsigned /*flags*/, + virtual unsigned _renderItem(DrawingContext &/*dc*/, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) { return RENDER_OK; } - virtual void _clipItem(DrawingContext &/*ct*/, Geom::IntRect const &/*area*/) {} + virtual void _clipItem(DrawingContext &/*dc*/, Geom::IntRect const &/*area*/) {} virtual DrawingItem *_pickItem(Geom::Point const &/*p*/, double /*delta*/, unsigned /*flags*/) { return NULL; } virtual bool _canClip() { return false; } diff --git a/src/display/drawing-shape.cpp b/src/display/drawing-shape.cpp index 03d7f51b5..f99f9442f 100644 --- a/src/display/drawing-shape.cpp +++ b/src/display/drawing-shape.cpp @@ -150,7 +150,7 @@ DrawingShape::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, u } unsigned -DrawingShape::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) +DrawingShape::_renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at) { if (!_curve || !_style) return RENDER_OK; if (!area.intersects(_bbox)) return RENDER_OK; // skip if not within bounding box @@ -160,67 +160,67 @@ DrawingShape::_renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigne if (outline) { guint32 rgba = _drawing.outlinecolor; - { Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); - ct.path(_curve->get_pathvector()); + { Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); + dc.path(_curve->get_pathvector()); } - { Inkscape::DrawingContext::Save save(ct); - ct.setSource(rgba); - ct.setLineWidth(0.5); - ct.setTolerance(0.5); - ct.stroke(); + { Inkscape::DrawingContext::Save save(dc); + dc.setSource(rgba); + dc.setLineWidth(0.5); + dc.setTolerance(0.5); + dc.stroke(); } } else { bool has_stroke, has_fill; // we assume the context has no path - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); // update fill and stroke paints. // this cannot be done during nr_arena_shape_update, because we need a Cairo context // to render svg:pattern - has_fill = _nrstyle.prepareFill(ct, _item_bbox); - has_stroke = _nrstyle.prepareStroke(ct, _item_bbox); + has_fill = _nrstyle.prepareFill(dc, _item_bbox); + has_stroke = _nrstyle.prepareStroke(dc, _item_bbox); has_stroke &= (_nrstyle.stroke_width != 0); if (has_fill || has_stroke) { // TODO: remove segments outside of bbox when no dashes present - ct.path(_curve->get_pathvector()); + dc.path(_curve->get_pathvector()); if (has_fill) { - _nrstyle.applyFill(ct); - ct.fillPreserve(); + _nrstyle.applyFill(dc); + dc.fillPreserve(); } if (has_stroke) { - _nrstyle.applyStroke(ct); - ct.strokePreserve(); + _nrstyle.applyStroke(dc); + dc.strokePreserve(); } - ct.newPath(); // clear path + dc.newPath(); // clear path } // has fill or stroke pattern } // marker rendering for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { - i->render(ct, area, flags, stop_at); + i->render(dc, area, flags, stop_at); } return RENDER_OK; } -void DrawingShape::_clipItem(DrawingContext &ct, Geom::IntRect const & /*area*/) +void DrawingShape::_clipItem(DrawingContext &dc, Geom::IntRect const & /*area*/) { if (!_curve) return; - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); // handle clip-rule if (_style) { if (_style->clip_rule.computed == SP_WIND_RULE_EVENODD) { - ct.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); + dc.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); } else { - ct.setFillRule(CAIRO_FILL_RULE_WINDING); + dc.setFillRule(CAIRO_FILL_RULE_WINDING); } } - ct.transform(_ctm); - ct.path(_curve->get_pathvector()); - ct.fill(); + dc.transform(_ctm); + dc.path(_curve->get_pathvector()); + dc.fill(); } DrawingItem * diff --git a/src/display/drawing-shape.h b/src/display/drawing-shape.h index 52496d86e..47b9e807e 100644 --- a/src/display/drawing-shape.h +++ b/src/display/drawing-shape.h @@ -33,9 +33,9 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); - virtual void _clipItem(DrawingContext &ct, Geom::IntRect const &area); + virtual void _clipItem(DrawingContext &dc, Geom::IntRect const &area); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); virtual bool _canClip(); diff --git a/src/display/drawing-surface.cpp b/src/display/drawing-surface.cpp index bddccbd96..94e0e1ab5 100644 --- a/src/display/drawing-surface.cpp +++ b/src/display/drawing-surface.cpp @@ -267,7 +267,7 @@ DrawingCache::prepare() * parameter to the bounds of the region that must be repainted. */ void -DrawingCache::paintFromCache(DrawingContext &ct, Geom::OptIntRect &area) +DrawingCache::paintFromCache(DrawingContext &dc, Geom::OptIntRect &area) { if (!area) return; @@ -296,10 +296,10 @@ DrawingCache::paintFromCache(DrawingContext &ct, Geom::OptIntRect &area) cairo_rectangle_int_t tmp; for (int i = 0; i < nr; ++i) { cairo_region_get_rectangle(cache_region, i, &tmp); - ct.rectangle(_convertRect(tmp)); + dc.rectangle(_convertRect(tmp)); } - ct.setSource(this); - ct.fill(); + dc.setSource(this); + dc.fill(); } cairo_region_destroy(cache_region); } @@ -310,21 +310,21 @@ DrawingCache::_dumpCache(Geom::OptIntRect const &area) { static int dumpnr = 0; cairo_surface_t *surface = ink_cairo_surface_copy(_surface); - DrawingContext ct(surface, _origin); + DrawingContext dc(surface, _origin); if (!cairo_region_is_empty(_clean_region)) { - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); int nr = cairo_region_num_rectangles(_clean_region); cairo_rectangle_int_t tmp; for (int i = 0; i < nr; ++i) { cairo_region_get_rectangle(_clean_region, i, &tmp); - ct.rectangle(_convertRect(tmp)); + dc.rectangle(_convertRect(tmp)); } - ct.setSource(0,1,0,0.1); - ct.fill(); + dc.setSource(0,1,0,0.1); + dc.fill(); } - ct.rectangle(*area); - ct.setSource(1,0,0,0.1); - ct.fill(); + dc.rectangle(*area); + dc.setSource(1,0,0,0.1); + dc.fill(); char *fn = g_strdup_printf("dump%d.png", dumpnr++); cairo_surface_write_to_png(surface, fn); cairo_surface_destroy(surface); diff --git a/src/display/drawing-surface.h b/src/display/drawing-surface.h index 1ec848405..e937cca55 100644 --- a/src/display/drawing-surface.h +++ b/src/display/drawing-surface.h @@ -65,7 +65,7 @@ public: void markClean(Geom::IntRect const &area = Geom::IntRect::infinite()); void scheduleTransform(Geom::IntRect const &new_area, Geom::Affine const &trans); void prepare(); - void paintFromCache(DrawingContext &ct, Geom::OptIntRect &area); + void paintFromCache(DrawingContext &dc, Geom::OptIntRect &area); protected: cairo_region_t *_clean_region; diff --git a/src/display/drawing-text.cpp b/src/display/drawing-text.cpp index f652a2970..f5a0f0af5 100644 --- a/src/display/drawing-text.cpp +++ b/src/display/drawing-text.cpp @@ -195,7 +195,7 @@ DrawingText::_updateItem(Geom::IntRect const &area, UpdateContext const &ctx, un return DrawingGroup::_updateItem(area, ctx, flags, reset); } -void DrawingText::decorateStyle(DrawingContext &ct, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2) +void DrawingText::decorateStyle(DrawingContext &dc, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2) { double wave[16]={ 0.000000, 0.382499, 0.706825, 0.923651, 1.000000, 0.923651, 0.706825, 0.382499, @@ -235,12 +235,12 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); if(_nrstyle.text_decoration_style & TEXT_DECORATION_STYLE_ISDOUBLE){ ps -= Geom::Point(0, vextent/12.0); pf -= Geom::Point(0, vextent/12.0); - ct.moveTo(ps); - ct.lineTo(pf); + dc.moveTo(ps); + dc.lineTo(pf); ps += Geom::Point(0, vextent/6.0); pf += Geom::Point(0, vextent/6.0); - ct.moveTo(ps); - ct.lineTo(pf); + dc.moveTo(ps); + dc.lineTo(pf); } /* The next three have a problem in that they are phase dependent. The bits of a line are not necessarily passing through this routine in order, so we have to use the xphase information @@ -251,14 +251,14 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); while(1){ if(dots[i]>0){ if(ps[Geom::X]> pf[Geom::X])break; - ct.moveTo(ps); + dc.moveTo(ps); ps += Geom::Point(step * (double)dots[i], 0.0); if(ps[Geom::X]>= pf[Geom::X]){ - ct.lineTo(pf); + dc.lineTo(pf); break; } else { - ct.lineTo(ps); + dc.lineTo(ps); } ps += Geom::Point(step * 4.0, 0.0); } @@ -272,14 +272,14 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); while(1){ if(dashes[i]>0){ if(ps[Geom::X]> pf[Geom::X])break; - ct.moveTo(ps); + dc.moveTo(ps); ps += Geom::Point(step * (double)dashes[i], 0.0); if(ps[Geom::X]>= pf[Geom::X]){ - ct.lineTo(pf); + dc.lineTo(pf); break; } else { - ct.lineTo(ps); + dc.lineTo(ps); } ps += Geom::Point(step * 8.0, 0.0); } @@ -293,23 +293,23 @@ pf = Geom::Point(step * round(p2[Geom::X]/step),p2[Geom::Y]); double amp = vextent/10.0; double x = ps[Geom::X]; double y = ps[Geom::Y]; - ct.moveTo(Geom::Point(x, y + amp * wave[i])); + dc.moveTo(Geom::Point(x, y + amp * wave[i])); while(1){ i = ((i + 1) & 15); x += step; - ct.lineTo(Geom::Point(x, y + amp * wave[i])); + dc.lineTo(Geom::Point(x, y + amp * wave[i])); if(x >= pf[Geom::X])break; } } else { // TEXT_DECORATION_STYLE_SOLID, also default in case it was not set for some reason - ct.moveTo(ps); - ct.lineTo(pf); -// ct.revrectangle(Geom::Rect(ps,pf)); + dc.moveTo(ps); + dc.lineTo(pf); +// dc.revrectangle(Geom::Rect(ps,pf)); } } /* returns scaled line thickness */ -double DrawingText::decorateItem(DrawingContext &ct, Geom::Affine const &aff, double phase_length) +double DrawingText::decorateItem(DrawingContext &dc, Geom::Affine const &aff, double phase_length) { double tsp_width_adj = _nrstyle.tspan_width / _nrstyle.font_size; double tsp_asc_adj = _nrstyle.ascender / _nrstyle.font_size; @@ -321,8 +321,8 @@ double DrawingText::decorateItem(DrawingContext &ct, Geom::Affine const &aff, do double scale = aff.descrim(); double xphase = phase_length/ _nrstyle.font_size; // used to figure out phase of patterns - Inkscape::DrawingContext::Save save(ct); - ct.transform(aff); // must be leftmost affine in span + Inkscape::DrawingContext::Save save(dc); + dc.transform(aff); // must be leftmost affine in span Geom::Point p1; Geom::Point p2; @@ -331,52 +331,52 @@ double DrawingText::decorateItem(DrawingContext &ct, Geom::Affine const &aff, do if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_UNDERLINE){ p1 = Geom::Point(0.0, -_nrstyle.underline_position); p2 = Geom::Point(tsp_width_adj,-_nrstyle.underline_position); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_OVERLINE){ p1 = Geom::Point(0.0, tsp_asc_adj -_nrstyle.underline_position + 1 * final_underline_thickness); p2 = Geom::Point(tsp_width_adj,tsp_asc_adj -_nrstyle.underline_position + 1 * final_underline_thickness); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_LINETHROUGH){ thickness = final_line_through_thickness; p1 = Geom::Point(0.0, _nrstyle.line_through_position); p2 = Geom::Point(tsp_width_adj,_nrstyle.line_through_position); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } // Obviously this does not blink, but it does indicate which text has been set with that attribute if(_nrstyle.text_decoration_line & TEXT_DECORATION_LINE_BLINK){ thickness = final_line_through_thickness; p1 = Geom::Point(0.0, _nrstyle.line_through_position - 2*final_line_through_thickness); p2 = Geom::Point(tsp_width_adj,_nrstyle.line_through_position - 2*final_line_through_thickness); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); p1 = Geom::Point(0.0, _nrstyle.line_through_position + 2*final_line_through_thickness); p2 = Geom::Point(tsp_width_adj,_nrstyle.line_through_position + 2*final_line_through_thickness); - decorateStyle(ct, tsp_size_adj, xphase, p1, p2); + decorateStyle(dc, tsp_size_adj, xphase, p1, p2); } thickness *= scale; return(thickness); } -unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) +unsigned DrawingText::_renderItem(DrawingContext &dc, Geom::IntRect const &/*area*/, unsigned /*flags*/, DrawingItem * /*stop_at*/) { if (_drawing.outline()) { guint32 rgba = _drawing.outlinecolor; - Inkscape::DrawingContext::Save save(ct); - ct.setSource(rgba); - ct.setTolerance(0.5); // low quality, but good enough for outline mode + Inkscape::DrawingContext::Save save(dc); + dc.setSource(rgba); + dc.setTolerance(0.5); // low quality, but good enough for outline mode for (ChildrenList::iterator i = _children.begin(); i != _children.end(); ++i) { DrawingGlyphs *g = dynamic_cast(&*i); if (!g) throw InvalidItemException(); - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); // skip glyphs with singular transforms if (g->_ctm.isSingular()) continue; - ct.transform(g->_ctm); + dc.transform(g->_ctm); if(g->_drawable){ - ct.path(*g->_font->PathVector(g->_glyph)); - ct.fill(); + dc.path(*g->_font->PathVector(g->_glyph)); + dc.fill(); } } return RENDER_OK; @@ -398,11 +398,11 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are // Therefore, only apply this ctm temporarily. bool has_stroke, has_fill; { - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); - has_fill = _nrstyle.prepareFill( ct, _item_bbox); - has_stroke = _nrstyle.prepareStroke(ct, _item_bbox); + has_fill = _nrstyle.prepareFill( dc, _item_bbox); + has_stroke = _nrstyle.prepareStroke(dc, _item_bbox); } if (has_fill || has_stroke) { @@ -418,11 +418,11 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are invset = true; } - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); if (g->_ctm.isSingular()) continue; - ct.transform(g->_ctm); + dc.transform(g->_ctm); if (g->_drawable) { - ct.path(*g->_font->PathVector(g->_glyph)); + dc.path(*g->_font->PathVector(g->_glyph)); } // get the leftmost affine transform (leftmost defined with respect to the x axis of the first transform). // That way the decoration will work no matter what mix of L->R, R->L text is in the span. @@ -448,17 +448,17 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are // draw the text itself // we need to apply this object's ctm again - Inkscape::DrawingContext::Save save(ct); - ct.transform(_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(_ctm); if (has_fill) { - _nrstyle.applyFill(ct); - ct.fillPreserve(); + _nrstyle.applyFill(dc); + dc.fillPreserve(); } if (has_stroke) { - _nrstyle.applyStroke(ct); - ct.strokePreserve(); + _nrstyle.applyStroke(dc); + dc.strokePreserve(); } - ct.newPath(); // clear path + dc.newPath(); // clear path // draw text decoration if (_nrstyle.text_decoration_line != TEXT_DECORATION_LINE_CLEAR && decorate) { @@ -477,27 +477,27 @@ unsigned DrawingText::_renderItem(DrawingContext &ct, Geom::IntRect const &/*are _nrstyle.fill.color.v.c[2], 1.0); } - ct.setSource(ergba); - ct.setTolerance(0.5); - double thickness = decorateItem(ct, aff, phase_length); - ct.setLineWidth(thickness); - ct.strokePreserve(); - ct.newPath(); // clear path + dc.setSource(ergba); + dc.setTolerance(0.5); + double thickness = decorateItem(dc, aff, phase_length); + dc.setLineWidth(thickness); + dc.strokePreserve(); + dc.newPath(); // clear path } } return RENDER_OK; } -void DrawingText::_clipItem(DrawingContext &ct, Geom::IntRect const &/*area*/) +void DrawingText::_clipItem(DrawingContext &dc, Geom::IntRect const &/*area*/) { - Inkscape::DrawingContext::Save save(ct); + Inkscape::DrawingContext::Save save(dc); // handle clip-rule if (_style) { if (_style->clip_rule.computed == SP_WIND_RULE_EVENODD) { - ct.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); + dc.setFillRule(CAIRO_FILL_RULE_EVEN_ODD); } else { - ct.setFillRule(CAIRO_FILL_RULE_WINDING); + dc.setFillRule(CAIRO_FILL_RULE_WINDING); } } @@ -507,13 +507,13 @@ void DrawingText::_clipItem(DrawingContext &ct, Geom::IntRect const &/*area*/) throw InvalidItemException(); } - Inkscape::DrawingContext::Save save(ct); - ct.transform(g->_ctm); + Inkscape::DrawingContext::Save save(dc); + dc.transform(g->_ctm); if(g->_drawable){ - ct.path(*g->_font->PathVector(g->_glyph)); + dc.path(*g->_font->PathVector(g->_glyph)); } } - ct.fill(); + dc.fill(); } DrawingItem * diff --git a/src/display/drawing-text.h b/src/display/drawing-text.h index fd122b54b..b863ca2a4 100644 --- a/src/display/drawing-text.h +++ b/src/display/drawing-text.h @@ -62,14 +62,14 @@ public: protected: virtual unsigned _updateItem(Geom::IntRect const &area, UpdateContext const &ctx, unsigned flags, unsigned reset); - virtual unsigned _renderItem(DrawingContext &ct, Geom::IntRect const &area, unsigned flags, + virtual unsigned _renderItem(DrawingContext &dc, Geom::IntRect const &area, unsigned flags, DrawingItem *stop_at); - virtual void _clipItem(DrawingContext &ct, Geom::IntRect const &area); + virtual void _clipItem(DrawingContext &dc, Geom::IntRect const &area); virtual DrawingItem *_pickItem(Geom::Point const &p, double delta, unsigned flags); virtual bool _canClip(); - double decorateItem(DrawingContext &ct, Geom::Affine const &aff, double phase_length); - void decorateStyle(DrawingContext &ct, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2); + double decorateItem(DrawingContext &dc, Geom::Affine const &aff, double phase_length); + void decorateStyle(DrawingContext &dc, double vextent, double xphase, Geom::Point const &p1, Geom::Point const &p2); NRStyle _nrstyle; friend class DrawingGlyphs; diff --git a/src/display/drawing.cpp b/src/display/drawing.cpp index c192e4565..6e728b03d 100644 --- a/src/display/drawing.cpp +++ b/src/display/drawing.cpp @@ -167,22 +167,22 @@ Drawing::update(Geom::IntRect const &area, UpdateContext const &ctx, unsigned fl } void -Drawing::render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags) +Drawing::render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags) { if (_root) { - _root->render(ct, area, flags); + _root->render(dc, area, flags); } if (colorMode() == COLORMODE_GRAYSCALE) { // apply grayscale filter on top of everything - cairo_surface_t *input = ct.rawTarget(); + cairo_surface_t *input = dc.rawTarget(); cairo_surface_t *out = ink_cairo_surface_create_identical(input); ink_cairo_surface_filter(input, out, _grayscale_colormatrix); - Geom::Point origin = ct.targetLogicalBounds().min(); - ct.setSource(out, origin[Geom::X], origin[Geom::Y]); - ct.setOperator(CAIRO_OPERATOR_SOURCE); - ct.paint(); - ct.setOperator(CAIRO_OPERATOR_OVER); + Geom::Point origin = dc.targetLogicalBounds().min(); + dc.setSource(out, origin[Geom::X], origin[Geom::Y]); + dc.setOperator(CAIRO_OPERATOR_SOURCE); + dc.paint(); + dc.setOperator(CAIRO_OPERATOR_OVER); cairo_surface_destroy(out); } diff --git a/src/display/drawing.h b/src/display/drawing.h index 74ab57fae..cc74833ba 100644 --- a/src/display/drawing.h +++ b/src/display/drawing.h @@ -68,7 +68,7 @@ public: void setGrayscaleMatrix(gdouble value_matrix[20]); void update(Geom::IntRect const &area = Geom::IntRect::infinite(), UpdateContext const &ctx = UpdateContext(), unsigned flags = DrawingItem::STATE_ALL, unsigned reset = 0); - void render(DrawingContext &ct, Geom::IntRect const &area, unsigned flags = 0); + void render(DrawingContext &dc, Geom::IntRect const &area, unsigned flags = 0); DrawingItem *pick(Geom::Point const &p, double delta, unsigned flags); sigc::signal signal_request_update; diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp index 92bb9dcaa..154d1ab32 100644 --- a/src/display/nr-filter-image.cpp +++ b/src/display/nr-filter-image.cpp @@ -108,17 +108,17 @@ void FilterImage::render_cairo(FilterSlot &slot) Geom::Rect sa = slot.get_slot_area(); cairo_surface_t *out = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, sa.width(), sa.height()); - Inkscape::DrawingContext ct(out, sa.min()); - ct.transform(user2pb); // we are now in primitive units - ct.translate(feImageX, feImageY); -// ct.scale(scaleX, scaleY); No scaling should be done + Inkscape::DrawingContext dc(out, sa.min()); + dc.transform(user2pb); // we are now in primitive units + dc.translate(feImageX, feImageY); +// dc.scale(scaleX, scaleY); No scaling should be done Geom::IntRect render_rect = area.roundOutwards(); - ct.translate(render_rect.min()); + dc.translate(render_rect.min()); // Update to renderable state drawing.update(render_rect); - drawing.render(ct, render_rect); + drawing.render(dc, render_rect); SVGElem->invoke_hide(key); // For the moment, we'll assume that any image is in sRGB color space diff --git a/src/display/nr-filter-slot.cpp b/src/display/nr-filter-slot.cpp index 755a30a74..e4c2f048e 100644 --- a/src/display/nr-filter-slot.cpp +++ b/src/display/nr-filter-slot.cpp @@ -25,13 +25,13 @@ namespace Inkscape { namespace Filters { -FilterSlot::FilterSlot(DrawingItem *item, DrawingContext *bgct, +FilterSlot::FilterSlot(DrawingItem *item, DrawingContext *bgdc, DrawingContext &graphic, FilterUnits const &u) : _item(item) , _source_graphic(graphic.rawTarget()) - , _background_ct(bgct ? bgct->raw() : NULL) + , _background_ct(bgdc ? bgdc->raw() : NULL) , _source_graphic_area(graphic.targetLogicalBounds().roundOutwards()) // fixme - , _background_area(bgct ? bgct->targetLogicalBounds().roundOutwards() : Geom::IntRect()) // fixme + , _background_area(bgdc ? bgdc->targetLogicalBounds().roundOutwards() : Geom::IntRect()) // fixme , _units(u) , _last_out(NR_FILTER_SOURCEGRAPHIC) , filterquality(FILTER_QUALITY_BEST) diff --git a/src/display/nr-filter-slot.h b/src/display/nr-filter-slot.h index 805027bfe..f3c98b8d9 100644 --- a/src/display/nr-filter-slot.h +++ b/src/display/nr-filter-slot.h @@ -28,7 +28,7 @@ namespace Filters { class FilterSlot { public: /** Creates a new FilterSlot object. */ - FilterSlot(DrawingItem *item, DrawingContext *bgct, + FilterSlot(DrawingItem *item, DrawingContext *bgdc, DrawingContext &graphic, FilterUnits const &u); /** Destroys the FilterSlot object and all its contents */ virtual ~FilterSlot(); diff --git a/src/display/nr-filter.cpp b/src/display/nr-filter.cpp index af9c15cd8..11984ba76 100644 --- a/src/display/nr-filter.cpp +++ b/src/display/nr-filter.cpp @@ -98,7 +98,7 @@ Filter::~Filter() } -int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgct) +int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgdc) { if (_primitive.empty()) { // when no primitives are defined, clear source graphic @@ -150,7 +150,7 @@ int Filter::render(Inkscape::DrawingItem const *item, DrawingContext &graphic, D } } - FilterSlot slot(const_cast(item), bgct, graphic, units); + FilterSlot slot(const_cast(item), bgdc, graphic, units); slot.set_quality(filterquality); slot.set_blurquality(blurquality); diff --git a/src/display/nr-filter.h b/src/display/nr-filter.h index 5df38ffe9..f9dcf1d84 100644 --- a/src/display/nr-filter.h +++ b/src/display/nr-filter.h @@ -28,12 +28,12 @@ namespace Filters { class Filter { public: - /** Given background state from @a bgct and an intermediate rendering from the surface + /** Given background state from @a bgdc and an intermediate rendering from the surface * backing @a graphic, modify the contents of the surface backing @a graphic to represent * the results of filter rendering. @a bgarea and @a area specify bounding boxes * of both surfaces in world coordinates; Cairo contexts are assumed to be in default state * (0,0 = surface origin, no path, OVER operator) */ - int render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgct); + int render(Inkscape::DrawingItem const *item, DrawingContext &graphic, DrawingContext *bgdc); /** * Creates a new filter primitive under this filter object. diff --git a/src/display/nr-style.cpp b/src/display/nr-style.cpp index 317f38635..403b139e0 100644 --- a/src/display/nr-style.cpp +++ b/src/display/nr-style.cpp @@ -207,14 +207,14 @@ void NRStyle::set(SPStyle *style) update(); } -bool NRStyle::prepareFill(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox) +bool NRStyle::prepareFill(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox) { // update fill pattern if (!fill_pattern) { switch (fill.type) { case PAINT_SERVER: { - //fill_pattern = sp_paint_server_create_pattern(fill.server, ct.raw(), paintbox, fill.opacity); - fill_pattern = fill.server->pattern_new(ct.raw(), paintbox, fill.opacity); + //fill_pattern = sp_paint_server_create_pattern(fill.server, dc.raw(), paintbox, fill.opacity); + fill_pattern = fill.server->pattern_new(dc.raw(), paintbox, fill.opacity); } break; case PAINT_COLOR: { @@ -229,19 +229,19 @@ bool NRStyle::prepareFill(Inkscape::DrawingContext &ct, Geom::OptRect const &pai return true; } -void NRStyle::applyFill(Inkscape::DrawingContext &ct) +void NRStyle::applyFill(Inkscape::DrawingContext &dc) { - ct.setSource(fill_pattern); - ct.setFillRule(fill_rule); + dc.setSource(fill_pattern); + dc.setFillRule(fill_rule); } -bool NRStyle::prepareStroke(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox) +bool NRStyle::prepareStroke(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox) { if (!stroke_pattern) { switch (stroke.type) { case PAINT_SERVER: { - //stroke_pattern = sp_paint_server_create_pattern(stroke.server, ct.raw(), paintbox, stroke.opacity); - stroke_pattern = stroke.server->pattern_new(ct.raw(), paintbox, stroke.opacity); + //stroke_pattern = sp_paint_server_create_pattern(stroke.server, dc.raw(), paintbox, stroke.opacity); + stroke_pattern = stroke.server->pattern_new(dc.raw(), paintbox, stroke.opacity); } break; case PAINT_COLOR: { @@ -256,14 +256,14 @@ bool NRStyle::prepareStroke(Inkscape::DrawingContext &ct, Geom::OptRect const &p return true; } -void NRStyle::applyStroke(Inkscape::DrawingContext &ct) +void NRStyle::applyStroke(Inkscape::DrawingContext &dc) { - ct.setSource(stroke_pattern); - ct.setLineWidth(stroke_width); - ct.setLineCap(line_cap); - ct.setLineJoin(line_join); - ct.setMiterLimit(miter_limit); - cairo_set_dash(ct.raw(), dash, n_dash, dash_offset); // fixme + dc.setSource(stroke_pattern); + dc.setLineWidth(stroke_width); + dc.setLineCap(line_cap); + dc.setLineJoin(line_join); + dc.setMiterLimit(miter_limit); + cairo_set_dash(dc.raw(), dash, n_dash, dash_offset); // fixme } void NRStyle::update() diff --git a/src/display/nr-style.h b/src/display/nr-style.h index 8fd736cc3..e54eef547 100644 --- a/src/display/nr-style.h +++ b/src/display/nr-style.h @@ -28,10 +28,10 @@ struct NRStyle { ~NRStyle(); void set(SPStyle *); - bool prepareFill(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox); - bool prepareStroke(Inkscape::DrawingContext &ct, Geom::OptRect const &paintbox); - void applyFill(Inkscape::DrawingContext &ct); - void applyStroke(Inkscape::DrawingContext &ct); + bool prepareFill(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox); + bool prepareStroke(Inkscape::DrawingContext &dc, Geom::OptRect const &paintbox); + void applyFill(Inkscape::DrawingContext &dc); + void applyStroke(Inkscape::DrawingContext &dc); void update(); enum PaintType { diff --git a/src/helper/pixbuf-ops.cpp b/src/helper/pixbuf-ops.cpp index cd4f539ec..1ba6628c5 100644 --- a/src/helper/pixbuf-ops.cpp +++ b/src/helper/pixbuf-ops.cpp @@ -140,10 +140,10 @@ Inkscape::Pixbuf *sp_generate_internal_bitmap(SPDocument *doc, gchar const */*fi cairo_surface_t *surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); if (cairo_surface_status(surface) == CAIRO_STATUS_SUCCESS) { - Inkscape::DrawingContext ct(surface, Geom::Point(0,0)); + Inkscape::DrawingContext dc(surface, Geom::Point(0,0)); // render items - drawing.render(ct, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); + drawing.render(dc, final_bbox, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); inkpb = new Inkscape::Pixbuf(surface); } diff --git a/src/helper/png-write.cpp b/src/helper/png-write.cpp index a16fe8e12..a7ebe7423 100644 --- a/src/helper/png-write.cpp +++ b/src/helper/png-write.cpp @@ -335,14 +335,14 @@ sp_export_get_rows(guchar const **rows, void **to_free, int row, int num_rows, v cairo_surface_t *s = cairo_image_surface_create_for_data( px, CAIRO_FORMAT_ARGB32, ebp->width, num_rows, stride); - Inkscape::DrawingContext ct(s, bbox.min()); - ct.setSource(ebp->background); - ct.setOperator(CAIRO_OPERATOR_SOURCE); - ct.paint(); - ct.setOperator(CAIRO_OPERATOR_OVER); + Inkscape::DrawingContext dc(s, bbox.min()); + dc.setSource(ebp->background); + dc.setOperator(CAIRO_OPERATOR_SOURCE); + dc.paint(); + dc.setOperator(CAIRO_OPERATOR_OVER); /* Render */ - ebp->drawing->render(ct, bbox); + ebp->drawing->render(dc, bbox); cairo_surface_destroy(s); *to_free = px; diff --git a/src/sp-mesh-array.cpp b/src/sp-mesh-array.cpp index 5a204e8b0..ab14e75d2 100644 --- a/src/sp-mesh-array.cpp +++ b/src/sp-mesh-array.cpp @@ -1925,10 +1925,10 @@ guint SPMeshNodeArray::color_pick( std::vector icorners, SPItem* item ) { /* Find visible area */ cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ibox.width(), ibox.height()); - Inkscape::DrawingContext ct(s, ibox.min()); + Inkscape::DrawingContext dc(s, ibox.min()); /* Render copy and pick color */ - pick_drawing->render(ct, ibox); + pick_drawing->render(dc, ibox); double R = 0, G = 0, B = 0, A = 0; ink_cairo_surface_average_color(s, R, G, B, A); cairo_surface_destroy(s); diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp index 711f26428..425ca9efa 100644 --- a/src/sp-pattern.cpp +++ b/src/sp-pattern.cpp @@ -639,25 +639,25 @@ cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b // Create drawing surface with size of pattern tile (in tile space) but with number of pixels // based on required resolution (c). Inkscape::DrawingSurface pattern_surface(pattern_tile, c.ceil()); - Inkscape::DrawingContext ct(pattern_surface); + Inkscape::DrawingContext dc(pattern_surface); pattern_tile *= pattern_surface.drawingTransform(); Geom::IntRect one_tile = pattern_tile.roundOutwards(); // render pattern. if (needs_opacity) { - ct.pushGroup(); // this group is for pattern + opacity + dc.pushGroup(); // this group is for pattern + opacity } // TODO: make sure there are no leaks. Inkscape::UpdateContext ctx; // UpdateContext is structure with only ctm! ctx.ctm = vb2ps * pattern_surface.drawingTransform(); - ct.transform( pattern_surface.drawingTransform().inverse() ); + dc.transform( pattern_surface.drawingTransform().inverse() ); drawing.update(Geom::IntRect::infinite(), ctx); // Render drawing to pattern_surface via drawing context, this calls root->render // which is really DrawingItem->render(). - drawing.render(ct, one_tile); + drawing.render(dc, one_tile); for (SPObject *child = shown->firstChild() ; child != NULL; child = child->getNext() ) { if (SP_IS_ITEM (child)) { SP_ITEM(child)->invoke_hide(dkey); @@ -673,8 +673,8 @@ cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &b // cairo_surface_write_to_png( pattern_surface.raw(), "sp-pattern.png" ); if (needs_opacity) { - ct.popGroupToSource(); // pop raw pattern - ct.paint(opacity); // apply opacity + dc.popGroupToSource(); // pop raw pattern + dc.paint(opacity); // apply opacity } cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw()); diff --git a/src/ui/cache/svg_preview_cache.cpp b/src/ui/cache/svg_preview_cache.cpp index a09489f6d..f1d6304cb 100644 --- a/src/ui/cache/svg_preview_cache.cpp +++ b/src/ui/cache/svg_preview_cache.cpp @@ -56,9 +56,9 @@ GdkPixbuf* render_pixbuf(Inkscape::Drawing &drawing, double scale_factor, Geom:: /* Render */ cairo_surface_t *s = cairo_image_surface_create( CAIRO_FORMAT_ARGB32, psize, psize); - Inkscape::DrawingContext ct(s, area.min()); + Inkscape::DrawingContext dc(s, area.min()); - drawing.render(ct, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); + drawing.render(dc, area, Inkscape::DrawingItem::RENDER_BYPASS_CACHE); cairo_surface_flush(s); GdkPixbuf* pixbuf = ink_pixbuf_create_from_cairo_surface(s); diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp index 87c399339..fb131d8da 100644 --- a/src/ui/dialog/clonetiler.cpp +++ b/src/ui/dialog/clonetiler.cpp @@ -2063,9 +2063,9 @@ guint32 CloneTiler::clonetiler_trace_pick(Geom::Rect box) /* Find visible area */ cairo_surface_t *s = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ibox.width(), ibox.height()); - Inkscape::DrawingContext ct(s, ibox.min()); + Inkscape::DrawingContext dc(s, ibox.min()); /* Render */ - trace_drawing->render(ct, ibox); + trace_drawing->render(dc, ibox); double R = 0, G = 0, B = 0, A = 0; ink_cairo_surface_average_color(s, R, G, B, A); cairo_surface_destroy(s); diff --git a/src/ui/tools/flood-tool.cpp b/src/ui/tools/flood-tool.cpp index 0b72bc9f2..4e29b8856 100644 --- a/src/ui/tools/flood-tool.cpp +++ b/src/ui/tools/flood-tool.cpp @@ -794,7 +794,7 @@ static void sp_flood_do_flood_fill(ToolBase *event_context, GdkEvent *event, boo cairo_surface_t *s = cairo_image_surface_create_for_data( px, CAIRO_FORMAT_ARGB32, width, height, stride); - Inkscape::DrawingContext ct(s, Geom::Point(0,0)); + Inkscape::DrawingContext dc(s, Geom::Point(0,0)); // cairo_translate not necessary here - surface origin is at 0,0 SPNamedView *nv = sp_desktop_namedview(desktop); @@ -802,12 +802,12 @@ static void sp_flood_do_flood_fill(ToolBase *event_context, GdkEvent *event, boo // bgcolor is 0xrrggbbaa, we need 0xaarrggbb dtc = (bgcolor >> 8) | (bgcolor << 24); - ct.setSource(bgcolor); - ct.setOperator(CAIRO_OPERATOR_SOURCE); - ct.paint(); - ct.setOperator(CAIRO_OPERATOR_OVER); + dc.setSource(bgcolor); + dc.setOperator(CAIRO_OPERATOR_SOURCE); + dc.paint(); + dc.setOperator(CAIRO_OPERATOR_OVER); - drawing.render(ct, final_bbox); + drawing.render(dc, final_bbox); //cairo_surface_write_to_png( s, "cairo.png" ); diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp index a9c30ee8f..eb16cfece 100644 --- a/src/widgets/icon.cpp +++ b/src/widgets/icon.cpp @@ -1190,9 +1190,9 @@ sp_icon_doc_icon( SPDocument *doc, Inkscape::Drawing &drawing, /* Render */ cairo_surface_t *s = cairo_image_surface_create_for_data(px, CAIRO_FORMAT_ARGB32, psize, psize, stride); - Inkscape::DrawingContext ct(s, ua.min()); + Inkscape::DrawingContext dc(s, ua.min()); - drawing.render(ct, ua); + drawing.render(dc, ua); cairo_surface_destroy(s); // convert to GdkPixbuf format -- cgit v1.2.3 From e099764f90ea719b1ba330581a080fd1b508cf2b Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sat, 8 Feb 2014 08:00:21 -0500 Subject: reverting triangle.py and wireframe_sphere.py from rev 13007 (bzr r13010) --- share/extensions/triangle.py | 7 ++----- share/extensions/wireframe_sphere.py | 3 +-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/share/extensions/triangle.py b/share/extensions/triangle.py index ad26c6891..81945f370 100755 --- a/share/extensions/triangle.py +++ b/share/extensions/triangle.py @@ -82,7 +82,7 @@ def draw_tri_from_3_sides(s_a, s_b, s_c, offset, parent): #draw a triangle from offy = c[1]/2 #c is the highest point offset = ( offset[0]-offx , offset[1]-offy ) #add the centre of the triangle to the offset - draw_SVG_tri(a, b, c , offset, Grid_Polar.unittouu(e, '2px'), 'Triangle', parent) + draw_SVG_tri(a, b, c , offset, 2, 'Triangle', parent) else: sys.stderr.write('Error:Invalid Triangle Specifications.\n') @@ -122,10 +122,7 @@ class Grid_Polar(inkex.Effect): tri = self.current_layer offset = (self.view_center[0],self.view_center[1]) #the offset require to centre the triangle - self.options.s_a = self.unittouu(str(self.options.s_a) + 'px') - self.options.s_b = self.unittouu(str(self.options.s_b) + 'px') - self.options.s_c = self.unittouu(str(self.options.s_c) + 'px') - + if self.options.mode == '3_sides': s_a = self.options.s_a s_b = self.options.s_b diff --git a/share/extensions/wireframe_sphere.py b/share/extensions/wireframe_sphere.py index b8947869c..5804a1b45 100755 --- a/share/extensions/wireframe_sphere.py +++ b/share/extensions/wireframe_sphere.py @@ -66,7 +66,7 @@ inkex.localize() def draw_SVG_ellipse((rx, ry), (cx, cy), parent, start_end=(0,2*pi),transform='' ): style = { 'stroke' : '#000000', - 'stroke-width' : str(Wireframe_Sphere.unittouu(e, '1px')), + 'stroke-width' : '1', 'fill' : 'none' } circ_attribs = {'style':simplestyle.formatStyle(style), inkex.addNS('cx','sodipodi') :str(cx), @@ -120,7 +120,6 @@ class Wireframe_Sphere(inkex.Effect): else: flip = '' #no flip - so.RADIUS = self.unittouu(str(so.RADIUS) + 'px') so.TILT = abs(so.TILT)*(pi/180) #Convert to radians so.ROT_OFFSET = so.ROT_OFFSET*(pi/180) #Convert to radians -- cgit v1.2.3 From 75ceef199c1032a2424b3aaa01c8027cea3f9ef1 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sat, 8 Feb 2014 16:02:17 +0100 Subject: Fix for Bug #879058 (Spray Single Path Mode includes original object). Fixed bugs: - https://launchpad.net/bugs/879058 (bzr r13011) --- src/ui/tools/spray-tool.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp index 91c606e8e..4ea482461 100644 --- a/src/ui/tools/spray-tool.cpp +++ b/src/ui/tools/spray-tool.cpp @@ -453,7 +453,7 @@ static bool sp_spray_recursive(SPDesktop *desktop, Geom::OptRect a = parent_item->documentVisualBounds(); if (a) { - if (i == 2) { + if (i == 1) { Inkscape::XML::Node *copy1 = old_repr->duplicate(xml_doc); parent->appendChild(copy1); SPObject *new_obj1 = doc->getObjectByRepr(copy1); -- cgit v1.2.3 From d8cb55512fe7cdb3cc5ab83a9d173079885fd87d Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sat, 8 Feb 2014 15:49:04 -0500 Subject: more robust versions of triangle.py and wireframe_sphere.py, see rev 13007 (bzr r13012) --- share/extensions/triangle.py | 20 ++++++++++++-------- share/extensions/wireframe_sphere.py | 16 +++++++++------- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/share/extensions/triangle.py b/share/extensions/triangle.py index 81945f370..019db3147 100755 --- a/share/extensions/triangle.py +++ b/share/extensions/triangle.py @@ -69,7 +69,7 @@ def is_valid_tri_from_sides(a,b,c):#check whether triangle with sides a,b,c is v return (a+b)>c and (a+c)>b and (b+c)>a and a > 0 and b> 0 and c>0#two sides must always be greater than the third #no zero-length sides, no degenerate case -def draw_tri_from_3_sides(s_a, s_b, s_c, offset, parent): #draw a triangle from three sides (with a given offset +def draw_tri_from_3_sides(s_a, s_b, s_c, offset, width, parent): #draw a triangle from three sides (with a given offset if is_valid_tri_from_sides(s_a,s_b,s_c): a_b = angle_from_3_sides(s_a, s_c, s_b) @@ -82,7 +82,7 @@ def draw_tri_from_3_sides(s_a, s_b, s_c, offset, parent): #draw a triangle from offy = c[1]/2 #c is the highest point offset = ( offset[0]-offx , offset[1]-offy ) #add the centre of the triangle to the offset - draw_SVG_tri(a, b, c , offset, 2, 'Triangle', parent) + draw_SVG_tri(a, b, c , offset, width, 'Triangle', parent) else: sys.stderr.write('Error:Invalid Triangle Specifications.\n') @@ -122,12 +122,16 @@ class Grid_Polar(inkex.Effect): tri = self.current_layer offset = (self.view_center[0],self.view_center[1]) #the offset require to centre the triangle + self.options.s_a = self.unittouu(str(self.options.s_a) + 'px') + self.options.s_b = self.unittouu(str(self.options.s_b) + 'px') + self.options.s_c = self.unittouu(str(self.options.s_c) + 'px') + stroke_width = self.unittouu('2px') if self.options.mode == '3_sides': s_a = self.options.s_a s_b = self.options.s_b s_c = self.options.s_c - draw_tri_from_3_sides(s_a, s_b, s_c, offset, tri) + draw_tri_from_3_sides(s_a, s_b, s_c, offset, stroke_width, tri) elif self.options.mode == 's_ab_a_c': s_a = self.options.s_a @@ -135,7 +139,7 @@ class Grid_Polar(inkex.Effect): a_c = self.options.a_c*pi/180 #in rad s_c = third_side_from_enclosed_angle(s_a,s_b,a_c) - draw_tri_from_3_sides(s_a, s_b, s_c, offset, tri) + draw_tri_from_3_sides(s_a, s_b, s_c, offset, stroke_width, tri) elif self.options.mode == 's_ab_a_a': s_a = self.options.s_a @@ -159,13 +163,13 @@ class Grid_Polar(inkex.Effect): if not(error) and (a_b < pi) and (a_c < pi): #check that the solution is valid, if so draw acute solution s_c = third_side_from_enclosed_angle(s_a,s_b,a_c) - draw_tri_from_3_sides(s_a, s_b, s_c, offset, tri) + draw_tri_from_3_sides(s_a, s_b, s_c, offset, stroke_width, tri) if not(error) and ((a_b > pi) or (a_c > pi) or ambiguous):#we want the obtuse solution a_b = pi - a_b a_c = pi - a_a - a_b s_c = third_side_from_enclosed_angle(s_a,s_b,a_c) - draw_tri_from_3_sides(s_a, s_b, s_c, offset, tri) + draw_tri_from_3_sides(s_a, s_b, s_c, offset, stroke_width, tri) elif self.options.mode == 's_a_a_ab': s_a = self.options.s_a @@ -176,7 +180,7 @@ class Grid_Polar(inkex.Effect): s_b = s_a*sin(a_b)/sin(a_a) s_c = s_a*sin(a_c)/sin(a_a) - draw_tri_from_3_sides(s_a, s_b, s_c, offset, tri) + draw_tri_from_3_sides(s_a, s_b, s_c, offset, stroke_width, tri) elif self.options.mode == 's_c_a_ab': s_c = self.options.s_c @@ -187,7 +191,7 @@ class Grid_Polar(inkex.Effect): s_a = s_c*sin(a_a)/sin(a_c) s_b = s_c*sin(a_b)/sin(a_c) - draw_tri_from_3_sides(s_a, s_b, s_c, offset, tri) + draw_tri_from_3_sides(s_a, s_b, s_c, offset, stroke_width, tri) if __name__ == '__main__': e = Grid_Polar() diff --git a/share/extensions/wireframe_sphere.py b/share/extensions/wireframe_sphere.py index 5804a1b45..bcd676dc4 100755 --- a/share/extensions/wireframe_sphere.py +++ b/share/extensions/wireframe_sphere.py @@ -63,10 +63,10 @@ import simplestyle inkex.localize() #SVG OUTPUT FUNCTIONS ================================================ -def draw_SVG_ellipse((rx, ry), (cx, cy), parent, start_end=(0,2*pi),transform='' ): +def draw_SVG_ellipse((rx, ry), (cx, cy), width, parent, start_end=(0,2*pi),transform='' ): style = { 'stroke' : '#000000', - 'stroke-width' : '1', + 'stroke-width' : str(width), 'fill' : 'none' } circ_attribs = {'style':simplestyle.formatStyle(style), inkex.addNS('cx','sodipodi') :str(cx), @@ -120,8 +120,10 @@ class Wireframe_Sphere(inkex.Effect): else: flip = '' #no flip + so.RADIUS = self.unittouu(str(so.RADIUS) + 'px') so.TILT = abs(so.TILT)*(pi/180) #Convert to radians so.ROT_OFFSET = so.ROT_OFFSET*(pi/180) #Convert to radians + stroke_width = self.unittouu('1px') EPSILON = 0.001 #add a tiny value to the ellipse radii, so that if we get a zero radius, the ellipse still shows up as a line @@ -174,7 +176,7 @@ class Wireframe_Sphere(inkex.Effect): #finally, draw the line of longitude #the centre is always at the centre of the sphere - draw_SVG_ellipse( ( minorRad, so.RADIUS ), (0,0), grp_long , start_end,transform) + draw_SVG_ellipse( ( minorRad, so.RADIUS ), (0,0), stroke_width, grp_long , start_end,transform) # LINES OF LATITUDE if so.NUM_LAT > 0: @@ -201,18 +203,18 @@ class Wireframe_Sphere(inkex.Effect): if so.HIDE_BACK: if lat_angle > so.TILT: #this LoLat is partially or fully visible if lat_angle > pi-so.TILT: #this LoLat is fully visible - draw_SVG_ellipse((majorRad, minorRad), (cx,cy), grp_lat) + draw_SVG_ellipse((majorRad, minorRad), (cx,cy), stroke_width, grp_lat) else: #this LoLat is partially visible proportion = -(acos( tan(lat_angle - pi/2)/tan(pi/2 - so.TILT)) )/pi + 1 start_end = ( pi/2 - proportion*pi, pi/2 + proportion*pi ) #make the start and end angles (mirror image around pi/2) - draw_SVG_ellipse((majorRad, minorRad), (cx,cy), grp_lat, start_end) + draw_SVG_ellipse((majorRad, minorRad), (cx,cy), stroke_width, grp_lat, start_end) else: #just draw the full lines of latitude - draw_SVG_ellipse((majorRad, minorRad), (cx,cy), grp_lat) + draw_SVG_ellipse((majorRad, minorRad), (cx,cy), stroke_width, grp_lat) #THE HORIZON CIRCLE - draw_SVG_ellipse((so.RADIUS, so.RADIUS), (0,0), grp) #circle, centred on the sphere centre + draw_SVG_ellipse((so.RADIUS, so.RADIUS), (0,0), stroke_width, grp) #circle, centred on the sphere centre if __name__ == '__main__': e = Wireframe_Sphere() -- cgit v1.2.3 From c94100093bbd8a68b6da68e75a41600524d66757 Mon Sep 17 00:00:00 2001 From: David Mathog Date: Sun, 9 Feb 2014 12:08:00 +0100 Subject: memleak fix (bzr r13013) --- src/desktop-style.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/desktop-style.cpp b/src/desktop-style.cpp index 00b9db7d0..bab9635a9 100644 --- a/src/desktop-style.cpp +++ b/src/desktop-style.cpp @@ -587,11 +587,15 @@ objects_query_fillstroke (GSList *objects, SPStyle *style_res, bool const isfill paint_res->colorSet = paint->colorSet; paint_res->currentcolor = paint->currentcolor; if (paint_res->set && paint_effectively_set && paint->isPaintserver()) { // copy the server + gchar const *string = NULL; // memory leak results if style->get* called inside sp_style_set_to_uri_string. if (isfill) { - sp_style_set_to_uri_string (style_res, true, style->getFillURI()); + string = style->getFillURI(); + sp_style_set_to_uri_string (style_res, true, string); } else { - sp_style_set_to_uri_string (style_res, false, style->getStrokeURI()); + string = style->getStrokeURI(); + sp_style_set_to_uri_string (style_res, false, string); } + if(string)g_free((void *) string); } paint_res->set = paint_effectively_set; style_res->fill_rule.computed = style->fill_rule.computed; // no averaging on this, just use the last one -- cgit v1.2.3 From 68a90a9d9e35b85db9d88867ad40823425f79230 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 9 Feb 2014 17:10:10 +0100 Subject: fix build on Mavericks (clang, libc++) (bzr r13014) --- src/2geom/generic-interval.h | 4 ++-- src/2geom/generic-rect.h | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/2geom/generic-interval.h b/src/2geom/generic-interval.h index 87d3be2c1..41eaf59b0 100644 --- a/src/2geom/generic-interval.h +++ b/src/2geom/generic-interval.h @@ -315,14 +315,14 @@ inline GenericOptInterval operator&(GenericInterval const &a, GenericInter return GenericOptInterval(a) & GenericOptInterval(b); } -#ifdef _GLIBCXX_IOSTREAM +//#ifdef _GLIBCXX_IOSTREAM template inline std::ostream &operator<< (std::ostream &os, Geom::GenericInterval const &I) { os << "Interval("<::contains(OptCRect const &r) const { return !r || contains(*r); } -#ifdef _GLIBCXX_IOSTREAM +//#ifdef _GLIBCXX_IOSTREAM template inline std::ostream &operator<<(std::ostream &out, GenericRect const &r) { out << "X: " << r[X] << " Y: " << r[Y]; return out; } -#endif +//#endif } // end namespace Geom -- cgit v1.2.3 From c655e31cc1bbbec30e3143f5078fbe23ca3feb0d Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sun, 9 Feb 2014 12:03:05 -0500 Subject: Extensions->Render submenu. Scaling of group transform into document units, Part 3 (Bug 1240455) (bzr r13015) --- share/extensions/Barcode/Base.py | 3 ++- share/extensions/hershey.py | 5 ++++- share/extensions/polyhedron_3d.py | 3 +++ share/extensions/render_barcode.py | 1 + share/extensions/render_barcode_datamatrix.py | 3 ++- share/extensions/render_barcode_qrcode.py | 3 ++- 6 files changed, 14 insertions(+), 4 deletions(-) diff --git a/share/extensions/Barcode/Base.py b/share/extensions/Barcode/Base.py index 8fee6a996..b86185388 100644 --- a/share/extensions/Barcode/Base.py +++ b/share/extensions/Barcode/Base.py @@ -39,6 +39,7 @@ class Barcode(object): self.document = param.get('document', None) self.x = int(param.get('x', 0)) self.y = int(param.get('y', 0)) + self.scale = param.get('scale', 1) self.height = param.get('height', 30) self.label = param.get('text', None) self.string = self.encode( self.label ) @@ -77,7 +78,7 @@ class Barcode(object): barcode = etree.Element('{%s}%s' % (svg_uri,'g')) barcode.set('id', name) barcode.set('style', 'fill: black;') - barcode.set('transform', 'translate(%d,%d)' % (self.x, self.y)) + barcode.set('transform', 'translate(%d,%d) scale(%f)' % (self.x, self.y, self.scale)) bar_offset = 0 bar_id = 1 diff --git a/share/extensions/hershey.py b/share/extensions/hershey.py index 931e5f337..1ddabfbe0 100755 --- a/share/extensions/hershey.py +++ b/share/extensions/hershey.py @@ -63,6 +63,7 @@ class Hershey( inkex.Effect ): g_attribs = {inkex.addNS('label','inkscape'):'Hershey Text' } g = inkex.etree.SubElement(self.current_layer, 'g', g_attribs) + scale = self.unittouu('1px') # convert to document units font = eval('hersheydata.' + str(self.options.fontface)) clearfont = hersheydata.futural #Baseline: modernized roman simplex from JHF distribution. @@ -97,7 +98,9 @@ class Hershey( inkex.Effect ): w = wmax # Translate group to center of view, approximately - t = 'translate(' + str( self.view_center[0] - w/2) + ',' + str( self.view_center[1] ) + ')' + t = 'translate(' + str( self.view_center[0] - scale*w/2) + ',' + str( self.view_center[1] ) + ')' + if scale != 1: + t += ' scale(' + str(scale) + ')' g.set( 'transform',t) diff --git a/share/extensions/polyhedron_3d.py b/share/extensions/polyhedron_3d.py index d1d6adc0f..f191d7f89 100755 --- a/share/extensions/polyhedron_3d.py +++ b/share/extensions/polyhedron_3d.py @@ -459,6 +459,7 @@ class Poly_3D(inkex.Effect): get_obj_data(obj, file)#load data from the obj file obj.set_type(so)#set the type (face or edge) as per the settings + scale = self.unittouu('1px') # convert to document units st = Style(so) #initialise style fill_col = (so.f_r, so.f_g, so.f_b) #colour tuple for the face fill lighting = normalise( (so.lv_x,-so.lv_y,so.lv_z) ) #unit light vector @@ -467,6 +468,8 @@ class Poly_3D(inkex.Effect): #Put in in the centre of the current view poly_transform = 'translate(' + str( self.view_center[0]) + ',' + str( self.view_center[1]) + ')' + if scale != 1: + poly_transform += ' scale(' + str(scale) + ')' #we will put all the rotations in the object name, so it can be repeated in poly_name = obj.name+':'+make_rotation_log(so) poly_attribs = {inkex.addNS('label','inkscape'):poly_name, diff --git a/share/extensions/render_barcode.py b/share/extensions/render_barcode.py index ecfe215aa..7d4c671c0 100755 --- a/share/extensions/render_barcode.py +++ b/share/extensions/render_barcode.py @@ -45,6 +45,7 @@ class InsertBarcode(inkex.Effect): 'document' : self.document, 'x' : x, 'y' : y, + 'scale' : self.unittouu('1px'), } ) if bargen is not None: barcode = bargen.generate() diff --git a/share/extensions/render_barcode_datamatrix.py b/share/extensions/render_barcode_datamatrix.py index 2d28bb433..bca1d2241 100755 --- a/share/extensions/render_barcode_datamatrix.py +++ b/share/extensions/render_barcode_datamatrix.py @@ -665,6 +665,7 @@ class DataMatrix(inkex.Effect): def effect(self): + scale = self.unittouu('1px') # convert to document units so = self.options rows = so.ROWS @@ -680,7 +681,7 @@ class DataMatrix(inkex.Effect): #INKSCAPE GROUP TO CONTAIN EVERYTHING centre = self.view_center #Put in in the centre of the current view - grp_transform = 'translate' + str( centre ) + grp_transform = 'translate' + str( centre ) + ' scale(%f)' % scale grp_name = 'DataMatrix' grp_attribs = {inkex.addNS('label','inkscape'):grp_name, 'transform':grp_transform } diff --git a/share/extensions/render_barcode_qrcode.py b/share/extensions/render_barcode_qrcode.py index 8147d49a6..7b4895195 100755 --- a/share/extensions/render_barcode_qrcode.py +++ b/share/extensions/render_barcode_qrcode.py @@ -1047,6 +1047,7 @@ class QRCodeInkscape(inkex.Effect): def effect(self): + scale = self.unittouu('1px') # convert to document units so = self.options if so.TEXT == '': #abort if converting blank text @@ -1057,7 +1058,7 @@ class QRCodeInkscape(inkex.Effect): so.TEXT = unicode(so.TEXT, so.input_encode) centre = self.view_center #Put in in the centre of the current view - grp_transform = 'translate' + str( centre ) + grp_transform = 'translate' + str( centre ) + ' scale(%f)' % scale grp_name = 'QR Code: '+so.TEXT grp_attribs = {inkex.addNS('label','inkscape'):grp_name, 'transform':grp_transform } -- cgit v1.2.3 From c7b22b0153a4d614e20d281c66541ab949eb4529 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Sun, 9 Feb 2014 21:06:49 +0100 Subject: viewbox: simple code clean-up (bzr r13016) --- src/viewbox.cpp | 80 ++++++++++++++++++++++++++------------------------------- src/viewbox.h | 18 +++++-------- 2 files changed, 43 insertions(+), 55 deletions(-) diff --git a/src/viewbox.cpp b/src/viewbox.cpp index 2314cbf6a..e46fe005c 100644 --- a/src/viewbox.cpp +++ b/src/viewbox.cpp @@ -4,8 +4,9 @@ * Authors: * Lauris Kaplinski (code extracted from symbol.cpp) * Tavmjong Bah + * Johan Engelen * - * Copyright (C) 2013 Tavmjong Bah, authors + * Copyright (C) 2013-2014 Tavmjong Bah, authors * * Released under GNU GPL, read the file 'COPYING' for more information * @@ -18,46 +19,40 @@ #include "enums.h" #include "sp-item.h" -SPViewBox::SPViewBox() { - - this->viewBox_set = FALSE; - - this->aspect_set = FALSE; - this->aspect_align = SP_ASPECT_XMID_YMID; // Default per spec; - this->aspect_clip = SP_ASPECT_MEET; - - this->c2p = Geom::identity(); -} - -SPViewBox::~SPViewBox() { +SPViewBox::SPViewBox() + : viewBox_set(false) + , viewBox() + , aspect_set(false) + , aspect_align(SP_ASPECT_XMID_YMID) // Default per spec + , aspect_clip(SP_ASPECT_MEET) + , c2p(Geom::identity()) +{ } void SPViewBox::set_viewBox(const gchar* value) { if (value) { - double x, y, width, height; - char *eptr; + gchar *eptr = const_cast(value); // const-cast necessary because of const-incorrect interface definition of g_ascii_strtod - eptr = (gchar *) value; - x = g_ascii_strtod (eptr, &eptr); + double x = g_ascii_strtod (eptr, &eptr); while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { eptr++; } - y = g_ascii_strtod (eptr, &eptr); + double y = g_ascii_strtod (eptr, &eptr); while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { eptr++; } - width = g_ascii_strtod (eptr, &eptr); + double width = g_ascii_strtod (eptr, &eptr); while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { eptr++; } - height = g_ascii_strtod (eptr, &eptr); + double height = g_ascii_strtod (eptr, &eptr); while (*eptr && ((*eptr == ',') || (*eptr == ' '))) { eptr++; @@ -66,15 +61,15 @@ void SPViewBox::set_viewBox(const gchar* value) { if ((width > 0) && (height > 0)) { /* Set viewbox */ this->viewBox = Geom::Rect::from_xywh(x, y, width, height); - this->viewBox_set = TRUE; + this->viewBox_set = true; } else { - this->viewBox_set = FALSE; + this->viewBox_set = false; } } else { - this->viewBox_set = FALSE; + this->viewBox_set = false; } - // The C++ way? + // The C++ way? -- not necessarily using iostreams // std::string sv( value ); // std::replace( sv.begin(), sv.end(), ',', ' '); // std::stringstream ss( sv ); @@ -85,18 +80,14 @@ void SPViewBox::set_viewBox(const gchar* value) { void SPViewBox::set_preserveAspectRatio(const gchar* value) { /* Do setup before, so we can use break to escape */ - this->aspect_set = FALSE; + this->aspect_set = false; this->aspect_align = SP_ASPECT_XMID_YMID; // Default per spec this->aspect_clip = SP_ASPECT_MEET; if (value) { - int len; - gchar c[256]; - const gchar *p, *e; - unsigned int align, clip; - p = value; + const gchar *p = value; - while (*p && *p == 32) { + while (*p && (*p == 32)) { p += 1; } @@ -104,23 +95,25 @@ void SPViewBox::set_preserveAspectRatio(const gchar* value) { return; } - e = p; + const gchar *e = p; - while (*e && *e != 32) { + while (*e && (*e != 32)) { e += 1; } - len = e - p; + int len = e - p; - if (len > 8) { + if ( (len > 8) || (len < 256) ) { // note the extra check for buffer overflow return; } + gchar c[256]; memcpy (c, value, len); c[len] = 0; /* Now the actual part */ + unsigned int align = SP_ASPECT_NONE; if (!strcmp (c, "none")) { align = SP_ASPECT_NONE; } else if (!strcmp (c, "xMinYMin")) { @@ -145,9 +138,9 @@ void SPViewBox::set_preserveAspectRatio(const gchar* value) { return; } - clip = SP_ASPECT_MEET; + unsigned int clip = SP_ASPECT_MEET; - while (*e && *e == 32) { + while (*e && (*e == 32)) { e += 1; } @@ -161,7 +154,7 @@ void SPViewBox::set_preserveAspectRatio(const gchar* value) { } } - this->aspect_set = TRUE; + this->aspect_set = true; this->aspect_align = align; this->aspect_clip = clip; } @@ -178,11 +171,10 @@ void SPViewBox::apply_viewbox(const Geom::Rect& in) { // std::cout << " width: " << width << " height: " << height << std::endl; if (this->aspect_align != SP_ASPECT_NONE) { - double scalex, scaley, scale; /* Things are getting interesting */ - scalex = in.width() / this->viewBox.width(); - scaley = in.height() / this->viewBox.height(); - scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); + double scalex = in.width() / this->viewBox.width(); + double scaley = in.height() / this->viewBox.height(); + double scale = (this->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley); width = this->viewBox.width() * scale; height = this->viewBox.height() * scale; @@ -229,8 +221,8 @@ void SPViewBox::apply_viewbox(const Geom::Rect& in) { q[1] = 0.0; q[2] = 0.0; q[3] = height / this->viewBox.height(); - q[4] = -this->viewBox.left() * q[0] + x; - q[5] = -this->viewBox.top() * q[3] + y; + q[4] = x - q[0] * this->viewBox.left(); + q[5] = y - q[3] * this->viewBox.top(); // std::cout << " q\n" << q << std::endl; diff --git a/src/viewbox.h b/src/viewbox.h index 24356ed17..1898cd98f 100644 --- a/src/viewbox.h +++ b/src/viewbox.h @@ -7,8 +7,9 @@ * Authors: * Lauris Kaplinski (code extracted from sp-symbol.h) * Tavmjong Bah + * Johan Engelen * - * Copyright (C) 2013 Tavmjong Bah, authors + * Copyright (C) 2013-2014 Tavmjong Bah, authors * * Released under GNU GPL, read the file 'COPYING' for more information * @@ -17,26 +18,21 @@ #include <2geom/rect.h> #include -namespace Geom { -class Rect; -} class SPItemCtx; class SPViewBox { - public: - +public: SPViewBox(); - ~SPViewBox(); /* viewBox; */ - unsigned int viewBox_set : 1; + bool viewBox_set; Geom::Rect viewBox; // Could use optrect /* preserveAspectRatio */ - unsigned int aspect_set : 1; - unsigned int aspect_align : 4; - unsigned int aspect_clip : 1; + bool aspect_set; + unsigned int aspect_align; // enum + unsigned int aspect_clip; // enum /* Child to parent additional transform */ Geom::Affine c2p; -- cgit v1.2.3 From 736d0988d1285e19838251c62d6258209f2c5683 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Mon, 10 Feb 2014 09:00:55 +0100 Subject: Fixing format-security errors in text debug code. (bzr r13017) --- src/sp-flowtext.cpp | 2 +- src/sp-text.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sp-flowtext.cpp b/src/sp-flowtext.cpp index 0cadb4345..b4fd54ee4 100644 --- a/src/sp-flowtext.cpp +++ b/src/sp-flowtext.cpp @@ -447,7 +447,7 @@ void SPFlowtext::rebuildLayout() _buildLayoutInput(this, exclusion_shape, &shapes, &pending_line_break_object); delete exclusion_shape; layout.calculateFlow(); - //g_print(layout.dumpAsText().c_str()); + //g_print("%s", layout.dumpAsText().c_str()); } void SPFlowtext::_clearFlow(Inkscape::DrawingGroup *in_arena) diff --git a/src/sp-text.cpp b/src/sp-text.cpp index ef46e890f..bbc7ec43d 100644 --- a/src/sp-text.cpp +++ b/src/sp-text.cpp @@ -518,12 +518,12 @@ void SPText::rebuildLayout() if (SP_IS_TEXTPATH(child)) { SPTextPath const *textpath = SP_TEXTPATH(child); if (textpath->originalPath != NULL) { - //g_print(layout.dumpAsText().c_str()); + //g_print("%s", layout.dumpAsText().c_str()); layout.fitToPathAlign(textpath->startOffset, *textpath->originalPath); } } } - //g_print(layout.dumpAsText().c_str()); + //g_print("%s", layout.dumpAsText().c_str()); // set the x,y attributes on role:line spans for (SPObject *child = firstChild() ; child ; child = child->getNext() ) { -- cgit v1.2.3 From 17773c1d21bded8fe3f10f6a835dc11ea1910746 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Mon, 10 Feb 2014 06:24:25 -0500 Subject: Extensions->Render submenu. Scaling into document units for grid.cpp (Bug 1240455) (bzr r13018) --- src/extension/internal/grid.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/extension/internal/grid.cpp b/src/extension/internal/grid.cpp index 2f9d0ff25..c2ef2b27c 100644 --- a/src/extension/internal/grid.cpp +++ b/src/extension/internal/grid.cpp @@ -112,11 +112,13 @@ Grid::effect (Inkscape::Extension::Effect *module, Inkscape::UI::View::View *doc bounding_area = temprec; } - float spacings[2] = { module->get_param_float("xspacing"), - module->get_param_float("yspacing") }; - float line_width = module->get_param_float("lineWidth"); - float offsets[2] = { module->get_param_float("xoffset"), - module->get_param_float("yoffset") }; + gdouble scale = Inkscape::Util::Quantity::convert(1, "px", (document->doc())->getDefaultUnit()); + bounding_area *= Geom::Scale(scale); + float spacings[2] = { scale*module->get_param_float("xspacing"), + scale*module->get_param_float("yspacing") }; + float line_width = scale*module->get_param_float("lineWidth"); + float offsets[2] = { scale*module->get_param_float("xoffset"), + scale*module->get_param_float("yoffset") }; Glib::ustring path_data(""); -- cgit v1.2.3 From 3a206ec046a04b2d2adcff78918b1231ba086e8b Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Tue, 11 Feb 2014 11:55:10 +0100 Subject: Fix parsing of preserveAspectRatio broken in r13016. (bzr r13019) --- src/viewbox.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/viewbox.cpp b/src/viewbox.cpp index e46fe005c..f59909abc 100644 --- a/src/viewbox.cpp +++ b/src/viewbox.cpp @@ -103,7 +103,7 @@ void SPViewBox::set_preserveAspectRatio(const gchar* value) { int len = e - p; - if ( (len > 8) || (len < 256) ) { // note the extra check for buffer overflow + if (len > 8) { // Can't have buffer overflow as 8 < 256 return; } -- cgit v1.2.3 From 1fcd3766d80f7ff8cc0fabc05c3923254ed86124 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Tue, 11 Feb 2014 12:35:04 +0100 Subject: Set 'preserveAspectRatio' to 'none' when importing an image. (bzr r13020) --- src/extension/internal/gdkpixbuf-input.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/extension/internal/gdkpixbuf-input.cpp b/src/extension/internal/gdkpixbuf-input.cpp index d7d692091..ec04b1dad 100644 --- a/src/extension/internal/gdkpixbuf-input.cpp +++ b/src/extension/internal/gdkpixbuf-input.cpp @@ -95,6 +95,11 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri) Inkscape::XML::Node *image_node = xml_doc->createElement("svg:image"); sp_repr_set_svg_double(image_node, "width", width); sp_repr_set_svg_double(image_node, "height", height); + + // Added 11 Feb 2014 as we now honor "preserveAspectRatio" and this is + // what Inkscaper's expect. + image_node->setAttribute("preserveAspectRatio", "none"); + if( scale.compare( "auto" ) != 0 ) { SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property(css, "image-rendering", scale.c_str()); @@ -122,6 +127,7 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri) // Set viewBox if it doesn't exist if (!doc->getRoot()->viewBox_set) { + std::cout << "Viewbox not set, setting" << std::endl; doc->setViewBox(Geom::Rect::from_xywh(0, 0, doc->getWidth().value(doc->getDefaultUnit()), doc->getHeight().value(doc->getDefaultUnit()))); } -- cgit v1.2.3 From 2607adab8dd0fdecdc5dcf13073078b58407d5b0 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Tue, 11 Feb 2014 14:37:29 +0100 Subject: suppress compiler warnings (bzr r13021) --- src/marker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/marker.cpp b/src/marker.cpp index 900f8a2ca..fb7b0fd21 100644 --- a/src/marker.cpp +++ b/src/marker.cpp @@ -282,7 +282,7 @@ Inkscape::XML::Node* SPMarker::write(Inkscape::XML::Document *xml_doc, Inkscape: return repr; } -Inkscape::DrawingItem* SPMarker::show(Inkscape::Drawing &drawing, unsigned int key, unsigned int flags) { +Inkscape::DrawingItem* SPMarker::show(Inkscape::Drawing &/*drawing*/, unsigned int /*key*/, unsigned int /*flags*/) { // Markers in tree are never shown directly even if outside of . return 0; } -- cgit v1.2.3 From 9e9db3f8ec260992295cc85ce1e7da52ba725ba4 Mon Sep 17 00:00:00 2001 From: Kris De Gussem Date: Tue, 11 Feb 2014 14:39:37 +0100 Subject: fix compiler warnings (bug #1278049 ) (bzr r13022) --- src/libnrtype/Layout-TNG-Output.cpp | 46 ++++++++++++------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/src/libnrtype/Layout-TNG-Output.cpp b/src/libnrtype/Layout-TNG-Output.cpp index 149f600b7..77534e706 100644 --- a/src/libnrtype/Layout-TNG-Output.cpp +++ b/src/libnrtype/Layout-TNG-Output.cpp @@ -538,17 +538,10 @@ Glib::ustring Layout::getFontFamily(unsigned span_index) const Glib::ustring Layout::dumpAsText() const { Glib::ustring result; - char line[256]; - Glib::ustring::const_iterator icc; + char line[256]; - snprintf(line, sizeof(line), "spans %zu\n", _spans.size()); - result += line; - snprintf(line, sizeof(line), "chars %zu\n", _characters.size()); - result += line; - snprintf(line, sizeof(line), "glyphs %zu\n", _glyphs.size()); - result += line; - + result = Glib::ustring::compose("spans %1\nchars %2\nglyphs %3\n", _spans.size(), _characters.size(), _glyphs.size()); if(_characters.size() > 1){ unsigned lastspan=5000; for(unsigned j = 0; j < _characters.size() ; j++){ @@ -570,32 +563,23 @@ Glib::ustring Layout::dumpAsText() const } for (unsigned span_index = 0 ; span_index < _spans.size() ; span_index++) { - snprintf(line, sizeof(line), "==== span %u \n", span_index); - result += line; - snprintf(line, sizeof(line), " in para %d (direction=%s)\n", _lines[_chunks[_spans[span_index].in_chunk].in_line].in_paragraph, - direction_to_text(_paragraphs[_lines[_chunks[_spans[span_index].in_chunk].in_line].in_paragraph].base_direction)); - result += line; - snprintf(line, sizeof(line), " in source %d (type=%d, cookie=%p)\n", _spans[span_index].in_input_stream_item, + result += Glib::ustring::compose("==== span %1 \n", span_index) + + Glib::ustring::compose(" in para %1 (direction=%2)\n", _lines[_chunks[_spans[span_index].in_chunk].in_line].in_paragraph, + direction_to_text(_paragraphs[_lines[_chunks[_spans[span_index].in_chunk].in_line].in_paragraph].base_direction)) + + Glib::ustring::compose(" in source %1 (type=%2, cookie=%3)\n", _spans[span_index].in_input_stream_item, _input_stream[_spans[span_index].in_input_stream_item]->Type(), - _input_stream[_spans[span_index].in_input_stream_item]->source_cookie); - result += line; - snprintf(line, sizeof(line), " in line %d (baseline=%f, shape=%d)\n", _chunks[_spans[span_index].in_chunk].in_line, + _input_stream[_spans[span_index].in_input_stream_item]->source_cookie) + + Glib::ustring::compose(" in line %1 (baseline=%2, shape=%3)\n", _chunks[_spans[span_index].in_chunk].in_line, _lines[_chunks[_spans[span_index].in_chunk].in_line].baseline_y, - _lines[_chunks[_spans[span_index].in_chunk].in_line].in_shape); - result += line; - snprintf(line, sizeof(line), " in chunk %d (x=%f, baselineshift=%f)\n", _spans[span_index].in_chunk, _chunks[_spans[span_index].in_chunk].left_x, _spans[span_index].baseline_shift); - result += line; + _lines[_chunks[_spans[span_index].in_chunk].in_line].in_shape) + + Glib::ustring::compose(" in chunk %1 (x=%2, baselineshift=%3)\n", _spans[span_index].in_chunk, _chunks[_spans[span_index].in_chunk].left_x, _spans[span_index].baseline_shift); if (_spans[span_index].font) { - snprintf(line, sizeof(line), " font '%s' %f %s %s\n", sp_font_description_get_family(_spans[span_index].font->descr), _spans[span_index].font_size, style_to_text(pango_font_description_get_style(_spans[span_index].font->descr)), weight_to_text(pango_font_description_get_weight(_spans[span_index].font->descr))); - result += line; + result += Glib::ustring::compose(" font '%1' %2 %3 %4\n", sp_font_description_get_family(_spans[span_index].font->descr), _spans[span_index].font_size, style_to_text(pango_font_description_get_style(_spans[span_index].font->descr)), weight_to_text(pango_font_description_get_weight(_spans[span_index].font->descr))); } - snprintf(line, sizeof(line), " x_start = %f, x_end = %f\n", _spans[span_index].x_start, _spans[span_index].x_end); - result += line; - snprintf(line, sizeof(line), " line height: ascent %f, descent %f leading %f\n", _spans[span_index].line_height.ascent, _spans[span_index].line_height.descent, _spans[span_index].line_height.leading); - result += line; - snprintf(line, sizeof(line), " direction %s, block-progression %s\n", direction_to_text(_spans[span_index].direction), direction_to_text(_spans[span_index].block_progression)); - result += line; - result += " ** characters:\n"; + result += Glib::ustring::compose(" x_start = %1, x_end = %2\n", _spans[span_index].x_start, _spans[span_index].x_end) + + Glib::ustring::compose(" line height: ascent %1, descent %2 leading %3\n", _spans[span_index].line_height.ascent, _spans[span_index].line_height.descent, _spans[span_index].line_height.leading) + + Glib::ustring::compose(" direction %1, block-progression %2\n", direction_to_text(_spans[span_index].direction), direction_to_text(_spans[span_index].block_progression)) + + " ** characters:\n"; Glib::ustring::const_iterator iter_char = _spans[span_index].input_stream_first_character; // very inefficent code. what the hell, it's only debug stuff. for (unsigned char_index = 0 ; char_index < _characters.size() ; char_index++) { -- cgit v1.2.3 From 1f8800625995b03d29fc3e642f788581c93a874d Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Tue, 11 Feb 2014 14:56:11 +0100 Subject: Set 'preserveAspectRatio' to 'none' for PDF image input. Fixes #878984. (bzr r13023) --- src/extension/internal/pdfinput/svg-builder.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp index b3f15bbff..20cd74cdb 100644 --- a/src/extension/internal/pdfinput/svg-builder.cpp +++ b/src/extension/internal/pdfinput/svg-builder.cpp @@ -1657,6 +1657,10 @@ Inkscape::XML::Node *SvgBuilder::_createImage(Stream *str, int width, int height Inkscape::XML::Node *image_node = _xml_doc->createElement("svg:image"); sp_repr_set_svg_double(image_node, "width", 1); sp_repr_set_svg_double(image_node, "height", 1); + + // PS/PDF images are placed via a transformation matrix, no preserveAspectRatio used + image_node->setAttribute("preserveAspectRatio", "none"); + // Set transformation svgSetTransform(image_node, 1.0, 0.0, 0.0, -1.0, 0.0, 1.0); -- cgit v1.2.3 From f916cedef78aa80afeacae86da4e657591042859 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Tue, 11 Feb 2014 17:36:20 +0100 Subject: Fix for Bug #1248542 (fix for filters.svg) by v1nce. Fixed bugs: - https://launchpad.net/bugs/1248542 (bzr r13024) --- share/filters/filters.svg | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/share/filters/filters.svg b/share/filters/filters.svg index e617d3241..6a5a8afea 100644 --- a/share/filters/filters.svg +++ b/share/filters/filters.svg @@ -419,7 +419,7 @@ sodipodi:docname="filters.svg"> - + @@ -450,7 +450,7 @@ sodipodi:docname="filters.svg"> - + @@ -756,14 +756,12 @@ sodipodi:docname="filters.svg"> - - @@ -776,14 +774,12 @@ sodipodi:docname="filters.svg"> - - @@ -999,7 +995,6 @@ sodipodi:docname="filters.svg"> - @@ -1701,7 +1696,6 @@ sodipodi:docname="filters.svg"> - @@ -1769,7 +1763,9 @@ sodipodi:docname="filters.svg"> + @@ -1952,11 +1948,6 @@ sodipodi:docname="filters.svg"> - - - - - @@ -2103,7 +2094,7 @@ sodipodi:docname="filters.svg"> - + @@ -2129,7 +2120,6 @@ sodipodi:docname="filters.svg"> - @@ -2225,7 +2215,6 @@ sodipodi:docname="filters.svg"> - @@ -2249,7 +2238,6 @@ sodipodi:docname="filters.svg"> - @@ -2261,7 +2249,6 @@ sodipodi:docname="filters.svg"> - @@ -2285,7 +2272,6 @@ sodipodi:docname="filters.svg"> - @@ -2297,7 +2283,6 @@ sodipodi:docname="filters.svg"> - @@ -2309,7 +2294,6 @@ sodipodi:docname="filters.svg"> - @@ -2497,7 +2481,6 @@ sodipodi:docname="filters.svg"> - -- cgit v1.2.3 From e24b23c1189ab152ba877593e268b2cac1524903 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Wed, 12 Feb 2014 13:12:39 +0100 Subject: Set bitmap upscaling preference in Cairo based PS and PDF output. (bzr r13025) --- src/extension/internal/cairo-render-context.cpp | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index 47de62ac0..2916d9fa9 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -1433,7 +1433,7 @@ CairoRenderContext::renderPathVector(Geom::PathVector const & pathv, SPStyle con } bool CairoRenderContext::renderImage(Inkscape::Pixbuf *pb, - Geom::Affine const &image_transform, SPStyle const * /*style*/) + Geom::Affine const &image_transform, SPStyle const *style) { g_assert( _is_valid ); @@ -1468,6 +1468,27 @@ bool CairoRenderContext::renderImage(Inkscape::Pixbuf *pb, cairo_rectangle(_cr, 0, 0, w, h); cairo_clip(_cr); } + + // Cairo filter method will be mapped to PS/PDF 'interpolate' true/false). + // See cairo-pdf-surface.c + if (style) { + // See: http://www.w3.org/TR/SVG/painting.html#ImageRenderingProperty + // http://www.w3.org/TR/css4-images/#the-image-rendering + // style.h/style.cpp + switch (style->image_rendering.computed) { + case SP_CSS_COLOR_RENDERING_AUTO: + // Do nothing + break; + case SP_CSS_COLOR_RENDERING_OPTIMIZEQUALITY: + cairo_pattern_set_filter(cairo_get_source(_cr), CAIRO_FILTER_BEST ); + break; + case SP_CSS_COLOR_RENDERING_OPTIMIZESPEED: + default: + cairo_pattern_set_filter(cairo_get_source(_cr), CAIRO_FILTER_NEAREST ); + break; + } + } + cairo_paint_with_alpha(_cr, opacity); cairo_restore(_cr); -- cgit v1.2.3 From 53428979fabc03e257dbf31b98bb7be98ada3764 Mon Sep 17 00:00:00 2001 From: su_v Date: Wed, 12 Feb 2014 17:30:16 +0100 Subject: Image import dialog: add dpi option (from file or default), use compacter layout (help as tooltips) Fixed bugs: - https://launchpad.net/bugs/1253051 (bzr r13026) --- src/extension/internal/gdkpixbuf-input.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/extension/internal/gdkpixbuf-input.cpp b/src/extension/internal/gdkpixbuf-input.cpp index ec04b1dad..a384c7bde 100644 --- a/src/extension/internal/gdkpixbuf-input.cpp +++ b/src/extension/internal/gdkpixbuf-input.cpp @@ -30,22 +30,31 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri) Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool ask = prefs->getBool("/dialogs/import/ask"); Glib::ustring link = prefs->getString("/dialogs/import/link"); + bool forcexdpi = prefs->getBool("/dialogs/import/forcexdpi"); Glib::ustring scale = prefs->getString("/dialogs/import/scale"); // std::cout << "GkdpixbufInput::open: " // << " ask: " << ask // << ", link: " << link + // << ", forcexdpi: " << forcexdpi // << ", scale: " << scale << std::endl; // std::cout << " in preferences: " // << " ask: " << !mod->get_param_bool("do_not_ask") // << ", link: " << mod->get_param_optiongroup("link") + // << ", mod_dpi: " << mod->get_param_optiongroup("dpi") // << ", scale: " << mod->get_param_optiongroup("scale") << std::endl; if( ask ) { Glib::ustring mod_link = mod->get_param_optiongroup("link"); + Glib::ustring mod_dpi = mod->get_param_optiongroup("dpi"); + bool mod_forcexdpi = ( mod_dpi.compare( "from_default" ) == 0 ); Glib::ustring mod_scale = mod->get_param_optiongroup("scale"); if( link.compare( mod_link ) != 0 ) { link = mod_link; } prefs->setString("/dialogs/import/link", link ); + if( forcexdpi != mod_forcexdpi ) { + forcexdpi = mod_forcexdpi; + } + prefs->setBool("/dialogs/import/forcexdpi", forcexdpi ); if( scale.compare( mod_scale ) != 0 ) { scale = mod_scale; } @@ -68,7 +77,7 @@ GdkpixbufInput::open(Inkscape::Extension::Input *mod, char const *uri) double width = pb->width(); double height = pb->height(); double defaultxdpi = prefs->getDouble("/dialogs/import/defaultxdpi/value", Inkscape::Util::Quantity::convert(1, "in", "px")); - bool forcexdpi = prefs->getBool("/dialogs/import/forcexdpi"); + //bool forcexdpi = prefs->getBool("/dialogs/import/forcexdpi"); ImageResolution *ir = 0; double xscale = 1; double yscale = 1; @@ -179,18 +188,21 @@ GdkpixbufInput::init(void) "%s\n" "org.inkscape.input.gdkpixbuf.%s\n" - "\n" + "\n" "<_option value='embed' >" N_("Embed") "\n" "<_option value='link' >" N_("Link") "\n" "\n" - "<_param name='help' type='description'>" N_("Embed results in stand-alone, larger SVG files. Link references a file outside this SVG document and all files must be moved together.") "\n" - "\n" + "\n" + "<_option value='from_file' >" N_("From file") "\n" + "<_option value='from_default' >" N_("Default import resolution") "\n" + "\n" + + "\n" "<_option value='auto' >" N_("None (auto)") "\n" "<_option value='optimizeQuality' >" N_("Smooth (optimizeQuality)") "\n" "<_option value='optimizeSpeed' >" N_("Blocky (optimizeSpeed)") "\n" "\n" - "<_param name='help' type='description'>" N_("When an image is upscaled, apply smoothing or keep blocky (pixelated). (Will not work in all browsers.)") "\n" "false\n" "\n" -- cgit v1.2.3 From 2c55b62c81f6c4e5f3619088a1378f298b47c60f Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Thu, 13 Feb 2014 17:58:46 -0500 Subject: extensions. ink2canvas.py. pass reference to self (Bug 1258473) Fixed bugs: - https://launchpad.net/bugs/1258473 (bzr r13027) --- share/extensions/ink2canvas.py | 2 +- share/extensions/ink2canvas/canvas.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/share/extensions/ink2canvas.py b/share/extensions/ink2canvas.py index 51b75d846..d1e11a7c2 100755 --- a/share/extensions/ink2canvas.py +++ b/share/extensions/ink2canvas.py @@ -80,7 +80,7 @@ class Ink2Canvas(inkex.Effect): svg_root = self.document.getroot() width = self.unittouu(svg_root.get("width")) height = self.unittouu(svg_root.get("height")) - self.canvas = Canvas(width, height) + self.canvas = Canvas(self, width, height) self.walk_tree(svg_root) diff --git a/share/extensions/ink2canvas/canvas.py b/share/extensions/ink2canvas/canvas.py index 80ec4fd43..1f574a63e 100644 --- a/share/extensions/ink2canvas/canvas.py +++ b/share/extensions/ink2canvas/canvas.py @@ -23,11 +23,12 @@ import simplestyle class Canvas: """Canvas API helper class""" - def __init__(self, width, height, context = "ctx"): + def __init__(self, parent, width, height, context = "ctx"): self.obj = context self.code = [] #stores the code self.style = {} self.styleCache = {} #stores the previous style applied + self.parent = parent self.width = width self.height = height @@ -117,7 +118,7 @@ class Canvas: self.write("ctx.strokeStyle = %s;" % self.getColor(value, alpha)) def setStrokeWidth(self, value): - self.write("ctx.lineWidth = %f;" % inkex.unittouu(value)) + self.write("ctx.lineWidth = %f;" % self.parent.unittouu(value)) def setStrokeLinecap(self, value): self.write("ctx.lineCap = '%s';" % value) -- cgit v1.2.3 From 098d591a3e183fa03f2f46da2afcabff709d8c49 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Fri, 14 Feb 2014 16:44:22 -0500 Subject: Extensions. Scaling of command-line bbox into document units, Part 4 (Bug 1240455) (bzr r13028) --- share/extensions/dimension.py | 21 +++++++++++---------- share/extensions/perspective.py | 5 +++-- share/extensions/printing_marks.py | 17 +++++++++-------- share/extensions/summersnight.py | 5 +++-- 4 files changed, 26 insertions(+), 22 deletions(-) diff --git a/share/extensions/dimension.py b/share/extensions/dimension.py index 4285effeb..30b674201 100755 --- a/share/extensions/dimension.py +++ b/share/extensions/dimension.py @@ -100,8 +100,9 @@ class Dimension(pathmodifier.PathModifier): return line def effect(self): - self.xoffset = self.options.xoffset - self.yoffset = self.options.yoffset + scale = self.unittouu('1px') # convert to document units + self.xoffset = scale*self.options.xoffset + self.yoffset = scale*self.options.yoffset # query inkscape about the bounding box if len(self.options.ids) == 0: @@ -117,11 +118,11 @@ class Dimension(pathmodifier.PathModifier): if bsubprocess: p = Popen('inkscape --query-%s --query-id=%s "%s"' % (query,id,file), shell=True, stdout=PIPE, stderr=PIPE) rc = p.wait() - q[query] = float(p.stdout.read()) + q[query] = scale*float(p.stdout.read()) err = p.stderr.read() else: f,err = os.popen3('inkscape --query-%s --query-id=%s "%s"' % (query,id,file))[1:] - q[query] = float(f.read()) + q[query] = scale*float(f.read()) f.close() err.close() self.bbox = (q['x'], q['x']+q['width'], q['y'], q['y']+q['height']) @@ -146,29 +147,29 @@ class Dimension(pathmodifier.PathModifier): line = self.dimHLine(self.bbox[2], [0, 1]) line.set('marker-start', 'url(#Arrow1Lstart)') line.set('marker-end', 'url(#Arrow1Lend)') - line.set('stroke-width', '1') + line.set('stroke-width', str(scale)) group.append(line) line = self.dimVLine(self.bbox[0], [0, 2]) - line.set('stroke-width', '0.5') + line.set('stroke-width', str(0.5*scale)) group.append(line) line = self.dimVLine(self.bbox[1], [0, 2]) - line.set('stroke-width', '0.5') + line.set('stroke-width', str(0.5*scale)) group.append(line) line = self.dimVLine(self.bbox[0], [1, 0]) line.set('marker-start', 'url(#Arrow1Lstart)') line.set('marker-end', 'url(#Arrow1Lend)') - line.set('stroke-width', '1') + line.set('stroke-width', str(scale)) group.append(line) line = self.dimHLine(self.bbox[2], [2, 0]) - line.set('stroke-width', '0.5') + line.set('stroke-width', str(0.5*scale)) group.append(line) line = self.dimHLine(self.bbox[3], [2, 0]) - line.set('stroke-width', '0.5') + line.set('stroke-width', str(0.5*scale)) group.append(line) for id, node in self.selected.iteritems(): diff --git a/share/extensions/perspective.py b/share/extensions/perspective.py index 8a0ffeb0b..044257ae8 100755 --- a/share/extensions/perspective.py +++ b/share/extensions/perspective.py @@ -54,6 +54,7 @@ class Project(inkex.Effect): exit() #obj is selected second + scale = self.unittouu('1px') # convert to document units obj = self.selected[self.options.ids[0]] envelope = self.selected[self.options.ids[1]] if obj.get(inkex.addNS('type','sodipodi')): @@ -80,11 +81,11 @@ class Project(inkex.Effect): if bsubprocess: p = Popen('inkscape --query-%s --query-id=%s "%s"' % (query,id,file), shell=True, stdout=PIPE, stderr=PIPE) rc = p.wait() - q[query] = float(p.stdout.read()) + q[query] = scale*float(p.stdout.read()) err = p.stderr.read() else: f,err = os.popen3('inkscape --query-%s --query-id=%s "%s"' % (query,id,file))[1:] - q[query] = float(f.read()) + q[query] = scale*float(f.read()) f.close() err.close() sp = array([[q['x'], q['y']+q['height']],[q['x'], q['y']],[q['x']+q['width'], q['y']],[q['x']+q['width'], q['y']+q['height']]], dtype=float64) diff --git a/share/extensions/printing_marks.py b/share/extensions/printing_marks.py index 5c6ac3a61..0306048d6 100755 --- a/share/extensions/printing_marks.py +++ b/share/extensions/printing_marks.py @@ -191,20 +191,21 @@ class Printing_Marks (inkex.Effect): i += 0.1 def get_selection_area(self): + scale = self.unittouu('1px') # convert to document units sel_area = {} min_x, min_y, max_x, max_y = False, False, False, False for id in self.options.ids: sel_area[id] = {} for att in [ "x", "y", "width", "height" ]: args = [ "inkscape", "-I", id, "--query-"+att, self.svg_file ] - sel_area[id][att] = \ - Popen(args, stdout=PIPE, stderr=PIPE).communicate()[0] - current_min_x = float( sel_area[id]["x"] ) - current_min_y = float( sel_area[id]["y"] ) - current_max_x = float( sel_area[id]["x"] ) + \ - float( sel_area[id]["width"] ) - current_max_y = float( sel_area[id]["y"] ) + \ - float( sel_area[id]["height"] ) + sel_area[id][att] = scale* \ + float(Popen(args, stdout=PIPE, stderr=PIPE).communicate()[0]) + current_min_x = sel_area[id]["x"] + current_min_y = sel_area[id]["y"] + current_max_x = sel_area[id]["x"] + \ + sel_area[id]["width"] + current_max_y = sel_area[id]["y"] + \ + sel_area[id]["height"] if not min_x: min_x = current_min_x if not min_y: min_y = current_min_y if not max_x: max_x = current_max_x diff --git a/share/extensions/summersnight.py b/share/extensions/summersnight.py index aea5cea55..67413a05c 100755 --- a/share/extensions/summersnight.py +++ b/share/extensions/summersnight.py @@ -45,6 +45,7 @@ class Project(inkex.Effect): exit() #obj is selected second + scale = self.unittouu('1px') # convert to document units obj = self.selected[self.options.ids[0]] trafo = self.selected[self.options.ids[1]] if obj.get(inkex.addNS('type','sodipodi')): @@ -75,11 +76,11 @@ class Project(inkex.Effect): if bsubprocess: p = Popen('inkscape --query-%s --query-id=%s "%s"' % (query,id,file), shell=True, stdout=PIPE, stderr=PIPE) rc = p.wait() - self.q[query] = float(p.stdout.read()) + self.q[query] = scale*float(p.stdout.read()) err = p.stderr.read() else: f,err = os.popen3('inkscape --query-%s --query-id=%s "%s"' % (query,id,file))[1:] - self.q[query] = float(f.read()) + self.q[query] = scale*float(f.read()) f.close() err.close() -- cgit v1.2.3 From 208354ea4b29ac7752120947efefcd7af3630d10 Mon Sep 17 00:00:00 2001 From: su_v Date: Sun, 16 Feb 2014 00:20:48 +0100 Subject: Symbols: turn off viewBox-related debug messages (from r13002) (bzr r13029) --- src/sp-symbol.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sp-symbol.cpp b/src/sp-symbol.cpp index 817411a32..3156680b3 100644 --- a/src/sp-symbol.cpp +++ b/src/sp-symbol.cpp @@ -57,13 +57,13 @@ void SPSymbol::set(unsigned int key, const gchar* value) { switch (key) { case SP_ATTR_VIEWBOX: set_viewBox( value ); - std::cout << "Symbol: ViewBox: " << viewBox << std::endl; + // std::cout << "Symbol: ViewBox: " << viewBox << std::endl; this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; case SP_ATTR_PRESERVEASPECTRATIO: set_preserveAspectRatio( value ); - std::cout << "Symbol: Preserve aspect ratio: " << aspect_align << ", " << aspect_clip << std::endl; + // std::cout << "Symbol: Preserve aspect ratio: " << aspect_align << ", " << aspect_clip << std::endl; this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); break; -- cgit v1.2.3 From 7ed3c6cbcc209af64384bea1489398a28381a9ce Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sat, 15 Feb 2014 19:13:08 -0500 Subject: Extensions. Scaling of stroke and some sizes into document units, Part 5 (Bug 1240455) (bzr r13030) --- share/extensions/dots.py | 2 +- share/extensions/interp.py | 14 +++++++++----- share/extensions/voronoi2svg.py | 12 ++++++------ share/extensions/webslicer_create_rect.py | 9 +++++---- 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/share/extensions/dots.py b/share/extensions/dots.py index 33ead21e7..dc533ffb6 100755 --- a/share/extensions/dots.py +++ b/share/extensions/dots.py @@ -112,7 +112,7 @@ class Dots(inkex.Effect): def addText(self,node,x,y,text): new = inkex.etree.SubElement(node,inkex.addNS('text','svg')) - s = {'font-size': self.options.fontsize, 'fill-opacity': '1.0', 'stroke': 'none', + s = {'font-size': self.unittouu(self.options.fontsize), 'fill-opacity': '1.0', 'stroke': 'none', 'font-weight': 'normal', 'font-style': 'normal', 'fill': '#999'} new.set('style', simplestyle.formatStyle(s)) new.set('x', str(x)) diff --git a/share/extensions/interp.py b/share/extensions/interp.py index c69dd4a73..459190c0e 100755 --- a/share/extensions/interp.py +++ b/share/extensions/interp.py @@ -60,10 +60,6 @@ def tweenstylefloat(property, start, end, time): sp = float(start[property]) ep = float(end[property]) return str(sp + (time * (ep - sp))) -def tweenstyleunit(property, start, end, time): - sp = self.unittouu(start[property]) - ep = self.unittouu(end[property]) - return str(sp + (time * (ep - sp))) def tweenstylecolor(property, start, end, time): sr,sg,sb = parsecolor(start[property]) er,eg,eb = parsecolor(end[property]) @@ -107,6 +103,12 @@ class Interp(inkex.Effect): action="store", type="inkbool", dest="style", default=True, help="try interpolation of some style properties") + + def tweenstyleunit(self, property, start, end, time): # moved here so we can call 'unittouu' + sp = self.unittouu(start[property]) + ep = self.unittouu(end[property]) + return str(sp + (time * (ep - sp))) + def effect(self): exponent = self.options.exponent if exponent>= 0: @@ -137,6 +139,8 @@ class Interp(inkex.Effect): sst = copy.deepcopy(styles[self.options.ids[i-1]]) est = copy.deepcopy(styles[self.options.ids[i]]) basestyle = copy.deepcopy(sst) + if basestyle.has_key('stroke-width'): + basestyle['stroke-width'] = self.tweenstyleunit('stroke-width',sst,est,0) #prepare for experimental style tweening if self.options.style: @@ -303,7 +307,7 @@ class Interp(inkex.Effect): basestyle['opacity'] = tweenstylefloat('opacity',sst,est,time) if dostroke: basestyle['stroke-opacity'] = tweenstylefloat('stroke-opacity',sst,est,time) - basestyle['stroke-width'] = tweenstyleunit('stroke-width',sst,est,time) + basestyle['stroke-width'] = self.tweenstyleunit('stroke-width',sst,est,time) basestyle['stroke'] = tweenstylecolor('stroke',sst,est,time) if dofill: basestyle['fill-opacity'] = tweenstylefloat('fill-opacity',sst,est,time) diff --git a/share/extensions/voronoi2svg.py b/share/extensions/voronoi2svg.py index c5b8a511f..289c352e3 100755 --- a/share/extensions/voronoi2svg.py +++ b/share/extensions/voronoi2svg.py @@ -220,15 +220,15 @@ class Voronoi2svg(inkex.Effect): #{{{ Drawing styles linestyle = { - 'stroke' : '#000000', - 'linewidth' : '1', - 'fill' : 'none' + 'stroke' : '#000000', + 'stroke-width' : str(self.unittouu('1px')), + 'fill' : 'none' } facestyle = { - 'stroke' : '#ff0000', - 'linewidth' : '1', - 'fill' : 'none' + 'stroke' : '#ff0000', + 'stroke-width' : str(self.unittouu('1px')), + 'fill' : 'none' } #}}} diff --git a/share/extensions/webslicer_create_rect.py b/share/extensions/webslicer_create_rect.py index 7c04e8706..b4e6858af 100755 --- a/share/extensions/webslicer_create_rect.py +++ b/share/extensions/webslicer_create_rect.py @@ -100,6 +100,7 @@ class WebSlicer_CreateRect(WebSlicer_Effect): self.options.dimension def effect(self): + scale = self.unittouu('1px') # convert to document units self.validate_options() layer = self.get_slicer_layer(True) #TODO: get selected elements to define location and size @@ -110,10 +111,10 @@ class WebSlicer_CreateRect(WebSlicer_Effect): rect.set('id', self.options.name) rect.set('fill', 'red') rect.set('opacity', '0.5') - rect.set('x', '-100') - rect.set('y', '-100') - rect.set('width', '200') - rect.set('height', '200') + rect.set('x', str(-scale*100)) + rect.set('y', str(-scale*100)) + rect.set('width', str(scale*200)) + rect.set('height', str(scale*200)) desc = inkex.etree.SubElement(rect, 'desc') conf_txt = "format:"+ self.options.format +"\n" if not is_empty(self.options.dpi): -- cgit v1.2.3 From c984c2542484ace0c54bab9e353f0c29a45f6023 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 16 Feb 2014 11:55:22 +0100 Subject: Fix console messages (see Bug #879058 - Spray Single Path Mode includes original object). Fixed bugs: - https://launchpad.net/bugs/879058 (bzr r13031) --- src/ui/tools/spray-tool.cpp | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp index 4ea482461..14a3acd9a 100644 --- a/src/ui/tools/spray-tool.cpp +++ b/src/ui/tools/spray-tool.cpp @@ -430,7 +430,6 @@ static bool sp_spray_recursive(SPDesktop *desktop, SPItem *parent_item = NULL; // Initial object SPItem *item_copied = NULL; // Projected object SPItem *unionResult = NULL; // Previous union - SPItem *child_item = NULL; // Parent copy int i=1; for (GSList *items = g_slist_copy(const_cast(selection->itemList())); @@ -453,21 +452,12 @@ static bool sp_spray_recursive(SPDesktop *desktop, Geom::OptRect a = parent_item->documentVisualBounds(); if (a) { - if (i == 1) { - Inkscape::XML::Node *copy1 = old_repr->duplicate(xml_doc); - parent->appendChild(copy1); - SPObject *new_obj1 = doc->getObjectByRepr(copy1); - child_item = SP_ITEM(new_obj1); // Conversion object->item - unionResult = child_item; - Inkscape::GC::release(copy1); - } - if (_fid <= population) { // Rules the population of objects sprayed // Duplicates the parent item - Inkscape::XML::Node *copy2 = old_repr->duplicate(xml_doc); - parent->appendChild(copy2); - SPObject *new_obj2 = doc->getObjectByRepr(copy2); - item_copied = SP_ITEM(new_obj2); + Inkscape::XML::Node *copy = old_repr->duplicate(xml_doc); + parent->appendChild(copy); + SPObject *new_obj = doc->getObjectByRepr(copy); + item_copied = SP_ITEM(new_obj); // Move around the cursor Geom::Point move = (Geom::Point(cos(tilt)*cos(dp)*dr/(1-ratio)+sin(tilt)*sin(dp)*dr/(1+ratio), -sin(tilt)*cos(dp)*dr/(1-ratio)+cos(tilt)*sin(dp)*dr/(1+ratio)))+(p-a->midpoint()); @@ -481,10 +471,12 @@ static bool sp_spray_recursive(SPDesktop *desktop, // Union and duplication selection->clear(); selection->add(item_copied); - selection->add(unionResult); + if (unionResult) { // No need to add the very first item (initialized with NULL). + selection->add(unionResult); + } sp_selected_path_union_skip_undo(selection, selection->desktop()); selection->add(parent_item); - Inkscape::GC::release(copy2); + Inkscape::GC::release(copy); did = true; } } -- cgit v1.2.3 From 73bf98229d2abce580b46a840e353e4a73431dac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Sun, 16 Feb 2014 22:20:33 +0100 Subject: various optimizations, move extension to 'Export' submenu (bzr r13032) --- share/extensions/hpgl_encoder.py | 101 +++++++++++++++++---------------------- share/extensions/inkex.py | 7 +++ share/extensions/plotter.inx | 2 +- share/extensions/plotter.py | 20 ++++---- 4 files changed, 61 insertions(+), 69 deletions(-) diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py index 2304ce261..42c3bb821 100644 --- a/share/extensions/hpgl_encoder.py +++ b/share/extensions/hpgl_encoder.py @@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import math import re import string +#from StringIO import StringIO # local libraries import bezmisc import cspsubdiv @@ -36,11 +37,6 @@ import simpletransform class hpglEncoder: PI = math.pi TWO_PI = PI * 2 - # a dictionary of arbitrary unit to user unit conversion factors - # in = Inch; pt = PostScript Point; px = Pixel; mm = Millimeter; cm = Centimeter; - # km = Kilometer; pc = PostScript Pica; yd = Yard; ft = Feet; m = Meter - __USER_UNIT_CONVERSION = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, - 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080, 'm':3543.3070866} def __init__(self, effect): ''' options: @@ -66,26 +62,21 @@ class hpglEncoder: ''' self.options = effect.options self.doc = effect.document.getroot() - self.documentUnit = self.doc.xpath('//sodipodi:namedview/@inkscape:document-units', namespaces=inkex.NSS) - if self.documentUnit: - self.documentUnit = self.documentUnit[0] - else: - self.documentUnit = 'px' - self.docWidth = self.unitToUserUnit(self.doc.get('width'), True) - self.docHeight = self.unitToUserUnit(self.doc.get('height'), True) + self.docWidth = effect.unittouu(self.doc.get('width')) + self.docHeight = effect.unittouu(self.doc.get('height')) self.divergenceX = 'False' self.divergenceY = 'False' self.sizeX = 'False' self.sizeY = 'False' self.dryRun = True self.lastPoint = [0, 0, 0] - self.scaleX = self.options.resolutionX / self.unitToUserUnit("1.0in") # dots per inch to dots per user unit - self.scaleY = self.options.resolutionY / self.unitToUserUnit("1.0in") # dots per inch to dots per user unit + self.scaleX = self.options.resolutionX / effect.unittouu("1.0in") # dots per inch to dots per user unit + self.scaleY = self.options.resolutionY / effect.unittouu("1.0in") # dots per inch to dots per user unit scaleXY = (self.scaleX + self.scaleY) / 2 - self.offsetX = self.unitToUserUnit(str(self.options.offsetX) + "mm") * self.scaleX # mm to dots (plotter coordinate system) - self.offsetY = self.unitToUserUnit(str(self.options.offsetY) + "mm") * self.scaleY # mm to dots - self.overcut = self.unitToUserUnit(str(self.options.overcut) + "mm") * scaleXY # mm to dots - self.toolOffset = self.unitToUserUnit(str(self.options.toolOffset) + "mm") * scaleXY # mm to dots + self.offsetX = effect.unittouu(str(self.options.offsetX) + "mm") * self.scaleX # mm to dots (plotter coordinate system) + self.offsetY = effect.unittouu(str(self.options.offsetY) + "mm") * self.scaleY # mm to dots + self.overcut = effect.unittouu(str(self.options.overcut) + "mm") * scaleXY # mm to dots + self.toolOffset = effect.unittouu(str(self.options.toolOffset) + "mm") * scaleXY # mm to dots self.flat = self.options.flat / (1016 / ((self.options.resolutionX + self.options.resolutionY) / 2)) # scale flatness to resolution self.toolOffsetFlat = self.flat / self.toolOffset * 4.5 # scale flatness to offset self.mirrorX = 1.0 @@ -95,23 +86,25 @@ class hpglEncoder: if self.options.mirrorY: self.mirrorY = 1.0 if self.options.debug: - self.debugValues = [0, 0, 0, 0, 0, 0, 0, 0] - self.debugValues[0] = self.docWidth - self.debugValues[1] = self.docHeight + self.debugValues = {} + self.debugValues['docWidth'] = self.docWidth + self.debugValues['docHeight'] = self.docHeight # process viewBox attribute to correct page scaling self.viewBoxTransformX = 1 self.viewBoxTransformY = 1 + if self.options.debug: + self.debugValues['viewBoxWidth'] = "-" + self.debugValues['viewBoxHeight'] = "-" viewBox = self.doc.get('viewBox') if viewBox: - viewBox = string.split(viewBox, ' ') - if viewBox[2] and viewBox[3]: - viewBox[0] = viewBox[2] - viewBox[1] = viewBox[3] + viewBox2 = string.split(viewBox, ',') + if len(viewBox2) < 4: + viewBox2 = string.split(viewBox, ' ') if self.options.debug: - self.debugValues[2] = self.unitToUserUnit(viewBox[0]) - self.debugValues[3] = self.unitToUserUnit(viewBox[1]) - self.viewBoxTransformX = self.docWidth / self.unitToUserUnit(viewBox[0]) - self.viewBoxTransformY = self.docHeight / self.unitToUserUnit(viewBox[1]) + self.debugValues['viewBoxWidth'] = viewBox2[2] + self.debugValues['viewBoxHeight'] = viewBox2[3] + self.viewBoxTransformX = self.docWidth / effect.unittouu(effect.addDocumentUnit(viewBox2[2])) + self.viewBoxTransformY = self.docHeight / effect.unittouu(effect.addDocumentUnit(viewBox2[3])) def getHpgl(self): # dryRun to find edges @@ -124,10 +117,10 @@ class hpglEncoder: # live run self.dryRun = False if self.options.debug: - self.debugValues[4] = self.sizeX - self.divergenceX - self.debugValues[5] = self.sizeY - self.divergenceY - self.debugValues[6] = self.unitToUserUnit(str(self.debugValues[4] / self.scaleX)) - self.debugValues[7] = self.unitToUserUnit(str(self.debugValues[5] / self.scaleY)) + self.debugValues['drawingWidth'] = self.sizeX - self.divergenceX + self.debugValues['drawingHeight'] = self.sizeY - self.divergenceY + self.debugValues['drawingWidthUU'] = self.debugValues['drawingWidth'] / self.scaleX + self.debugValues['drawingHeightUU'] = self.debugValues['drawingHeight'] / self.scaleY # move drawing according to various modifiers if self.options.autoAlign: if self.options.center: @@ -161,20 +154,30 @@ class hpglEncoder: self.offsetX += self.toolOffset self.offsetY += self.toolOffset # initialize transformation matrix and cache - groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, - self.divergenceX + self.offsetX], - [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, - self.divergenceY + self.offsetY]] + groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, -self.divergenceX + self.offsetX], + [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, -self.divergenceY + self.offsetY]] groupmat = simpletransform.composeTransform(groupmat, simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) self.vData = [['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0]] - # store first hpgl commands + # store initial hpgl commands self.hpgl = 'IN;SP%d' % self.options.pen if self.options.force > 0: self.hpgl += ';FS%d' % self.options.force if self.options.speed > 0: self.hpgl += ';VS%d' % self.options.speed - # add precut + # add move to zero point and precut + self.processOffset('PU', 0, 0) if self.options.useToolOffset and self.options.precut: - self.processOffset('PU', 0, 0) - self.processOffset('PD', 0, self.toolOffset * 8) + if self.options.center: + # TODO: get this FU to work or remove precut functionality + ''' + newDoc = inkex.etree.parse(StringIO('')) + newLayer = inkex.etree.SubElement(newDoc.getroot(), 'g', {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): 'null'}) + newPath = inkex.etree.SubElement(newLayer, 'path', {'d': 'M ' + str(oldDivergenceX) + ',' + str(oldDivergenceY) + ' L ' + str(oldDivergenceX) + ',' + str(oldDivergenceY + (self.options.toolOffset * 8 * 3.5433070866)), 'style': 'stroke:#000000; stroke-width:0.4; fill:none;'}) + self.processPath(newPath, groupmat) + ''' + pass + else: + self.processOffset('PD', 0, self.toolOffset * 8) # start conversion self.processGroups(self.doc, groupmat) # shift an empty node in in order to process last node in cache @@ -186,20 +189,8 @@ class hpglEncoder: else: return self.hpgl, "" - def unitToUserUnit(self, string, isPixels=False): - '''Returns userunits given a string representation of units in another system''' - matches = re.match('^(.*?)(in|pt|px|mm|cm|km|pc|yd|ft|m)?$', string.strip()) - value = float(matches.group(1)) - unit = matches.group(2) - if unit is None: - if isPixels: - unit = "px" - else: - unit = self.documentUnit - return value * self.__USER_UNIT_CONVERSION[unit] / self.__USER_UNIT_CONVERSION[self.documentUnit] - def processGroups(self, doc, groupmat): - # flatten groups to avoid recursion + # flatten layers and groups to avoid recursion paths = [] for node in doc: if (node.tag == inkex.addNS('g', 'svg') and self.isGroupVisible(node)) or node.tag == inkex.addNS('path', 'svg'): @@ -291,12 +282,6 @@ class hpglEncoder: y = y2 + (y2 - y1) / self.getLength(x1, y1, x2, y2, False) * offset return [x, y] - def getAlpha(self, x1, y1, x2, y2, x3, y3): - # get alpha of point 2 - temp1 = (x1 - x2) ** 2 + (y1 - y2) ** 2 + (x3 - x2) ** 2 + (y3 - y2) ** 2 - (x1 - x3) ** 2 - (y1 - y3) ** 2 - temp2 = 2 * math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2) * math.sqrt((x3 - x2) ** 2 + (y3 - y2) ** 2) - return math.acos(max(min(temp1 / temp2, 1.0), -1.0)) - def processOffset(self, cmd, posX, posY): # calculate offset correction (or dont) if not self.options.useToolOffset or self.dryRun: diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py index 1203a4606..d71b7d7e7 100755 --- a/share/extensions/inkex.py +++ b/share/extensions/inkex.py @@ -311,5 +311,12 @@ class Effect: def uutounit(self, val, unit): return val / (self.__uuconv[unit] / self.__uuconv[self.getDocumentUnit()]) + def addDocumentUnit(self, value): + ''' Add document unit when no unit is specified in the string ''' + try: + float(value) + return value + self.getDocumentUnit() + except ValueError: + return value # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99 diff --git a/share/extensions/plotter.inx b/share/extensions/plotter.inx index e30d61418..c8f009140 100644 --- a/share/extensions/plotter.inx +++ b/share/extensions/plotter.inx @@ -80,7 +80,7 @@ path - +