added the possibility to store the current tool, FG/BG color, brush,

1999-10-17  Michael Natterer  <mitch@gimp.org>

	* app/gimpcontext.[ch]: added the possibility to store the current
	tool, FG/BG color, brush, pattern and gradient, but don't use
	these attributes yet.

	Before replacing the get/set color/brush/... functions with
	context functions, I'll have to change the "parent context"
	implementation to something where the children catch the parent's
	color/brush/..._changed signals.
	Finally, updating the indicator_area, device_status, tool_options
	etc. will be done by connecting to their own context's "*_changed"
	signals, which will be much cleaner than calling the update
	functions from various places.

	(I think this is a "consistency fix", please let me know if you
	consider it a new feature).
This commit is contained in:
Michael Natterer 1999-10-17 12:28:38 +00:00 committed by Michael Natterer
parent ec40ac728b
commit f650984006
5 changed files with 1582 additions and 372 deletions

View File

@ -1,3 +1,21 @@
1999-10-17 Michael Natterer <mitch@gimp.org>
* app/gimpcontext.[ch]: added the possibility to store the current
tool, FG/BG color, brush, pattern and gradient, but don't use
these attributes yet.
Before replacing the get/set color/brush/... functions with
context functions, I'll have to change the "parent context"
implementation to something where the children catch the parent's
color/brush/..._changed signals.
Finally, updating the indicator_area, device_status, tool_options
etc. will be done by connecting to their own context's "*_changed"
signals, which will be much cleaner than calling the update
functions from various places.
(I think this is a "consistency fix", please let me know if you
consider it a new feature).
Sun Oct 17 00:55:38 CEST 1999 Marc Lehmann <marc@gimp.org>
* (221 files): Corrected ~20 pdb function names by choosing the

View File

