]> Creatis software - gdcm.git/blob - src/jpeg/ljpg/predict.c
ENH: I am a moron. Fix compilation of gdcm in static mode, I had to add some new...
[gdcm.git] / src / jpeg / ljpg / predict.c
1 /*
2  * predict.c --
3  * 
4  * Code for predictor calculation. Its macro version, predictor.h,
5  * is used in non-debugging compilation.
6  */
7 /*
8  * $Id: predict.c,v 1.1 2003/10/21 12:08:54 jpr Exp $
9  */
10 #include <stdio.h>
11 #include "mcu.h"
12
13 #ifdef DEBUG
14 /*
15  *--------------------------------------------------------------
16  *
17  * Predict --
18  *
19  *      Calculate the predictor for pixel[row][col][curComp],
20  *      i.e. curRowBuf[col][curComp]. It handles the all special 
21  *      cases at image edges, such as first row and first column
22  *      of a scan.
23  *
24  * Results:
25  *      predictor is passed out.
26  *
27  * Side effects:
28  *      None.
29  *
30  *--------------------------------------------------------------
31  */
32 void
33 Predict(int row,int col,  /* position of the pixel to be predicted */
34         int curComp,      /* the pixel's component that is predicting */
35         MCU *curRowBuf,MCU *prevRowBuf, /* current and previous row of image */
36         int Pr,          /* data precision */
37         int Pt,          /* point transformation */
38         int psv,         /* predictor selection value */
39         int *predictor)  /* preditor value (output) */
40 {
41     register int left,upper,diag,leftcol;
42
43     leftcol=col-1;
44     if (row==0) {      
45
46        /* 
47         * The predictor of first pixel is (1<<(Pr-Pt-1), and the
48         * predictors for rest of first row are left neighbors. 
49         */
50        if (col==0) {
51           *predictor = (1<<(Pr-Pt-1));
52        }
53        else {
54           *predictor = curRowBuf[leftcol][curComp];
55        }
56     }
57     else {
58
59        /*
60         * The predictors of first column are upper neighbors. 
61         * All other preditors are calculated according to psv. 
62         */
63        upper=prevRowBuf[col][curComp];
64        if (col==0)
65           *predictor = upper;
66        else {
67           left=curRowBuf[leftcol][curComp];
68           diag=prevRowBuf[leftcol][curComp];
69           switch (psv) {
70              case 0:
71                      *predictor = 0;
72                      break;
73              case 1:
74                      *predictor = left;
75                      break;
76              case 2:
77                      *predictor = upper;
78                      break;
79              case 3:
80                      *predictor = diag;
81                      break;
82              case 4:
83                      *predictor = left+upper-diag;
84                      break;
85              case 5:
86                      *predictor = left+((upper-diag)>>1);
87                      break;
88              case 6:
89                      *predictor = upper+((left-diag)>>1);
90                      break;
91              case 7:
92                      *predictor = (left+upper)>>1;
93                      break;
94              default:
95                      fprintf(stderr,"Warning: Undefined PSV\n");
96                      *predictor = 0;
97            }
98         }
99       }
100 }
101
102 /*
103  *--------------------------------------------------------------
104  *
105  * QuickPredict --
106  *
107  *      Calculate the predictor for sample curRowBuf[col][curComp].
108  *      It does not handle the special cases at image edges, such 
109  *      as first row and first column of a scan. We put the special 
110  *      case checkings outside so that the computations in main
111  *      loop can be simpler. This has enhenced the performance
112  *      significantly.
113  *
114  * Results:
115  *      predictor is passed out.
116  *
117  * Side effects:
118  *      None.
119  *
120  *--------------------------------------------------------------
121  */
122 void
123 QuickPredict(int col   /* column # of the pixel to be predicted */,
124          int curComp   /* the pixel's component that is predicting */,
125          MCU *curRowBuf,MCU *prevRowBuf,/* current and previous row of image */
126          int psv       /* predictor selection value */,
127          int predictor /* preditor value (output) */)
128 {
129     register int left,upper,diag,leftcol;
130
131     /* 
132      * All predictor are calculated according to psv.
133      */ 
134     switch (psv) {
135       case 0:
136               *predictor = 0;
137               break;
138       case 1:
139               leftcol = col-1;
140               left    = curRowBuf[leftcol][curComp];
141               *predictor = left;
142               break;
143       case 2:
144               upper = prevRowBuf[col][curComp];
145               *predictor = upper;
146               break;
147       case 3:
148               leftcol = col-1;
149               diag    = prevRowBuf[leftcol][curComp];
150               *predictor = diag;
151               break;
152       case 4:
153               leftcol = col-1;
154               upper   = prevRowBuf[col][curComp];
155               left    = curRowBuf[leftcol][curComp];
156               diag    = prevRowBuf[leftcol][curComp];
157               *predictor = left + upper - diag;
158               break;
159       case 5:
160               leftcol = col-1;
161               upper   = prevRowBuf[col][curComp];
162               left    = curRowBuf[leftcol][curComp];
163               diag    = prevRowBuf[leftcol][curComp];
164               *predictor = left+((upper-diag)>>1);
165               break;
166       case 6:
167               leftcol = col-1;
168               upper   = prevRowBuf[col][curComp];
169               left    = curRowBuf[leftcol][curComp];
170               diag    = prevRowBuf[leftcol][curComp];
171               *predictor = upper+((left-diag)>>1);
172               break;
173       case 7:
174               leftcol = col-1;
175               upper   = prevRowBuf[col][curComp];
176               left    = curRowBuf[leftcol][curComp];
177               *predictor = (left+upper)>>1;
178               break;
179       default:
180               fprintf(stderr,"Warning: Undefined PSV\n");
181               *predictor = 0;
182      }
183 }
184 #endif /*DEBUG*/