1 /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */
3 /*----------------------------------------------------------------------
5 gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome
8 Copyright (C) 2002, 2003, 2004 Gerber van der Graaf
10 This file is part of gpiv.
12 Gpiv is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2, or (at your option)
17 This program is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program; if not, write to the Free Software Foundation,
24 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26 ----------------------------------------------------------------------*/
30 #include "display_zoom.h"
34 set__canvas_size (Display
*disp
38 set__adjusters (Display
*disp
42 canvas_display_button_scroll (GtkWidget
*widget
,
43 GdkEventScroll
*event
,
46 /*-----------------------------------------------------------------------------
49 Display
* disp
= gtk_object_get_data(GTK_OBJECT(widget
), "disp");
50 GpivConsole
* gpiv
= gtk_object_get_data(GTK_OBJECT(widget
), "gpiv");
53 if (event
->direction
== 0) {
54 disp
->zoom_factor
*= DISPLAY_ZOOMFACTOR_STEP
;
57 if (event
->direction
== 1) {
58 disp
->zoom_factor
/= DISPLAY_ZOOMFACTOR_STEP
;
61 check__zoom_factor (&disp
->zoom_factor
);
62 set__canvas_size (disp
);
63 if (gpiv_par
->display__stretch_auto
== TRUE
) {
64 stretch_window (disp
);
66 set__adjusters (disp
);
67 set__hrulerscale (disp
);
68 set__vrulerscale (disp
);
73 check__zoom_factor (gfloat
*factor
75 /*-----------------------------------------------------------------------------
78 if (*factor
< DISPLAY_ZOOMFACTOR_MIN
) {
79 *factor
= DISPLAY_ZOOMFACTOR_MIN
;
82 if (*factor
> DISPLAY_ZOOMFACTOR_MAX
) {
83 *factor
= DISPLAY_ZOOMFACTOR_MAX
;
89 set__canvas_size (Display
*disp
91 /*-----------------------------------------------------------------------------
94 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (disp
->canvas
),
96 /* gnome_canvas_set_center_scroll_region (GNOME_CANVAS(disp->canvas), TRUE); */
98 if (disp
->zoom_factor
< disp
->zoom_factor_old
) {
99 gtk_widget_set_size_request (disp
->canvas
,
100 (gint
) (disp
->zoom_factor
*
101 disp
->img
->image
->header
->ncolumns
),
102 (gint
) (disp
->zoom_factor
*
103 disp
->img
->image
->header
->nrows
));
105 disp
->zoom_factor_old
= disp
->zoom_factor
;
112 set__hrulerscale (Display
*disp
114 /*-----------------------------------------------------------------------------
120 if (disp
->pida
->exist_piv
&& display_act
->pida
->scaled_piv
) {
121 x_start
= (gfloat
) (disp
->x_adj_value
- 1)
122 / (gfloat
) disp
->zoom_factor
123 * disp
->img
->image
->header
->s_scale
125 + disp
->img
->image
->header
->z_off_x
128 x_end
= (gfloat
) x_start
129 + (disp
->img
->image
->header
->s_scale
* (gfloat
) disp
->x_page_size
130 / (gfloat
) disp
->zoom_factor
)
134 x_start
= (gfloat
) (disp
->x_adj_value
- 1) / (gfloat
) disp
->zoom_factor
;
135 x_end
= (gfloat
) x_start
136 + (gfloat
) disp
->x_page_size
/ (gfloat
) disp
->zoom_factor
;
140 /* g_message ("set__hrulerscale:: s_scale = %f z_off_x = %f x_start = %f x_end = %f", */
141 /* disp->img->image->header->s_scale, */
142 /* disp->img->image->header->z_off_x, */
145 gtk_ruler_set_range (GTK_RULER (disp
->hruler
),
154 set__vrulerscale (Display
*disp
156 /*-----------------------------------------------------------------------------
157 * Identic to display.c: on_adj_changed__adapt_vruler
163 if (disp
->pida
->exist_piv
&& display_act
->pida
->scaled_piv
) {
164 y_start
= (gfloat
) (disp
->y_adj_value
- 1)
165 / (gfloat
) disp
->zoom_factor
166 * disp
->img
->image
->header
->s_scale
168 + disp
->img
->image
->header
->z_off_y
171 y_end
= (gfloat
) y_start
172 + (disp
->img
->image
->header
->s_scale
* (gfloat
) disp
->y_page_size
173 / (gfloat
) disp
->zoom_factor
)
177 y_start
= (gfloat
) (disp
->y_adj_value
- 1) / (gfloat
) disp
->zoom_factor
;
178 y_end
= (gfloat
) y_start
179 + (gfloat
) disp
->y_page_size
/(gfloat
) disp
->zoom_factor
;
182 gtk_ruler_set_range (GTK_RULER (disp
->vruler
),
191 set__adjusters (Display
*disp
193 /*-----------------------------------------------------------------------------
196 GtkAdjustment
* hadj
= GTK_ADJUSTMENT (disp
->hadj
);
197 GtkAdjustment
* vadj
= GTK_ADJUSTMENT (disp
->vadj
) ;
200 vadj
->upper
= (gdouble
) (disp
->img
->image
->header
->nrows
)
201 * disp
->zoom_factor
- 1.0;
202 vadj
->page_size
= (gdouble
) (disp
->img
->image
->header
->nrows
)
203 * disp
->zoom_factor_old
;
204 gtk_adjustment_set_value( GTK_ADJUSTMENT (vadj
),
205 (vadj
->lower
+ vadj
->upper
- vadj
->page_size
)
210 hadj
->upper
= (gdouble
) (disp
->img
->image
->header
->ncolumns
)
211 * disp
->zoom_factor
- 1.0;
212 hadj
->page_size
= (gdouble
) (disp
->img
->image
->header
->ncolumns
)
213 * disp
->zoom_factor_old
;
214 gtk_adjustment_set_value (GTK_ADJUSTMENT (hadj
),
215 (hadj
->lower
+ hadj
->upper
- hadj
->page_size
)
218 /* g_message ("set__adjusters:: HOR: lower = %f upper = %f size = %f", */
219 /* hadj->lower, hadj->upper, hadj->page_size); */
221 g_signal_emit_by_name (G_OBJECT (hadj
), "changed");
222 g_signal_emit_by_name (G_OBJECT (vadj
), "changed");
228 stretch_window (Display
*disp
230 /*-----------------------------------------------------------------------------
233 GtkAdjustment
* hadj
= GTK_ADJUSTMENT (disp
->hadj
);
234 GtkAdjustment
* vadj
= GTK_ADJUSTMENT (disp
->vadj
);
235 gint screen_width
= gdk_screen_width();
236 gint screen_height
= gdk_screen_height();
238 gint display_width
= (gint
) (disp
->zoom_factor
*
239 disp
->img
->image
->header
->ncolumns
242 gint display_height
= (gint
) (disp
->zoom_factor
*
243 disp
->img
->image
->header
->nrows
247 if (display_width
>= screen_width
/* - VIEW_HMARGE */) {
248 display_width
= screen_width
- VIEW_HMARGE
;
251 if (display_height
>= screen_height
- VIEW_VMARGE
) {
252 display_height
= screen_height
/* - VIEW_VMARGE */;
256 gtk_widget_set_size_request (disp
->canvas
,
257 (gint
) display_width
/* - VIEW_HMARGE */,
258 (gint
) display_height
/* - VIEW_VMARGE */);
260 disp
->zoom_factor_old
= disp
->zoom_factor
;
263 vadj
->upper
= (gdouble
) disp
->img
->image
->header
->nrows
- 1;
264 vadj
->page_size
= (gdouble
) (disp
->img
->image
->header
->nrows
);
267 hadj
->upper
= (gdouble
) disp
->img
->image
->header
->ncolumns
- 1;
268 hadj
->page_size
= (gdouble
) (disp
->img
->image
->header
->ncolumns
);
270 g_signal_emit_by_name (G_OBJECT (hadj
), "changed");
271 g_signal_emit_by_name (G_OBJECT (vadj
), "changed");
276 zoom_display (Display
*disp
,
279 /*-----------------------------------------------------------------------------
282 gint width
= 0, height
= 0;
283 gint new_width
= 0, new_height
= 0;
286 disp
->zoom_factor
= zfactor
[zoom_index
];
287 check__zoom_factor (&disp
->zoom_factor
);
288 set__canvas_size (disp
);
289 if (gpiv_par
->display__stretch_auto
== TRUE
) {
290 stretch_window (disp
);
292 set__adjusters (disp
);
293 set__hrulerscale (disp
);
294 set__vrulerscale (disp
);