do not allocate memory in normalize_coeffs_8bpc

This commit is contained in:
homm 2016-12-01 04:02:22 +03:00
parent 02e1ae3d8f
commit 8d7355e733

View File

@ -211,17 +211,14 @@ precompute_coeffs(int inSize, float in0, float in1, int outSize,
} }
int void
normalize_coeffs_8bpc(int outSize, int kmax, double *prekk, INT32 **kkp) normalize_coeffs_8bpc(int outSize, int kmax, double *prekk)
{ {
int x; int x;
INT32 *kk; INT32 *kk;
/* malloc check ok, overflow checked in precompute_coeffs */ // We are using the same buffer for normalized coefficients
kk = malloc(outSize * kmax * sizeof(INT32)); kk = (INT32 *)prekk;
if ( ! kk) {
return 0;
}
for (x = 0; x < outSize * kmax; x++) { for (x = 0; x < outSize * kmax; x++) {
if (prekk[x] < 0) { if (prekk[x] < 0) {
@ -230,14 +227,11 @@ normalize_coeffs_8bpc(int outSize, int kmax, double *prekk, INT32 **kkp)
kk[x] = (int) (0.5 + prekk[x] * (1 << PRECISION_BITS)); kk[x] = (int) (0.5 + prekk[x] * (1 << PRECISION_BITS));
} }
} }
*kkp = kk;
return kmax;
} }
Imaging void
ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn,
int kmax, int *xbounds, double *prekk) int kmax, int *xbounds, double *prekk)
{ {
@ -246,10 +240,8 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn,
int xx, yy, x, xmin, xmax; int xx, yy, x, xmin, xmax;
INT32 *k, *kk; INT32 *k, *kk;
kmax = normalize_coeffs_8bpc(imOut->xsize, kmax, prekk, &kk); kk = (INT32 *) prekk;
if ( ! kmax) { normalize_coeffs_8bpc(imOut->xsize, kmax, prekk);
return (Imaging) ImagingError_MemoryError();
}
ImagingSectionEnter(&cookie); ImagingSectionEnter(&cookie);
if (imIn->image8) { if (imIn->image8) {
@ -319,13 +311,10 @@ ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn,
} }
} }
ImagingSectionLeave(&cookie); ImagingSectionLeave(&cookie);
free(kk);
return imOut;
} }
Imaging void
ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn,
int kmax, int *xbounds, double *prekk) int kmax, int *xbounds, double *prekk)
{ {
@ -334,10 +323,8 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn,
int xx, yy, y, ymin, ymax; int xx, yy, y, ymin, ymax;
INT32 *k, *kk; INT32 *k, *kk;
kmax = normalize_coeffs_8bpc(imOut->ysize, kmax, prekk, &kk); kk = (INT32 *) prekk;
if ( ! kmax) { normalize_coeffs_8bpc(imOut->ysize, kmax, prekk);
return (Imaging) ImagingError_MemoryError();
}
ImagingSectionEnter(&cookie); ImagingSectionEnter(&cookie);
if (imIn->image8) { if (imIn->image8) {
@ -407,13 +394,10 @@ ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn,
} }
} }
ImagingSectionLeave(&cookie); ImagingSectionLeave(&cookie);
free(kk);
return imOut;
} }
Imaging void
ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn, ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn,
int kmax, int *xbounds, double *kk) int kmax, int *xbounds, double *kk)
{ {
@ -453,12 +437,10 @@ ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn,
break; break;
} }
ImagingSectionLeave(&cookie); ImagingSectionLeave(&cookie);
return imOut;
} }
Imaging void
ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn, ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn,
int kmax, int *xbounds, double *kk) int kmax, int *xbounds, double *kk)
{ {
@ -498,12 +480,10 @@ ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn,
break; break;
} }
ImagingSectionLeave(&cookie); ImagingSectionLeave(&cookie);
return imOut;
} }
typedef Imaging (*ResampleFunction)(Imaging imOut, Imaging imIn, typedef void (*ResampleFunction)(Imaging imOut, Imaging imIn,
int kmax, int *xbounds, double *kk); int kmax, int *xbounds, double *kk);
@ -600,12 +580,7 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize,
free(kk); free(kk);
return NULL; return NULL;
} }
if ( ! ResampleHorizontal(imTemp, imIn, kmax, xbounds, kk)) { ResampleHorizontal(imTemp, imIn, kmax, xbounds, kk);
ImagingDelete(imTemp);
free(xbounds);
free(kk);
return NULL;
}
free(xbounds); free(xbounds);
free(kk); free(kk);
imOut = imIn = imTemp; imOut = imIn = imTemp;
@ -616,6 +591,7 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize,
kmax = precompute_coeffs(imIn->ysize, box[1], box[3], ysize, filterp, kmax = precompute_coeffs(imIn->ysize, box[1], box[3], ysize, filterp,
&xbounds, &kk); &xbounds, &kk);
if ( ! kmax) { if ( ! kmax) {
ImagingDelete(imTemp);
return (Imaging) ImagingError_MemoryError(); return (Imaging) ImagingError_MemoryError();
} }
@ -626,13 +602,7 @@ ImagingResampleInner(Imaging imIn, int xsize, int ysize,
return NULL; return NULL;
} }
/* imIn can be the original image or horizontally resampled one */ /* imIn can be the original image or horizontally resampled one */
if ( ! ResampleVertical(imOut, imIn, kmax, xbounds, kk)) { ResampleVertical(imOut, imIn, kmax, xbounds, kk);
ImagingDelete(imTemp);
ImagingDelete(imOut);
free(xbounds);
free(kk);
return NULL;
}
/* it's safe to call ImagingDelete with empty value /* it's safe to call ImagingDelete with empty value
if previous step was not performed. */ if previous step was not performed. */
ImagingDelete(imTemp); ImagingDelete(imTemp);