From 4679120e17530f4c1b5dea7ad0f3881eaf6b5d12 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Thu, 6 Dec 2018 14:19:10 +0100 Subject: [PATCH] only load 1st level in XCF files Does just like GIMP ! see https://gitlab.gnome.org/GNOME/gimp/issues/2604 --- IMG_xcf.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/IMG_xcf.c b/IMG_xcf.c index 27710c32..016d5efb 100644 --- a/IMG_xcf.c +++ b/IMG_xcf.c @@ -633,6 +633,7 @@ do_layer_surface(SDL_Surface * surface, SDL_RWops * src, xcf_header * head, xcf_ int i, j; Uint32 x, y, tx, ty, ox, oy; Uint32 *row; + Uint32 length; SDL_RWseek(src, layer->hierarchy_file_offset, RW_SEEK_SET); hierarchy = read_xcf_hierarchy(src, head); @@ -651,7 +652,10 @@ do_layer_surface(SDL_Surface * surface, SDL_RWops * src, xcf_header * head, xcf_ level = NULL; for (i = 0; hierarchy->level_file_offsets[i]; i++) { - SDL_RWseek(src, hierarchy->level_file_offsets[i], RW_SEEK_SET); + if (SDL_RWseek(src, hierarchy->level_file_offsets[i], RW_SEEK_SET) < 0) + break; + if (i > 0) // skip level except the 1st one, just like GIMP does + continue; level = read_xcf_level(src, head); ty = tx = 0; @@ -659,12 +663,12 @@ do_layer_surface(SDL_Surface * surface, SDL_RWops * src, xcf_header * head, xcf_ SDL_RWseek(src, level->tile_file_offsets[j], RW_SEEK_SET); ox = tx + 64 > level->width ? level->width % 64 : 64; oy = ty + 64 > level->height ? level->height % 64 : 64; + length = ox*oy*6; - if (level->tile_file_offsets[j + 1]) { - tile = load_tile(src, level->tile_file_offsets[j + 1] - level->tile_file_offsets[j], hierarchy->bpp, ox, oy); - } else { - tile = load_tile(src, ox * oy * 6, hierarchy->bpp, ox, oy); + if (level->tile_file_offsets[j + 1] > level->tile_file_offsets[j]) { + length = level->tile_file_offsets[j + 1] - level->tile_file_offsets[j]; } + tile = load_tile(src, length, hierarchy->bpp, ox, oy); if (!tile) { if (hierarchy) {