From a7d7ab4723b36932335e6329d0a6479c6a166509 Mon Sep 17 00:00:00 2001 From: cristy Date: Fri, 30 Mar 2012 18:29:39 +0000 Subject: [PATCH] --- coders/xcf.c | 99 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/coders/xcf.c b/coders/xcf.c index 746f0daad..ee1b7d618 100644 --- a/coders/xcf.c +++ b/coders/xcf.c @@ -1040,7 +1040,6 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) else if (image_type == GIMP_INDEXED) ThrowReaderException(CoderError,"ColormapTypeNotSupported"); - (void) SetImageBackgroundColor(image,exception); image->matte=MagickTrue; /* Read properties. @@ -1195,8 +1194,8 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) /*BOGUS: ignored for now */ /*float factor = (float) */ (void) ReadBlobMSBLong(image); /* size_t digits = */ (void) ReadBlobMSBLong(image); - for (i=0; i<5; i++) - (void) ReadBlobStringWithLongSize(image, unit_string, + for (i=0; i < 5; i++) + (void) ReadBlobStringWithLongSize(image,unit_string, sizeof(unit_string),exception); } break; @@ -1229,12 +1228,16 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) else { int + number_layers = 0, + num_layers = 0, current_layer = 0, - foundAllLayers = MagickFalse, - number_layers = 0; + first_layer = 0, + last_layer = 0, + last = 0, + foundAllLayers = MagickFalse; MagickOffsetType - oldPos=TellBlob(image); + oldPos; XCFLayerInfo *layer_info; @@ -1242,6 +1245,7 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) /* the read pointer */ + oldPos=TellBlob(image); do { ssize_t offset = (int) ReadBlobMSBLong(image); @@ -1259,6 +1263,20 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) offset=SeekBlob(image,oldPos,SEEK_SET); /* restore the position! */ if (offset < 0) ThrowReaderException(CorruptImageError,"ImproperImageHeader"); + first_layer=image_info->scene; + num_layers=number_layers; + /* number_scenes==0 means read all the images */ + if ((image_info->number_scenes > 0) && + (image_info->number_scenes < number_layers)) + num_layers=image_info->scene; + last_layer=first_layer+num_layers-1; + + /* XCF has layers backwards. */ + last=last_layer; + last_layer=number_layers-first_layer - 1; + first_layer=number_layers-last-1; + number_layers=num_layers; + /* allocate our array of layer info blocks */ length=(size_t) number_layers; layer_info=(XCFLayerInfo *) AcquireQuantumMemory(length, @@ -1286,25 +1304,29 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) * next layer offset is stored. */ saved_pos=TellBlob(image); - /* seek to the layer offset */ - offset=SeekBlob(image,offset,SEEK_SET); - /* read in the layer */ - layer_ok=ReadOneLayer(image,&doc_info,&layer_info[current_layer], - exception); - if (layer_ok == MagickFalse) + if ((first_layer <= current_layer) && (current_layer <= last_layer)) { - int j; - - for (j=0; j < current_layer; j++) - layer_info[j].image=DestroyImage(layer_info[j].image); - ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + /* seek to the layer offset */ + offset=SeekBlob(image,offset,SEEK_SET); + /* read in the layer */ + layer_ok=ReadOneLayer(image,&doc_info,&layer_info[current_layer], + exception); + if (layer_ok == MagickFalse) + { + int j; + + for (j=0; j < current_layer; j++) + layer_info[j].image=DestroyImage(layer_info[j].image); + layer_info=(XCFLayerInfo *) RelinquishMagickMemory(layer_info); + ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); + } + /* restore the saved position so we'll be ready to + * read the next offset. + */ + offset=SeekBlob(image, saved_pos, SEEK_SET); + } + current_layer++; } - /* restore the saved position so we'll be ready to - * read the next offset. - */ - offset=SeekBlob(image, saved_pos, SEEK_SET); - current_layer++; - } if (number_layers == 1) { /* @@ -1312,7 +1334,7 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) */ (void) CompositeImage(image,layer_info[0].image,OverCompositeOp, MagickTrue,layer_info[0].offset_x,layer_info[0].offset_y,exception); - layer_info[0].image =DestroyImage( layer_info[0].image); + layer_info[0].image=DestroyImage( layer_info[0].image); } else { @@ -1353,23 +1375,18 @@ static Image *ReadXCFImage(const ImageInfo *image_info,ExceptionInfo *exception) /* now reverse the order of the layers as they are put into subimages */ - j=number_layers-2; - image->next=layer_info[j].image; - layer_info[j].image->previous=image; - layer_info[j].image->page.x=layer_info[j].offset_x; - layer_info[j].image->page.y=layer_info[j].offset_y; - layer_info[j].image->page.width=layer_info[j].width; - layer_info[j].image->page.height=layer_info[j].height; - for (j=number_layers-3; j>=0; j--) - { - if (j > 0) - layer_info[j].image->next=layer_info[j-1].image; - if (j < (number_layers-1)) - layer_info[j].image->previous=layer_info[j+1].image; - layer_info[j].image->page.x=layer_info[j].offset_x; - layer_info[j].image->page.y=layer_info[j].offset_y; - layer_info[j].image->page.width=layer_info[j].width; - layer_info[j].image->page.height=layer_info[j].height; + image->next=layer_info[number_layers-2].image; + layer_info[number_layers-2].image->previous=image; + for (j=number_layers-2; j>=0; j--) + { + if (j > 0) + layer_info[j].image->next=layer_info[j-1].image; + if (j < (number_layers-1)) + layer_info[j].image->previous=layer_info[j+1].image; + layer_info[j].image->page.x = layer_info[j].offset_x; + layer_info[j].image->page.y = layer_info[j].offset_y; + layer_info[j].image->page.width = layer_info[j].width; + layer_info[j].image->page.height = layer_info[j].height; } } #endif -- 2.40.0