@ -15,7 +15,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gtk/gtk.h>
#include "gimpcontext.h"
@ -23,11 +22,11 @@
#define context_return_if_fail(context) \
g_return_if_fail ((context) != NULL); \
g_return_if_fail (GIMP_IS_CONTEXT (context));
g_return_if_fail (GIMP_IS_CONTEXT (context))
#define context_return_val_if_fail(context,val) \
g_return_val_if_fail ((context) != NULL, (val)); \
g_return_val_if_fail (GIMP_IS_CONTEXT (context), (val));
g_return_val_if_fail (GIMP_IS_CONTEXT (context), (val))
#define context_check_current(context) \
((context) = (context) ? (context) : current_context)
@ -38,17 +37,29 @@
enum {
ARG_0,
ARG_IMAGE,
ARG_DISPLAY,
ARG_TOOL,
ARG_FOREGROUND,
ARG_BACKGROUND,
ARG_OPACITY,
ARG_PAINT_MODE,
ARG_IMAGE,
ARG_DISPLAY
ARG_BRUSH,
ARG_PATTERN,
ARG_GRADIENT
};
enum {
OPACITY_CHANGED,
PAINT_MODE_CHANGED,
IMAGE_CHANGED,
DISPLAY_CHANGED,
TOOL_CHANGED,
FOREGROUND_CHANGED,
BACKGROUND_CHANGED,
OPACITY_CHANGED,
PAINT_MODE_CHANGED,
BRUSH_CHANGED,
PATTERN_CHANGED,
GRADIENT_CHANGED,
LAST_SIGNAL
};
@ -69,7 +80,7 @@ static GimpContext * default_context = NULL;
static GimpContext * standard_context = NULL;
/* private functions ******************************************************/
/* private functions *******************************************************/
static void
gimp_context_set_arg (GtkObject *object,
@ -82,17 +93,35 @@ gimp_context_set_arg (GtkObject *object,
switch (arg_id)
{
case ARG_IMAGE:
gimp_context_set_image (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_DISPLAY:
gimp_context_set_display (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_TOOL:
gimp_context_set_tool (context, GTK_VALUE_INT (*arg));
break;
case ARG_FOREGROUND:
gimp_context_set_foreground (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_BACKGROUND:
gimp_context_set_background (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_OPACITY:
gimp_context_set_opacity (context, GTK_VALUE_DOUBLE (*arg));
break;
case ARG_PAINT_MODE:
gimp_context_set_paint_mode (context, GTK_VALUE_INT (*arg));
break;
case ARG_IMAGE:
gimp_context_set_image (context, GTK_VALUE_POINTER (*arg));
case ARG_BRUSH:
gimp_context_set_brush (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_DISPLAY:
gimp_context_set_display (context, GTK_VALUE_POINTER (*arg));
case ARG_PATTERN:
gimp_context_set_pattern (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_GRADIENT:
gimp_context_set_gradient (context, GTK_VALUE_POINTER (*arg));
break;
default:
break;
@ -110,17 +139,49 @@ gimp_context_get_arg (GtkObject *object,
switch (arg_id)
{
case ARG_IMAGE:
GTK_VALUE_POINTER (*arg) = gimp_context_get_image (context);
break;
case ARG_DISPLAY:
GTK_VALUE_POINTER (*arg) = gimp_context_get_display (context);
break;
case ARG_TOOL:
GTK_VALUE_INT (*arg) = gimp_context_get_tool (context);
break;
case ARG_FOREGROUND:
{
guchar *dest = GTK_VALUE_POINTER (*arg);
guchar src[3];
gimp_context_get_foreground (context, src);
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
}
break;
case ARG_BACKGROUND:
{
guchar *dest = GTK_VALUE_POINTER (*arg);
guchar src[3];
gimp_context_get_background (context, src);
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
}
break;
case ARG_OPACITY:
GTK_VALUE_DOUBLE (*arg) = gimp_context_get_opacity (context);
break;
case ARG_PAINT_MODE:
GTK_VALUE_INT (*arg) = gimp_context_get_paint_mode (context);
break;
case ARG_IMAGE:
GTK_VALUE_POINTER (*arg) = gimp_context_get_image (context);
case ARG_BRUSH:
GTK_VALUE_POINTER (*arg) = gimp_context_get_brush (context);
break;
case ARG_DISPLAY:
GTK_VALUE_POINTER (*arg) = gimp_context_get_display (context);
case ARG_PATTERN:
GTK_VALUE_POINTER (*arg) = gimp_context_get_pattern (context);
break;
case ARG_GRADIENT:
GTK_VALUE_POINTER (*arg) = gimp_context_get_gradient (context);
break;
default:
arg->type = GTK_TYPE_INVALID;
@ -151,33 +212,29 @@ gimp_context_class_init (GimpContextClass *klass)
object_class = GTK_OBJECT_CLASS (klass);
gtk_object_add_arg_type ("GimpContext::opacity",
GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_OPACITY);
gtk_object_add_arg_type ("GimpContext::paint_mode",
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PAINT_MODE);
gtk_object_add_arg_type ("GimpContext::image",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_IMAGE);
gtk_object_add_arg_type ("GimpContext::display",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_DISPLAY);
gtk_object_add_arg_type ("GimpContext::tool",
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_TOOL);
gtk_object_add_arg_type ("GimpContext::foreground",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_FOREGROUND);
gtk_object_add_arg_type ("GimpContext::background",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BACKGROUND);
gtk_object_add_arg_type ("GimpContext::opacity",
GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_OPACITY);
gtk_object_add_arg_type ("GimpContext::paint_mode",
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PAINT_MODE);
gtk_object_add_arg_type ("GimpContext::brush",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BRUSH);
gtk_object_add_arg_type ("GimpContext::pattern",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_PATTERN);
gtk_object_add_arg_type ("GimpContext::gradient",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_GRADIENT);
parent_class = gtk_type_class (gimp_object_get_type ());
gimp_context_signals[OPACITY_CHANGED] =
gimp_signal_new ("opacity_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
opacity_changed),
gimp_sigtype_double);
gimp_context_signals[PAINT_MODE_CHANGED] =
gimp_signal_new ("paint_mode_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
paint_mode_changed),
gimp_sigtype_int);
gimp_context_signals[IMAGE_CHANGED] =
gimp_signal_new ("image_changed",
GTK_RUN_FIRST,
@ -194,6 +251,70 @@ gimp_context_class_init (GimpContextClass *klass)
display_changed),
gimp_sigtype_pointer);
gimp_context_signals[TOOL_CHANGED] =
gimp_signal_new ("tool_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
tool_changed),
gimp_sigtype_int);
gimp_context_signals[FOREGROUND_CHANGED] =
gimp_signal_new ("foreground_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
foreground_changed),
gimp_sigtype_pointer);
gimp_context_signals[BACKGROUND_CHANGED] =
gimp_signal_new ("background_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
background_changed),
gimp_sigtype_pointer);
gimp_context_signals[OPACITY_CHANGED] =
gimp_signal_new ("opacity_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
opacity_changed),
gimp_sigtype_double);
gimp_context_signals[PAINT_MODE_CHANGED] =
gimp_signal_new ("paint_mode_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
paint_mode_changed),
gimp_sigtype_int);
gimp_context_signals[BRUSH_CHANGED] =
gimp_signal_new ("brush_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
brush_changed),
gimp_sigtype_pointer);
gimp_context_signals[PATTERN_CHANGED] =
gimp_signal_new ("pattern_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
pattern_changed),
gimp_sigtype_pointer);
gimp_context_signals[GRADIENT_CHANGED] =
gimp_signal_new ("gradient_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
gradient_changed),
gimp_sigtype_pointer);
gtk_object_class_add_signals (object_class, gimp_context_signals,
LAST_SIGNAL);
@ -201,10 +322,16 @@ gimp_context_class_init (GimpContextClass *klass)
object_class->get_arg = gimp_context_get_arg;
object_class->destroy = gimp_context_destroy;
klass->opacity_changed = NULL;
klass->paint_mode_changed = NULL;
klass->image_changed = NULL;
klass->display_changed = NULL;
klass->tool_changed = NULL;
klass->foreground_changed = NULL;
klass->background_changed = NULL;
klass->opacity_changed = NULL;
klass->paint_mode_changed = NULL;
klass->brush_changed = NULL;
klass->pattern_changed = NULL;
klass->gradient_changed = NULL;
}
static void
@ -213,8 +340,29 @@ gimp_context_init (GimpContext *context)
context->name = NULL;
context->parent = NULL;
/* Values to be taken from the parent context by default */
context->image_defined = FALSE;
context->image = NULL;
context->display_defined = FALSE;
context->display = NULL;
context->tool_defined = FALSE;
context->tool = RECT_SELECT;
/* Values defined by default */
context->foreground_defined = TRUE;
context->foreground[0] = 255;
context->foreground[1] = 255;
context->foreground[2] = 255;
context->background_defined = TRUE;
context->background[0] = 0;
context->background[1] = 0;
context->background[2] = 0;
context->opacity_defined = TRUE;
context->opacity = 1.0;
@ -223,14 +371,17 @@ gimp_context_init (GimpContext *context)
/* Values to be taken from the parent context by default */
context->image_defined = FALSE;
context->image = NULL;
context->brush_defined = FALSE;
context->brush = NULL;
context->display_defined = FALSE;
context->display = NULL;
context->pattern_defined = FALSE;
context->pattern = NULL;
context->gradient_defined = FALSE;
context->gradient = NULL;
}
/* public functions *******************************************************/
/* public functions ********************************************************/
GtkType
gimp_context_get_type (void)
@ -276,21 +427,41 @@ gimp_context_new (gchar *name,
if (template)
{
context->opacity = gimp_context_get_opacity (template);
context->paint_mode = gimp_context_get_paint_mode (template);
context->image = gimp_context_get_image (template);
context->display = gimp_context_get_display (template);
guchar col[3];
context->image = gimp_context_get_image (template);
context->display = gimp_context_get_display (template);
context->tool = gimp_context_get_tool (template);
gimp_context_get_foreground (template, col);
context->foreground[0] = col[0];
context->foreground[1] = col[1];
context->foreground[2] = col[2];
gimp_context_get_background (template, col);
context->background[0] = col[0];
context->background[1] = col[1];
context->background[2] = col[2];
context->opacity = gimp_context_get_opacity (template);
context->paint_mode = gimp_context_get_paint_mode (template);
context->brush = gimp_context_get_brush (template);
context->pattern = gimp_context_get_pattern (template);
context->gradient = gimp_context_get_gradient (template);
context->opacity_defined = template->opacity_defined;
context->paint_mode_defined = template->paint_mode_defined;
context->image_defined = template->image_defined;
context->display_defined = template->display_defined;
context->tool_defined = template->tool_defined;
context->foreground_defined = template->foreground_defined;
context->background_defined = template->background_defined;
context->opacity_defined = template->opacity_defined;
context->paint_mode_defined = template->paint_mode_defined;
context->brush_defined = template->brush_defined;
context->pattern_defined = template->pattern_defined;
context->gradient_defined = template->gradient_defined;
}
return context;
}
/* getting/setting the special contexts ***********************************/
/* getting/setting the special contexts ************************************/
GimpContext *
gimp_context_get_current (void)
@ -341,7 +512,7 @@ gimp_context_get_standard (void)
return standard_context;
}
/* functions manipulating a single context ********************************/
/* functions manipulating a single context *********************************/
gchar *
gimp_context_get_name (GimpContext *context)
@ -380,99 +551,7 @@ gimp_context_set_parent (GimpContext *context,
* functions into a single macro call
*/
/* opacity */
gdouble
gimp_context_get_opacity (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 1.0);
context_find_defined (context, opacity_defined);
return context->opacity;
}
void
gimp_context_set_opacity (GimpContext *context,
gdouble opacity)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, opacity_defined);
context->opacity = opacity;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[OPACITY_CHANGED],
opacity);
}
gboolean
gimp_context_opacity_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->opacity_defined;
}
void
gimp_context_define_opacity (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->opacity = gimp_context_get_opacity (context);
context->opacity_defined = defined;
}
/* paint mode */
LayerModeEffects
gimp_context_get_paint_mode (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 0);
context_find_defined (context, paint_mode_defined);
return context->paint_mode;
}
void
gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, paint_mode_defined);
context->paint_mode = paint_mode;
gtk_signal_emit (GTK_OBJECT(context),
gimp_context_signals[PAINT_MODE_CHANGED],
paint_mode);
}
gboolean
gimp_context_paint_mode_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->paint_mode_defined;
}
void
gimp_context_define_paint_mode (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->paint_mode = gimp_context_get_paint_mode (context);
context->paint_mode_defined = defined;
}
/* image */
/* image *******************************************************************/
GimpImage *
gimp_context_get_image (GimpContext *context)
@ -520,7 +599,7 @@ gimp_context_define_image (GimpContext *context,
context->image_defined = defined;
}
/* display */
/* display *****************************************************************/
GDisplay *
gimp_context_get_display (GimpContext *context)
@ -574,3 +653,417 @@ gimp_context_define_display (GimpContext *context,
context->display_defined = defined;
}
/* tool ********************************************************************/
ToolType
gimp_context_get_tool (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 0);
context_find_defined (context, tool_defined);
return context->tool;
}
void
gimp_context_set_tool (GimpContext *context,
ToolType tool)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, tool_defined);
if (context->tool == tool) return;
context->tool = tool;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[TOOL_CHANGED],
tool);
}
gboolean
gimp_context_tool_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->tool_defined;
}
void
gimp_context_define_tool (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->tool = gimp_context_get_tool (context);
context->tool_defined = defined;
}
/* foreground color ********************************************************/
void
gimp_context_get_foreground (GimpContext *context,
guchar foreground[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, foreground_defined);
foreground[0] = context->foreground[0];
foreground[1] = context->foreground[1];
foreground[2] = context->foreground[2];
}
void
gimp_context_set_foreground (GimpContext *context,
guchar foreground[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, foreground_defined);
if (context->foreground[0] == foreground[0] &&
context->foreground[1] == foreground[1] &&
context->foreground[2] == foreground[2]) return;
context->foreground[0] = foreground[0];
context->foreground[1] = foreground[1];
context->foreground[2] = foreground[2];
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[FOREGROUND_CHANGED],
context->foreground);
}
gboolean
gimp_context_foreground_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->foreground_defined;
}
void
gimp_context_define_foreground (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
{
guchar col[3];
gimp_context_get_foreground (context, col);
context->foreground[0] = col[0];
context->foreground[1] = col[1];
context->foreground[2] = col[2];
}
context->foreground_defined = defined;
}
/* background color ********************************************************/
void
gimp_context_get_background (GimpContext *context,
guchar background[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, background_defined);
background[0] = context->background[0];
background[1] = context->background[1];
background[2] = context->background[2];
}
void
gimp_context_set_background (GimpContext *context,
guchar background[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, background_defined);
if (context->background[0] == background[0] &&
context->background[1] == background[1] &&
context->background[2] == background[2]) return;
context->background[0] = background[0];
context->background[1] = background[1];
context->background[2] = background[2];
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[BACKGROUND_CHANGED],
context->background);
}
gboolean
gimp_context_background_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->background_defined;
}
void
gimp_context_define_background (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
{
guchar col[3];
gimp_context_get_background (context, col);
context->background[0] = col[0];
context->background[1] = col[1];
context->background[2] = col[2];
}
context->background_defined = defined;
}
/* opacity *****************************************************************/
gdouble
gimp_context_get_opacity (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 1.0);
context_find_defined (context, opacity_defined);
return context->opacity;
}
void
gimp_context_set_opacity (GimpContext *context,
gdouble opacity)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, opacity_defined);
if (context->opacity == opacity) return;
context->opacity = opacity;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[OPACITY_CHANGED],
opacity);
}
gboolean
gimp_context_opacity_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->opacity_defined;
}
void
gimp_context_define_opacity (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->opacity = gimp_context_get_opacity (context);
context->opacity_defined = defined;
}
/* paint mode **************************************************************/
LayerModeEffects
gimp_context_get_paint_mode (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 0);
context_find_defined (context, paint_mode_defined);
return context->paint_mode;
}
void
gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, paint_mode_defined);
if (context->paint_mode == paint_mode) return;
context->paint_mode = paint_mode;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[PAINT_MODE_CHANGED],
paint_mode);
}
gboolean
gimp_context_paint_mode_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->paint_mode_defined;
}
void
gimp_context_define_paint_mode (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->paint_mode = gimp_context_get_paint_mode (context);
context->paint_mode_defined = defined;
}
/* brush *******************************************************************/
GimpBrush *
gimp_context_get_brush (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, NULL);
context_find_defined (context, brush_defined);
return context->brush;
}
void
gimp_context_set_brush (GimpContext *context,
GimpBrush *brush)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, brush_defined);
if (context->brush == brush) return;
context->brush = brush;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[BRUSH_CHANGED],
brush);
}
gboolean
gimp_context_brush_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->brush_defined;
}
void
gimp_context_define_brush (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->brush = gimp_context_get_brush (context);
context->brush_defined = defined;
}
/* pattern *****************************************************************/
GPattern *
gimp_context_get_pattern (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, NULL);
context_find_defined (context, pattern_defined);
return context->pattern;
}
void
gimp_context_set_pattern (GimpContext *context,
GPattern *pattern)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, pattern_defined);
if (context->pattern == pattern) return;
context->pattern = pattern;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[PATTERN_CHANGED],
pattern);
}
gboolean
gimp_context_pattern_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->pattern_defined;
}
void
gimp_context_define_pattern (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->pattern = gimp_context_get_pattern (context);
context->pattern_defined = defined;
}
/* gradient ****************************************************************/
gradient_t *
gimp_context_get_gradient (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, NULL);
context_find_defined (context, gradient_defined);
return context->gradient;
}
void
gimp_context_set_gradient (GimpContext *context,
gradient_t *gradient)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, gradient_defined);
if (context->gradient == gradient) return;
context->gradient = gradient;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[GRADIENT_CHANGED],
gradient);
}
gboolean
gimp_context_gradient_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->gradient_defined;
}
void
gimp_context_define_gradient (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->gradient = gimp_context_get_gradient (context);
context->gradient_defined = defined;
}

