mirror of
				https://github.com/python-pillow/Pillow.git
				synced 2025-11-04 09:57:43 +03:00 
			
		
		
		
	allocate new image outside of ResampleHorizontal/ResampleVertical
This commit is contained in:
		
							parent
							
								
									44e443fa75
								
							
						
					
					
						commit
						4079c7f192
					
				| 
						 | 
				
			
			@ -238,11 +238,10 @@ normalize_coeffs_8bpc(int outSize, int kmax, double *prekk, INT32 **kkp)
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
Imaging
 | 
			
		||||
ImagingResampleHorizontal_8bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		||||
                               struct filter *filterp)
 | 
			
		||||
ImagingResampleHorizontal_8bpc(Imaging imOut, Imaging imIn, float x0, float x1,
 | 
			
		||||
                               int xsize, struct filter *filterp)
 | 
			
		||||
{
 | 
			
		||||
    ImagingSectionCookie cookie;
 | 
			
		||||
    Imaging imOut;
 | 
			
		||||
    int ss0, ss1, ss2, ss3;
 | 
			
		||||
    int xx, yy, x, kmax, xmin, xmax;
 | 
			
		||||
    int *xbounds;
 | 
			
		||||
| 
						 | 
				
			
			@ -262,13 +261,6 @@ ImagingResampleHorizontal_8bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		|||
        return (Imaging) ImagingError_MemoryError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    imOut = ImagingNew(imIn->mode, xsize, imIn->ysize);
 | 
			
		||||
    if ( ! imOut) {
 | 
			
		||||
        free(kk);
 | 
			
		||||
        free(xbounds);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionEnter(&cookie);
 | 
			
		||||
    if (imIn->image8) {
 | 
			
		||||
        for (yy = 0; yy < imOut->ysize; yy++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -336,8 +328,8 @@ ImagingResampleHorizontal_8bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionLeave(&cookie);
 | 
			
		||||
 | 
			
		||||
    free(kk);
 | 
			
		||||
    free(xbounds);
 | 
			
		||||
    return imOut;
 | 
			
		||||
| 
						 | 
				
			
			@ -345,11 +337,10 @@ ImagingResampleHorizontal_8bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
Imaging
 | 
			
		||||
ImagingResampleVertical_8bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		||||
                             struct filter *filterp)
 | 
			
		||||
ImagingResampleVertical_8bpc(Imaging imOut, Imaging imIn, float y0, float y1,
 | 
			
		||||
                             int ysize, struct filter *filterp)
 | 
			
		||||
{
 | 
			
		||||
    ImagingSectionCookie cookie;
 | 
			
		||||
    Imaging imOut;
 | 
			
		||||
    int ss0, ss1, ss2, ss3;
 | 
			
		||||
    int xx, yy, y, kmax, ymin, ymax;
 | 
			
		||||
    int *xbounds;
 | 
			
		||||
| 
						 | 
				
			
			@ -369,13 +360,6 @@ ImagingResampleVertical_8bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		|||
        return (Imaging) ImagingError_MemoryError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    imOut = ImagingNew(imIn->mode, imIn->xsize, ysize);
 | 
			
		||||
    if ( ! imOut) {
 | 
			
		||||
        free(kk);
 | 
			
		||||
        free(xbounds);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionEnter(&cookie);
 | 
			
		||||
    if (imIn->image8) {
 | 
			
		||||
        for (yy = 0; yy < ysize; yy++) {
 | 
			
		||||
| 
						 | 
				
			
			@ -443,8 +427,8 @@ ImagingResampleVertical_8bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		|||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionLeave(&cookie);
 | 
			
		||||
 | 
			
		||||
    free(kk);
 | 
			
		||||
    free(xbounds);
 | 
			
		||||
    return imOut;
 | 
			
		||||
| 
						 | 
				
			
			@ -452,11 +436,10 @@ ImagingResampleVertical_8bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
Imaging
 | 
			
		||||
ImagingResampleHorizontal_32bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		||||
                                struct filter *filterp)
 | 
			
		||||
ImagingResampleHorizontal_32bpc(Imaging imOut, Imaging imIn, float x0, float x1,
 | 
			
		||||
                                int xsize, struct filter *filterp)
 | 
			
		||||
{
 | 
			
		||||
    ImagingSectionCookie cookie;
 | 
			
		||||
    Imaging imOut;
 | 
			
		||||
    double ss;
 | 
			
		||||
    int xx, yy, x, kmax, xmin, xmax;
 | 
			
		||||
    int *xbounds;
 | 
			
		||||
| 
						 | 
				
			
			@ -468,13 +451,6 @@ ImagingResampleHorizontal_32bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		|||
        return (Imaging) ImagingError_MemoryError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    imOut = ImagingNew(imIn->mode, xsize, imIn->ysize);
 | 
			
		||||
    if ( ! imOut) {
 | 
			
		||||
        free(kk);
 | 
			
		||||
        free(xbounds);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionEnter(&cookie);
 | 
			
		||||
    switch(imIn->type) {
 | 
			
		||||
        case IMAGING_TYPE_INT32:
 | 
			
		||||
| 
						 | 
				
			
			@ -505,8 +481,8 @@ ImagingResampleHorizontal_32bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		|||
            }
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionLeave(&cookie);
 | 
			
		||||
 | 
			
		||||
    free(kk);
 | 
			
		||||
    free(xbounds);
 | 
			
		||||
    return imOut;
 | 
			
		||||
| 
						 | 
				
			
			@ -514,11 +490,10 @@ ImagingResampleHorizontal_32bpc(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
Imaging
 | 
			
		||||
ImagingResampleVertical_32bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		||||
                              struct filter *filterp)
 | 
			
		||||
ImagingResampleVertical_32bpc(Imaging imOut, Imaging imIn, float y0, float y1,
 | 
			
		||||
                              int ysize, struct filter *filterp)
 | 
			
		||||
{
 | 
			
		||||
    ImagingSectionCookie cookie;
 | 
			
		||||
    Imaging imOut;
 | 
			
		||||
    double ss;
 | 
			
		||||
    int xx, yy, y, kmax, ymin, ymax;
 | 
			
		||||
    int *xbounds;
 | 
			
		||||
| 
						 | 
				
			
			@ -530,13 +505,6 @@ ImagingResampleVertical_32bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		|||
        return (Imaging) ImagingError_MemoryError();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    imOut = ImagingNew(imIn->mode, imIn->xsize, ysize);
 | 
			
		||||
    if ( ! imOut) {
 | 
			
		||||
        free(kk);
 | 
			
		||||
        free(xbounds);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionEnter(&cookie);
 | 
			
		||||
    switch(imIn->type) {
 | 
			
		||||
        case IMAGING_TYPE_INT32:
 | 
			
		||||
| 
						 | 
				
			
			@ -567,16 +535,16 @@ ImagingResampleVertical_32bpc(Imaging imIn, float y0, float y1, int ysize,
 | 
			
		|||
            }
 | 
			
		||||
            break;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ImagingSectionLeave(&cookie);
 | 
			
		||||
 | 
			
		||||
    free(kk);
 | 
			
		||||
    free(xbounds);
 | 
			
		||||
    return imOut;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
typedef Imaging (*ResampleFunction)(Imaging imIn, float x0, float x1, int xsize,
 | 
			
		||||
                                    struct filter *filterp);
 | 
			
		||||
typedef Imaging (*ResampleFunction)(Imaging imOut, Imaging imIn,
 | 
			
		||||
    float x0, float x1, int xsize, struct filter *filterp);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Imaging
 | 
			
		||||
| 
						 | 
				
			
			@ -637,21 +605,32 @@ ImagingResample(Imaging imIn, int xsize, int ysize, int filter, float roi[4])
 | 
			
		|||
 | 
			
		||||
    /* two-pass resize, first pass */
 | 
			
		||||
    if (roi[0] || roi[2] != xsize) {
 | 
			
		||||
        imTemp = ResampleHorizontal(imIn, roi[0], roi[2], xsize, filterp);
 | 
			
		||||
        if ( ! imTemp)
 | 
			
		||||
        imTemp = ImagingNew(imIn->mode, xsize, imIn->ysize);
 | 
			
		||||
        if ( ! imTemp) {
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        if ( ! ResampleHorizontal(imTemp, imIn, roi[0], roi[2], xsize, filterp)) {
 | 
			
		||||
            ImagingDelete(imTemp);
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        imOut = imIn = imTemp;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* second pass */
 | 
			
		||||
    if (roi[1] || roi[3] != ysize) {
 | 
			
		||||
        /* imIn can be the original image or horizontally resampled one */
 | 
			
		||||
        imOut = ResampleVertical(imIn, roi[1], roi[3], ysize, filterp);
 | 
			
		||||
        /* it's safe to call ImagingDelete with empty value
 | 
			
		||||
           if there was no previous step. */
 | 
			
		||||
        ImagingDelete(imTemp);
 | 
			
		||||
        if ( ! imOut)
 | 
			
		||||
        imOut = ImagingNew(imIn->mode, imIn->xsize, ysize);
 | 
			
		||||
        if ( ! imOut) {
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        /* imIn can be the original image or horizontally resampled one */
 | 
			
		||||
        if ( ! ResampleVertical(imOut, imIn, roi[1], roi[3], ysize, filterp)) {
 | 
			
		||||
            ImagingDelete(imTemp);
 | 
			
		||||
            ImagingDelete(imOut);
 | 
			
		||||
            return NULL;
 | 
			
		||||
        }
 | 
			
		||||
        /* it's safe to call ImagingDelete with empty value
 | 
			
		||||
           if previous step was not performed. */
 | 
			
		||||
        ImagingDelete(imTemp);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* none of the previous steps are performed, copying */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue
	
	Block a user