Adapted for use on cluster (using MPI/OMP) parallelised gpiv_rr from gpivtools)
[gpiv.git] / src / display_zoom.c
blob089bac892042a05daf8719a0b3edee7fbbfcd6bc
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
6 libraries.
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)
15 any later version.
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 ----------------------------------------------------------------------*/
28 #include "gpiv_gui.h"
29 #include "display.h"
30 #include "display_zoom.h"
33 void
34 set__canvas_size (Display *disp
37 void
38 set__adjusters (Display *disp
41 gboolean
42 canvas_display_button_scroll (GtkWidget *widget,
43 GdkEventScroll *event,
44 gpointer data
46 /*-----------------------------------------------------------------------------
49 Display * disp = gtk_object_get_data(GTK_OBJECT(widget), "disp");
50 GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv");
51 gint x, y;
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);
72 void
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;
88 void
89 set__canvas_size (Display *disp
91 /*-----------------------------------------------------------------------------
94 gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (disp->canvas),
95 disp->zoom_factor);
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;
111 void
112 set__hrulerscale (Display *disp
114 /*-----------------------------------------------------------------------------
117 gfloat x_start;
118 gfloat x_end;
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
124 * 10e-4
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)
131 * 10e-4;
133 } else {
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, */
143 /* x_start, */
144 /* x_end); */
145 gtk_ruler_set_range (GTK_RULER (disp->hruler),
146 x_start,
147 x_end,
148 x_start,
149 x_end);
153 void
154 set__vrulerscale (Display *disp
156 /*-----------------------------------------------------------------------------
157 * Identic to display.c: on_adj_changed__adapt_vruler
160 gfloat y_start;
161 gfloat y_end;
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
167 * 10e-4
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)
174 * 10e-4;
176 } else {
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),
183 y_start,
184 y_end,
185 y_start,
186 y_end);
190 void
191 set__adjusters (Display *disp
193 /*-----------------------------------------------------------------------------
196 GtkAdjustment * hadj = GTK_ADJUSTMENT (disp->hadj);
197 GtkAdjustment * vadj = GTK_ADJUSTMENT (disp->vadj) ;
199 vadj->lower = 0.0;
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)
206 / 2.0);
209 hadj->lower = 0.0;
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)
216 / 2.0);
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");
227 void
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
240 /* + VIEW_HMARGE */
242 gint display_height = (gint) (disp->zoom_factor *
243 disp->img->image->header->nrows
244 /* + VIEW_VMARGE */
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;
262 vadj->lower = 0.0;
263 vadj->upper = (gdouble) disp->img->image->header->nrows - 1;
264 vadj->page_size = (gdouble) (disp->img->image->header->nrows);
266 hadj->lower = 0.0;
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");
275 void
276 zoom_display (Display *disp,
277 gint zoom_index
279 /*-----------------------------------------------------------------------------
282 gint width = 0, height = 0;
283 gint new_width = 0, new_height = 0;
285 if (disp != NULL) {
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);