Added scaling API to TurboJPEG/OSS


git-svn-id: svn+ssh://svn.code.sf.net/p/libjpeg-turbo/code/trunk@367 632fc199-4ca6-4c93-a231-07263d6284db
diff --git a/turbojpegl.c b/turbojpegl.c
index c1c62f6..1e48234 100644
--- a/turbojpegl.c
+++ b/turbojpegl.c
@@ -418,10 +418,10 @@
 }
 
 
-DLLEXPORT int DLLCALL tjDecompress(tjhandle h,
+DLLEXPORT int DLLCALL tjDecompress2(tjhandle h,
 	unsigned char *srcbuf, unsigned long size,
-	unsigned char *dstbuf, int width, int pitch, int height, int ps,
-	int flags)
+	unsigned char *dstbuf, int pitch, int ps,
+	int scale_num, int scale_denom, int flags)
 {
 	int i, row, retval=0;  JSAMPROW *row_pointer=NULL, *outbuf[MAX_COMPONENTS];
 	int cw[MAX_COMPONENTS], ch[MAX_COMPONENTS], iw[MAX_COMPONENTS],
@@ -435,14 +435,15 @@
 		tmpbuf[i]=NULL;  outbuf[i]=NULL;
 	}
 
-	if(srcbuf==NULL || size<=0
-		|| dstbuf==NULL || width<=0 || pitch<0 || height<=0)
-		_throw("Invalid argument in tjDecompress()");
+	if(srcbuf==NULL || size<=0 || dstbuf==NULL || pitch<0)
+		_throw("Invalid argument in tjDecompress2()");
 	if(ps!=3 && ps!=4 && ps!=1)
 		_throw("This decompressor can only handle 24-bit and 32-bit RGB or 8-bit grayscale output");
 	if(!j->initd) _throw("Instance has not been initialized for decompression");
 
-	if(pitch==0) pitch=width*ps;
+	if(scale_num!=1 || scale_denom<1 || scale_denom>8
+		|| (scale_denom&(scale_denom-1))!=0)
+		_throw("Unsupported scaling factor");
 
 	if(flags&TJ_FORCEMMX) putenv("JSIMD_FORCEMMX=1");
 	else if(flags&TJ_FORCESSE) putenv("JSIMD_FORCESSE=1");
@@ -470,10 +471,10 @@
 			int ih;
 			iw[i]=compptr->width_in_blocks*DCTSIZE;
 			ih=compptr->height_in_blocks*DCTSIZE;
-			cw[i]=PAD(width, dinfo->max_h_samp_factor)*compptr->h_samp_factor
-				/dinfo->max_h_samp_factor;
-			ch[i]=PAD(height, dinfo->max_v_samp_factor)*compptr->v_samp_factor
-				/dinfo->max_v_samp_factor;
+			cw[i]=PAD(dinfo->image_width, dinfo->max_h_samp_factor)
+				*compptr->h_samp_factor/dinfo->max_h_samp_factor;
+			ch[i]=PAD(dinfo->image_height, dinfo->max_v_samp_factor)
+				*compptr->v_samp_factor/dinfo->max_v_samp_factor;
 			if(iw[i]!=cw[i] || ih!=ch[i]) usetmpbuf=1;
 			th[i]=compptr->v_samp_factor*DCTSIZE;
 			tmpbufsize+=iw[i]*th[i];
@@ -503,16 +504,6 @@
 			}
 		}
 	}
-	else
-	{
-		if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)*height))==NULL)
-			_throw("Memory allocation failed in tjInitDecompress()");
-		for(i=0; i<height; i++)
-		{
-			if(flags&TJ_BOTTOMUP) row_pointer[i]= &dstbuf[(height-i-1)*pitch];
-			else row_pointer[i]= &dstbuf[i*pitch];
-		}
-	}
 
 	if(ps==1) j->dinfo.out_color_space = JCS_GRAYSCALE;
 	#if JCS_EXTENSIONS==1
@@ -533,6 +524,11 @@
 
 	if(flags&TJ_FASTUPSAMPLE) j->dinfo.do_fancy_upsampling=FALSE;
 	if(flags&TJ_YUV) j->dinfo.raw_data_out=TRUE;
+	else
+	{
+		j->dinfo.scale_num=scale_num;
+		j->dinfo.scale_denom=scale_denom;
+	}
 
 	jpeg_start_decompress(&j->dinfo);
 	if(flags&TJ_YUV)
@@ -567,6 +563,19 @@
 	}
 	else
 	{
+		if(pitch==0) pitch=j->dinfo.output_width*ps;
+		if((row_pointer=(JSAMPROW *)malloc(sizeof(JSAMPROW)
+			*j->dinfo.output_height))==NULL)
+		{
+			jpeg_finish_decompress(&j->dinfo);
+			_throw("Memory allocation failed in tjInitDecompress()");
+		}
+		for(i=0; i<j->dinfo.output_height; i++)
+		{
+			if(flags&TJ_BOTTOMUP)
+				row_pointer[i]= &dstbuf[(j->dinfo.output_height-i-1)*pitch];
+			else row_pointer[i]= &dstbuf[i*pitch];
+		}
 		while(j->dinfo.output_scanline<j->dinfo.output_height)
 		{
 			jpeg_read_scanlines(&j->dinfo, &row_pointer[j->dinfo.output_scanline],
@@ -587,6 +596,19 @@
 }
 
 
+DLLEXPORT int DLLCALL tjDecompress(tjhandle h,
+	unsigned char *srcbuf, unsigned long size,
+	unsigned char *dstbuf, int width, int pitch, int height, int ps,
+	int flags)
+{
+	if(width<=0 || height<=0)
+	{
+		sprintf(lasterror, "Invalid argument in tjDecompress()");
+		return -1;
+	}
+	return tjDecompress2(h, srcbuf, size, dstbuf, pitch, ps, 1, 1, flags);
+}
+
 // General
 
 DLLEXPORT char* DLLCALL tjGetErrorStr(void)