Commit 5646e03e authored by Ell's avatar Ell

app, icons: add 3D Transform tool

Add a new 3D Transform tool, based on GimpToolTransform3DGrid,
added in the previous commit.  The tool UI provides a notbook with
three tabs, corresponding to the three GimpToolTransform3DGrid
modes:

  Camera - allows setting the primary vanishing point, as well as
  the camera's focal length, expressed either directly, or as the
  camera's angle of view, relative to the whole image or the
  transformed item.  By default, the vanishing point is aligned
  with the item's center, and the angle of view is fixed relative
  to the item; this essentially means that each item is transformed
  using a local perspective, independent of its position and size
  relative to the image.  A global perspective can be achieved by
  using a common vanishing point and focal length (or an image-
  relative angle of view).

  Move   - allows moving the item using X, Y, and Z offsets.

  Rotate - allows rotating the item using X, Y, and Z Euler angles.
  The order of rotation of the different axes can be controlled by
  a set of numbered buttons next to the sliders, and the rotation's
  pivot can be controlled using a pivot selector.
parent 615035c1
Pipeline #141499 failed with stages
in 55 minutes and 21 seconds
......@@ -242,6 +242,7 @@ static const GimpDialogFactoryEntry entries[] =
FOREIGN ("gimp-shear-tool-dialog", TRUE, FALSE),
FOREIGN ("gimp-text-tool-dialog", TRUE, TRUE),
FOREIGN ("gimp-threshold-tool-dialog", TRUE, FALSE),
FOREIGN ("gimp-transform-3d-tool-dialog", TRUE, FALSE),
FOREIGN ("gimp-perspective-tool-dialog", TRUE, FALSE),
FOREIGN ("gimp-unified-transform-tool-dialog", TRUE, FALSE),
FOREIGN ("gimp-handle-transform-tool-dialog", TRUE, FALSE),
......
......@@ -214,6 +214,10 @@ libapptools_a_sources = \
gimptooloptions-gui.h \
gimptools-utils.c \
gimptools-utils.h \
gimptransform3doptions.c \
gimptransform3doptions.h \
gimptransform3dtool.c \
gimptransform3dtool.h \
gimptransformgridoptions.c \
gimptransformgridoptions.h \
gimptransformgridtool.c \
......
......@@ -84,6 +84,7 @@
#include "gimpsheartool.h"
#include "gimpsmudgetool.h"
#include "gimptexttool.h"
#include "gimptransform3dtool.h"
#include "gimpunifiedtransformtool.h"
#include "gimpvectortool.h"
#include "gimpwarptool.h"
......@@ -149,6 +150,7 @@ gimp_tools_init (Gimp *gimp)
gimp_shear_tool_register,
gimp_handle_transform_tool_register,
gimp_perspective_tool_register,
gimp_transform_3d_tool_register,
gimp_flip_tool_register,
gimp_cage_tool_register,
gimp_warp_tool_register,
......
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpbase/gimpbase.h"
#include "libgimpconfig/gimpconfig.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "tools-types.h"
#include "core/gimp.h"
#include "core/gimptoolinfo.h"
#include "widgets/gimppropwidgets.h"
#include "widgets/gimpwidgets-utils.h"
#include "gimptransform3doptions.h"
#include "gimp-intl.h"
enum
{
PROP_0,
PROP_MODE,
PROP_CONSTRAIN_AXIS,
PROP_Z_AXIS,
PROP_LOCAL_FRAME
};
static void gimp_transform_3d_options_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec);
static void gimp_transform_3d_options_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec);
G_DEFINE_TYPE (GimpTransform3DOptions, gimp_transform_3d_options,
GIMP_TYPE_TRANSFORM_GRID_OPTIONS)
#define parent_class gimp_transform_3d_options_parent_class
static void
gimp_transform_3d_options_class_init (GimpTransform3DOptionsClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->set_property = gimp_transform_3d_options_set_property;
object_class->get_property = gimp_transform_3d_options_get_property;
GIMP_CONFIG_PROP_ENUM (object_class, PROP_MODE,
"mode",
_("Mode"),
_("Transform mode"),
GIMP_TYPE_TRANSFORM_3D_MODE,
GIMP_TRANSFORM_3D_MODE_CAMERA,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_CONSTRAIN_AXIS,
"constrain-axis",
NULL,
_("Constrain transformation to a single axis"),
FALSE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_Z_AXIS,
"z-axis",
NULL,
_("Transform along the Z axis"),
FALSE,
GIMP_PARAM_STATIC_STRINGS);
GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_LOCAL_FRAME,
"local-frame",
NULL,
_("Transform in the local frame of reference"),
FALSE,
GIMP_PARAM_STATIC_STRINGS);
}
static void
gimp_transform_3d_options_init (GimpTransform3DOptions *options)
{
}
static void
gimp_transform_3d_options_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
GimpTransform3DOptions *options = GIMP_TRANSFORM_3D_OPTIONS (object);
switch (property_id)
{
case PROP_MODE:
options->mode = g_value_get_enum (value);
break;
case PROP_CONSTRAIN_AXIS:
options->constrain_axis = g_value_get_boolean (value);
break;
case PROP_Z_AXIS:
options->z_axis = g_value_get_boolean (value);
break;
case PROP_LOCAL_FRAME:
options->local_frame = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void
gimp_transform_3d_options_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
GimpTransform3DOptions *options = GIMP_TRANSFORM_3D_OPTIONS (object);
switch (property_id)
{
case PROP_MODE:
g_value_set_enum (value, options->mode);
break;
case PROP_CONSTRAIN_AXIS:
g_value_set_boolean (value, options->constrain_axis);
break;
case PROP_Z_AXIS:
g_value_set_boolean (value, options->z_axis);
break;
case PROP_LOCAL_FRAME:
g_value_set_boolean (value, options->local_frame);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
GtkWidget *
gimp_transform_3d_options_gui (GimpToolOptions *tool_options)
{
GObject *config = G_OBJECT (tool_options);
GtkWidget *vbox = gimp_transform_grid_options_gui (tool_options);
GtkWidget *button;
gchar *label;
GdkModifierType extend_mask = gimp_get_extend_selection_mask ();
GdkModifierType constrain_mask = gimp_get_constrain_behavior_mask ();
label = g_strdup_printf (_("Constrain axis (%s)"),
gimp_get_mod_string (extend_mask));
button = gimp_prop_check_button_new (config, "constrain-axis", label);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_free (label);
label = g_strdup_printf (_("Z axis (%s)"),
gimp_get_mod_string (constrain_mask));
button = gimp_prop_check_button_new (config, "z-axis", label);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_free (label);
label = g_strdup_printf (_("Local frame (%s)"),
gimp_get_mod_string (GDK_MOD1_MASK));
button = gimp_prop_check_button_new (config, "local-frame", label);
gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
gtk_widget_show (button);
g_free (label);
return vbox;
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_TRANSFORM_3D_OPTIONS_H__
#define __GIMP_TRANSFORM_3D_OPTIONS_H__
#include "gimptransformgridoptions.h"
#define GIMP_TYPE_TRANSFORM_3D_OPTIONS (gimp_transform_3d_options_get_type ())
#define GIMP_TRANSFORM_3D_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_TRANSFORM_3D_OPTIONS, GimpTransform3DOptions))
#define GIMP_TRANSFORM_3D_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_TRANSFORM_3D_OPTIONS, GimpTransform3DOptionsClass))
#define GIMP_IS_TRANSFORM_3D_OPTIONS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_TRANSFORM_3D_OPTIONS))
#define GIMP_IS_TRANSFORM_3D_OPTIONS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_TRANSFORM_3D_OPTIONS))
#define GIMP_TRANSFORM_3D_OPTIONS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_TRANSFORM_3D_OPTIONS, GimpTransform3DOptionsClass))
typedef struct _GimpTransform3DOptions GimpTransform3DOptions;
typedef struct _GimpTransform3DOptionsClass GimpTransform3DOptionsClass;
struct _GimpTransform3DOptions
{
GimpTransformGridOptions parent_instance;
GimpTransform3DMode mode;
gboolean constrain_axis;
gboolean z_axis;
gboolean local_frame;
};
struct _GimpTransform3DOptionsClass
{
GimpTransformGridOptionsClass parent_class;
};
GType gimp_transform_3d_options_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_transform_3d_options_gui (GimpToolOptions *tool_options);
#endif /* __GIMP_TRANSFORM_3D_OPTIONS_H__ */
This diff is collapsed.
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_TRANSFORM_3D_TOOL_H__
#define __GIMP_TRANSFORM_3D_TOOL_H__
#include "gimptransformgridtool.h"
#define GIMP_TYPE_TRANSFORM_3D_TOOL (gimp_transform_3d_tool_get_type ())
#define GIMP_TRANSFORM_3D_TOOL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_TRANSFORM_3D_TOOL, GimpTransform3DTool))
#define GIMP_TRANSFORM_3D_TOOL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_TRANSFORM_3D_TOOL, GimpTransform3DToolClass))
#define GIMP_IS_TRANSFORM_3D_TOOL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_TRANSFORM_3D_TOOL))
#define GIMP_TRANSFORM_3D_TOOL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_TRANSFORM_3D_TOOL, GimpTransform3DToolClass))
#define GIMP_TRANSFORM_3D_TOOL_GET_OPTIONS(t) (GIMP_TRANSFORM_3D_OPTIONS (gimp_tool_get_options (GIMP_TOOL (t))))
typedef struct _GimpTransform3DTool GimpTransform3DTool;
typedef struct _GimpTransform3DToolClass GimpTransform3DToolClass;
struct _GimpTransform3DTool
{
GimpTransformGridTool parent_instance;
gboolean updating;
GtkWidget *notebook;
GtkWidget *vanishing_point_se;
GtkWidget *lens_mode_combo;
GtkWidget *focal_length_se;
GtkWidget *angle_of_view_scale;
GtkAdjustment *angle_of_view_adj;
GtkWidget *offset_se;
GtkWidget *rotation_order_buttons[3];
GtkAdjustment *angle_adj[3];
GtkWidget *pivot_selector;
};
struct _GimpTransform3DToolClass
{
GimpTransformGridToolClass parent_class;
};
void gimp_transform_3d_tool_register (GimpToolRegisterCallback callback,
gpointer data);
GType gimp_transform_3d_tool_get_type (void) G_GNUC_CONST;
#endif /* __GIMP_TRANSFORM_3D_TOOL_H__ */
......@@ -115,6 +115,8 @@ libapptools_sources = [
'gimptoolcontrol.c',
'gimptooloptions-gui.c',
'gimptools-utils.c',
'gimptransform3doptions.c',
'gimptransform3dtool.c',
'gimptransformgridoptions.c',
'gimptransformgridtool.c',
'gimptransformgridtoolundo.c',
......
......@@ -261,6 +261,43 @@ gimp_matting_preview_mode_get_type (void)
return type;
}
GType
gimp_transform_3d_lens_mode_get_type (void)
{
static const GEnumValue values[] =
{
{ GIMP_TRANSFORM_3D_LENS_MODE_FOCAL_LENGTH, "GIMP_TRANSFORM_3D_LENS_MODE_FOCAL_LENGTH", "focal-length" },
{ GIMP_TRANSFORM_3D_LENS_MODE_FOV_IMAGE, "GIMP_TRANSFORM_3D_LENS_MODE_FOV_IMAGE", "fov-image" },
{ GIMP_TRANSFORM_3D_LENS_MODE_FOV_ITEM, "GIMP_TRANSFORM_3D_LENS_MODE_FOV_ITEM", "fov-item" },
{ 0, NULL, NULL }
};
static const GimpEnumDesc descs[] =
{
{ GIMP_TRANSFORM_3D_LENS_MODE_FOCAL_LENGTH, NC_("3-dtrasnform-lens-mode", "Focal length"), NULL },
{ GIMP_TRANSFORM_3D_LENS_MODE_FOV_IMAGE, NC_("3-dtrasnform-lens-mode", "Field of view (relative to image)"), NULL },
/* Translators: this is an abbreviated version of "Field of view (relative to image)".
Keep it short. */
{ GIMP_TRANSFORM_3D_LENS_MODE_FOV_IMAGE, NC_("3-dtrasnform-lens-mode", "FOV (image)"), NULL },
{ GIMP_TRANSFORM_3D_LENS_MODE_FOV_ITEM, NC_("3-dtrasnform-lens-mode", "Field of view (relative to item)"), NULL },
/* Translators: this is an abbreviated version of "Field of view (relative to item)".
Keep it short. */
{ GIMP_TRANSFORM_3D_LENS_MODE_FOV_ITEM, NC_("3-dtrasnform-lens-mode", "FOV (item)"), NULL },
{ 0, NULL, NULL }
};
static GType type = 0;
if (G_UNLIKELY (! type))
{
type = g_enum_register_static ("Gimp3DTrasnformLensMode", values);
gimp_type_set_translation_context (type, "3-dtrasnform-lens-mode");
gimp_enum_set_value_descriptions (type, descs);
}
return type;
}
GType
gimp_warp_behavior_get_type (void)
{
......
......@@ -138,6 +138,18 @@ typedef enum
} GimpMattingPreviewMode;
#define GIMP_TYPE_TRANSFORM_3D_LENS_MODE (gimp_transform_3d_lens_mode_get_type ())
GType gimp_transform_3d_lens_mode_get_type (void) G_GNUC_CONST;
typedef enum /*< lowercase_name=gimp_transform_3d_lens_mode >*/
{
GIMP_TRANSFORM_3D_LENS_MODE_FOCAL_LENGTH, /*< desc="Focal length" >*/
GIMP_TRANSFORM_3D_LENS_MODE_FOV_IMAGE, /*< desc="Field of view (relative to image)", abbrev="FOV (image)" >*/
GIMP_TRANSFORM_3D_LENS_MODE_FOV_ITEM, /*< desc="Field of view (relative to item)", abbrev="FOV (item)" >*/
} Gimp3DTrasnformLensMode;
#define GIMP_TYPE_WARP_BEHAVIOR (gimp_warp_behavior_get_type ())
GType gimp_warp_behavior_get_type (void) G_GNUC_CONST;
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="24"
height="24"
viewBox="0 0 6.3499998 6.3500002"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="gimp-tool-transform-3d.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<inkscape:path-effect
effect="perspective-envelope"
up_left_point="-0.75390625,0.24804688"
up_right_point="15.753906,3.1240237"
down_left_point="-0.75390625,16.753906"
down_right_point="15.753906,13.877929"
id="path-effect8778"
is_visible="true"
deform_type="perspective"
horizontal_mirror="true"
vertical_mirror="false"
overflow_perspective="false" />
<inkscape:path-effect
effect="perspective-envelope"
up_left_point="-0.75390625,0.24804688"
up_right_point="15.753906,3.1240238"
down_left_point="-0.75390625,16.753906"
down_right_point="15.753906,13.877929"
id="path-effect8778-5"
is_visible="true"
deform_type="perspective"
horizontal_mirror="true"
vertical_mirror="false"
overflow_perspective="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="33.541667"
inkscape:cx="12"
inkscape:cy="12"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="35"
inkscape:window-maximized="1"
inkscape:lockguides="true">
<inkscape:grid
type="xygrid"
id="grid815"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-290.64998)">
<g
id="g15517"
transform="matrix(1.5,0,0,1.5,0,-148.5)">
<path
sodipodi:nodetypes="cccccc"
inkscape:path-effect="#path-effect8778-5"
inkscape:connector-curvature="0"
inkscape:original-d="M -0.75390625,0.24804688 V 1 16.753906 H 15.753906 V 0.24804688 Z"
id="rect8574-3"
transform="matrix(0.19233318,0,0,0.25647458,0.67416786,292.70303)"
d="m -0.75390625,0.24804688 c 0,0 0,0.75195312 0,0.75195312 0,0 0,15.753906 0,15.753906 0,0 16.50781225,-2.875977 16.50781225,-2.875977 0,0 0,-10.7539052 0,-10.7539052 0,0 -16.50781225,-2.87597692 -16.50781225,-2.87597692 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#729fcf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
<g
id="g15509">
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.39687499;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35294118;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 0.95343015,293.23329 v 0.85576 l 0.84749345,0.0775 v -0.77205 z m 0,1.22163 v 0.85628 l 0.84749345,-0.0419 v -0.77256 z m 0.84749345,1.14518 -0.84749345,0.077 v 0.85628 l 0.84749345,-0.16123 z"
id="rect8574-3-6"
sodipodi:nodetypes="ccccccccccccccc" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.33072916;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35294118;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 2.1151162,293.45395 v 0.74104 l 0.6444053,0.0589 v -0.67748 z m 0,1.05837 v 0.74156 l 0.6444053,-0.0315 v -0.678 z m 0.6444053,0.99988 -0.6444053,0.0589 v 0.74156 l 0.6444053,-0.12247 z"
id="rect8574-3-6-2"
sodipodi:nodetypes="ccccccccccccccc" />
<path
inkscape:connector-curvature="0"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.26458332;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.35294118;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
d="m 3.0029172,293.62293 v 0.65319 l 0.5059125,0.0465 v -0.60358 z m 0,0.93329 v 0.6537 l 0.5059125,-0.0248 v -0.6041 z m 0.5059125,0.88728 -0.5059125,0.0465 v 0.65371 l 0.5059125,-0.0961 z"
id="rect8574-3-6-9"
sodipodi:nodetypes="ccccccccccccccc" />
</g>
<path
inkscape:path-effect="#path-effect8778"
inkscape:connector-curvature="0"
inkscape:original-d="M -0.75390625,0.24804688 V 1 16.753906 H 15.753906 V 0.24804688 Z M 0.75390625,1.7539062 H 4.2519531 V 5.2519531 H 0.75390625 Z m 4.99609375,0 h 3.5 v 3.4980469 h -3.5 z m 4.998047,0 h 3.498047 V 5.2519531 H 10.748047 Z M 0.75390625,6.75 H 4.2519531 v 3.5 H 0.75390625 Z M 5.75,6.75 h 3.5 v 3.5 h -3.5 z m 4.998047,0 h 3.498047 v 3.5 H 10.748047 Z M 0.75390625,11.748047 H 4.2519531 v 3.5 H 0.75390625 Z m 4.99609375,0 h 3.5 v 3.5 h -3.5 z m 4.998047,0 h 3.498047 v 3.5 h -3.498047 z"
id="rect8574"
transform="matrix(0.19233318,0,0,0.25647458,0.67416786,292.70303)"
d="m -0.75390625,0.24804688 c 0,0 0,0.75195312 0,0.75195312 0,0 0,15.753906 0,15.753906 0,0 16.50781225,-2.875977 16.50781225,-2.875977 0,0 0,-10.7539053 0,-10.7539053 0,0 -16.50781225,-2.87597682 -16.50781225,-2.87597682 z M 1.4525936,2.068179 c 0,0 4.4045654,0.6273444 4.4045654,0.6273444 0,0 0,3.0098615 0,3.0098615 0,0 -4.4045654,-0.302095 -4.4045654,-0.302095 0,0 0,-3.3351109 0,-3.3351109 z M 7.491225,2.9282643 c 0,0 3.350875,0.4772668 3.350875,0.4772668 0,0 0,2.641755 0,2.641755 0,0 -3.350875,-0.2298258 -3.350875,-0.2298258 0,0 0,-2.889196 0,-2.889196 z m 4.615892,0.6574437 c 0,0 2.632122,0.3748944 2.632122,0.3748944 0,0 0,2.353976 0,2.353976 0,0 -2.632122,-0.1805288 -2.632122,-0.1805288 0,0 0,-2.5483416 0,-2.5483416 z M 1.4525936,6.831559 c 0,0 4.4045654,0.1628063 4.4045654,0.1628063 0,0 0,3.0115417 0,3.0115417 0,0 -4.4045654,0.162625 -4.4045654,0.162625 0,0 0,-3.336973 0,-3.336973 z M 7.491225,7.0547654 c 0,0 3.350875,0.1238586 3.350875,0.1238586 0,0 0,2.6432301 0,2.6432301 0,0 -3.350875,0.1237204 -3.350875,0.1237204 0,0 0,-2.8908091 0,-2.8908091 z m 4.615892,0.1706175 c 0,0 2.632122,0.097291 2.632122,0.097291 0,0 0,2.3552903 0,2.3552903 0,0 -2.632122,0.097183 -2.632122,0.097183 0,0 0,-2.5497644 0,-2.5497644 z M 1.4525936,11.596801 c 0,0 4.4045654,-0.301913 4.4045654,-0.301913 0,0 0,3.011542 0,3.011542 0,0 -4.4045654,0.627344 -4.4045654,0.627344 0,0 0,-3.336973 0,-3.336973 z M 7.491225,11.18288 c 0,0 3.350875,-0.229688 3.350875,-0.229688 0,0 0,2.64323 0,2.64323 0,0 -3.350875,0.477267 -3.350875,0.477267 0,0 0,-2.890809 0,-2.890809 z m 4.615892,-0.316399 c 0,0 2.632122,-0.180421 2.632122,-0.180421 0,0 0,2.355291 0,2.355291 0,0 -2.632122,0.374894 -2.632122,0.374894 0,0 0,-2.549764 0,-2.549764 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#204a87;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
</g>
</svg>
......@@ -327,9 +327,13 @@ scalable_images = \
scalable/gimp-tools.svg \
scalable/gimp-tool-text.svg \
scalable/gimp-tool-threshold.svg \
scalable/gimp-tool-transform-3d.svg \
scalable/gimp-tool-unified-transform.svg \
scalable/gimp-tool-warp.svg \
scalable/gimp-tool-zoom.svg \
scalable/gimp-transform-3d-camera.svg \
scalable/gimp-transform-3d-move.svg \
scalable/gimp-transform-3d-rotate.svg \
scalable/gimp-transparency.svg \
scalable/gimp-undo-history.svg \
scalable/gimp-user-manual.svg \
......@@ -502,6 +506,7 @@ vector24_images = \
24/gimp-tool-shear.svg \
24/gimp-tool-smudge.svg \
24/gimp-tool-threshold.svg \
24/gimp-tool-transform-3d.svg \
24/gimp-tool-unified-transform.svg \
24/gimp-tool-text.svg \
24/gimp-tool-warp.svg \
......@@ -801,11 +806,15 @@ icons16_images = \
16/gimp-tool-smudge.png \
16/gimp-tool-text.png \
16/gimp-tool-threshold.png \
16/gimp-tool-transform-3d.png \
16/gimp-tool-unified-transform.png \
16/gimp-tool-warp.png \
16/gimp-tool-zoom.png \
16/gimp-tools.png \
16/gimp-transparency.png \
16/gimp-transform-3d-camera.svg \
16/gimp-transform-3d-move.svg \
16/gimp-transform-3d-rotate.svg \
16/gimp-undo-history.png \
16/gimp-user-manual.png \
16/gimp-video.png \
......@@ -1012,6 +1021,7 @@ icons24_images = \
24/gimp-tool-smudge.png \
24/gimp-tool-text.png \
24/gimp-tool-threshold.png \
24/gimp-tool-transform-3d.png \
24/gimp-tool-unified-transform.png \
24/gimp-tool-warp.png \
24/gimp-tool-zoom.png \
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg8"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
sodipodi:docname="gimp-tool-transform-3d.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96">
<defs
id="defs2">
<inkscape:path-effect
effect="perspective-envelope"
up_left_point="-0.75390625,0.24804688"
up_right_point="15.753906,3.1240237"
down_left_point="-0.75390625,16.753906"
down_right_point="15.753906,13.877929"
id="path-effect8778"
is_visible="true"
deform_type="perspective"
horizontal_mirror="true"
vertical_mirror="false"
overflow_perspective="false" />
<inkscape:path-effect
effect="perspective-envelope"
up_left_point="-0.75390625,0.24804688"
up_right_point="15.753906,3.1240238"
down_left_point="-0.75390625,16.753906"
down_right_point="15.753906,13.877929"
id="path-effect8778-5"
is_visible="true"
deform_type="perspective"
horizontal_mirror="true"
vertical_mirror="false"
overflow_perspective="false" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="50.3125"
inkscape:cx="7.9503106"
inkscape:cy="8"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1920"
inkscape:window-height="1008"
inkscape:window-x="0"
inkscape:window-y="35"
inkscape:window-maximized="1"
inkscape:lockguides="true">
<inkscape:grid
type="xygrid"
id="grid815"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-292.76665)">
<g
id="g15517">
<path