Skip to content

Commit eed1ecf

Browse files
committed
revise tilesource
should fix a lot of edge cases works for single images, needs testing and fixing for many other image types
1 parent 954c9ec commit eed1ecf

File tree

9 files changed

+295
-272
lines changed

9 files changed

+295
-272
lines changed

TODO

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
- nip4 ~/pics/nipguide.pdf, set "toilet roll", does not display correctly
1+
- nip4 ~/pics/nipguide.pdf, set "toilet roll", then set "multipage", height is
2+
wrong
23

34
- nip4 ~/pics/S000_t000002_V000_R0000_X000_Y000_C02_I1_D0_P00101.tif, set
45
"multipage", does not display correctly

src/displaybar.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,18 @@ displaybar_offset_value_changed(Tslider *slider, Displaybar *displaybar)
267267
NULL);
268268
}
269269

270+
// handy for debugging menu actions, see gtk/displaybar.ui
271+
static void
272+
displaybar_test_clicked(GtkButton *test, Displaybar *displaybar)
273+
{
274+
Tilesource *tilesource = displaybar->tilesource;
275+
276+
if (tilesource)
277+
g_object_set(tilesource,
278+
"mode", TILESOURCE_MODE_TOILET_ROLL,
279+
NULL);
280+
}
281+
270282
static void
271283
displaybar_init(Displaybar *displaybar)
272284
{
@@ -319,6 +331,7 @@ displaybar_class_init(DisplaybarClass *class)
319331
BIND_CALLBACK(displaybar_page_value_changed);
320332
BIND_CALLBACK(displaybar_scale_value_changed);
321333
BIND_CALLBACK(displaybar_offset_value_changed);
334+
BIND_CALLBACK(displaybar_test_clicked);
322335

323336
gobject_class->dispose = displaybar_dispose;
324337
gobject_class->set_property = displaybar_set_property;

src/gtk/displaybar.ui

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,15 @@
141141
</object>
142142
</child>
143143

144+
<!-- handy for debugging
145+
-->
146+
<child>
147+
<object class="GtkButton">
148+
<property name="label">Test</property>
149+
<signal name="clicked" handler="displaybar_test_clicked"/>
150+
</object>
151+
</child>
152+
144153
</object>
145154
</child>
146155

src/imagedisplay.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
#include "nip4.h"
3131

3232
/*
33+
*/
3334
#define DEBUG_VERBOSE
3435
#define DEBUG
35-
*/
3636

3737
// the focus colour we paint
3838
// FIXME ... we should somehow get this from the theme, I'm not sure how
@@ -353,11 +353,13 @@ imagedisplay_tilecache_changed(Tilecache *tilecache,
353353
Imagedisplay *imagedisplay)
354354
{
355355
#ifdef DEBUG
356-
printf("imagedisplay_tilecache_changed:\n");
356+
printf("imagedisplay_tilecache_changed: %d x %d\n",
357+
tilecache->tilesource->level_width[0],
358+
tilecache->tilesource->level_height[0]);
357359
#endif /*DEBUG*/
358360

359-
imagedisplay->image_rect.width = tilecache->tilesource->display_width;
360-
imagedisplay->image_rect.height = tilecache->tilesource->display_height;
361+
imagedisplay->image_rect.width = tilecache->tilesource->level_width[0];
362+
imagedisplay->image_rect.height = tilecache->tilesource->level_height[0];
361363
imagedisplay_layout(imagedisplay);
362364

363365
gtk_widget_queue_draw(GTK_WIDGET(imagedisplay));

src/imageui.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -813,9 +813,9 @@ imageui_bestfit(Imageui *imageui)
813813
int widget_height = gtk_widget_get_height(imageui->scrolled_window);
814814

815815
double hzoom = (double) widget_width /
816-
imageui->tilesource->display_width;
816+
imageui->tilesource->level_width[0];
817817
double vzoom = (double) widget_height /
818-
imageui->tilesource->display_height;
818+
imageui->tilesource->level_height[0];
819819
double zoom = VIPS_MIN(hzoom, vzoom);
820820

821821
imageui_zoom_to_eased(imageui, zoom * imageui->tilesource->zoom);
@@ -1196,21 +1196,19 @@ imageui_drag_update(GtkEventControllerMotion *self,
11961196

11971197
case IMAGEUI_SELECT:
11981198
regionview_resize(imageui->grabbed, imagewindow_get_modifiers(win),
1199-
imageui->tilesource->display_width,
1200-
imageui->tilesource->display_height,
1201-
offset_x / zoom,
1202-
offset_y / zoom);
1199+
imageui->tilesource->level_width[0],
1200+
imageui->tilesource->level_height[0],
1201+
offset_x / zoom, offset_y / zoom);
12031202

12041203
regionview_model_update(imageui->grabbed);
12051204

12061205
break;
12071206

12081207
case IMAGEUI_CREATE:
12091208
regionview_resize(imageui->floating, imagewindow_get_modifiers(win),
1210-
imageui->tilesource->display_width,
1211-
imageui->tilesource->display_height,
1212-
offset_x / zoom,
1213-
offset_y / zoom);
1209+
imageui->tilesource->level_width[0],
1210+
imageui->tilesource->level_height[0],
1211+
offset_x / zoom, offset_y / zoom);
12141212

12151213
// fine to do an immediate redraw, since we don't rely on calc for
12161214
// position

src/regionview.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -577,14 +577,14 @@ regionview_draw_guide(Regionview *regionview, GtkSnapshot *snapshot)
577577
if (regionview->draw_type == REGIONVIEW_HGUIDE) {
578578
regionview->frame.left = 0;
579579
regionview->frame.top = VIPS_RECT_BOTTOM(&regionview->draw_area);
580-
regionview->frame.width = tilesource->display_width;
580+
regionview->frame.width = tilesource->level_width[0];
581581
regionview->frame.height = 0;
582582
}
583583
else {
584584
regionview->frame.left = VIPS_RECT_RIGHT(&regionview->draw_area);
585585
regionview->frame.top = 0;
586586
regionview->frame.width = 0;
587-
regionview->frame.height = tilesource->display_height;
587+
regionview->frame.height = tilesource->level_height[0];
588588
}
589589
imageui_image_to_gtk_rect(imageui, &regionview->frame, &regionview->frame);
590590

src/tilecache.c

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@
3030
#include "nip4.h"
3131

3232
/*
33+
*/
3334
#define DEBUG_RENDER_TIME
3435
#define DEBUG_VERBOSE
3536
#define DEBUG
36-
*/
3737

3838
enum {
3939
/* Properties.
@@ -107,22 +107,19 @@ tilecache_dispose(GObject *object)
107107
static void
108108
tilecache_changed(Tilecache *tilecache)
109109
{
110-
g_signal_emit(tilecache,
111-
tilecache_signals[SIG_CHANGED], 0);
110+
g_signal_emit(tilecache, tilecache_signals[SIG_CHANGED], 0);
112111
}
113112

114113
static void
115114
tilecache_tiles_changed(Tilecache *tilecache)
116115
{
117-
g_signal_emit(tilecache,
118-
tilecache_signals[SIG_TILES_CHANGED], 0);
116+
g_signal_emit(tilecache, tilecache_signals[SIG_TILES_CHANGED], 0);
119117
}
120118

121119
static void
122120
tilecache_area_changed(Tilecache *tilecache, VipsRect *dirty, int z)
123121
{
124-
g_signal_emit(tilecache,
125-
tilecache_signals[SIG_AREA_CHANGED], 0, dirty, z);
122+
g_signal_emit(tilecache, tilecache_signals[SIG_AREA_CHANGED], 0, dirty, z);
126123
}
127124

128125
static void
@@ -190,7 +187,6 @@ tilecache_build_pyramid(Tilecache *tilecache)
190187
int n_levels;
191188
int level_width;
192189
int level_height;
193-
int i;
194190

195191
#ifdef DEBUG
196192
printf("tilecache_build_pyramid:\n");
@@ -206,8 +202,8 @@ tilecache_build_pyramid(Tilecache *tilecache)
206202
*/
207203
if (tilecache->levels &&
208204
tilecache->levels[0] &&
209-
tilesource->display_width == tilecache->levels[0]->Xsize &&
210-
tilesource->display_height == tilecache->levels[0]->Ysize) {
205+
tilesource->level_width[0] == tilecache->levels[0]->Xsize &&
206+
tilesource->level_height[0] == tilecache->levels[0]->Ysize) {
211207
#ifdef DEBUG
212208
printf("\tno geometry change, skipping pyr rebuild\n");
213209
#endif /*DEBUG*/
@@ -216,12 +212,12 @@ tilecache_build_pyramid(Tilecache *tilecache)
216212

217213
tilecache_free_pyramid(tilecache);
218214

219-
/* How many levels? Keep shrinking until we get both axies in one tile. We
215+
/* How many levels? Keep shrinking until we get both axes in one tile. We
220216
* need to handle very lopsided images, like LUTs and multi-page images,
221217
* do we must shrink both dimensions.
222218
*/
223-
level_width = tilesource->display_width;
224-
level_height = tilesource->display_height;
219+
level_width = tilesource->level_width[0];
220+
level_height = tilesource->level_height[0];
225221
n_levels = 1;
226222
for (;;) {
227223
if (level_width <= TILE_SIZE &&
@@ -236,9 +232,9 @@ tilecache_build_pyramid(Tilecache *tilecache)
236232
tilecache->n_levels = n_levels;
237233

238234
tilecache->levels = VIPS_ARRAY(NULL, n_levels, VipsImage *);
239-
level_width = tilesource->display_width;
240-
level_height = tilesource->display_height;
241-
for (i = 0; i < n_levels; i++) {
235+
level_width = tilesource->level_width[0];
236+
level_height = tilesource->level_height[0];
237+
for (int i = 0; i < n_levels; i++) {
242238
tilecache->levels[i] = vips_image_new();
243239

244240
vips_image_init_fields(tilecache->levels[i],
@@ -261,7 +257,7 @@ tilecache_build_pyramid(Tilecache *tilecache)
261257

262258
#ifdef DEBUG
263259
printf(" %d pyr levels\n", n_levels);
264-
for (i = 0; i < n_levels; i++)
260+
for (int i = 0; i < n_levels; i++)
265261
printf(" %d) %d x %d\n",
266262
i,
267263
tilecache->levels[i]->Xsize,

0 commit comments

Comments
 (0)