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 } |