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