Doxygen Source Code Documentation
        
Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search   
jidctint.c
Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 #define JPEG_INTERNALS
00029 #include "jinclude.h"
00030 #include "jpeglib.h"
00031 #include "jdct.h"               
00032 
00033 #ifdef DCT_ISLOW_SUPPORTED
00034 
00035 
00036 
00037 
00038 
00039 
00040 #if DCTSIZE != 8
00041   Sorry, this code only copes with 8x8 DCTs. 
00042 #endif
00043 
00044 
00045 
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 #if BITS_IN_JSAMPLE == 8
00078 #define CONST_BITS  13
00079 #define PASS1_BITS  2
00080 #else
00081 #define CONST_BITS  13
00082 #define PASS1_BITS  1           
00083 #endif
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 #if CONST_BITS == 13
00093 #define FIX_0_298631336  ((INT32)  2446)        
00094 #define FIX_0_390180644  ((INT32)  3196)        
00095 #define FIX_0_541196100  ((INT32)  4433)        
00096 #define FIX_0_765366865  ((INT32)  6270)        
00097 #define FIX_0_899976223  ((INT32)  7373)        
00098 #define FIX_1_175875602  ((INT32)  9633)        
00099 #define FIX_1_501321110  ((INT32)  12299)       
00100 #define FIX_1_847759065  ((INT32)  15137)       
00101 #define FIX_1_961570560  ((INT32)  16069)       
00102 #define FIX_2_053119869  ((INT32)  16819)       
00103 #define FIX_2_562915447  ((INT32)  20995)       
00104 #define FIX_3_072711026  ((INT32)  25172)       
00105 #else
00106 #define FIX_0_298631336  FIX(0.298631336)
00107 #define FIX_0_390180644  FIX(0.390180644)
00108 #define FIX_0_541196100  FIX(0.541196100)
00109 #define FIX_0_765366865  FIX(0.765366865)
00110 #define FIX_0_899976223  FIX(0.899976223)
00111 #define FIX_1_175875602  FIX(1.175875602)
00112 #define FIX_1_501321110  FIX(1.501321110)
00113 #define FIX_1_847759065  FIX(1.847759065)
00114 #define FIX_1_961570560  FIX(1.961570560)
00115 #define FIX_2_053119869  FIX(2.053119869)
00116 #define FIX_2_562915447  FIX(2.562915447)
00117 #define FIX_3_072711026  FIX(3.072711026)
00118 #endif
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 #if BITS_IN_JSAMPLE == 8
00129 #define MULTIPLY(var,const)  MULTIPLY16C16(var,const)
00130 #else
00131 #define MULTIPLY(var,const)  ((var) * (const))
00132 #endif
00133 
00134 
00135 
00136 
00137 
00138 
00139 
00140 #define DEQUANTIZE(coef,quantval)  (((ISLOW_MULT_TYPE) (coef)) * (quantval))
00141 
00142 
00143 
00144 
00145 
00146 
00147 GLOBAL(void)
00148 jpeg_idct_islow (j_decompress_ptr cinfo, jpeg_component_info * compptr,
00149                  JCOEFPTR coef_block,
00150                  JSAMPARRAY output_buf, JDIMENSION output_col)
00151 {
00152   INT32 tmp0, tmp1, tmp2, tmp3;
00153   INT32 tmp10, tmp11, tmp12, tmp13;
00154   INT32 z1, z2, z3, z4, z5;
00155   JCOEFPTR inptr;
00156   ISLOW_MULT_TYPE * quantptr;
00157   int * wsptr;
00158   JSAMPROW outptr;
00159   JSAMPLE *range_limit = IDCT_range_limit(cinfo);
00160   int ctr;
00161   int workspace[DCTSIZE2];      
00162   SHIFT_TEMPS
00163 
00164   
00165   
00166   
00167 
00168   inptr = coef_block;
00169   quantptr = (ISLOW_MULT_TYPE *) compptr->dct_table;
00170   wsptr = workspace;
00171   for (ctr = DCTSIZE; ctr > 0; ctr--) {
00172     
00173 
00174 
00175 
00176 
00177 
00178 
00179 
00180     
00181     if (inptr[DCTSIZE*1] == 0 && inptr[DCTSIZE*2] == 0 &&
00182         inptr[DCTSIZE*3] == 0 && inptr[DCTSIZE*4] == 0 &&
00183         inptr[DCTSIZE*5] == 0 && inptr[DCTSIZE*6] == 0 &&
00184         inptr[DCTSIZE*7] == 0) {
00185       
00186       int dcval = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]) << PASS1_BITS;
00187       
00188       wsptr[DCTSIZE*0] = dcval;
00189       wsptr[DCTSIZE*1] = dcval;
00190       wsptr[DCTSIZE*2] = dcval;
00191       wsptr[DCTSIZE*3] = dcval;
00192       wsptr[DCTSIZE*4] = dcval;
00193       wsptr[DCTSIZE*5] = dcval;
00194       wsptr[DCTSIZE*6] = dcval;
00195       wsptr[DCTSIZE*7] = dcval;
00196       
00197       inptr++;                  
00198       quantptr++;
00199       wsptr++;
00200       continue;
00201     }
00202     
00203     
00204     
00205     
00206     z2 = DEQUANTIZE(inptr[DCTSIZE*2], quantptr[DCTSIZE*2]);
00207     z3 = DEQUANTIZE(inptr[DCTSIZE*6], quantptr[DCTSIZE*6]);
00208     
00209     z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
00210     tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
00211     tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
00212     
00213     z2 = DEQUANTIZE(inptr[DCTSIZE*0], quantptr[DCTSIZE*0]);
00214     z3 = DEQUANTIZE(inptr[DCTSIZE*4], quantptr[DCTSIZE*4]);
00215 
00216     tmp0 = (z2 + z3) << CONST_BITS;
00217     tmp1 = (z2 - z3) << CONST_BITS;
00218     
00219     tmp10 = tmp0 + tmp3;
00220     tmp13 = tmp0 - tmp3;
00221     tmp11 = tmp1 + tmp2;
00222     tmp12 = tmp1 - tmp2;
00223     
00224     
00225 
00226 
00227     
00228     tmp0 = DEQUANTIZE(inptr[DCTSIZE*7], quantptr[DCTSIZE*7]);
00229     tmp1 = DEQUANTIZE(inptr[DCTSIZE*5], quantptr[DCTSIZE*5]);
00230     tmp2 = DEQUANTIZE(inptr[DCTSIZE*3], quantptr[DCTSIZE*3]);
00231     tmp3 = DEQUANTIZE(inptr[DCTSIZE*1], quantptr[DCTSIZE*1]);
00232     
00233     z1 = tmp0 + tmp3;
00234     z2 = tmp1 + tmp2;
00235     z3 = tmp0 + tmp2;
00236     z4 = tmp1 + tmp3;
00237     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); 
00238     
00239     tmp0 = MULTIPLY(tmp0, FIX_0_298631336); 
00240     tmp1 = MULTIPLY(tmp1, FIX_2_053119869); 
00241     tmp2 = MULTIPLY(tmp2, FIX_3_072711026); 
00242     tmp3 = MULTIPLY(tmp3, FIX_1_501321110); 
00243     z1 = MULTIPLY(z1, - FIX_0_899976223); 
00244     z2 = MULTIPLY(z2, - FIX_2_562915447); 
00245     z3 = MULTIPLY(z3, - FIX_1_961570560); 
00246     z4 = MULTIPLY(z4, - FIX_0_390180644); 
00247     
00248     z3 += z5;
00249     z4 += z5;
00250     
00251     tmp0 += z1 + z3;
00252     tmp1 += z2 + z4;
00253     tmp2 += z2 + z3;
00254     tmp3 += z1 + z4;
00255     
00256     
00257     
00258     wsptr[DCTSIZE*0] = (int) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
00259     wsptr[DCTSIZE*7] = (int) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
00260     wsptr[DCTSIZE*1] = (int) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
00261     wsptr[DCTSIZE*6] = (int) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
00262     wsptr[DCTSIZE*2] = (int) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
00263     wsptr[DCTSIZE*5] = (int) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
00264     wsptr[DCTSIZE*3] = (int) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
00265     wsptr[DCTSIZE*4] = (int) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
00266     
00267     inptr++;                    
00268     quantptr++;
00269     wsptr++;
00270   }
00271   
00272   
00273   
00274   
00275 
00276   wsptr = workspace;
00277   for (ctr = 0; ctr < DCTSIZE; ctr++) {
00278     outptr = output_buf[ctr] + output_col;
00279     
00280 
00281 
00282 
00283 
00284 
00285 
00286     
00287 #ifndef NO_ZERO_ROW_TEST
00288     if (wsptr[1] == 0 && wsptr[2] == 0 && wsptr[3] == 0 && wsptr[4] == 0 &&
00289         wsptr[5] == 0 && wsptr[6] == 0 && wsptr[7] == 0) {
00290       
00291       JSAMPLE dcval = range_limit[(int) DESCALE((INT32) wsptr[0], PASS1_BITS+3)
00292                                   & RANGE_MASK];
00293       
00294       outptr[0] = dcval;
00295       outptr[1] = dcval;
00296       outptr[2] = dcval;
00297       outptr[3] = dcval;
00298       outptr[4] = dcval;
00299       outptr[5] = dcval;
00300       outptr[6] = dcval;
00301       outptr[7] = dcval;
00302 
00303       wsptr += DCTSIZE;         
00304       continue;
00305     }
00306 #endif
00307     
00308     
00309     
00310     
00311     z2 = (INT32) wsptr[2];
00312     z3 = (INT32) wsptr[6];
00313     
00314     z1 = MULTIPLY(z2 + z3, FIX_0_541196100);
00315     tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065);
00316     tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865);
00317     
00318     tmp0 = ((INT32) wsptr[0] + (INT32) wsptr[4]) << CONST_BITS;
00319     tmp1 = ((INT32) wsptr[0] - (INT32) wsptr[4]) << CONST_BITS;
00320     
00321     tmp10 = tmp0 + tmp3;
00322     tmp13 = tmp0 - tmp3;
00323     tmp11 = tmp1 + tmp2;
00324     tmp12 = tmp1 - tmp2;
00325     
00326     
00327 
00328 
00329     
00330     tmp0 = (INT32) wsptr[7];
00331     tmp1 = (INT32) wsptr[5];
00332     tmp2 = (INT32) wsptr[3];
00333     tmp3 = (INT32) wsptr[1];
00334     
00335     z1 = tmp0 + tmp3;
00336     z2 = tmp1 + tmp2;
00337     z3 = tmp0 + tmp2;
00338     z4 = tmp1 + tmp3;
00339     z5 = MULTIPLY(z3 + z4, FIX_1_175875602); 
00340     
00341     tmp0 = MULTIPLY(tmp0, FIX_0_298631336); 
00342     tmp1 = MULTIPLY(tmp1, FIX_2_053119869); 
00343     tmp2 = MULTIPLY(tmp2, FIX_3_072711026); 
00344     tmp3 = MULTIPLY(tmp3, FIX_1_501321110); 
00345     z1 = MULTIPLY(z1, - FIX_0_899976223); 
00346     z2 = MULTIPLY(z2, - FIX_2_562915447); 
00347     z3 = MULTIPLY(z3, - FIX_1_961570560); 
00348     z4 = MULTIPLY(z4, - FIX_0_390180644); 
00349     
00350     z3 += z5;
00351     z4 += z5;
00352     
00353     tmp0 += z1 + z3;
00354     tmp1 += z2 + z4;
00355     tmp2 += z2 + z3;
00356     tmp3 += z1 + z4;
00357     
00358     
00359     
00360     outptr[0] = range_limit[(int) DESCALE(tmp10 + tmp3,
00361                                           CONST_BITS+PASS1_BITS+3)
00362                             & RANGE_MASK];
00363     outptr[7] = range_limit[(int) DESCALE(tmp10 - tmp3,
00364                                           CONST_BITS+PASS1_BITS+3)
00365                             & RANGE_MASK];
00366     outptr[1] = range_limit[(int) DESCALE(tmp11 + tmp2,
00367                                           CONST_BITS+PASS1_BITS+3)
00368                             & RANGE_MASK];
00369     outptr[6] = range_limit[(int) DESCALE(tmp11 - tmp2,
00370                                           CONST_BITS+PASS1_BITS+3)
00371                             & RANGE_MASK];
00372     outptr[2] = range_limit[(int) DESCALE(tmp12 + tmp1,
00373                                           CONST_BITS+PASS1_BITS+3)
00374                             & RANGE_MASK];
00375     outptr[5] = range_limit[(int) DESCALE(tmp12 - tmp1,
00376                                           CONST_BITS+PASS1_BITS+3)
00377                             & RANGE_MASK];
00378     outptr[3] = range_limit[(int) DESCALE(tmp13 + tmp0,
00379                                           CONST_BITS+PASS1_BITS+3)
00380                             & RANGE_MASK];
00381     outptr[4] = range_limit[(int) DESCALE(tmp13 - tmp0,
00382                                           CONST_BITS+PASS1_BITS+3)
00383                             & RANGE_MASK];
00384     
00385     wsptr += DCTSIZE;           
00386   }
00387 }
00388 
00389 #endif