View File

@ -20,8 +20,13 @@
#include <glib.h>
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpimageF.h"
#include "gradient_header.h"
#include "patterns.h"
#include "toolsF.h"
#include "gimpobjectP.h"
#define GIMP_TYPE_CONTEXT (gimp_context_get_type ())
@ -32,18 +37,29 @@
typedef enum
{
GIMP_CONTEXT_ARG_OPACITY = 1 << 0,
GIMP_CONTEXT_ARG_PAINT_MODE = 1 << 1,
GIMP_CONTEXT_ARG_IMAGE = 1 << 2,
GIMP_CONTEXT_ARG_DISPLAY = 1 << 3,
GIMP_CONTEXT_ARG_IMAGE = 1 << 0,
GIMP_CONTEXT_ARG_DISPLAY = 1 << 1,
GIMP_CONTEXT_ARG_TOOL = 1 << 2,
GIMP_CONTEXT_ARG_FOREGROUND = 1 << 3,
GIMP_CONTEXT_ARG_BACKGROUND = 1 << 4,
GIMP_CONTEXT_ARG_OPACITY = 1 << 5,
GIMP_CONTEXT_ARG_PAINT_MODE = 1 << 6,
GIMP_CONTEXT_ARG_BRUSH = 1 << 7,
GIMP_CONTEXT_ARG_PATTERN = 1 << 8,
GIMP_CONTEXT_ARG_GRADIENT = 1 << 9,
/* aliases
*/
GIMP_CONTEXT_ARG_PAINT = GIMP_CONTEXT_ARG_OPACITY |
GIMP_CONTEXT_ARG_PAINT_MODE,
GIMP_CONTEXT_ARG_ALL = GIMP_CONTEXT_ARG_PAINT |
GIMP_CONTEXT_ARG_IMAGE |
GIMP_CONTEXT_ARG_DISPLAY
GIMP_CONTEXT_ARG_PAINT = GIMP_CONTEXT_ARG_FOREGROUND |
GIMP_CONTEXT_ARG_BACKGROUND |
GIMP_CONTEXT_ARG_OPACITY |
GIMP_CONTEXT_ARG_PAINT_MODE |
GIMP_CONTEXT_ARG_BRUSH |
GIMP_CONTEXT_ARG_PATTERN |
GIMP_CONTEXT_ARG_GRADIENT,
GIMP_CONTEXT_ARG_ALL = GIMP_CONTEXT_ARG_IMAGE |
GIMP_CONTEXT_ARG_DISPLAY |
GIMP_CONTEXT_ARG_TOOL
} GimpContextArgs;
typedef struct _GimpContext GimpContext;
@ -59,6 +75,20 @@ struct _GimpContext
/* FIXME: the solution of having a boolean for each attribute and the
* name "defined" need some brainstorming
*/
gboolean image_defined;
GimpImage *image;
gboolean display_defined;
GDisplay *display;
gboolean tool_defined;
ToolType tool;
gboolean foreground_defined;
guchar foreground[3];
gboolean background_defined;
guchar background[3];
gboolean opacity_defined;
gdouble opacity;
@ -66,22 +96,32 @@ struct _GimpContext
gboolean paint_mode_defined;
LayerModeEffects paint_mode;
gboolean image_defined;
GimpImage *image;
gboolean brush_defined;
GimpBrush *brush;
gboolean display_defined;
GDisplay *display;
gboolean pattern_defined;
GPattern *pattern;
gboolean gradient_defined;
gradient_t *gradient;
};
struct _GimpContextClass
{
GimpObjectClass parent_class;
void (* opacity_changed) (GimpContext *context, gdouble opacity);
void (* paint_mode_changed) (GimpContext *context, gint paint_mode);
void (* image_changed) (GimpContext *context, gpointer image);
void (* display_changed) (GimpContext *context, gpointer display);
void (* tool_changed) (GimpContext *context, gint tool_type);
void (* foreground_changed) (GimpContext *context, guchar foreground[3]);
void (* background_changed) (GimpContext *context, guchar background[3]);
void (* opacity_changed) (GimpContext *context, gdouble opacity);
void (* paint_mode_changed) (GimpContext *context, gint paint_mode);
void (* brush_changed) (GimpContext *context, gpointer brush);
void (* pattern_changed) (GimpContext *context, gpointer pattern);
void (* gradient_changed) (GimpContext *context, gpointer gradient);
};
GtkType gimp_context_get_type (void);
@ -129,33 +169,96 @@ GimpContext * gimp_context_get_parent (GimpContext *context);
void gimp_context_set_parent (GimpContext *context,
GimpContext *parent);
gdouble gimp_context_get_opacity (GimpContext *context);
void gimp_context_set_opacity (GimpContext *context,
gdouble opacity);
gboolean gimp_context_opacity_defined (GimpContext *context);
void gimp_context_define_opacity (GimpContext *context,
gboolean defined);
/* image */
LayerModeEffects
gimp_context_get_paint_mode (GimpContext *context);
void gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode);
gboolean gimp_context_paint_mode_defined (GimpContext *context);
void gimp_context_define_paint_mode (GimpContext *context,
gboolean defined);
GimpImage * gimp_context_get_image (GimpContext *context);
void gimp_context_set_image (GimpContext *context,
GimpImage *image);
gboolean gimp_context_image_defined (GimpContext *context);
void gimp_context_define_image (GimpContext *context,
gboolean defined);
GimpImage * gimp_context_get_image (GimpContext *context);
void gimp_context_set_image (GimpContext *context,
GimpImage *image);
gboolean gimp_context_image_defined (GimpContext *context);
void gimp_context_define_image (GimpContext *context,
gboolean defined);
/* display */
GDisplay * gimp_context_get_display (GimpContext *context);
void gimp_context_set_display (GimpContext *context,
GDisplay *display);
gboolean gimp_context_display_defined (GimpContext *context);
void gimp_context_define_display (GimpContext *context,
gboolean defined);
GDisplay * gimp_context_get_display (GimpContext *context);
void gimp_context_set_display (GimpContext *context,
GDisplay *display);
gboolean gimp_context_display_defined (GimpContext *context);
void gimp_context_define_display (GimpContext *context,
gboolean defined);
/* tool */
ToolType gimp_context_get_tool (GimpContext *context);
void gimp_context_set_tool (GimpContext *context,
ToolType tool_type);
gboolean gimp_context_tool_defined (GimpContext *context);
void gimp_context_define_tool (GimpContext *context,
gboolean defined);
/* foreground color */
void gimp_context_get_foreground (GimpContext *context,
guchar foreground[3]);
void gimp_context_set_foreground (GimpContext *context,
guchar foreground[3]);
gboolean gimp_context_foreground_defined (GimpContext *context);
void gimp_context_define_foreground (GimpContext *context,
gboolean defined);
/* background color */
void gimp_context_get_background (GimpContext *context,
guchar background[3]);
void gimp_context_set_background (GimpContext *context,
guchar background[3]);
gboolean gimp_context_background_defined (GimpContext *context);
void gimp_context_define_background (GimpContext *context,
gboolean defined);
/* opacity */
gdouble gimp_context_get_opacity (GimpContext *context);
void gimp_context_set_opacity (GimpContext *context,
gdouble opacity);
gboolean gimp_context_opacity_defined (GimpContext *context);
void gimp_context_define_opacity (GimpContext *context,
gboolean defined);
/* paint mode */
LayerModeEffects gimp_context_get_paint_mode (GimpContext *context);
void gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode);
gboolean gimp_context_paint_mode_defined (GimpContext *context);
void gimp_context_define_paint_mode (GimpContext *context,
gboolean defined);
/* brush */
GimpBrush * gimp_context_get_brush (GimpContext *context);
void gimp_context_set_brush (GimpContext *context,
GimpBrush *brush);
gboolean gimp_context_brush_defined (GimpContext *context);
void gimp_context_define_brush (GimpContext *context,
gboolean defined);
/* pattern */
GPattern * gimp_context_get_pattern (GimpContext *context);
void gimp_context_set_pattern (GimpContext *context,
GPattern *pattern);
gboolean gimp_context_pattern_defined (GimpContext *context);
void gimp_context_define_pattern (GimpContext *context,
gboolean defined);
/* gradient */
gradient_t * gimp_context_get_gradient (GimpContext *context);
void gimp_context_set_gradient (GimpContext *context,
gradient_t *gradient);
gboolean gimp_context_gradient_defined (GimpContext *context);
void gimp_context_define_gradient (GimpContext *context,
gboolean defined);
#endif /* __GIMP_CONTEXT_H__ */

