new funtion which returns TRUE if any of the gradient's segments refer to

2006-08-31  Michael Natterer  <mitch@gimp.org>

	* app/core/gimpgradient.[ch] (gimp_gradient_has_fg_bg_segments):
	new funtion which returns TRUE if any of the gradient's segments
	refer to FG of BG.

	(gimp_gradient_segment_get_left_color_type)
	(gimp_gradient_segment_set_left_color_type)
	(gimp_gradient_segment_get_right_color_type)
	(gimp_gradient_segment_set_right_color_type): new accessors for
	the new GimpGradientColor stuff.

	(gimp_gradient_segment_split_midpoint)
	(gimp_gradient_segment_range_flip)
	(gimp_gradient_segment_range_replicate): split, flip and replicate
	the segments' color_types too.

	* app/widgets/gimpviewrenderer.[ch]: added virtual functions
	::set_context() and ::invalidate() and call them.

	* app/widgets/gimpviewrenderergradient.[ch]: implement the virtual
	functions. Connect to the context's "foreground-changed" and
	"background-changed" signals if the gradient contains FG or BG
	colors and invalidate the renderer whenever they change.

	* app/core/gimp-gradients.c: removed signal connections which
	invalidated the gradients on FG/BG changes of the user context.
This commit is contained in:
Michael Natterer
2006-08-31 18:47:13 +00:00
committed by Michael Natterer
parent 50a8cde19a
commit 663b44c988
8 changed files with 290 additions and 83 deletions

View File

@ -51,23 +51,26 @@ enum
};
static void gimp_view_renderer_dispose (GObject *object);
static void gimp_view_renderer_finalize (GObject *object);
static void gimp_view_renderer_dispose (GObject *object);
static void gimp_view_renderer_finalize (GObject *object);
static gboolean gimp_view_renderer_idle_update (GimpViewRenderer *renderer);
static void gimp_view_renderer_real_draw (GimpViewRenderer *renderer,
GdkWindow *window,
GtkWidget *widget,
const GdkRectangle *draw_area,
const GdkRectangle *expose_area);
static void gimp_view_renderer_real_render (GimpViewRenderer *renderer,
GtkWidget *widget);
static gboolean gimp_view_renderer_idle_update (GimpViewRenderer *renderer);
static void gimp_view_renderer_real_set_context (GimpViewRenderer *renderer,
GimpContext *context);
static void gimp_view_renderer_real_invalidate (GimpViewRenderer *renderer);
static void gimp_view_renderer_real_draw (GimpViewRenderer *renderer,
GdkWindow *window,
GtkWidget *widget,
const GdkRectangle *draw_area,
const GdkRectangle *expose_area);
static void gimp_view_renderer_real_render (GimpViewRenderer *renderer,
GtkWidget *widget);
static void gimp_view_renderer_size_changed (GimpViewRenderer *renderer,
GimpViewable *viewable);
static GdkGC * gimp_view_renderer_create_gc (GimpViewRenderer *renderer,
GdkWindow *window,
GtkWidget *widget);
static void gimp_view_renderer_size_changed (GimpViewRenderer *renderer,
GimpViewable *viewable);
static GdkGC * gimp_view_renderer_create_gc (GimpViewRenderer *renderer,
GdkWindow *window,
GtkWidget *widget);
G_DEFINE_TYPE (GimpViewRenderer, gimp_view_renderer, G_TYPE_OBJECT)
@ -100,6 +103,8 @@ gimp_view_renderer_class_init (GimpViewRendererClass *klass)
object_class->finalize = gimp_view_renderer_finalize;
klass->update = NULL;
klass->set_context = gimp_view_renderer_real_set_context;
klass->invalidate = gimp_view_renderer_real_invalidate;
klass->draw = gimp_view_renderer_real_draw;
klass->render = gimp_view_renderer_real_render;
@ -153,6 +158,9 @@ gimp_view_renderer_dispose (GObject *object)
if (renderer->viewable)
gimp_view_renderer_set_viewable (renderer, NULL);
if (renderer->context)
gimp_view_renderer_set_context (renderer, NULL);
gimp_view_renderer_remove_idle (renderer);
G_OBJECT_CLASS (parent_class)->dispose (object);
@ -200,10 +208,12 @@ gimp_view_renderer_new_internal (GimpContext *context,
renderer = g_object_new (gimp_view_renderer_type_from_viewable_type (viewable_type),
NULL);
renderer->context = context;
renderer->viewable_type = viewable_type;
renderer->is_popup = is_popup ? TRUE : FALSE;
if (context)
gimp_view_renderer_set_context (renderer, context);
return renderer;
}
@ -272,7 +282,8 @@ gimp_view_renderer_set_context (GimpViewRenderer *renderer,
if (context != renderer->context)
{
renderer->context = context;
GIMP_VIEW_RENDERER_GET_CLASS (renderer)->set_context (renderer,
context);
if (renderer->viewable)
gimp_view_renderer_invalidate (renderer);
@ -521,9 +532,12 @@ gimp_view_renderer_invalidate (GimpViewRenderer *renderer)
g_return_if_fail (GIMP_IS_VIEW_RENDERER (renderer));
if (renderer->idle_id)
g_source_remove (renderer->idle_id);
{
g_source_remove (renderer->idle_id);
renderer->idle_id = 0;
}
renderer->needs_render = TRUE;
GIMP_VIEW_RENDERER_GET_CLASS (renderer)->invalidate (renderer);
renderer->idle_id =
g_idle_add_full (G_PRIORITY_LOW,
@ -669,6 +683,19 @@ gimp_view_renderer_idle_update (GimpViewRenderer *renderer)
return FALSE;
}
static void
gimp_view_renderer_real_set_context (GimpViewRenderer *renderer,
GimpContext *context)
{
renderer->context = context;
}
static void
gimp_view_renderer_real_invalidate (GimpViewRenderer *renderer)
{
renderer->needs_render = TRUE;
}
static void
gimp_view_renderer_real_draw (GimpViewRenderer *renderer,
GdkWindow *window,