ui/gtk/image.c

changeset 532
80a6d8923d75
parent 530
7992a44fe719
child 533
951b92ce3708
equal deleted inserted replaced
531:9068a5c7caf6 532:80a6d8923d75
79 #endif 79 #endif
80 80
81 if(args.scrollarea) { 81 if(args.scrollarea) {
82 toplevel = SCROLLEDWINDOW_NEW(); 82 toplevel = SCROLLEDWINDOW_NEW();
83 SCROLLEDWINDOW_SET_CHILD(toplevel, widget); 83 SCROLLEDWINDOW_SET_CHILD(toplevel, widget);
84 args.adjustsize = TRUE; 84 args.adjustwidgetsize = TRUE;
85 } else { 85 } else {
86 toplevel = widget; 86 toplevel = widget;
87 } 87 }
88 88
89 UiImageViewer *imgviewer = malloc(sizeof(UiImageViewer)); 89 UiImageViewer *imgviewer = malloc(sizeof(UiImageViewer));
97 imgviewer->padding_left = args.image_padding_left; 97 imgviewer->padding_left = args.image_padding_left;
98 imgviewer->padding_right = args.image_padding_right; 98 imgviewer->padding_right = args.image_padding_right;
99 imgviewer->padding_top = args.image_padding_top; 99 imgviewer->padding_top = args.image_padding_top;
100 imgviewer->padding_bottom = args.image_padding_bottom; 100 imgviewer->padding_bottom = args.image_padding_bottom;
101 } 101 }
102 imgviewer->adjustsize = args.adjustsize; 102 imgviewer->adjustwidgetsize = args.adjustwidgetsize;
103 imgviewer->autoscale = args.autoscale; 103 imgviewer->autoscale = args.autoscale;
104 imgviewer->useradjustable = args.useradjustable; 104 imgviewer->useradjustable = args.useradjustable;
105 imgviewer->zoom_scale = 20; 105 imgviewer->zoom_scale = 20;
106 106
107 g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy); 107 g_object_set_data_full(G_OBJECT(drawingarea), "uiimageviewer", imgviewer, (GDestroyNotify)imageviewer_destroy);
180 current->container->add(current->container, toplevel, TRUE); 180 current->container->add(current->container, toplevel, TRUE);
181 181
182 return toplevel; 182 return toplevel;
183 } 183 }
184 184
185 static void imageviewer_reset(UiImageViewer *imgviewer) {
186 imgviewer->zoom = 0;
187 imgviewer->isautoscaled = FALSE;
188 imgviewer->transx = 0;
189 imgviewer->transy;
190 imgviewer->begin_transx = 0;
191 imgviewer->begin_transy = 0;
192 imgviewer->scale = 1;
193 }
194
195 UIWIDGET ui_imageviewer_reset(UIWIDGET w) {
196 UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
197 if(imgviewer) {
198 imageviewer_reset(imgviewer);
199 gtk_widget_queue_draw(w);
200 }
201 }
202
203 UIWIDGET ui_imageviewer_set_autoscale(UIWIDGET w, UiBool set) {
204 UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
205 if(imgviewer) {
206 imgviewer->autoscale = set;
207 }
208 }
209
210 UIWIDGET ui_imageviewer_set_adjustwidgetsize(UIWIDGET w, UiBool set) {
211 UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
212 if(imgviewer) {
213 imgviewer->adjustwidgetsize = set;
214 }
215 }
216
217 UIWIDGET ui_imageviewer_set_useradjustable(UIWIDGET w, UiBool set) {
218 UiImageViewer *imgviewer = g_object_get_data(G_OBJECT(w), "uiimageviewer");
219 if(imgviewer) {
220 imgviewer->useradjustable = set;
221 }
222 }
185 223
186 void ui_cairo_draw_image(UiImageViewer *imgviewer, cairo_t *cr, int width, int height) { 224 void ui_cairo_draw_image(UiImageViewer *imgviewer, cairo_t *cr, int width, int height) {
187 if(!imgviewer->pixbuf) { 225 if(!imgviewer->pixbuf) {
188 return; 226 return;
189 } 227 }
193 double dpixheight = (double)gdk_pixbuf_get_height(pixbuf); 231 double dpixheight = (double)gdk_pixbuf_get_height(pixbuf);
194 232
195 double dwidth = width; 233 double dwidth = width;
196 double dheight = height; 234 double dheight = height;
197 double scale = 1; 235 double scale = 1;
198 if(imgviewer->autoscale) { 236 // if autoscale is enabled, scale the image to fill available space
199 scale = dwidth / dpixwidth; 237 // if useradjustable is also enabled, the autoscaling is only done once
200 if(dpixheight * scale > dheight) { 238 if(imgviewer->autoscale && imgviewer->scale != 0) {
201 scale = dheight / dpixheight; 239 if(!imgviewer->isautoscaled) {
240 scale = dwidth / dpixwidth;
241 if(dpixheight * scale > dheight) {
242 scale = dheight / dpixheight;
243 }
244
245 if(imgviewer->useradjustable) {
246 imgviewer->isautoscaled = TRUE;
247 }
248
249 imgviewer->scale = scale;
250 } else {
251 scale = imgviewer->scale;
202 } 252 }
203 } else { 253 } else {
254 // user-adjusted scaling
204 scale = 1 + ((double)imgviewer->zoom / (double)imgviewer->zoom_scale); 255 scale = 1 + ((double)imgviewer->zoom / (double)imgviewer->zoom_scale);
205 } 256 }
206 257
207 dpixwidth *= scale; 258 dpixwidth *= scale;
208 dpixheight *= scale; 259 dpixheight *= scale;
215 cairo_translate(cr, x, y); 266 cairo_translate(cr, x, y);
216 cairo_scale(cr, scale, scale); 267 cairo_scale(cr, scale, scale);
217 268
218 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); 269 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0);
219 cairo_paint(cr); 270 cairo_paint(cr);
220
221 imgviewer->prev_scale = scale;
222 } 271 }
223 272
224 void* ui_imageviewer_get(UiGeneric *g) { 273 void* ui_imageviewer_get(UiGeneric *g) {
225 UiImageViewer *imgviewer = g->obj; 274 UiImageViewer *imgviewer = g->obj;
226 g->value = imgviewer->pixbuf; 275 g->value = imgviewer->pixbuf;
239 GdkPixbuf *pixbuf = value; 288 GdkPixbuf *pixbuf = value;
240 289
241 UiImageViewer *imgviewer = g->obj; 290 UiImageViewer *imgviewer = g->obj;
242 g->value = pixbuf; 291 g->value = pixbuf;
243 292
293 imageviewer_reset(imgviewer);
294
244 if(imgviewer->pixbuf) { 295 if(imgviewer->pixbuf) {
245 g_object_unref(imgviewer->pixbuf); 296 g_object_unref(imgviewer->pixbuf);
246 } 297 }
247 imgviewer->pixbuf = pixbuf; 298 imgviewer->pixbuf = pixbuf;
248 299
249 if(imgviewer->adjustsize) { 300 if(imgviewer->adjustwidgetsize && !imgviewer->autoscale) {
250 int width = gdk_pixbuf_get_width(pixbuf); 301 int width = gdk_pixbuf_get_width(pixbuf);
251 int height = gdk_pixbuf_get_height(pixbuf); 302 int height = gdk_pixbuf_get_height(pixbuf);
252 gtk_widget_set_size_request(imgviewer->widget, width, height); 303 gtk_widget_set_size_request(imgviewer->widget, width, height);
253 } 304 }
254 gtk_widget_queue_draw(imgviewer->widget); 305 gtk_widget_queue_draw(imgviewer->widget);
286 if(imgviewer->useradjustable) { 337 if(imgviewer->useradjustable) {
287 imgviewer->zoom -= dy; 338 imgviewer->zoom -= dy;
288 if(imgviewer->zoom < -imgviewer->zoom_scale) { 339 if(imgviewer->zoom < -imgviewer->zoom_scale) {
289 imgviewer->zoom = -imgviewer->zoom_scale; 340 imgviewer->zoom = -imgviewer->zoom_scale;
290 } 341 }
342 imgviewer->scale = 0; // disable autoscale
291 gtk_widget_queue_draw(imgviewer->widget); 343 gtk_widget_queue_draw(imgviewer->widget);
292 return TRUE; 344 return TRUE;
293 } 345 }
294 return FALSE; 346 return FALSE;
295 } 347 }

mercurial