View File

@ -15,7 +15,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <gtk/gtk.h>
#include "gimpcontext.h"
@ -23,11 +22,11 @@
#define context_return_if_fail(context) \
g_return_if_fail ((context) != NULL); \
g_return_if_fail (GIMP_IS_CONTEXT (context));
g_return_if_fail (GIMP_IS_CONTEXT (context))
#define context_return_val_if_fail(context,val) \
g_return_val_if_fail ((context) != NULL, (val)); \
g_return_val_if_fail (GIMP_IS_CONTEXT (context), (val));
g_return_val_if_fail (GIMP_IS_CONTEXT (context), (val))
#define context_check_current(context) \
((context) = (context) ? (context) : current_context)
@ -38,17 +37,29 @@
enum {
ARG_0,
ARG_IMAGE,
ARG_DISPLAY,
ARG_TOOL,
ARG_FOREGROUND,
ARG_BACKGROUND,
ARG_OPACITY,
ARG_PAINT_MODE,
ARG_IMAGE,
ARG_DISPLAY
ARG_BRUSH,
ARG_PATTERN,
ARG_GRADIENT
};
enum {
OPACITY_CHANGED,
PAINT_MODE_CHANGED,
IMAGE_CHANGED,
DISPLAY_CHANGED,
TOOL_CHANGED,
FOREGROUND_CHANGED,
BACKGROUND_CHANGED,
OPACITY_CHANGED,
PAINT_MODE_CHANGED,
BRUSH_CHANGED,
PATTERN_CHANGED,
GRADIENT_CHANGED,
LAST_SIGNAL
};
@ -69,7 +80,7 @@ static GimpContext * default_context = NULL;
static GimpContext * standard_context = NULL;
/* private functions ******************************************************/
/* private functions *******************************************************/
static void
gimp_context_set_arg (GtkObject *object,
@ -82,17 +93,35 @@ gimp_context_set_arg (GtkObject *object,
switch (arg_id)
{
case ARG_IMAGE:
gimp_context_set_image (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_DISPLAY:
gimp_context_set_display (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_TOOL:
gimp_context_set_tool (context, GTK_VALUE_INT (*arg));
break;
case ARG_FOREGROUND:
gimp_context_set_foreground (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_BACKGROUND:
gimp_context_set_background (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_OPACITY:
gimp_context_set_opacity (context, GTK_VALUE_DOUBLE (*arg));
break;
case ARG_PAINT_MODE:
gimp_context_set_paint_mode (context, GTK_VALUE_INT (*arg));
break;
case ARG_IMAGE:
gimp_context_set_image (context, GTK_VALUE_POINTER (*arg));
case ARG_BRUSH:
gimp_context_set_brush (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_DISPLAY:
gimp_context_set_display (context, GTK_VALUE_POINTER (*arg));
case ARG_PATTERN:
gimp_context_set_pattern (context, GTK_VALUE_POINTER (*arg));
break;
case ARG_GRADIENT:
gimp_context_set_gradient (context, GTK_VALUE_POINTER (*arg));
break;
default:
break;
@ -110,17 +139,49 @@ gimp_context_get_arg (GtkObject *object,
switch (arg_id)
{
case ARG_IMAGE:
GTK_VALUE_POINTER (*arg) = gimp_context_get_image (context);
break;
case ARG_DISPLAY:
GTK_VALUE_POINTER (*arg) = gimp_context_get_display (context);
break;
case ARG_TOOL:
GTK_VALUE_INT (*arg) = gimp_context_get_tool (context);
break;
case ARG_FOREGROUND:
{
guchar *dest = GTK_VALUE_POINTER (*arg);
guchar src[3];
gimp_context_get_foreground (context, src);
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
}
break;
case ARG_BACKGROUND:
{
guchar *dest = GTK_VALUE_POINTER (*arg);
guchar src[3];
gimp_context_get_background (context, src);
dest[0] = src[0];
dest[1] = src[1];
dest[2] = src[2];
}
break;
case ARG_OPACITY:
GTK_VALUE_DOUBLE (*arg) = gimp_context_get_opacity (context);
break;
case ARG_PAINT_MODE:
GTK_VALUE_INT (*arg) = gimp_context_get_paint_mode (context);
break;
case ARG_IMAGE:
GTK_VALUE_POINTER (*arg) = gimp_context_get_image (context);
case ARG_BRUSH:
GTK_VALUE_POINTER (*arg) = gimp_context_get_brush (context);
break;
case ARG_DISPLAY:
GTK_VALUE_POINTER (*arg) = gimp_context_get_display (context);
case ARG_PATTERN:
GTK_VALUE_POINTER (*arg) = gimp_context_get_pattern (context);
break;
case ARG_GRADIENT:
GTK_VALUE_POINTER (*arg) = gimp_context_get_gradient (context);
break;
default:
arg->type = GTK_TYPE_INVALID;
@ -151,33 +212,29 @@ gimp_context_class_init (GimpContextClass *klass)
object_class = GTK_OBJECT_CLASS (klass);
gtk_object_add_arg_type ("GimpContext::opacity",
GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_OPACITY);
gtk_object_add_arg_type ("GimpContext::paint_mode",
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PAINT_MODE);
gtk_object_add_arg_type ("GimpContext::image",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_IMAGE);
gtk_object_add_arg_type ("GimpContext::display",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_DISPLAY);
gtk_object_add_arg_type ("GimpContext::tool",
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_TOOL);
gtk_object_add_arg_type ("GimpContext::foreground",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_FOREGROUND);
gtk_object_add_arg_type ("GimpContext::background",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BACKGROUND);
gtk_object_add_arg_type ("GimpContext::opacity",
GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_OPACITY);
gtk_object_add_arg_type ("GimpContext::paint_mode",
GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_PAINT_MODE);
gtk_object_add_arg_type ("GimpContext::brush",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_BRUSH);
gtk_object_add_arg_type ("GimpContext::pattern",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_PATTERN);
gtk_object_add_arg_type ("GimpContext::gradient",
GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_GRADIENT);
parent_class = gtk_type_class (gimp_object_get_type ());
gimp_context_signals[OPACITY_CHANGED] =
gimp_signal_new ("opacity_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
opacity_changed),
gimp_sigtype_double);
gimp_context_signals[PAINT_MODE_CHANGED] =
gimp_signal_new ("paint_mode_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
paint_mode_changed),
gimp_sigtype_int);
gimp_context_signals[IMAGE_CHANGED] =
gimp_signal_new ("image_changed",
GTK_RUN_FIRST,
@ -194,6 +251,70 @@ gimp_context_class_init (GimpContextClass *klass)
display_changed),
gimp_sigtype_pointer);
gimp_context_signals[TOOL_CHANGED] =
gimp_signal_new ("tool_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
tool_changed),
gimp_sigtype_int);
gimp_context_signals[FOREGROUND_CHANGED] =
gimp_signal_new ("foreground_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
foreground_changed),
gimp_sigtype_pointer);
gimp_context_signals[BACKGROUND_CHANGED] =
gimp_signal_new ("background_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
background_changed),
gimp_sigtype_pointer);
gimp_context_signals[OPACITY_CHANGED] =
gimp_signal_new ("opacity_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
opacity_changed),
gimp_sigtype_double);
gimp_context_signals[PAINT_MODE_CHANGED] =
gimp_signal_new ("paint_mode_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
paint_mode_changed),
gimp_sigtype_int);
gimp_context_signals[BRUSH_CHANGED] =
gimp_signal_new ("brush_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
brush_changed),
gimp_sigtype_pointer);
gimp_context_signals[PATTERN_CHANGED] =
gimp_signal_new ("pattern_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
pattern_changed),
gimp_sigtype_pointer);
gimp_context_signals[GRADIENT_CHANGED] =
gimp_signal_new ("gradient_changed",
GTK_RUN_FIRST,
object_class->type,
GTK_SIGNAL_OFFSET (GimpContextClass,
gradient_changed),
gimp_sigtype_pointer);
gtk_object_class_add_signals (object_class, gimp_context_signals,
LAST_SIGNAL);
@ -201,10 +322,16 @@ gimp_context_class_init (GimpContextClass *klass)
object_class->get_arg = gimp_context_get_arg;
object_class->destroy = gimp_context_destroy;
klass->opacity_changed = NULL;
klass->paint_mode_changed = NULL;
klass->image_changed = NULL;
klass->display_changed = NULL;
klass->tool_changed = NULL;
klass->foreground_changed = NULL;
klass->background_changed = NULL;
klass->opacity_changed = NULL;
klass->paint_mode_changed = NULL;
klass->brush_changed = NULL;
klass->pattern_changed = NULL;
klass->gradient_changed = NULL;
}
static void
@ -213,8 +340,29 @@ gimp_context_init (GimpContext *context)
context->name = NULL;
context->parent = NULL;
/* Values to be taken from the parent context by default */
context->image_defined = FALSE;
context->image = NULL;
context->display_defined = FALSE;
context->display = NULL;
context->tool_defined = FALSE;
context->tool = RECT_SELECT;
/* Values defined by default */
context->foreground_defined = TRUE;
context->foreground[0] = 255;
context->foreground[1] = 255;
context->foreground[2] = 255;
context->background_defined = TRUE;
context->background[0] = 0;
context->background[1] = 0;
context->background[2] = 0;
context->opacity_defined = TRUE;
context->opacity = 1.0;
@ -223,14 +371,17 @@ gimp_context_init (GimpContext *context)
/* Values to be taken from the parent context by default */
context->image_defined = FALSE;
context->image = NULL;
context->brush_defined = FALSE;
context->brush = NULL;
context->display_defined = FALSE;
context->display = NULL;
context->pattern_defined = FALSE;
context->pattern = NULL;
context->gradient_defined = FALSE;
context->gradient = NULL;
}
/* public functions *******************************************************/
/* public functions ********************************************************/
GtkType
gimp_context_get_type (void)
@ -276,21 +427,41 @@ gimp_context_new (gchar *name,
if (template)
{
context->opacity = gimp_context_get_opacity (template);
context->paint_mode = gimp_context_get_paint_mode (template);
context->image = gimp_context_get_image (template);
context->display = gimp_context_get_display (template);
guchar col[3];
context->image = gimp_context_get_image (template);
context->display = gimp_context_get_display (template);
context->tool = gimp_context_get_tool (template);
gimp_context_get_foreground (template, col);
context->foreground[0] = col[0];
context->foreground[1] = col[1];
context->foreground[2] = col[2];
gimp_context_get_background (template, col);
context->background[0] = col[0];
context->background[1] = col[1];
context->background[2] = col[2];
context->opacity = gimp_context_get_opacity (template);
context->paint_mode = gimp_context_get_paint_mode (template);
context->brush = gimp_context_get_brush (template);
context->pattern = gimp_context_get_pattern (template);
context->gradient = gimp_context_get_gradient (template);
context->opacity_defined = template->opacity_defined;
context->paint_mode_defined = template->paint_mode_defined;
context->image_defined = template->image_defined;
context->display_defined = template->display_defined;
context->tool_defined = template->tool_defined;
context->foreground_defined = template->foreground_defined;
context->background_defined = template->background_defined;
context->opacity_defined = template->opacity_defined;
context->paint_mode_defined = template->paint_mode_defined;
context->brush_defined = template->brush_defined;
context->pattern_defined = template->pattern_defined;
context->gradient_defined = template->gradient_defined;
}
return context;
}
/* getting/setting the special contexts ***********************************/
/* getting/setting the special contexts ************************************/
GimpContext *
gimp_context_get_current (void)
@ -341,7 +512,7 @@ gimp_context_get_standard (void)
return standard_context;
}
/* functions manipulating a single context ********************************/
/* functions manipulating a single context *********************************/
gchar *
gimp_context_get_name (GimpContext *context)
@ -380,99 +551,7 @@ gimp_context_set_parent (GimpContext *context,
* functions into a single macro call
*/
/* opacity */
gdouble
gimp_context_get_opacity (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 1.0);
context_find_defined (context, opacity_defined);
return context->opacity;
}
void
gimp_context_set_opacity (GimpContext *context,
gdouble opacity)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, opacity_defined);
context->opacity = opacity;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[OPACITY_CHANGED],
opacity);
}
gboolean
gimp_context_opacity_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->opacity_defined;
}
void
gimp_context_define_opacity (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->opacity = gimp_context_get_opacity (context);
context->opacity_defined = defined;
}
/* paint mode */
LayerModeEffects
gimp_context_get_paint_mode (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 0);
context_find_defined (context, paint_mode_defined);
return context->paint_mode;
}
void
gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, paint_mode_defined);
context->paint_mode = paint_mode;
gtk_signal_emit (GTK_OBJECT(context),
gimp_context_signals[PAINT_MODE_CHANGED],
paint_mode);
}
gboolean
gimp_context_paint_mode_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->paint_mode_defined;
}
void
gimp_context_define_paint_mode (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->paint_mode = gimp_context_get_paint_mode (context);
context->paint_mode_defined = defined;
}
/* image */
/* image *******************************************************************/
GimpImage *
gimp_context_get_image (GimpContext *context)
@ -520,7 +599,7 @@ gimp_context_define_image (GimpContext *context,
context->image_defined = defined;
}
/* display */
/* display *****************************************************************/
GDisplay *
gimp_context_get_display (GimpContext *context)
@ -574,3 +653,417 @@ gimp_context_define_display (GimpContext *context,
context->display_defined = defined;
}
/* tool ********************************************************************/
ToolType
gimp_context_get_tool (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 0);
context_find_defined (context, tool_defined);
return context->tool;
}
void
gimp_context_set_tool (GimpContext *context,
ToolType tool)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, tool_defined);
if (context->tool == tool) return;
context->tool = tool;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[TOOL_CHANGED],
tool);
}
gboolean
gimp_context_tool_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->tool_defined;
}
void
gimp_context_define_tool (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->tool = gimp_context_get_tool (context);
context->tool_defined = defined;
}
/* foreground color ********************************************************/
void
gimp_context_get_foreground (GimpContext *context,
guchar foreground[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, foreground_defined);
foreground[0] = context->foreground[0];
foreground[1] = context->foreground[1];
foreground[2] = context->foreground[2];
}
void
gimp_context_set_foreground (GimpContext *context,
guchar foreground[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, foreground_defined);
if (context->foreground[0] == foreground[0] &&
context->foreground[1] == foreground[1] &&
context->foreground[2] == foreground[2]) return;
context->foreground[0] = foreground[0];
context->foreground[1] = foreground[1];
context->foreground[2] = foreground[2];
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[FOREGROUND_CHANGED],
context->foreground);
}
gboolean
gimp_context_foreground_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->foreground_defined;
}
void
gimp_context_define_foreground (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
{
guchar col[3];
gimp_context_get_foreground (context, col);
context->foreground[0] = col[0];
context->foreground[1] = col[1];
context->foreground[2] = col[2];
}
context->foreground_defined = defined;
}
/* background color ********************************************************/
void
gimp_context_get_background (GimpContext *context,
guchar background[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, background_defined);
background[0] = context->background[0];
background[1] = context->background[1];
background[2] = context->background[2];
}
void
gimp_context_set_background (GimpContext *context,
guchar background[3])
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, background_defined);
if (context->background[0] == background[0] &&
context->background[1] == background[1] &&
context->background[2] == background[2]) return;
context->background[0] = background[0];
context->background[1] = background[1];
context->background[2] = background[2];
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[BACKGROUND_CHANGED],
context->background);
}
gboolean
gimp_context_background_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->background_defined;
}
void
gimp_context_define_background (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
{
guchar col[3];
gimp_context_get_background (context, col);
context->background[0] = col[0];
context->background[1] = col[1];
context->background[2] = col[2];
}
context->background_defined = defined;
}
/* opacity *****************************************************************/
gdouble
gimp_context_get_opacity (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 1.0);
context_find_defined (context, opacity_defined);
return context->opacity;
}
void
gimp_context_set_opacity (GimpContext *context,
gdouble opacity)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, opacity_defined);
if (context->opacity == opacity) return;
context->opacity = opacity;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[OPACITY_CHANGED],
opacity);
}
gboolean
gimp_context_opacity_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->opacity_defined;
}
void
gimp_context_define_opacity (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->opacity = gimp_context_get_opacity (context);
context->opacity_defined = defined;
}
/* paint mode **************************************************************/
LayerModeEffects
gimp_context_get_paint_mode (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, 0);
context_find_defined (context, paint_mode_defined);
return context->paint_mode;
}
void
gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, paint_mode_defined);
if (context->paint_mode == paint_mode) return;
context->paint_mode = paint_mode;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[PAINT_MODE_CHANGED],
paint_mode);
}
gboolean
gimp_context_paint_mode_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->paint_mode_defined;
}
void
gimp_context_define_paint_mode (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->paint_mode = gimp_context_get_paint_mode (context);
context->paint_mode_defined = defined;
}
/* brush *******************************************************************/
GimpBrush *
gimp_context_get_brush (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, NULL);
context_find_defined (context, brush_defined);
return context->brush;
}
void
gimp_context_set_brush (GimpContext *context,
GimpBrush *brush)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, brush_defined);
if (context->brush == brush) return;
context->brush = brush;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[BRUSH_CHANGED],
brush);
}
gboolean
gimp_context_brush_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->brush_defined;
}
void
gimp_context_define_brush (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->brush = gimp_context_get_brush (context);
context->brush_defined = defined;
}
/* pattern *****************************************************************/
GPattern *
gimp_context_get_pattern (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, NULL);
context_find_defined (context, pattern_defined);
return context->pattern;
}
void
gimp_context_set_pattern (GimpContext *context,
GPattern *pattern)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, pattern_defined);
if (context->pattern == pattern) return;
context->pattern = pattern;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[PATTERN_CHANGED],
pattern);
}
gboolean
gimp_context_pattern_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->pattern_defined;
}
void
gimp_context_define_pattern (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->pattern = gimp_context_get_pattern (context);
context->pattern_defined = defined;
}
/* gradient ****************************************************************/
gradient_t *
gimp_context_get_gradient (GimpContext *context)
{
context_check_current (context);
context_return_val_if_fail (context, NULL);
context_find_defined (context, gradient_defined);
return context->gradient;
}
void
gimp_context_set_gradient (GimpContext *context,
gradient_t *gradient)
{
context_check_current (context);
context_return_if_fail (context);
context_find_defined (context, gradient_defined);
if (context->gradient == gradient) return;
context->gradient = gradient;
gtk_signal_emit (GTK_OBJECT (context),
gimp_context_signals[GRADIENT_CHANGED],
gradient);
}
gboolean
gimp_context_gradient_defined (GimpContext *context)
{
context_return_val_if_fail (context, FALSE);
return context->gradient_defined;
}
void
gimp_context_define_gradient (GimpContext *context,
gboolean defined)
{
context_return_if_fail (context);
if (defined)
context->gradient = gimp_context_get_gradient (context);
context->gradient_defined = defined;
}

