static bool read_tile(openslide_t *osr, cairo_t *cr, struct _openslide_level *level, int64_t tile_col, int64_t tile_row, void *arg, GError **err) { struct level *l = (struct level *) level; struct _openslide_tiff_level *tiffl = &l->tiffl; TIFF *tiff = arg; // tile size int64_t tw = tiffl->tile_w; int64_t th = tiffl->tile_h; // cache struct _openslide_cache_entry *cache_entry; uint32_t *tiledata = _openslide_cache_get(osr->cache, level, tile_col, tile_row, &cache_entry); if (!tiledata) { tiledata = g_slice_alloc(tw * th * 4); if (!_openslide_tiff_read_tile(tiffl, tiff, tiledata, tile_col, tile_row, err)) { g_slice_free1(tw * th * 4, tiledata); return false; } // clip, if necessary if (!_openslide_tiff_clip_tile(tiffl, tiledata, tile_col, tile_row, err)) { g_slice_free1(tw * th * 4, tiledata); return false; } // put it in the cache _openslide_cache_put(osr->cache, level, tile_col, tile_row, tiledata, tw * th * 4, &cache_entry); } // draw it cairo_surface_t *surface = cairo_image_surface_create_for_data((unsigned char *) tiledata, CAIRO_FORMAT_ARGB32, tw, th, tw * 4); cairo_set_source_surface(cr, surface, 0, 0); cairo_surface_destroy(surface); cairo_paint(cr); // done with the cache entry, release it _openslide_cache_entry_unref(cache_entry); return true; }
int64_t tile_col, int64_t tile_row, void *tile G_GNUC_UNUSED, void *arg, GError **err) { struct level *l = (struct level *) level; struct _openslide_tiff_level *tiffl = &l->tiffl; TIFF *tiff = arg; // tile size int64_t tw = tiffl->tile_w; int64_t th = tiffl->tile_h; // cache struct _openslide_cache_entry *cache_entry; uint32_t *tiledata = _openslide_cache_get(osr->cache, level, tile_col, tile_row, &cache_entry); if (!tiledata) { tiledata = g_slice_alloc(tw * th * 4); if (!_openslide_tiff_read_tile(tiffl, tiff, tiledata, tile_col, tile_row, err)) { g_slice_free1(tw * th * 4, tiledata); return false; } // clip, if necessary if (!_openslide_tiff_clip_tile(tiffl, tiledata, tile_col, tile_row, err)) { g_slice_free1(tw * th * 4, tiledata);
cairo_t *cr, struct _openslide_level *level G_GNUC_UNUSED, int64_t tile_col, int64_t tile_row, void *arg, GError **err) { struct read_tile_args *args = arg; struct _openslide_tiff_level *tiffl = &args->area->tiffl; // tile size int64_t tw = tiffl->tile_w; int64_t th = tiffl->tile_h; // cache struct _openslide_cache_entry *cache_entry; uint32_t *tiledata = _openslide_cache_get(osr->cache, args->area, tile_col, tile_row, &cache_entry); if (!tiledata) { tiledata = g_slice_alloc(tw * th * 4); if (!_openslide_tiff_read_tile(tiffl, args->tiff, tiledata, tile_col, tile_row, err)) { g_slice_free1(tw * th * 4, tiledata); return false; } // clip, if necessary if (!_openslide_tiff_clip_tile(tiffl, tiledata, tile_col, tile_row, err)) { g_slice_free1(tw * th * 4, tiledata);