cvs: gd /libgd/src gd_nnquant.c

[email protected] ("Pierre-Alain Joye") Tue, 01 Jan 2008 18:55:20 -0000
Newsgroups php.gd.cvs
Message-ID <cvspajoye1199213720@cvsserver>
pajoye		Tue Jan  1 18:55:20 2008 UTC

  Modified files:              
    /gd/libgd/src	gd_nnquant.c 
  Log:
  - #58, free neuquant and temp buffer on exit
  
  
http://cvs.php.net/viewvc.cgi/gd/libgd/src/gd_nnquant.c?r1=1.2&r2=1.3&diff_format=u
Index: gd/libgd/src/gd_nnquant.c
diff -u gd/libgd/src/gd_nnquant.c:1.2 gd/libgd/src/gd_nnquant.c:1.3
--- gd/libgd/src/gd_nnquant.c:1.2	Mon Dec 31 01:58:18 2007
+++ gd/libgd/src/gd_nnquant.c	Tue Jan  1 18:55:20 2008
@@ -481,7 +481,7 @@
 	nn_quant *nnq = NULL;
 
 	int row;
-	unsigned char *rgba;
+	unsigned char *rgba = NULL;
 	gdImagePtr dst;
 
 	/* Default it to 3 */
@@ -498,8 +498,9 @@
 	 */
 	rgba = (unsigned char *) gdMalloc(gdImageSX(im) * gdImageSY(im) * 4);
 	if (!rgba) {
-		return NULL;
+		goto done;
 	}
+
 	d = rgba;
 	for (row = 0; row < gdImageSY(im); row++) {
 		int *p = im->tpixels[row];
@@ -517,7 +518,7 @@
 
 	nnq = (nn_quant *) gdMalloc(sizeof(nn_quant));
 	if (!nnq) {
-		return NULL;
+		goto done;
 	}
 
 	initnet(nnq, rgba, gdImageSY(im) * gdImageSX(im) * 4, sample_factor, newcolors);
@@ -528,22 +529,23 @@
 	inxbuild(nnq); 
 	/* remapping colormap to eliminate opaque tRNS-chunk entries... */
 	for (top_idx = newcolors-1, bot_idx = x = 0;  x < newcolors;  ++x) {
-		if (map[x][3] == 255) /* maxval */
+		if (map[x][3] == 255) { /* maxval */
 			remap[x] = top_idx--;
-		else
+		} else {
 			remap[x] = bot_idx++;
+		}
 	}
 	if (bot_idx != top_idx + 1) {
 		fprintf(stderr,
 				"  internal logic error: remapped bot_idx = %d, top_idx = %d\n",
 				bot_idx, top_idx);
 		fflush(stderr);
-		return NULL;
+		goto done;
 	}
 
 	dst = gdImageCreate(gdImageSX(im), gdImageSY(im));
 	if (!dst) {
-		return NULL;
+		goto done;
 	}
 
 	for (x = 0; x < newcolors; ++x) {
@@ -571,5 +573,14 @@
 					];
 		}
 	}
+
+done:
+	if (rgba) {
+		gdFree(rgba);
+	}
+
+	if (nnq) {
+		gdFree(nnq);
+	}
 	return dst;
 }