[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21953] branches/blender2.5/blender/source /blender/imbuf/intern: better loading partially written TARGA's, dont read over the end of the buffer and set the remaining pixels 0.
Campbell Barton
ideasman42 at gmail.com
Tue Jul 28 00:41:35 CEST 2009
Revision: 21953
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21953
Author: campbellbarton
Date: 2009-07-28 00:41:35 +0200 (Tue, 28 Jul 2009)
Log Message:
-----------
better loading partially written TARGA's, dont read over the end of the buffer and set the remaining pixels 0.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/imbuf/intern/IMB_targa.h
branches/blender2.5/blender/source/blender/imbuf/intern/readimage.c
branches/blender2.5/blender/source/blender/imbuf/intern/targa.c
Modified: branches/blender2.5/blender/source/blender/imbuf/intern/IMB_targa.h
===================================================================
--- branches/blender2.5/blender/source/blender/imbuf/intern/IMB_targa.h 2009-07-27 22:15:17 UTC (rev 21952)
+++ branches/blender2.5/blender/source/blender/imbuf/intern/IMB_targa.h 2009-07-27 22:41:35 UTC (rev 21953)
@@ -41,7 +41,7 @@
int imb_is_a_targa(void *buf);
-struct ImBuf *imb_loadtarga(unsigned char *mem, int flags);
+struct ImBuf *imb_loadtarga(unsigned char *mem, int size, int flags);
short imb_savetarga(struct ImBuf * ibuf, char *name, int flags);
#endif
Modified: branches/blender2.5/blender/source/blender/imbuf/intern/readimage.c
===================================================================
--- branches/blender2.5/blender/source/blender/imbuf/intern/readimage.c 2009-07-27 22:15:17 UTC (rev 21952)
+++ branches/blender2.5/blender/source/blender/imbuf/intern/readimage.c 2009-07-27 22:41:35 UTC (rev 21953)
@@ -143,7 +143,7 @@
ibuf = imb_bmp_decode((uchar *)mem, size, flags);
if (ibuf) return(ibuf);
- ibuf = imb_loadtarga((uchar *)mem, flags);
+ ibuf = imb_loadtarga((uchar *)mem, size, flags);
if (ibuf) return(ibuf);
ibuf = imb_loaddpx((uchar *)mem, size, flags);
@@ -229,7 +229,7 @@
}
}
- ibuf = imb_loadtarga((uchar *) mem,flags);
+ ibuf = imb_loadtarga((uchar *) mem,maxlen,flags);
if (ibuf) return(ibuf);
if (IB_verbose) fprintf(stderr,"Unknown fileformat\n");
Modified: branches/blender2.5/blender/source/blender/imbuf/intern/targa.c
===================================================================
--- branches/blender2.5/blender/source/blender/imbuf/intern/targa.c 2009-07-27 22:15:17 UTC (rev 21952)
+++ branches/blender2.5/blender/source/blender/imbuf/intern/targa.c 2009-07-27 22:41:35 UTC (rev 21953)
@@ -365,8 +365,24 @@
return checktarga(&tga, buf);
}
-static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int psize)
+static void complete_partial_load(struct ImBuf *ibuf, unsigned int *rect)
{
+ int size = (ibuf->x * ibuf->y) - (rect - ibuf->rect);
+ if(size) {
+ printf("decodetarga: incomplete file, %.1f%% missing\n", 100*((float)size / (ibuf->x * ibuf->y)));
+
+ /* not essential but makes displaying partially rendered TGA's less ugly */
+ memset(rect, 0, size);
+ }
+ else {
+ /* shouldnt happen */
+ printf("decodetarga: incomplete file, all pixels written\n");
+ }
+}
+
+static void decodetarga(struct ImBuf *ibuf, unsigned char *mem, int mem_size, int psize)
+{
+ unsigned char *mem_end = mem+mem_size;
int count, col, size;
unsigned int *rect;
uchar * cp = (uchar *) &col;
@@ -380,9 +396,13 @@
/* set alpha */
cp[0] = 0xff;
cp[1] = cp[2] = 0;
-
+
while(size > 0){
count = *mem++;
+
+ if(mem>mem_end)
+ goto partial_load;
+
if (count >= 128) {
/*if (count == 128) printf("TARGA: 128 in file !\n");*/
count -= 127;
@@ -452,15 +472,28 @@
}
*rect++ = col;
count --;
+
+ if(mem>mem_end)
+ goto partial_load;
}
+
+ if(mem>mem_end)
+ goto partial_load;
}
}
}
- if (size) printf("decodetarga: count would overwrite %d pixels\n", -size);
+ if (size) {
+ printf("decodetarga: count would overwrite %d pixels\n", -size);
+ }
+ return;
+
+partial_load:
+ complete_partial_load(ibuf, rect);
}
-static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int psize)
+static void ldtarga(struct ImBuf * ibuf,unsigned char * mem, int mem_size, int psize)
{
+ unsigned char *mem_end = mem+mem_size;
int col,size;
unsigned int *rect;
uchar * cp = (uchar *) &col;
@@ -476,6 +509,9 @@
cp[1] = cp[2] = 0;
while(size > 0){
+ if(mem>mem_end)
+ goto partial_load;
+
if (psize & 2){
if (psize & 1){
/* order = bgra */
@@ -505,10 +541,14 @@
*rect++ = col;
size--;
}
+ return;
+
+partial_load:
+ complete_partial_load(ibuf, rect);
}
-struct ImBuf *imb_loadtarga(unsigned char *mem, int flags)
+struct ImBuf *imb_loadtarga(unsigned char *mem, int mem_size, int flags)
{
TARGA tga;
struct ImBuf * ibuf;
@@ -579,18 +619,18 @@
case 1:
case 2:
case 3:
- if (tga.pixsize <= 8) ldtarga(ibuf,mem,0);
- else if (tga.pixsize <= 16) ldtarga(ibuf,mem,1);
- else if (tga.pixsize <= 24) ldtarga(ibuf,mem,2);
- else if (tga.pixsize <= 32) ldtarga(ibuf,mem,3);
+ if (tga.pixsize <= 8) ldtarga(ibuf,mem,mem_size,0);
+ else if (tga.pixsize <= 16) ldtarga(ibuf,mem,mem_size,1);
+ else if (tga.pixsize <= 24) ldtarga(ibuf,mem,mem_size,2);
+ else if (tga.pixsize <= 32) ldtarga(ibuf,mem,mem_size,3);
break;
case 9:
case 10:
case 11:
- if (tga.pixsize <= 8) decodetarga(ibuf,mem,0);
- else if (tga.pixsize <= 16) decodetarga(ibuf,mem,1);
- else if (tga.pixsize <= 24) decodetarga(ibuf,mem,2);
- else if (tga.pixsize <= 32) decodetarga(ibuf,mem,3);
+ if (tga.pixsize <= 8) decodetarga(ibuf,mem,mem_size,0);
+ else if (tga.pixsize <= 16) decodetarga(ibuf,mem,mem_size,1);
+ else if (tga.pixsize <= 24) decodetarga(ibuf,mem,mem_size,2);
+ else if (tga.pixsize <= 32) decodetarga(ibuf,mem,mem_size,3);
break;
}
More information about the Bf-blender-cvs
mailing list