View File

@ -20,8 +20,13 @@
#include <glib.h>
#include "apptypes.h"
#include "gdisplay.h"
#include "gimpimageF.h"
#include "gradient_header.h"
#include "patterns.h"
#include "toolsF.h"
#include "gimpobjectP.h"
#define GIMP_TYPE_CONTEXT (gimp_context_get_type ())
@ -32,18 +37,29 @@
typedef enum
{
GIMP_CONTEXT_ARG_OPACITY = 1 << 0,
GIMP_CONTEXT_ARG_PAINT_MODE = 1 << 1,
GIMP_CONTEXT_ARG_IMAGE = 1 << 2,
GIMP_CONTEXT_ARG_DISPLAY = 1 << 3,
GIMP_CONTEXT_ARG_IMAGE = 1 << 0,
GIMP_CONTEXT_ARG_DISPLAY = 1 << 1,
GIMP_CONTEXT_ARG_TOOL = 1 << 2,
GIMP_CONTEXT_ARG_FOREGROUND = 1 << 3,
GIMP_CONTEXT_ARG_BACKGROUND = 1 << 4,
GIMP_CONTEXT_ARG_OPACITY = 1 << 5,
GIMP_CONTEXT_ARG_PAINT_MODE = 1 << 6,
GIMP_CONTEXT_ARG_BRUSH = 1 << 7,
GIMP_CONTEXT_ARG_PATTERN = 1 << 8,
GIMP_CONTEXT_ARG_GRADIENT = 1 << 9,
/* aliases
*/
GIMP_CONTEXT_ARG_PAINT = GIMP_CONTEXT_ARG_OPACITY |
GIMP_CONTEXT_ARG_PAINT_MODE,
GIMP_CONTEXT_ARG_ALL = GIMP_CONTEXT_ARG_PAINT |
GIMP_CONTEXT_ARG_IMAGE |
GIMP_CONTEXT_ARG_DISPLAY
GIMP_CONTEXT_ARG_PAINT = GIMP_CONTEXT_ARG_FOREGROUND |
GIMP_CONTEXT_ARG_BACKGROUND |
GIMP_CONTEXT_ARG_OPACITY |
GIMP_CONTEXT_ARG_PAINT_MODE |
GIMP_CONTEXT_ARG_BRUSH |
GIMP_CONTEXT_ARG_PATTERN |
GIMP_CONTEXT_ARG_GRADIENT,
GIMP_CONTEXT_ARG_ALL = GIMP_CONTEXT_ARG_IMAGE |
GIMP_CONTEXT_ARG_DISPLAY |
GIMP_CONTEXT_ARG_TOOL
} GimpContextArgs;
typedef struct _GimpContext GimpContext;
@ -59,6 +75,20 @@ struct _GimpContext
/* FIXME: the solution of having a boolean for each attribute and the
* name "defined" need some brainstorming
*/
gboolean image_defined;
GimpImage *image;
gboolean display_defined;
GDisplay *display;
gboolean tool_defined;
ToolType tool;
gboolean foreground_defined;
guchar foreground[3];
gboolean background_defined;
guchar background[3];
gboolean opacity_defined;
gdouble opacity;
@ -66,22 +96,32 @@ struct _GimpContext
gboolean paint_mode_defined;
LayerModeEffects paint_mode;
gboolean image_defined;
GimpImage *image;
gboolean brush_defined;
GimpBrush *brush;
gboolean display_defined;
GDisplay *display;
gboolean pattern_defined;
GPattern *pattern;
gboolean gradient_defined;
gradient_t *gradient;
};
struct _GimpContextClass
{
GimpObjectClass parent_class;
void (* opacity_changed) (GimpContext *context, gdouble opacity);
void (* paint_mode_changed) (GimpContext *context, gint paint_mode);
void (* image_changed) (GimpContext *context, gpointer image);
void (* display_changed) (GimpContext *context, gpointer display);
void (* tool_changed) (GimpContext *context, gint tool_type);
void (* foreground_changed) (GimpContext *context, guchar foreground[3]);
void (* background_changed) (GimpContext *context, guchar background[3]);
void (* opacity_changed) (GimpContext *context, gdouble opacity);
void (* paint_mode_changed) (GimpContext *context, gint paint_mode);
void (* brush_changed) (GimpContext *context, gpointer brush);
void (* pattern_changed) (GimpContext *context, gpointer pattern);
void (* gradient_changed) (GimpContext *context, gpointer gradient);
};
GtkType gimp_context_get_type (void);
@ -129,33 +169,96 @@ GimpContext * gimp_context_get_parent (GimpContext *context);
void gimp_context_set_parent (GimpContext *context,
GimpContext *parent);
gdouble gimp_context_get_opacity (GimpContext *context);
void gimp_context_set_opacity (GimpContext *context,
gdouble opacity);
gboolean gimp_context_opacity_defined (GimpContext *context);
void gimp_context_define_opacity (GimpContext *context,
gboolean defined);
/* image */
LayerModeEffects
gimp_context_get_paint_mode (GimpContext *context);
void gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode);
gboolean gimp_context_paint_mode_defined (GimpContext *context);
void gimp_context_define_paint_mode (GimpContext *context,
gboolean defined);
GimpImage * gimp_context_get_image (GimpContext *context);
void gimp_context_set_image (GimpContext *context,
GimpImage *image);
gboolean gimp_context_image_defined (GimpContext *context);
void gimp_context_define_image (GimpContext *context,
gboolean defined);
GimpImage * gimp_context_get_image (GimpContext *context);
void gimp_context_set_image (GimpContext *context,
GimpImage *image);
gboolean gimp_context_image_defined (GimpContext *context);
void gimp_context_define_image (GimpContext *context,
gboolean defined);
/* display */
GDisplay * gimp_context_get_display (GimpContext *context);
void gimp_context_set_display (GimpContext *context,
GDisplay *display);
gboolean gimp_context_display_defined (GimpContext *context);
void gimp_context_define_display (GimpContext *context,
gboolean defined);
GDisplay * gimp_context_get_display (GimpContext *context);
void gimp_context_set_display (GimpContext *context,
GDisplay *display);
gboolean gimp_context_display_defined (GimpContext *context);
void gimp_context_define_display (GimpContext *context,
gboolean defined);
/* tool */
ToolType gimp_context_get_tool (GimpContext *context);
void gimp_context_set_tool (GimpContext *context,
ToolType tool_type);
gboolean gimp_context_tool_defined (GimpContext *context);
void gimp_context_define_tool (GimpContext *context,
gboolean defined);
/* foreground color */
void gimp_context_get_foreground (GimpContext *context,
guchar foreground[3]);
void gimp_context_set_foreground (GimpContext *context,
guchar foreground[3]);
gboolean gimp_context_foreground_defined (GimpContext *context);
void gimp_context_define_foreground (GimpContext *context,
gboolean defined);
/* background color */
void gimp_context_get_background (GimpContext *context,
guchar background[3]);
void gimp_context_set_background (GimpContext *context,
guchar background[3]);
gboolean gimp_context_background_defined (GimpContext *context);
void gimp_context_define_background (GimpContext *context,
gboolean defined);
/* opacity */
gdouble gimp_context_get_opacity (GimpContext *context);
void gimp_context_set_opacity (GimpContext *context,
gdouble opacity);
gboolean gimp_context_opacity_defined (GimpContext *context);
void gimp_context_define_opacity (GimpContext *context,
gboolean defined);
/* paint mode */
LayerModeEffects gimp_context_get_paint_mode (GimpContext *context);
void gimp_context_set_paint_mode (GimpContext *context,
LayerModeEffects paint_mode);
gboolean gimp_context_paint_mode_defined (GimpContext *context);
void gimp_context_define_paint_mode (GimpContext *context,
gboolean defined);
/* brush */
GimpBrush * gimp_context_get_brush (GimpContext *context);
void gimp_context_set_brush (GimpContext *context,
GimpBrush *brush);
gboolean gimp_context_brush_defined (GimpContext *context);
void gimp_context_define_brush (GimpContext *context,
gboolean defined);
/* pattern */
GPattern * gimp_context_get_pattern (GimpContext *context);
void gimp_context_set_pattern (GimpContext *context,
GPattern *pattern);
gboolean gimp_context_pattern_defined (GimpContext *context);
void gimp_context_define_pattern (GimpContext *context,
gboolean defined);
/* gradient */
gradient_t * gimp_context_get_gradient (GimpContext *context);
void gimp_context_set_gradient (GimpContext *context,
gradient_t *gradient);
gboolean gimp_context_gradient_defined (GimpContext *context);
void gimp_context_define_gradient (GimpContext *context,
gboolean defined);
#endif /* __GIMP_CONTEXT_H__ */