32
32
#include "gimpdrawablepreview.h"
35
#define SELECTION_BORDER 2
38
static void gimp_drawable_preview_class_init (GimpDrawablePreviewClass *klass);
39
static void gimp_drawable_preview_init (GimpDrawablePreview *preview);
41
static void gimp_drawable_preview_style_set (GtkWidget *widget,
42
GtkStyle *prev_style);
44
static void gimp_drawable_preview_draw_original (GimpPreview *preview);
45
static void gimp_drawable_preview_draw_thumb (GimpPreview *preview,
46
GimpPreviewArea *area,
49
static void gimp_drawable_preview_draw_buffer (GimpPreview *preview,
52
static gboolean gimp_drawable_preview_get_bounds (GimpDrawable *drawable,
59
static GimpScrolledPreviewClass *parent_class = NULL;
63
gimp_drawable_preview_get_type (void)
65
static GType preview_type = 0;
69
static const GTypeInfo drawable_preview_info =
71
sizeof (GimpDrawablePreviewClass),
73
(GBaseFinalizeFunc) NULL,
74
(GClassInitFunc) gimp_drawable_preview_class_init,
75
NULL, /* class_finalize */
76
NULL, /* class_data */
77
sizeof (GimpDrawablePreview),
79
(GInstanceInitFunc) gimp_drawable_preview_init
82
preview_type = g_type_register_static (GIMP_TYPE_SCROLLED_PREVIEW,
83
"GimpDrawablePreview",
84
&drawable_preview_info, 0);
35
#define SELECTION_BORDER 8
50
static GObject * gimp_drawable_preview_constructor (GType type,
52
GObjectConstructParam *params);
54
static void gimp_drawable_preview_get_property (GObject *object,
58
static void gimp_drawable_preview_set_property (GObject *object,
62
static void gimp_drawable_preview_destroy (GtkObject *object);
64
static void gimp_drawable_preview_style_set (GtkWidget *widget,
65
GtkStyle *prev_style);
67
static void gimp_drawable_preview_draw_original (GimpPreview *preview);
68
static void gimp_drawable_preview_draw_thumb (GimpPreview *preview,
69
GimpPreviewArea *area,
72
static void gimp_drawable_preview_draw_buffer (GimpPreview *preview,
76
static void gimp_drawable_preview_set_drawable (GimpDrawablePreview *preview,
77
GimpDrawable *drawable);
80
G_DEFINE_TYPE (GimpDrawablePreview, gimp_drawable_preview,
81
GIMP_TYPE_SCROLLED_PREVIEW)
83
#define parent_class gimp_drawable_preview_parent_class
91
87
gimp_drawable_preview_class_init (GimpDrawablePreviewClass *klass)
93
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
94
GimpPreviewClass *preview_class = GIMP_PREVIEW_CLASS (klass);
96
parent_class = g_type_class_peek_parent (klass);
89
GObjectClass *object_class = G_OBJECT_CLASS (klass);
90
GtkObjectClass *gtk_object_class = GTK_OBJECT_CLASS (klass);
91
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
92
GimpPreviewClass *preview_class = GIMP_PREVIEW_CLASS (klass);
94
object_class->constructor = gimp_drawable_preview_constructor;
95
object_class->get_property = gimp_drawable_preview_get_property;
96
object_class->set_property = gimp_drawable_preview_set_property;
98
gtk_object_class->destroy = gimp_drawable_preview_destroy;
98
100
widget_class->style_set = gimp_drawable_preview_style_set;
100
102
preview_class->draw = gimp_drawable_preview_draw_original;
101
103
preview_class->draw_thumb = gimp_drawable_preview_draw_thumb;
102
104
preview_class->draw_buffer = gimp_drawable_preview_draw_buffer;
107
* GimpDrawablePreview:drawable:
111
g_object_class_install_property (object_class, PROP_DRAWABLE,
112
g_param_spec_pointer ("drawable", NULL, NULL,
113
GIMP_PARAM_READWRITE |
114
G_PARAM_CONSTRUCT_ONLY));
127
gimp_drawable_preview_constructor (GType type,
129
GObjectConstructParam *params)
132
PreviewSettings settings;
133
gchar *data_name = g_strconcat (g_get_prgname (), "-preview", NULL);
135
object = G_OBJECT_CLASS (parent_class)->constructor (type, n_params, params);
137
if (gimp_get_data (data_name, &settings))
138
gimp_scrolled_preview_set_position (GIMP_SCROLLED_PREVIEW (object),
139
settings.x, settings.y);
147
gimp_drawable_preview_get_property (GObject *object,
152
GimpDrawablePreview *preview = GIMP_DRAWABLE_PREVIEW (object);
157
g_value_set_pointer (value,
158
gimp_drawable_preview_get_drawable (preview));
162
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
168
gimp_drawable_preview_set_property (GObject *object,
173
GimpDrawablePreview *preview = GIMP_DRAWABLE_PREVIEW (object);
178
gimp_drawable_preview_set_drawable (preview,
179
g_value_get_pointer (value));
183
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
189
gimp_drawable_preview_destroy (GtkObject *object)
191
GimpPreview *preview = GIMP_PREVIEW (object);
192
PreviewSettings settings;
195
settings.x = preview->xoff + preview->xmin;
196
settings.y = preview->yoff + preview->ymin;
197
settings.update = TRUE;
199
data_name = g_strconcat (g_get_prgname (), "-preview", NULL);
200
gimp_set_data (data_name, &settings, sizeof (PreviewSettings));
203
GTK_OBJECT_CLASS (parent_class)->destroy (object);
115
207
gimp_drawable_preview_style_set (GtkWidget *widget,
116
208
GtkStyle *prev_style)
179
271
GimpDrawablePreview *drawable_preview = GIMP_DRAWABLE_PREVIEW (preview);
180
272
GimpDrawable *drawable = drawable_preview->drawable;
188
if (gimp_drawable_preview_get_bounds (drawable, &x1, &y1, &x2, &y2))
275
_gimp_drawable_preview_area_draw_thumb (area, drawable, width, height);
279
_gimp_drawable_preview_area_draw_thumb (GimpPreviewArea *area,
280
GimpDrawable *drawable,
288
gint nav_width, nav_height;
290
g_return_if_fail (GIMP_IS_PREVIEW_AREA (area));
291
g_return_if_fail (drawable != NULL);
293
if (_gimp_drawable_preview_get_bounds (drawable, &x1, &y1, &x2, &y2))
300
width = gimp_drawable_width (drawable->drawable_id);
301
height = gimp_drawable_height (drawable->drawable_id);
306
nav_width = MIN (width, size);
307
nav_height = (height * nav_width) / width;
311
nav_height = MIN (height, size);
312
nav_width = (width * nav_height) / height;
315
if (_gimp_drawable_preview_get_bounds (drawable, &x1, &y1, &x2, &y2))
190
317
buffer = gimp_drawable_get_sub_thumbnail_data (drawable->drawable_id,
191
318
x1, y1, x2 - x1, y2 - y1,
192
&width, &height, &bpp);
319
&nav_width, &nav_height,
196
324
buffer = gimp_drawable_get_thumbnail_data (drawable->drawable_id,
197
&width, &height, &bpp);
325
&nav_width, &nav_height,
202
331
GimpImageType type;
204
gtk_widget_set_size_request (GTK_WIDGET (area), width, height);
333
gtk_widget_set_size_request (GTK_WIDGET (area), nav_width, nav_height);
205
334
gtk_widget_show (GTK_WIDGET (area));
206
335
gtk_widget_realize (GTK_WIDGET (area));
219
348
gimp_preview_area_draw (area,
221
type, buffer, bpp * width);
349
0, 0, nav_width, nav_height,
350
type, buffer, bpp * nav_width);
228
gimp_rectangle_intersect (gint x1,
246
d_w = MIN (x1 + width1, x2 + width2) - d_x;
247
d_h = MIN (y1 + height1, y2 + height2) - d_y;
249
if (dest_x) *dest_x = d_x;
250
if (dest_y) *dest_y = d_y;
251
if (dest_width) *dest_width = d_w;
252
if (dest_height) *dest_height = d_h;
254
return (d_w > 0 && d_h > 0);
258
357
gimp_drawable_preview_draw_area (GimpDrawablePreview *preview,