From: <no...@so...> - 2001-12-27 20:30:39
|
Bugs item #467524, was opened at 2001-10-03 08:47 You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=112997&aid=467524&group_id=12997 Category: 40. Photo Image|GIF Group: = 8.3.3 Status: Open Resolution: None Priority: 5 Submitted By: Nobody/Anonymous (nobody) >Assigned to: Jeffrey Hobbs (hobbs) Summary: GIF images are not read correctly Initial Comment: Using "wish", (Tcl/Tk version 8.3.3) reading GIF formatted images with the "-from" option to the "image read" command results in either a corrupted image or a segmentation fault. Using a small GIF file (307x187) I tried the following: % image create photo image1 % image1 read debris1.gif -from 0 0 100 100 % canvas .c .c % pack .c % .c create image 0 0 -anchor nw -image image1 1 The resulting image that is displayed is corrupt. In other instances using the "-from" option has resulted in a crash of the "wish" program due to a segementation fault. This problem also shows up under Tcl/Tk 8.3.2. It has been reproduced under Solaris 2.6, Solaris 8, Windows NT, and Windows 2000. I have also noticed that the same code is used in the Tcl/Tk 8.4 Alpha releases. The problem seems to be in the the call to "ReadImage()" in "tkImgGIF.c": 1). The "ReadImage()" function ignores any parameters that have been passed via the "-from" option. 2). Non-interlaced GIF images will load, but they will be corrupted. 3). Interlaced GIF images will typically cause a segmentation fault as they are read, but if not they will still be corrupted. I worked on a fix to prevent the problem, but it is not optimal: *** /afs/isis.unc.edu/home/m/c/mcknight/tkImgGIF.c Wed Oct 3 11:29:46 2001 --- tkImgGIF.c Wed Oct 3 11:31:34 2001 *************** *** 799,805 **** register unsigned char *top; int codeSize, clearCode, inCode, endCode, oldCode, maxCode, code, firstCode; ! /* * Initialize the decoder */ --- 799,805 ---- register unsigned char *top; int codeSize, clearCode, inCode, endCode, oldCode, maxCode, code, firstCode; ! /* * Initialize the decoder */ *************** *** 841,848 **** GetCode(chan, 0, 1); /* Read until we finish the image */ ! for (i = 0, ypos = 0; i < rows; i++) { ! for (xpos = 0; xpos < len; ) { if (top == stack) { /* Bummer -- our stack is empty. Now we have to work! */ --- 841,849 ---- GetCode(chan, 0, 1); /* Read until we finish the image */ ! ! for (i = 0, ypos = 0; i < height; i++) { ! for (xpos = 0; xpos < width; ) { if (top == stack) { /* Bummer -- our stack is empty. Now we have to work! */ *************** *** 947,955 **** * there are more in the file and we will be called to read * one of them later) */ ! *pixelPtr++ = cmap[v][CM_RED]; ! *pixelPtr++ = cmap[v][CM_GREEN]; ! *pixelPtr++ = cmap[v][CM_BLUE]; if (transparent >= 0) { *pixelPtr++ = cmap[v][CM_ALPHA]; } --- 948,963 ---- * there are more in the file and we will be called to read * one of them later) */ ! ! if ( (xpos >= srcX) && (xpos < srcX+len) && ! (ypos >= srcY) && (ypos < srcY+rows)) { ! ! *pixelPtr++ = cmap[v][CM_RED]; ! *pixelPtr++ = cmap[v][CM_GREEN]; ! *pixelPtr++ = cmap[v][CM_BLUE]; ! ! } ! if (transparent >= 0) { *pixelPtr++ = cmap[v][CM_ALPHA]; } *************** *** 970,976 **** } else { ypos++; } ! pixelPtr = imagePtr + (ypos) * len * ((transparent>=0)?4:3); } return TCL_OK; } --- 978,989 ---- } else { ypos++; } ! ! if ( i >= (srcY+rows) ) { ! break; ! } ! ! pixelPtr = imagePtr + (ypos-srcY) * len * ((transparent>=0)?4:3); } return TCL_OK; } ---------------------------------------------------------------------- You can respond by visiting: http://sourceforge.net/tracker/?func=detail&atid=112997&aid=467524&group_id=12997 |