mirror of https://github.com/GNOME/gimp.git
app: some general minor seamless-clone cleanup, and make it build
This commit is contained in:
parent
32c129ded7
commit
0b37c9e374
|
@ -162,8 +162,8 @@ libapptools_a_sources = \
|
|||
gimprotatetool.h \
|
||||
gimpscaletool.c \
|
||||
gimpscaletool.h \
|
||||
gimpseamlesscloneoptions.c \
|
||||
gimpseamlesscloneoptions.h \
|
||||
gimpseamlesscloneoptions.c \
|
||||
gimpseamlesscloneoptions.h \
|
||||
gimpseamlessclonetool.c \
|
||||
gimpseamlessclonetool.h \
|
||||
gimpselectionoptions.c \
|
||||
|
|
|
@ -120,7 +120,6 @@ gimp_seamless_clone_options_gui (GimpToolOptions *tool_options)
|
|||
{
|
||||
GObject *config = G_OBJECT (tool_options);
|
||||
GtkWidget *vbox = gimp_tool_options_gui (tool_options);
|
||||
GtkWidget *mode;
|
||||
GtkWidget *button;
|
||||
|
||||
button = gimp_prop_check_button_new (config, "temp",
|
||||
|
|
|
@ -37,9 +37,9 @@ typedef struct _GimpSeamlessCloneOptionsClass GimpSeamlessCloneOptionsClass;
|
|||
|
||||
struct _GimpSeamlessCloneOptions
|
||||
{
|
||||
GimpToolOptions parent_instance;
|
||||
GimpToolOptions parent_instance;
|
||||
|
||||
gboolean temp;
|
||||
gboolean temp;
|
||||
};
|
||||
|
||||
struct _GimpSeamlessCloneOptionsClass
|
||||
|
|
|
@ -33,8 +33,6 @@
|
|||
|
||||
#include "tools-types.h"
|
||||
|
||||
//#include "base/tile-manager.h"
|
||||
|
||||
#include "core/gimp.h"
|
||||
#include "core/gimpbuffer.h"
|
||||
#include "core/gimpchannel.h"
|
||||
|
@ -58,6 +56,7 @@
|
|||
|
||||
#include "gimp-intl.h"
|
||||
|
||||
|
||||
#define SC_DEBUG TRUE
|
||||
|
||||
#ifdef SC_DEBUG
|
||||
|
@ -68,6 +67,13 @@
|
|||
#define sc_debug_fend()
|
||||
#endif
|
||||
|
||||
#define gimp_seamless_clone_tool_is_in_paste(sc,x0,y0) \
|
||||
( ((sc)->xoff <= (x0) && (x0) < (sc)->xoff + (sc)->width) \
|
||||
&& ((sc)->yoff <= (y0) && (y0) < (sc)->yoff + (sc)->height)) \
|
||||
|
||||
#define gimp_seamless_clone_tool_is_in_paste_c(sc,coords) \
|
||||
gimp_seamless_clone_tool_is_in_paste((sc),(coords)->x,(coords)->y)
|
||||
|
||||
|
||||
/* init ----------> preprocess
|
||||
* | |
|
||||
|
@ -85,7 +91,7 @@
|
|||
*
|
||||
* INIT: Wait for click on canvas
|
||||
* have a paste ? -> PREPROCESS : -> QUIT
|
||||
*
|
||||
*
|
||||
* PREPROCESS: Do the preprocessing
|
||||
* -> RENDER
|
||||
*
|
||||
|
@ -118,40 +124,40 @@ static void gimp_seamless_clone_tool_stop (GimpSeamlessClone
|
|||
static void gimp_seamless_clone_tool_options_notify (GimpTool *tool,
|
||||
GimpToolOptions *options,
|
||||
const GParamSpec *pspec);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_button_press (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpButtonPressType press_type,
|
||||
GimpDisplay *display);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_button_release (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpButtonReleaseType release_type,
|
||||
GimpDisplay *display);
|
||||
|
||||
|
||||
static gboolean gimp_seamless_clone_tool_key_press (GimpTool *tool,
|
||||
GdkEventKey *kevent,
|
||||
GimpDisplay *display);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_motion (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
guint32 time,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_control (GimpTool *tool,
|
||||
GimpToolAction action,
|
||||
GimpDisplay *display);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_cursor_update (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
GdkModifierType state,
|
||||
GimpDisplay *display);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_oper_update (GimpTool *tool,
|
||||
const GimpCoords *coords,
|
||||
GdkModifierType state,
|
||||
|
@ -162,10 +168,10 @@ static void gimp_seamless_clone_tool_draw (GimpDrawTool
|
|||
|
||||
static void gimp_seamless_clone_tool_create_image_map (GimpSeamlessCloneTool *sc,
|
||||
GimpDrawable *drawable);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_image_map_flush (GimpImageMap *image_map,
|
||||
GimpTool *tool);
|
||||
|
||||
|
||||
static void gimp_seamless_clone_tool_image_map_update (GimpSeamlessCloneTool *sc);
|
||||
|
||||
static void gimp_seamless_clone_tool_create_render_node (GimpSeamlessCloneTool *sc);
|
||||
|
@ -238,7 +244,7 @@ gimp_seamless_clone_tool_init (GimpSeamlessCloneTool *self)
|
|||
|
||||
/* TODO: We do need click events, but so do all tools. What's this? */
|
||||
gimp_tool_control_set_wants_click (tool->control, TRUE);
|
||||
|
||||
|
||||
gimp_tool_control_set_tool_cursor (tool->control,
|
||||
GIMP_TOOL_CURSOR_MOVE);
|
||||
|
||||
|
@ -249,7 +255,7 @@ gimp_seamless_clone_tool_init (GimpSeamlessCloneTool *self)
|
|||
gimp_tool_control_set_motion_mode (tool->control, GIMP_MOTION_MODE_COMPRESS);
|
||||
|
||||
self->paste = NULL;
|
||||
|
||||
|
||||
self->render_node = NULL;
|
||||
self->sc_node = NULL;
|
||||
|
||||
|
@ -362,7 +368,7 @@ gimp_seamless_clone_tool_start (GimpSeamlessCloneTool *sc,
|
|||
if (sc->paste == NULL)
|
||||
{
|
||||
sc->paste = paste_to_gegl_buf (GIMP_TOOL (sc));
|
||||
|
||||
|
||||
if (sc->paste == NULL)
|
||||
{
|
||||
/* TODO: prompt for some error message */
|
||||
|
@ -374,7 +380,7 @@ gimp_seamless_clone_tool_start (GimpSeamlessCloneTool *sc,
|
|||
sc->height = gegl_buffer_get_height (sc->paste);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Free resources which are relevant only for the previous display */
|
||||
gimp_seamless_clone_tool_stop (sc, TRUE);
|
||||
|
||||
|
@ -497,7 +503,7 @@ gimp_seamless_clone_tool_key_press (GimpTool *tool,
|
|||
{
|
||||
GimpSeamlessCloneTool *sct = GIMP_SEAMLESS_CLONE_TOOL (tool);
|
||||
gboolean retval = TRUE;
|
||||
|
||||
|
||||
if (sct->tool_state == SC_STATE_RENDER_MOTION
|
||||
|| sct->tool_state == SC_STATE_RENDER_WAIT)
|
||||
{
|
||||
|
@ -515,8 +521,7 @@ gimp_seamless_clone_tool_key_press (GimpTool *tool,
|
|||
* rectangle each time (in the update function) or by
|
||||
* invalidating and re-rendering all now (expensive and
|
||||
* perhaps useless */
|
||||
gimp_image_map_commit (sct->image_map
|
||||
NULL);
|
||||
gimp_image_map_commit (sct->image_map, NULL);
|
||||
g_object_unref (sct->image_map);
|
||||
sct->image_map = NULL;
|
||||
|
||||
|
@ -687,7 +692,7 @@ gimp_seamless_clone_tool_cursor_update (GimpTool *tool,
|
|||
{
|
||||
if (sc->tool_state == SC_STATE_RENDER_MOTION)
|
||||
modifier = GIMP_CURSOR_MODIFIER_MOVE;
|
||||
|
||||
|
||||
else if (sc->tool_state == SC_STATE_RENDER_WAIT
|
||||
&& gimp_seamless_clone_tool_is_in_paste_c (sc, coords))
|
||||
modifier = GIMP_CURSOR_MODIFIER_NONE;
|
||||
|
@ -721,7 +726,7 @@ gimp_seamless_clone_tool_draw (GimpDrawTool *draw_tool)
|
|||
* which will receive the drawable on which the preview is applied, and
|
||||
* it should also have an "output" pad to which the final result will be
|
||||
* rendered
|
||||
*/
|
||||
*/
|
||||
static void
|
||||
gimp_seamless_clone_tool_create_render_node (GimpSeamlessCloneTool *sc)
|
||||
{
|
||||
|
@ -745,16 +750,16 @@ gimp_seamless_clone_tool_create_render_node (GimpSeamlessCloneTool *sc)
|
|||
GeglNode *node;
|
||||
GeglNode *op, *paste, *overlay;
|
||||
GeglNode *input, *output;
|
||||
|
||||
|
||||
node = gegl_node_new ();
|
||||
|
||||
input = gegl_node_get_input_proxy (node, "input");
|
||||
output = gegl_node_get_output_proxy (node, "output");
|
||||
|
||||
paste = gegl_node_new_child (node,
|
||||
"operation", "gegl:buffer-source",
|
||||
"buffer", sc->paste,
|
||||
NULL);
|
||||
paste = gegl_node_new_child (node,
|
||||
"operation", "gegl:buffer-source",
|
||||
"buffer", sc->paste,
|
||||
NULL);
|
||||
|
||||
op = gegl_node_new_child (node,
|
||||
"operation", "gegl:seamless-clone",
|
||||
|
@ -764,23 +769,23 @@ gimp_seamless_clone_tool_create_render_node (GimpSeamlessCloneTool *sc)
|
|||
"operation", "svg:dst-over",
|
||||
NULL);
|
||||
|
||||
gegl_node_connect_to (input, "output",
|
||||
op, "input");
|
||||
gegl_node_connect_to (input, "output",
|
||||
op, "input");
|
||||
|
||||
gegl_node_connect_to (paste, "output",
|
||||
op, "aux");
|
||||
gegl_node_connect_to (paste, "output",
|
||||
op, "aux");
|
||||
|
||||
gegl_node_connect_to (op, "output",
|
||||
overlay, "input");
|
||||
gegl_node_connect_to (op, "output",
|
||||
overlay, "input");
|
||||
|
||||
gegl_node_connect_to (input, "output",
|
||||
overlay, "aux");
|
||||
gegl_node_connect_to (input, "output",
|
||||
overlay, "aux");
|
||||
|
||||
gegl_node_connect_to (overlay, "output",
|
||||
output, "input");
|
||||
gegl_node_connect_to (overlay, "output",
|
||||
output, "input");
|
||||
|
||||
sc->render_node = node;
|
||||
sc->sc_node = op;
|
||||
sc->sc_node = op;
|
||||
|
||||
gimp_seamless_clone_tool_render_node_update (sc);
|
||||
}
|
||||
|
@ -789,7 +794,7 @@ static void
|
|||
gimp_seamless_clone_tool_render_node_update (GimpSeamlessCloneTool *sc)
|
||||
{
|
||||
GimpDrawable *bg = GIMP_TOOL (sc)->drawable;
|
||||
gint xoff, yoff;
|
||||
gint xoff, yoff;
|
||||
|
||||
/* Now we should also take into consideration the fact that
|
||||
* we should work with coordinates relative to the background
|
||||
|
@ -816,7 +821,7 @@ gimp_seamless_clone_tool_create_image_map (GimpSeamlessCloneTool *sc,
|
|||
|
||||
sc->image_map = gimp_image_map_new (drawable,
|
||||
_("Seamless Clone"),
|
||||
sc->render_node
|
||||
sc->render_node,
|
||||
GIMP_STOCK_TOOL_SEAMLESS_CLONE);
|
||||
|
||||
g_signal_connect (sc->image_map, "flush",
|
||||
|
@ -886,7 +891,7 @@ gimp_seamless_clone_tool_image_map_update (GimpSeamlessCloneTool *sc)
|
|||
* We need to clear the cache in the sc_node, since that is
|
||||
* where the previous paste was located */
|
||||
gegl_operation_invalidate (op, &visible, TRUE);
|
||||
|
||||
|
||||
/* Now update the image map and show this area */
|
||||
gimp_image_map_apply (sc->image_map);
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ struct _GimpSeamlessCloneTool
|
|||
|
||||
GeglNode *render_node; /* The parent of the Gegl graph that
|
||||
* renders the seamless cloning */
|
||||
|
||||
|
||||
GeglNode *sc_node; /* A Gegl node to do the seamless
|
||||
* cloning live with translation of
|
||||
* the paste */
|
||||
|
@ -58,7 +58,7 @@ struct _GimpSeamlessCloneTool
|
|||
GimpImageMap *image_map; /* The image map object which renders
|
||||
* the live preview, and commits it
|
||||
* when at the end */
|
||||
|
||||
|
||||
gint width, height; /* The width and height of the paste.
|
||||
* Needed for mouse hit detection */
|
||||
|
||||
|
@ -82,11 +82,5 @@ void gimp_seamless_clone_tool_register (GimpToolRegisterCallback callback,
|
|||
|
||||
GType gimp_seamless_clone_tool_get_type (void) G_GNUC_CONST;
|
||||
|
||||
#define gimp_seamless_clone_tool_is_in_paste(sc,x0,y0) \
|
||||
( ((sc)->xoff <= (x0) && (x0) < (sc)->xoff + (sc)->width) \
|
||||
&& ((sc)->yoff <= (y0) && (y0) < (sc)->yoff + (sc)->height)) \
|
||||
|
||||
#define gimp_seamless_clone_tool_is_in_paste_c(sc,coords) \
|
||||
gimp_seamless_clone_tool_is_in_paste((sc),(coords)->x,(coords)->y)
|
||||
|
||||
#endif /* __GIMP_SEAMLESS_CLONE_TOOL_H__ */
|
||||
|
|
Loading…
Reference in New Issue