1 /* LIBGIMP - The GIMP Library
2 * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
5 * Copyright (C) 2005 David Odin <dindinx@gimp.org>
7 * This library is free software: you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 3 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library. If not, see
19 * <https://www.gnu.org/licenses/>.
27 #include "libgimpwidgets/gimpwidgets.h"
29 #include "gimpuitypes.h"
33 #include "gimpdrawablepreview.h"
34 #include "gimpzoompreview.h"
38 * SECTION: gimpzoompreview
39 * @title: GimpZoomPreview
40 * @short_description: A drawable preview with zooming capabilities.
42 * A drawable preview with zooming capabilities.
59 struct _GimpZoomPreviewPrivate
66 #define GET_PRIVATE(obj) (((GimpZoomPreview *) (obj))->priv)
69 static void gimp_zoom_preview_constructed (GObject
*object
);
70 static void gimp_zoom_preview_finalize (GObject
*object
);
71 static void gimp_zoom_preview_dispose (GObject
*object
);
72 static void gimp_zoom_preview_get_property (GObject
*object
,
76 static void gimp_zoom_preview_set_property (GObject
*object
,
81 static void gimp_zoom_preview_set_adjustments (GimpZoomPreview
*preview
,
84 static void gimp_zoom_preview_size_allocate (GtkWidget
*widget
,
85 GtkAllocation
*allocation
,
86 GimpZoomPreview
*preview
);
87 static void gimp_zoom_preview_style_updated (GtkWidget
*widget
);
88 static gboolean
gimp_zoom_preview_scroll_event (GtkWidget
*widget
,
89 GdkEventScroll
*event
,
90 GimpZoomPreview
*preview
);
91 static void gimp_zoom_preview_draw (GimpPreview
*preview
);
92 static void gimp_zoom_preview_draw_buffer (GimpPreview
*preview
,
95 static void gimp_zoom_preview_draw_thumb (GimpPreview
*preview
,
96 GimpPreviewArea
*area
,
99 static void gimp_zoom_preview_set_cursor (GimpPreview
*preview
);
100 static void gimp_zoom_preview_transform (GimpPreview
*preview
,
105 static void gimp_zoom_preview_untransform (GimpPreview
*preview
,
111 static void gimp_zoom_preview_set_drawable_id (GimpZoomPreview
*preview
,
113 static void gimp_zoom_preview_set_model (GimpZoomPreview
*preview
,
114 GimpZoomModel
*model
);
116 static void gimp_zoom_preview_get_source_area (GimpPreview
*preview
,
123 G_DEFINE_TYPE (GimpZoomPreview
, gimp_zoom_preview
, GIMP_TYPE_SCROLLED_PREVIEW
)
125 #define parent_class gimp_zoom_preview_parent_class
127 static gint gimp_zoom_preview_counter
= 0;
131 gimp_zoom_preview_class_init (GimpZoomPreviewClass
*klass
)
133 GObjectClass
*object_class
= G_OBJECT_CLASS (klass
);
134 GtkWidgetClass
*widget_class
= GTK_WIDGET_CLASS (klass
);
135 GimpPreviewClass
*preview_class
= GIMP_PREVIEW_CLASS (klass
);
137 object_class
->constructed
= gimp_zoom_preview_constructed
;
138 object_class
->finalize
= gimp_zoom_preview_finalize
;
139 object_class
->dispose
= gimp_zoom_preview_dispose
;
140 object_class
->get_property
= gimp_zoom_preview_get_property
;
141 object_class
->set_property
= gimp_zoom_preview_set_property
;
143 widget_class
->style_updated
= gimp_zoom_preview_style_updated
;
145 preview_class
->draw
= gimp_zoom_preview_draw
;
146 preview_class
->draw_buffer
= gimp_zoom_preview_draw_buffer
;
147 preview_class
->draw_thumb
= gimp_zoom_preview_draw_thumb
;
148 preview_class
->set_cursor
= gimp_zoom_preview_set_cursor
;
149 preview_class
->transform
= gimp_zoom_preview_transform
;
150 preview_class
->untransform
= gimp_zoom_preview_untransform
;
152 g_type_class_add_private (object_class
, sizeof (GimpZoomPreviewPrivate
));
155 * GimpZoomPreview:drawable-id:
157 * The drawable the #GimpZoomPreview is attached to.
161 g_object_class_install_property (object_class
, PROP_DRAWABLE_ID
,
162 g_param_spec_int ("drawable-id",
164 "The drawable this preview is attached to",
166 GIMP_PARAM_READWRITE
|
167 G_PARAM_CONSTRUCT_ONLY
));
170 * GimpZoomPreview:model:
172 * The #GimpZoomModel used by this #GimpZoomPreview.
176 g_object_class_install_property (object_class
, PROP_MODEL
,
177 g_param_spec_object ("model",
179 "The zoom preview's GimpZoomModel",
180 GIMP_TYPE_ZOOM_MODEL
,
181 GIMP_PARAM_READWRITE
|
182 G_PARAM_CONSTRUCT_ONLY
));
186 gimp_zoom_preview_init (GimpZoomPreview
*preview
)
188 GtkWidget
*area
= gimp_preview_get_area (GIMP_PREVIEW (preview
));
190 preview
->priv
= G_TYPE_INSTANCE_GET_PRIVATE (preview
,
191 GIMP_TYPE_ZOOM_PREVIEW
,
192 GimpZoomPreviewPrivate
);
194 g_signal_connect (area
, "size-allocate",
195 G_CALLBACK (gimp_zoom_preview_size_allocate
),
197 g_signal_connect (area
, "scroll-event",
198 G_CALLBACK (gimp_zoom_preview_scroll_event
),
202 "check-size", gimp_check_size (),
203 "check-type", gimp_check_type (),
206 gimp_scrolled_preview_set_policy (GIMP_SCROLLED_PREVIEW (preview
),
207 GTK_POLICY_ALWAYS
, GTK_POLICY_ALWAYS
);
211 gimp_zoom_preview_constructed (GObject
*object
)
213 GimpZoomPreviewPrivate
*priv
= GET_PRIVATE (object
);
215 PreviewSettings settings
;
217 G_OBJECT_CLASS (parent_class
)->constructed (object
);
219 data_name
= g_strdup_printf ("%s-zoom-preview-%d",
221 gimp_zoom_preview_counter
++);
223 if (gimp_get_data (data_name
, &settings
))
225 gimp_preview_set_update (GIMP_PREVIEW (object
), settings
.update
);
228 g_object_set_data_full (object
, "gimp-zoom-preview-data-name",
229 data_name
, (GDestroyNotify
) g_free
);
233 GimpZoomModel
*model
= gimp_zoom_model_new ();
235 gimp_zoom_model_set_range (model
, 1.0, 256.0);
236 gimp_zoom_preview_set_model (GIMP_ZOOM_PREVIEW (object
), model
);
238 g_object_unref (model
);
241 gimp_zoom_preview_set_adjustments (GIMP_ZOOM_PREVIEW (object
), 1.0, 1.0);
245 gimp_zoom_preview_finalize (GObject
*object
)
247 GimpZoomPreviewPrivate
*priv
= GET_PRIVATE (object
);
249 g_clear_object (&priv
->model
);
251 G_OBJECT_CLASS (parent_class
)->finalize (object
);
255 gimp_zoom_preview_dispose (GObject
*object
)
257 const gchar
*data_name
= g_object_get_data (G_OBJECT (object
),
258 "gimp-zoom-preview-data-name");
262 GimpPreview
*preview
= GIMP_PREVIEW (object
);
263 PreviewSettings settings
;
265 settings
.update
= gimp_preview_get_update (preview
);
267 gimp_set_data (data_name
, &settings
, sizeof (PreviewSettings
));
270 G_OBJECT_CLASS (parent_class
)->dispose (object
);
274 gimp_zoom_preview_get_property (GObject
*object
,
279 GimpZoomPreview
*preview
= GIMP_ZOOM_PREVIEW (object
);
283 case PROP_DRAWABLE_ID
:
284 g_value_set_int (value
, gimp_zoom_preview_get_drawable_id (preview
));
288 g_value_set_object (value
, gimp_zoom_preview_get_model (preview
));
292 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
298 gimp_zoom_preview_set_property (GObject
*object
,
303 GimpZoomPreview
*preview
= GIMP_ZOOM_PREVIEW (object
);
307 case PROP_DRAWABLE_ID
:
308 gimp_zoom_preview_set_drawable_id (preview
, g_value_get_int (value
));
312 gimp_zoom_preview_set_model (preview
, g_value_get_object (value
));
316 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
322 gimp_zoom_preview_set_adjustments (GimpZoomPreview
*preview
,
326 GimpScrolledPreview
*scrolled_preview
= GIMP_SCROLLED_PREVIEW (preview
);
333 gimp_scrolled_preview_freeze (scrolled_preview
);
335 gimp_preview_get_size (GIMP_PREVIEW (preview
), &width
, &height
);
337 ratio
= new_factor
/ old_factor
;
339 gimp_scrolled_preview_get_adjustments (scrolled_preview
, &hadj
, &vadj
);
341 gtk_adjustment_configure (hadj
,
342 (gtk_adjustment_get_value (vadj
) + width
/ 2.0) * ratio
347 MAX (width
/ 2.0, new_factor
),
350 gtk_adjustment_configure (vadj
,
351 (gtk_adjustment_get_value (vadj
) + height
/ 2.0) * ratio
356 MAX (height
/ 2.0, new_factor
),
359 gimp_scrolled_preview_thaw (scrolled_preview
);
363 gimp_zoom_preview_size_allocate (GtkWidget
*widget
,
364 GtkAllocation
*allocation
,
365 GimpZoomPreview
*preview
)
370 gint width
= GIMP_PREVIEW (preview
)->xmax
- GIMP_PREVIEW (preview
)->xmin
;
371 gint height
= GIMP_PREVIEW (preview
)->ymax
- GIMP_PREVIEW (preview
)->ymin
;
373 GIMP_PREVIEW (preview
)->width
= MIN (width
, allocation
->width
);
374 GIMP_PREVIEW (preview
)->height
= MIN (height
, allocation
->height
);
377 zoom
= gimp_zoom_model_get_factor (preview
->priv
->model
);
379 gimp_zoom_preview_set_adjustments (preview
, zoom
, zoom
);
383 gimp_zoom_preview_style_updated (GtkWidget
*widget
)
385 GimpPreview
*preview
= GIMP_PREVIEW (widget
);
386 GtkWidget
*area
= gimp_preview_get_area (preview
);
388 GTK_WIDGET_CLASS (parent_class
)->style_updated (widget
);
392 GimpZoomPreviewPrivate
*priv
= GET_PRIVATE (preview
);
401 gtk_widget_style_get (widget
, "size", &size
, NULL
);
403 if (_gimp_drawable_preview_get_bounds (priv
->drawable_ID
,
411 width
= gimp_drawable_width (priv
->drawable_ID
);
412 height
= gimp_drawable_height (priv
->drawable_ID
);
417 preview_width
= MIN (width
, size
);
418 preview_height
= (height
* preview_width
) / width
;
422 preview_height
= MIN (height
, size
);
423 preview_width
= (width
* preview_height
) / height
;
426 gimp_preview_set_size (preview
, preview_width
, preview_height
);
431 gimp_zoom_preview_scroll_event (GtkWidget
*widget
,
432 GdkEventScroll
*event
,
433 GimpZoomPreview
*preview
)
435 if (event
->state
& GDK_CONTROL_MASK
)
437 GimpZoomPreviewPrivate
*priv
= GET_PRIVATE (preview
);
440 gimp_scrolled_preview_freeze (GIMP_SCROLLED_PREVIEW (preview
));
442 switch (event
->direction
)
445 gimp_zoom_model_zoom (priv
->model
, GIMP_ZOOM_IN
, 0.0);
448 case GDK_SCROLL_DOWN
:
449 gimp_zoom_model_zoom (priv
->model
, GIMP_ZOOM_OUT
, 0.0);
452 case GDK_SCROLL_SMOOTH
:
453 gdk_event_get_scroll_deltas ((GdkEvent
*) event
, NULL
, &delta
);
454 gimp_zoom_model_zoom (priv
->model
, GIMP_ZOOM_SMOOTH
, delta
);
461 gimp_scrolled_preview_thaw (GIMP_SCROLLED_PREVIEW (preview
));
468 gimp_zoom_preview_draw (GimpPreview
*preview
)
470 GimpZoomPreviewPrivate
*priv
= GIMP_ZOOM_PREVIEW (preview
)->priv
;
479 if (priv
->drawable_ID
< 1)
482 data
= gimp_zoom_preview_get_source (GIMP_ZOOM_PREVIEW (preview
),
483 &width
, &height
, &bpp
);
487 GtkWidget
*area
= gimp_preview_get_area (preview
);
489 gimp_preview_area_draw (GIMP_PREVIEW_AREA (area
),
491 gimp_drawable_type (priv
->drawable_ID
),
498 gimp_zoom_preview_draw_buffer (GimpPreview
*preview
,
499 const guchar
*buffer
,
502 GimpZoomPreviewPrivate
*priv
= GIMP_ZOOM_PREVIEW (preview
)->priv
;
503 GtkWidget
*area
= gimp_preview_get_area (preview
);
508 gimp_preview_get_size (preview
, &width
, &height
);
509 image_ID
= gimp_item_get_image (priv
->drawable_ID
);
511 if (gimp_selection_is_empty (image_ID
))
513 gimp_preview_area_draw (GIMP_PREVIEW_AREA (area
),
516 gimp_drawable_type (priv
->drawable_ID
),
534 selection_ID
= gimp_image_get_selection (image_ID
);
539 gimp_zoom_preview_get_source_area (preview
,
541 &src_width
, &src_height
);
543 src
= gimp_drawable_get_sub_thumbnail_data (priv
->drawable_ID
,
545 src_width
, src_height
,
547 gimp_drawable_offsets (priv
->drawable_ID
, &offsx
, &offsy
);
548 sel
= gimp_drawable_get_sub_thumbnail_data (selection_ID
,
549 src_x
+ offsx
, src_y
+ offsy
,
550 src_width
, src_height
,
551 &width
, &height
, &bpp
);
553 gimp_preview_area_mask (GIMP_PREVIEW_AREA (area
),
555 gimp_drawable_type (priv
->drawable_ID
),
556 src
, width
* gimp_drawable_bpp (priv
->drawable_ID
),
567 gimp_zoom_preview_draw_thumb (GimpPreview
*preview
,
568 GimpPreviewArea
*area
,
572 GimpZoomPreviewPrivate
*priv
= GIMP_ZOOM_PREVIEW (preview
)->priv
;
574 if (priv
->drawable_ID
> 0)
575 _gimp_drawable_preview_area_draw_thumb (area
, priv
->drawable_ID
,
580 gimp_zoom_preview_set_cursor (GimpPreview
*preview
)
582 GtkWidget
*area
= gimp_preview_get_area (preview
);
584 if (! gtk_widget_get_realized (area
))
587 if (gimp_zoom_preview_get_factor (GIMP_ZOOM_PREVIEW (preview
)) > 1.0)
589 GdkDisplay
*display
= gtk_widget_get_display (GTK_WIDGET (preview
));
592 cursor
= gdk_cursor_new_for_display (display
, GDK_HAND1
);
593 gdk_window_set_cursor (gtk_widget_get_window (area
),
595 g_object_unref (cursor
);
599 gdk_window_set_cursor (gtk_widget_get_window (area
),
600 gimp_preview_get_default_cursor (preview
));
605 gimp_zoom_preview_transform (GimpPreview
*preview
,
611 GimpZoomPreviewPrivate
*priv
= GIMP_ZOOM_PREVIEW (preview
)->priv
;
618 gimp_preview_get_size (preview
, &width
, &height
);
619 gimp_preview_get_offsets (preview
, &xoff
, &yoff
);
621 zoom
= gimp_zoom_preview_get_factor (GIMP_ZOOM_PREVIEW (preview
));
623 *dest_x
= ((gdouble
) (src_x
- priv
->extents
.x
) *
624 width
/ priv
->extents
.width
* zoom
) - xoff
;
626 *dest_y
= ((gdouble
) (src_y
- priv
->extents
.y
) *
627 height
/ priv
->extents
.height
* zoom
) - yoff
;
631 gimp_zoom_preview_untransform (GimpPreview
*preview
,
637 GimpZoomPreviewPrivate
*priv
= GIMP_ZOOM_PREVIEW (preview
)->priv
;
644 gimp_preview_get_size (preview
, &width
, &height
);
645 gimp_preview_get_offsets (preview
, &xoff
, &yoff
);
647 zoom
= gimp_zoom_preview_get_factor (GIMP_ZOOM_PREVIEW (preview
));
649 *dest_x
= (priv
->extents
.x
+
650 ((gdouble
) (src_x
+ xoff
) *
651 priv
->extents
.width
/ width
/ zoom
));
653 *dest_y
= (priv
->extents
.y
+
654 ((gdouble
) (src_y
+ yoff
) *
655 priv
->extents
.height
/ height
/ zoom
));
659 gimp_zoom_preview_set_drawable_id (GimpZoomPreview
*preview
,
662 GimpZoomPreviewPrivate
*priv
= preview
->priv
;
665 gint max_width
, max_height
;
667 g_return_if_fail (preview
->priv
->drawable_ID
< 1);
669 priv
->drawable_ID
= drawable_ID
;
671 if (gimp_drawable_mask_intersect (drawable_ID
, &x
, &y
, &width
, &height
))
678 width
= gimp_drawable_width (drawable_ID
);
679 height
= gimp_drawable_height (drawable_ID
);
685 priv
->extents
.width
= width
;
686 priv
->extents
.height
= height
;
690 max_width
= MIN (width
, 512);
691 max_height
= (height
* max_width
) / width
;
695 max_height
= MIN (height
, 512);
696 max_width
= (width
* max_height
) / height
;
699 gimp_preview_set_bounds (GIMP_PREVIEW (preview
),
700 0, 0, max_width
, max_height
);
702 g_object_set (gimp_preview_get_frame (GIMP_PREVIEW (preview
)),
703 "ratio", (gdouble
) width
/ (gdouble
) height
,
708 gimp_zoom_preview_set_model (GimpZoomPreview
*preview
,
709 GimpZoomModel
*model
)
711 GimpZoomPreviewPrivate
*priv
= GET_PRIVATE (preview
);
712 GtkWidget
*button_bar
;
716 g_return_if_fail (priv
->model
== NULL
);
721 priv
->model
= g_object_ref (model
);
723 g_signal_connect_swapped (priv
->model
, "zoomed",
724 G_CALLBACK (gimp_zoom_preview_set_adjustments
),
727 box
= gimp_preview_get_controls (GIMP_PREVIEW (preview
));
728 g_return_if_fail (GTK_IS_BOX (box
));
730 button_bar
= gtk_box_new (GTK_ORIENTATION_HORIZONTAL
, 2);
731 gtk_box_pack_end (GTK_BOX (box
), button_bar
, FALSE
, FALSE
, 0);
732 gtk_widget_show (button_bar
);
735 button
= gimp_zoom_button_new (priv
->model
,
736 GIMP_ZOOM_OUT
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
737 gtk_box_pack_start (GTK_BOX (button_bar
), button
, FALSE
, FALSE
, 0);
738 gtk_widget_show (button
);
741 button
= gimp_zoom_button_new (priv
->model
,
742 GIMP_ZOOM_IN
, GTK_ICON_SIZE_SMALL_TOOLBAR
);
743 gtk_box_pack_start (GTK_BOX (button_bar
), button
, FALSE
, FALSE
, 0);
744 gtk_widget_show (button
);
748 gimp_zoom_preview_get_source_area (GimpPreview
*preview
,
754 GimpZoomPreviewPrivate
*priv
= GET_PRIVATE (preview
);
755 gdouble zoom
= gimp_zoom_model_get_factor (priv
->model
);
757 gimp_zoom_preview_untransform (preview
, 0, 0, x
, y
);
759 *w
= priv
->extents
.width
/ zoom
;
760 *h
= priv
->extents
.height
/ zoom
;
765 * gimp_zoom_preview_new_from_drawable_id:
766 * @drawable_ID: a drawable ID
768 * Creates a new #GimpZoomPreview widget for @drawable_ID.
772 * Returns: a new #GimpZoomPreview.
775 gimp_zoom_preview_new_from_drawable_id (gint32 drawable_ID
)
777 g_return_val_if_fail (gimp_item_is_valid (drawable_ID
), NULL
);
778 g_return_val_if_fail (gimp_item_is_drawable (drawable_ID
), NULL
);
780 return g_object_new (GIMP_TYPE_ZOOM_PREVIEW
,
781 "drawable-id", drawable_ID
,
786 * gimp_zoom_preview_new_with_model_from_drawable_id:
787 * @drawable_ID: a drawable ID
788 * @model: a #GimpZoomModel
790 * Creates a new #GimpZoomPreview widget for @drawable_ID using the
793 * This variant of gimp_zoom_preview_new_from_drawable_id() allows you
794 * to create a preview using an existing zoom model. This may be
795 * useful if for example you want to have two zoom previews that keep
796 * their zoom factor in sync.
800 * Returns: a new #GimpZoomPreview.
803 gimp_zoom_preview_new_with_model_from_drawable_id (gint32 drawable_ID
,
804 GimpZoomModel
*model
)
807 g_return_val_if_fail (gimp_item_is_valid (drawable_ID
), NULL
);
808 g_return_val_if_fail (gimp_item_is_drawable (drawable_ID
), NULL
);
809 g_return_val_if_fail (GIMP_IS_ZOOM_MODEL (model
), NULL
);
811 return g_object_new (GIMP_TYPE_ZOOM_PREVIEW
,
812 "drawable-id", drawable_ID
,
818 * gimp_zoom_preview_get_drawable_id:
819 * @preview: a #GimpZoomPreview widget
821 * Returns the drawable_ID the #GimpZoomPreview is attached to.
823 * Return Value: the drawable_ID that was passed to
824 * gimp_zoom_preview_new_from_drawable_id().
829 gimp_zoom_preview_get_drawable_id (GimpZoomPreview
*preview
)
831 g_return_val_if_fail (GIMP_IS_ZOOM_PREVIEW (preview
), -1);
833 return GET_PRIVATE (preview
)->drawable_ID
;
837 * gimp_zoom_preview_get_model:
838 * @preview: a #GimpZoomPreview widget
840 * Returns the #GimpZoomModel the preview is using.
842 * Return Value: a pointer to the #GimpZoomModel owned by the @preview
847 gimp_zoom_preview_get_model (GimpZoomPreview
*preview
)
849 g_return_val_if_fail (GIMP_IS_ZOOM_PREVIEW (preview
), NULL
);
851 return GET_PRIVATE (preview
)->model
;
855 * gimp_zoom_preview_get_factor:
856 * @preview: a #GimpZoomPreview widget
858 * Returns the zoom factor the preview is currently using.
860 * Return Value: the current zoom factor
865 gimp_zoom_preview_get_factor (GimpZoomPreview
*preview
)
867 GimpZoomPreviewPrivate
*priv
;
869 g_return_val_if_fail (GIMP_IS_ZOOM_PREVIEW (preview
), 1.0);
871 priv
= GET_PRIVATE (preview
);
873 return priv
->model
? gimp_zoom_model_get_factor (priv
->model
) : 1.0;
877 * gimp_zoom_preview_get_source:
878 * @preview: a #GimpZoomPreview widget
879 * @width: a pointer to an int where the current width of the zoom widget
881 * @height: a pointer to an int where the current width of the zoom widget
883 * @bpp: return location for the number of bytes per pixel
885 * Returns the scaled image data of the part of the drawable the
886 * #GimpZoomPreview is currently showing, as a newly allocated array of guchar.
887 * This function also allow to get the current width, height and bpp of the
890 * Return Value: newly allocated data that should be released using g_free()
891 * when it is not any longer needed
896 gimp_zoom_preview_get_source (GimpZoomPreview
*preview
,
903 g_return_val_if_fail (GIMP_IS_ZOOM_PREVIEW (preview
), NULL
);
904 g_return_val_if_fail (width
!= NULL
&& height
!= NULL
&& bpp
!= NULL
, NULL
);
906 drawable_ID
= gimp_zoom_preview_get_drawable_id (preview
);
910 GimpPreview
*gimp_preview
= GIMP_PREVIEW (preview
);
916 gimp_preview_get_size (gimp_preview
, width
, height
);
918 gimp_zoom_preview_get_source_area (gimp_preview
,
920 &src_width
, &src_height
);
922 return gimp_drawable_get_sub_thumbnail_data (drawable_ID
,
924 src_width
, src_height
,