# HG changeset patch # User Thomas Bernard # Date 1544101065 -3600 # Thu Dec 06 13:57:45 2018 +0100 # Branch SDL-1.2 # Node ID fb0f3de12861e5a623abf13efbbcd24f5f1256a8 # Parent 390be9c3008bd0b2f67e5d2cfeee9d8ea85ed8e7 only load 1st level in XCF files Does just like GIMP ! see https://gitlab.gnome.org/GNOME/gimp/issues/2604 diff -r 390be9c3008b -r fb0f3de12861 IMG_xcf.c --- a/IMG_xcf.c Thu Dec 06 13:51:56 2018 +0100 +++ b/IMG_xcf.c Thu Dec 06 13:57:45 2018 +0100 @@ -647,6 +647,7 @@ 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); @@ -665,7 +666,10 @@ 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; @@ -673,29 +677,23 @@ 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]) { - if (level->tile_file_offsets [j+1] <= level->tile_file_offsets [j]) - break; - tile = load_tile - (src, - level->tile_file_offsets [j+1] - level->tile_file_offsets [j], - 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]; } - else { - tile = load_tile - (src, - ox*oy*6, - hierarchy->bpp, - ox, oy); - } + tile = load_tile + (src, + length, + hierarchy->bpp, + ox, oy); + if (!tile) { - if (hierarchy) - free_xcf_hierarchy(hierarchy); - if (level) - free_xcf_level(level); - return 1; + if (hierarchy) + free_xcf_hierarchy(hierarchy); + if (level) + free_xcf_level(level); + return 1; } p8 = tile;