libgimpwidgets: move all GimpOffsetArea members to a private struct

This commit is contained in:
Michael Natterer 2010-12-29 16:49:38 +01:00
parent 271f94928f
commit d2116f481b
2 changed files with 138 additions and 99 deletions

View File

@ -48,6 +48,25 @@ enum
};
typedef struct _GimpOffsetAreaPrivate GimpOffsetAreaPrivate;
struct _GimpOffsetAreaPrivate
{
gint orig_width;
gint orig_height;
gint width;
gint height;
gint offset_x;
gint offset_y;
gdouble display_ratio_x;
gdouble display_ratio_y;
};
#define GET_PRIVATE(obj) G_TYPE_INSTANCE_GET_PRIVATE (obj, \
GIMP_TYPE_OFFSET_AREA, \
GimpOffsetAreaPrivate)
static void gimp_offset_area_resize (GimpOffsetArea *area);
static void gimp_offset_area_realize (GtkWidget *widget);
@ -69,6 +88,7 @@ static guint gimp_offset_area_signals[LAST_SIGNAL] = { 0 };
static void
gimp_offset_area_class_init (GimpOffsetAreaClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
gimp_offset_area_signals[OFFSETS_CHANGED] =
@ -86,19 +106,23 @@ gimp_offset_area_class_init (GimpOffsetAreaClass *klass)
widget_class->realize = gimp_offset_area_realize;
widget_class->event = gimp_offset_area_event;
widget_class->draw = gimp_offset_area_draw;
g_type_class_add_private (object_class, sizeof (GimpOffsetAreaPrivate));
}
static void
gimp_offset_area_init (GimpOffsetArea *area)
{
area->orig_width = 0;
area->orig_height = 0;
area->width = 0;
area->height = 0;
area->offset_x = 0;
area->offset_y = 0;
area->display_ratio_x = 1.0;
area->display_ratio_y = 1.0;
GimpOffsetAreaPrivate *private = GET_PRIVATE (area);
private->orig_width = 0;
private->orig_height = 0;
private->width = 0;
private->height = 0;
private->offset_x = 0;
private->offset_y = 0;
private->display_ratio_x = 1.0;
private->display_ratio_y = 1.0;
gtk_widget_add_events (GTK_WIDGET (area),
GDK_BUTTON_PRESS_MASK |
@ -121,15 +145,18 @@ GtkWidget *
gimp_offset_area_new (gint orig_width,
gint orig_height)
{
GimpOffsetArea *area;
GimpOffsetArea *area;
GimpOffsetAreaPrivate *private;
g_return_val_if_fail (orig_width > 0, NULL);
g_return_val_if_fail (orig_height > 0, NULL);
area = g_object_new (GIMP_TYPE_OFFSET_AREA, NULL);
area->orig_width = area->width = orig_width;
area->orig_height = area->height = orig_height;
private = GET_PRIVATE (area);
private->orig_width = private->width = orig_width;
private->orig_height = private->height = orig_height;
gimp_offset_area_resize (area);
@ -175,31 +202,39 @@ gimp_offset_area_set_size (GimpOffsetArea *area,
gint width,
gint height)
{
GimpOffsetAreaPrivate *private;
g_return_if_fail (GIMP_IS_OFFSET_AREA (area));
g_return_if_fail (width > 0 && height > 0);
if (area->width != width || area->height != height)
private = GET_PRIVATE (area);
if (private->width != width || private->height != height)
{
gint offset_x;
gint offset_y;
area->width = width;
area->height = height;
private->width = width;
private->height = height;
if (area->orig_width <= area->width)
offset_x = CLAMP (area->offset_x, 0, area->width - area->orig_width);
if (private->orig_width <= private->width)
offset_x = CLAMP (private->offset_x,
0, private->width - private->orig_width);
else
offset_x = CLAMP (area->offset_x, area->width - area->orig_width, 0);
offset_x = CLAMP (private->offset_x,
private->width - private->orig_width, 0);
if (area->orig_height <= area->height)
offset_y = CLAMP (area->offset_y, 0, area->height - area->orig_height);
if (private->orig_height <= private->height)
offset_y = CLAMP (private->offset_y,
0, private->height - private->orig_height);
else
offset_y = CLAMP (area->offset_y, area->height - area->orig_height, 0);
offset_y = CLAMP (private->offset_y,
private->height - private->orig_height, 0);
if (offset_x != area->offset_x || offset_y != area->offset_y)
if (offset_x != private->offset_x || offset_y != private->offset_y)
{
area->offset_x = offset_x;
area->offset_y = offset_y;
private->offset_x = offset_x;
private->offset_y = offset_y;
g_signal_emit (area,
gimp_offset_area_signals[OFFSETS_CHANGED], 0,
@ -224,19 +259,27 @@ gimp_offset_area_set_offsets (GimpOffsetArea *area,
gint offset_x,
gint offset_y)
{
GimpOffsetAreaPrivate *private;
g_return_if_fail (GIMP_IS_OFFSET_AREA (area));
if (area->offset_x != offset_x || area->offset_y != offset_y)
{
if (area->orig_width <= area->width)
area->offset_x = CLAMP (offset_x, 0, area->width - area->orig_width);
else
area->offset_x = CLAMP (offset_x, area->width - area->orig_width, 0);
private = GET_PRIVATE (area);
if (area->orig_height <= area->height)
area->offset_y = CLAMP (offset_y, 0, area->height - area->orig_height);
if (private->offset_x != offset_x || private->offset_y != offset_y)
{
if (private->orig_width <= private->width)
private->offset_x = CLAMP (offset_x,
0, private->width - private->orig_width);
else
area->offset_y = CLAMP (offset_y, area->height - area->orig_height, 0);
private->offset_x = CLAMP (offset_x,
private->width - private->orig_width, 0);
if (private->orig_height <= private->height)
private->offset_y = CLAMP (offset_y,
0, private->height - private->orig_height);
else
private->offset_y = CLAMP (offset_y,
private->height - private->orig_height, 0);
gtk_widget_queue_draw (GTK_WIDGET (area));
}
@ -245,22 +288,23 @@ gimp_offset_area_set_offsets (GimpOffsetArea *area,
static void
gimp_offset_area_resize (GimpOffsetArea *area)
{
gint width;
gint height;
gdouble ratio;
GimpOffsetAreaPrivate *private = GET_PRIVATE (area);
gint width;
gint height;
gdouble ratio;
if (area->orig_width == 0 || area->orig_height == 0)
if (private->orig_width == 0 || private->orig_height == 0)
return;
if (area->orig_width <= area->width)
width = area->width;
if (private->orig_width <= private->width)
width = private->width;
else
width = area->orig_width * 2 - area->width;
width = private->orig_width * 2 - private->width;
if (area->orig_height <= area->height)
height = area->height;
if (private->orig_height <= private->height)
height = private->height;
else
height = area->orig_height * 2 - area->height;
height = private->orig_height * 2 - private->height;
ratio = (gdouble) DRAWING_AREA_SIZE / (gdouble) MAX (width, height);
@ -275,20 +319,21 @@ static void
gimp_offset_area_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
GimpOffsetArea *area = GIMP_OFFSET_AREA (widget);
GdkPixbuf *pixbuf;
GimpOffsetArea *area = GIMP_OFFSET_AREA (widget);
GimpOffsetAreaPrivate *private = GET_PRIVATE (area);
GdkPixbuf *pixbuf;
GTK_WIDGET_CLASS (parent_class)->size_allocate (widget, allocation);
area->display_ratio_x = ((gdouble) allocation->width /
((area->orig_width <= area->width) ?
area->width :
area->orig_width * 2 - area->width));
private->display_ratio_x = ((gdouble) allocation->width /
((private->orig_width <= private->width) ?
private->width :
private->orig_width * 2 - private->width));
area->display_ratio_y = ((gdouble) allocation->height /
((area->orig_height <= area->height) ?
area->height :
area->orig_height * 2 - area->height));
private->display_ratio_y = ((gdouble) allocation->height /
((private->orig_height <= private->height) ?
private->height :
private->orig_height * 2 - private->height));
pixbuf = g_object_get_data (G_OBJECT (area), "pixbuf");
@ -298,10 +343,10 @@ gimp_offset_area_size_allocate (GtkWidget *widget,
gint pixbuf_width;
gint pixbuf_height;
pixbuf_width = area->display_ratio_x * area->orig_width;
pixbuf_width = private->display_ratio_x * private->orig_width;
pixbuf_width = MAX (pixbuf_width, 1);
pixbuf_height = area->display_ratio_y * area->orig_height;
pixbuf_height = private->display_ratio_y * private->orig_height;
pixbuf_height = MAX (pixbuf_height, 1);
copy = g_object_get_data (G_OBJECT (area), "pixbuf-copy");
@ -346,11 +391,12 @@ gimp_offset_area_event (GtkWidget *widget,
static gint start_x = 0;
static gint start_y = 0;
GimpOffsetArea *area = GIMP_OFFSET_AREA (widget);
gint offset_x;
gint offset_y;
GimpOffsetArea *area = GIMP_OFFSET_AREA (widget);
GimpOffsetAreaPrivate *private = GET_PRIVATE (area);
gint offset_x;
gint offset_y;
if (area->orig_width == 0 || area->orig_height == 0)
if (private->orig_width == 0 || private->orig_height == 0)
return FALSE;
switch (event->type)
@ -360,8 +406,8 @@ gimp_offset_area_event (GtkWidget *widget,
{
gtk_grab_add (widget);
orig_offset_x = area->offset_x;
orig_offset_y = area->offset_y;
orig_offset_x = private->offset_x;
orig_offset_y = private->offset_y;
start_x = event->button.x;
start_y = event->button.y;
}
@ -369,17 +415,17 @@ gimp_offset_area_event (GtkWidget *widget,
case GDK_MOTION_NOTIFY:
offset_x = (orig_offset_x +
(event->motion.x - start_x) / area->display_ratio_x);
(event->motion.x - start_x) / private->display_ratio_x);
offset_y = (orig_offset_y +
(event->motion.y - start_y) / area->display_ratio_y);
(event->motion.y - start_y) / private->display_ratio_y);
if (area->offset_x != offset_x || area->offset_y != offset_y)
if (private->offset_x != offset_x || private->offset_y != offset_y)
{
gimp_offset_area_set_offsets (area, offset_x, offset_y);
g_signal_emit (area,
gimp_offset_area_signals[OFFSETS_CHANGED], 0,
area->offset_x, area->offset_y);
private->offset_x, private->offset_y);
}
break;
@ -403,29 +449,30 @@ static gboolean
gimp_offset_area_draw (GtkWidget *widget,
cairo_t *cr)
{
GimpOffsetArea *area = GIMP_OFFSET_AREA (widget);
GtkStyleContext *context = gtk_widget_get_style_context (widget);
GtkAllocation allocation;
GdkPixbuf *pixbuf;
gint w, h;
gint x, y;
GimpOffsetArea *area = GIMP_OFFSET_AREA (widget);
GimpOffsetAreaPrivate *private = GET_PRIVATE (area);
GtkStyleContext *context = gtk_widget_get_style_context (widget);
GtkAllocation allocation;
GdkPixbuf *pixbuf;
gint w, h;
gint x, y;
gtk_widget_get_allocation (widget, &allocation);
x = (area->display_ratio_x *
((area->orig_width <= area->width) ?
area->offset_x :
area->offset_x + area->orig_width - area->width));
x = (private->display_ratio_x *
((private->orig_width <= private->width) ?
private->offset_x :
private->offset_x + private->orig_width - private->width));
y = (area->display_ratio_y *
((area->orig_height <= area->height) ?
area->offset_y :
area->offset_y + area->orig_height - area->height));
y = (private->display_ratio_y *
((private->orig_height <= private->height) ?
private->offset_y :
private->offset_y + private->orig_height - private->height));
w = area->display_ratio_x * area->orig_width;
w = private->display_ratio_x * private->orig_width;
w = MAX (w, 1);
h = area->display_ratio_y * area->orig_height;
h = private->display_ratio_y * private->orig_height;
h = MAX (h, 1);
pixbuf = g_object_get_data (G_OBJECT (widget), "pixbuf-copy");
@ -445,14 +492,15 @@ gimp_offset_area_draw (GtkWidget *widget,
gtk_render_frame (context, cr, x, y, w, h);
}
if (area->orig_width > area->width || area->orig_height > area->height)
if (private->orig_width > private->width ||
private->orig_height > private->height)
{
gint line_width;
if (area->orig_width > area->width)
if (private->orig_width > private->width)
{
x = area->display_ratio_x * (area->orig_width - area->width);
w = area->display_ratio_x * area->width;
x = private->display_ratio_x * (private->orig_width - private->width);
w = private->display_ratio_x * private->width;
}
else
{
@ -460,10 +508,10 @@ gimp_offset_area_draw (GtkWidget *widget,
w = allocation.width + 2;
}
if (area->orig_height > area->height)
if (private->orig_height > private->height)
{
y = area->display_ratio_y * (area->orig_height - area->height);
h = area->display_ratio_y * area->height;
y = private->display_ratio_y * (private->orig_height - private->height);
h = private->display_ratio_y * private->height;
}
else
{

View File

@ -44,24 +44,15 @@ typedef struct _GimpOffsetAreaClass GimpOffsetAreaClass;
struct _GimpOffsetArea
{
GtkDrawingArea parent_instance;
gint orig_width;
gint orig_height;
gint width;
gint height;
gint offset_x;
gint offset_y;
gdouble display_ratio_x;
gdouble display_ratio_y;
};
struct _GimpOffsetAreaClass
{
GtkDrawingAreaClass parent_class;
void (* offsets_changed) (GimpOffsetArea *offset_area,
gint offset_x,
gint offset_y);
void (* offsets_changed) (GimpOffsetArea *offset_area,
gint offset_x,
gint offset_y);
/* Padding for future expansion */
void (* _gimp_reserved1) (void);