Statistics
| Branch: | Revision:

root / ui / vnc-enc-zywrle.h @ 7fee199c

History | View | Annotate | Download (25.3 kB)

1 148954fa Corentin Chary
/********************************************************************
2 148954fa Corentin Chary
 *                                                                  *
3 148954fa Corentin Chary
 * THIS FILE IS PART OF THE 'ZYWRLE' VNC CODEC SOURCE CODE.         *
4 148954fa Corentin Chary
 *                                                                  *
5 148954fa Corentin Chary
 * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
6 148954fa Corentin Chary
 * GOVERNED BY A FOLLOWING BSD-STYLE SOURCE LICENSE.                *
7 148954fa Corentin Chary
 * PLEASE READ THESE TERMS BEFORE DISTRIBUTING.                     *
8 148954fa Corentin Chary
 *                                                                  *
9 148954fa Corentin Chary
 * THE 'ZYWRLE' VNC CODEC SOURCE CODE IS (C) COPYRIGHT 2006         *
10 148954fa Corentin Chary
 * BY Hitachi Systems & Services, Ltd.                              *
11 148954fa Corentin Chary
 * (Noriaki Yamazaki, Research & Developement Center)               *
12 148954fa Corentin Chary
 *                                                                  *
13 148954fa Corentin Chary
 *                                                                  *
14 148954fa Corentin Chary
 ********************************************************************
15 148954fa Corentin Chary
Redistribution and use in source and binary forms, with or without
16 148954fa Corentin Chary
modification, are permitted provided that the following conditions
17 148954fa Corentin Chary
are met:
18 148954fa Corentin Chary

19 148954fa Corentin Chary
- Redistributions of source code must retain the above copyright
20 148954fa Corentin Chary
notice, this list of conditions and the following disclaimer.
21 148954fa Corentin Chary

22 148954fa Corentin Chary
- Redistributions in binary form must reproduce the above copyright
23 148954fa Corentin Chary
notice, this list of conditions and the following disclaimer in the
24 148954fa Corentin Chary
documentation and/or other materials provided with the distribution.
25 148954fa Corentin Chary

26 148954fa Corentin Chary
- Neither the name of the Hitachi Systems & Services, Ltd. nor
27 148954fa Corentin Chary
the names of its contributors may be used to endorse or promote
28 148954fa Corentin Chary
products derived from this software without specific prior written
29 148954fa Corentin Chary
permission.
30 148954fa Corentin Chary

31 148954fa Corentin Chary
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 148954fa Corentin Chary
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 148954fa Corentin Chary
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34 148954fa Corentin Chary
A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION
35 148954fa Corentin Chary
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
36 148954fa Corentin Chary
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
37 148954fa Corentin Chary
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
38 148954fa Corentin Chary
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
39 148954fa Corentin Chary
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40 148954fa Corentin Chary
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
41 148954fa Corentin Chary
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42 148954fa Corentin Chary
 ********************************************************************/
43 148954fa Corentin Chary
44 148954fa Corentin Chary
#ifndef VNC_ENCODING_ZYWRLE_H
45 148954fa Corentin Chary
#define VNC_ENCODING_ZYWRLE_H
46 148954fa Corentin Chary
47 148954fa Corentin Chary
/* Tables for Coefficients filtering. */
48 148954fa Corentin Chary
#ifndef ZYWRLE_QUANTIZE
49 148954fa Corentin Chary
/* Type A:lower bit omitting of EZW style. */
50 148954fa Corentin Chary
static const unsigned int zywrle_param[3][3]={
51 148954fa Corentin Chary
        {0x0000F000, 0x00000000, 0x00000000},
52 148954fa Corentin Chary
        {0x0000C000, 0x00F0F0F0, 0x00000000},
53 148954fa Corentin Chary
        {0x0000C000, 0x00C0C0C0, 0x00F0F0F0},
54 148954fa Corentin Chary
/*        {0x0000FF00, 0x00000000, 0x00000000},
55 148954fa Corentin Chary
        {0x0000FF00, 0x00FFFFFF, 0x00000000},
56 148954fa Corentin Chary
        {0x0000FF00, 0x00FFFFFF, 0x00FFFFFF}, */
57 148954fa Corentin Chary
};
58 148954fa Corentin Chary
#else
59 148954fa Corentin Chary
/* Type B:Non liner quantization filter. */
60 148954fa Corentin Chary
static const int8_t zywrle_conv[4][256]={
61 148954fa Corentin Chary
{        /* bi=5, bo=5 r=0.0:PSNR=24.849 */
62 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
63 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
64 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
65 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
66 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
67 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
68 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
69 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
70 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
71 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
72 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
73 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
74 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
75 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
76 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
77 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
78 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
79 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
80 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
81 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
82 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
83 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
84 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
85 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
86 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
87 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
88 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
89 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
90 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
91 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
92 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
93 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
94 148954fa Corentin Chary
},
95 148954fa Corentin Chary
{        /* bi=5, bo=5 r=2.0:PSNR=74.031 */
96 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
97 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
98 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 32,
99 148954fa Corentin Chary
        32, 32, 32, 32, 32, 32, 32, 32,
100 148954fa Corentin Chary
        32, 32, 32, 32, 32, 32, 32, 32,
101 148954fa Corentin Chary
        48, 48, 48, 48, 48, 48, 48, 48,
102 148954fa Corentin Chary
        48, 48, 48, 56, 56, 56, 56, 56,
103 148954fa Corentin Chary
        56, 56, 56, 56, 64, 64, 64, 64,
104 148954fa Corentin Chary
        64, 64, 64, 64, 72, 72, 72, 72,
105 148954fa Corentin Chary
        72, 72, 72, 72, 80, 80, 80, 80,
106 148954fa Corentin Chary
        80, 80, 88, 88, 88, 88, 88, 88,
107 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 96, 96,
108 148954fa Corentin Chary
        96, 96, 96, 104, 104, 104, 104, 104,
109 148954fa Corentin Chary
        104, 104, 104, 104, 104, 112, 112, 112,
110 148954fa Corentin Chary
        112, 112, 112, 112, 112, 112, 120, 120,
111 148954fa Corentin Chary
        120, 120, 120, 120, 120, 120, 120, 120,
112 148954fa Corentin Chary
        0, -120, -120, -120, -120, -120, -120, -120,
113 148954fa Corentin Chary
        -120, -120, -120, -112, -112, -112, -112, -112,
114 148954fa Corentin Chary
        -112, -112, -112, -112, -104, -104, -104, -104,
115 148954fa Corentin Chary
        -104, -104, -104, -104, -104, -104, -96, -96,
116 148954fa Corentin Chary
        -96, -96, -96, -88, -88, -88, -88, -88,
117 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -80,
118 148954fa Corentin Chary
        -80, -80, -80, -80, -80, -72, -72, -72,
119 148954fa Corentin Chary
        -72, -72, -72, -72, -72, -64, -64, -64,
120 148954fa Corentin Chary
        -64, -64, -64, -64, -64, -56, -56, -56,
121 148954fa Corentin Chary
        -56, -56, -56, -56, -56, -56, -48, -48,
122 148954fa Corentin Chary
        -48, -48, -48, -48, -48, -48, -48, -48,
123 148954fa Corentin Chary
        -48, -32, -32, -32, -32, -32, -32, -32,
124 148954fa Corentin Chary
        -32, -32, -32, -32, -32, -32, -32, -32,
125 148954fa Corentin Chary
        -32, -32, 0, 0, 0, 0, 0, 0,
126 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
127 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
128 148954fa Corentin Chary
},
129 148954fa Corentin Chary
{        /* bi=5, bo=4 r=2.0:PSNR=64.441 */
130 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
131 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
132 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
133 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
134 148954fa Corentin Chary
        48, 48, 48, 48, 48, 48, 48, 48,
135 148954fa Corentin Chary
        48, 48, 48, 48, 48, 48, 48, 48,
136 148954fa Corentin Chary
        48, 48, 48, 48, 48, 48, 48, 48,
137 148954fa Corentin Chary
        64, 64, 64, 64, 64, 64, 64, 64,
138 148954fa Corentin Chary
        64, 64, 64, 64, 64, 64, 64, 64,
139 148954fa Corentin Chary
        80, 80, 80, 80, 80, 80, 80, 80,
140 148954fa Corentin Chary
        80, 80, 80, 80, 80, 88, 88, 88,
141 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
142 148954fa Corentin Chary
        104, 104, 104, 104, 104, 104, 104, 104,
143 148954fa Corentin Chary
        104, 104, 104, 112, 112, 112, 112, 112,
144 148954fa Corentin Chary
        112, 112, 112, 112, 120, 120, 120, 120,
145 148954fa Corentin Chary
        120, 120, 120, 120, 120, 120, 120, 120,
146 148954fa Corentin Chary
        0, -120, -120, -120, -120, -120, -120, -120,
147 148954fa Corentin Chary
        -120, -120, -120, -120, -120, -112, -112, -112,
148 148954fa Corentin Chary
        -112, -112, -112, -112, -112, -112, -104, -104,
149 148954fa Corentin Chary
        -104, -104, -104, -104, -104, -104, -104, -104,
150 148954fa Corentin Chary
        -104, -88, -88, -88, -88, -88, -88, -88,
151 148954fa Corentin Chary
        -88, -88, -88, -88, -80, -80, -80, -80,
152 148954fa Corentin Chary
        -80, -80, -80, -80, -80, -80, -80, -80,
153 148954fa Corentin Chary
        -80, -64, -64, -64, -64, -64, -64, -64,
154 148954fa Corentin Chary
        -64, -64, -64, -64, -64, -64, -64, -64,
155 148954fa Corentin Chary
        -64, -48, -48, -48, -48, -48, -48, -48,
156 148954fa Corentin Chary
        -48, -48, -48, -48, -48, -48, -48, -48,
157 148954fa Corentin Chary
        -48, -48, -48, -48, -48, -48, -48, -48,
158 148954fa Corentin Chary
        -48, 0, 0, 0, 0, 0, 0, 0,
159 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
160 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
161 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
162 148954fa Corentin Chary
},
163 148954fa Corentin Chary
{        /* bi=5, bo=2 r=2.0:PSNR=43.175 */
164 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
165 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
166 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
167 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
168 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
169 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
170 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
171 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
172 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
173 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
174 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
175 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
176 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
177 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
178 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
179 148954fa Corentin Chary
        88, 88, 88, 88, 88, 88, 88, 88,
180 148954fa Corentin Chary
        0, -88, -88, -88, -88, -88, -88, -88,
181 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
182 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
183 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
184 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
185 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
186 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
187 148954fa Corentin Chary
        -88, -88, -88, -88, -88, -88, -88, -88,
188 148954fa Corentin Chary
        -88, 0, 0, 0, 0, 0, 0, 0,
189 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
190 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
191 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
192 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
193 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
194 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
195 148954fa Corentin Chary
        0, 0, 0, 0, 0, 0, 0, 0,
196 148954fa Corentin Chary
}
197 148954fa Corentin Chary
};
198 148954fa Corentin Chary
199 148954fa Corentin Chary
static const int8_t *zywrle_param[3][3][3]={
200 148954fa Corentin Chary
        {{zywrle_conv[0], zywrle_conv[2], zywrle_conv[0]},
201 148954fa Corentin Chary
         {zywrle_conv[0], zywrle_conv[0], zywrle_conv[0]},
202 148954fa Corentin Chary
         {zywrle_conv[0], zywrle_conv[0], zywrle_conv[0]}},
203 148954fa Corentin Chary
        {{zywrle_conv[0], zywrle_conv[3], zywrle_conv[0]},
204 148954fa Corentin Chary
         {zywrle_conv[1], zywrle_conv[1], zywrle_conv[1]},
205 148954fa Corentin Chary
         {zywrle_conv[0], zywrle_conv[0], zywrle_conv[0]}},
206 148954fa Corentin Chary
        {{zywrle_conv[0], zywrle_conv[3], zywrle_conv[0]},
207 148954fa Corentin Chary
         {zywrle_conv[2], zywrle_conv[2], zywrle_conv[2]},
208 148954fa Corentin Chary
         {zywrle_conv[1], zywrle_conv[1], zywrle_conv[1]}},
209 148954fa Corentin Chary
};
210 148954fa Corentin Chary
#endif
211 148954fa Corentin Chary
212 148954fa Corentin Chary
/*   Load/Save pixel stuffs. */
213 148954fa Corentin Chary
#define ZYWRLE_YMASK15  0xFFFFFFF8
214 148954fa Corentin Chary
#define ZYWRLE_UVMASK15 0xFFFFFFF8
215 148954fa Corentin Chary
#define ZYWRLE_LOAD_PIXEL15(src, r, g, b)                               \
216 148954fa Corentin Chary
    do {                                                                \
217 148954fa Corentin Chary
        r = (((uint8_t*)src)[S_1]<< 1)& 0xF8;                           \
218 148954fa Corentin Chary
        g = (((uint8_t*)src)[S_1]<< 6) | (((uint8_t*)src)[S_0]>> 2);    \
219 148954fa Corentin Chary
        g &= 0xF8;                                                      \
220 148954fa Corentin Chary
        b =  (((uint8_t*)src)[S_0]<< 3)& 0xF8;                          \
221 148954fa Corentin Chary
    } while (0)
222 148954fa Corentin Chary
223 148954fa Corentin Chary
#define ZYWRLE_SAVE_PIXEL15(dst, r, g, b)                               \
224 148954fa Corentin Chary
    do {                                                                \
225 148954fa Corentin Chary
        r &= 0xF8;                                                      \
226 148954fa Corentin Chary
        g &= 0xF8;                                                      \
227 148954fa Corentin Chary
        b &= 0xF8;                                                      \
228 148954fa Corentin Chary
        ((uint8_t*)dst)[S_1] = (uint8_t)((r >> 1)|(g >> 6));            \
229 148954fa Corentin Chary
        ((uint8_t*)dst)[S_0] = (uint8_t)(((b >> 3)|(g << 2))& 0xFF);    \
230 148954fa Corentin Chary
    } while (0)
231 148954fa Corentin Chary
232 148954fa Corentin Chary
#define ZYWRLE_YMASK16  0xFFFFFFFC
233 148954fa Corentin Chary
#define ZYWRLE_UVMASK16 0xFFFFFFF8
234 148954fa Corentin Chary
#define ZYWRLE_LOAD_PIXEL16(src, r, g, b)                               \
235 148954fa Corentin Chary
    do {                                                                \
236 148954fa Corentin Chary
        r = ((uint8_t*)src)[S_1] & 0xF8;                                \
237 148954fa Corentin Chary
        g = (((uint8_t*)src)[S_1]<< 5) | (((uint8_t*)src)[S_0] >> 3);   \
238 148954fa Corentin Chary
        g &= 0xFC;                                                      \
239 148954fa Corentin Chary
        b = (((uint8_t*)src)[S_0]<< 3) & 0xF8;                          \
240 148954fa Corentin Chary
    } while (0)
241 148954fa Corentin Chary
242 148954fa Corentin Chary
#define ZYWRLE_SAVE_PIXEL16(dst, r, g,b)                                \
243 148954fa Corentin Chary
    do {                                                                \
244 148954fa Corentin Chary
        r &= 0xF8;                                                      \
245 148954fa Corentin Chary
        g &= 0xFC;                                                      \
246 148954fa Corentin Chary
        b &= 0xF8;                                                      \
247 148954fa Corentin Chary
        ((uint8_t*)dst)[S_1] = (uint8_t)(r | (g >> 5));                 \
248 148954fa Corentin Chary
        ((uint8_t*)dst)[S_0] = (uint8_t)(((b >> 3)|(g << 3)) & 0xFF);   \
249 148954fa Corentin Chary
    } while (0)
250 148954fa Corentin Chary
251 148954fa Corentin Chary
#define ZYWRLE_YMASK32  0xFFFFFFFF
252 148954fa Corentin Chary
#define ZYWRLE_UVMASK32 0xFFFFFFFF
253 148954fa Corentin Chary
#define ZYWRLE_LOAD_PIXEL32(src, r, g, b)     \
254 148954fa Corentin Chary
    do {                                      \
255 148954fa Corentin Chary
        r = ((uint8_t*)src)[L_2];             \
256 148954fa Corentin Chary
        g = ((uint8_t*)src)[L_1];             \
257 148954fa Corentin Chary
        b = ((uint8_t*)src)[L_0];             \
258 148954fa Corentin Chary
    } while (0)
259 148954fa Corentin Chary
#define ZYWRLE_SAVE_PIXEL32(dst, r, g, b)             \
260 148954fa Corentin Chary
    do {                                              \
261 148954fa Corentin Chary
        ((uint8_t*)dst)[L_2] = (uint8_t)r;            \
262 148954fa Corentin Chary
        ((uint8_t*)dst)[L_1] = (uint8_t)g;            \
263 148954fa Corentin Chary
        ((uint8_t*)dst)[L_0] = (uint8_t)b;            \
264 148954fa Corentin Chary
    } while (0)
265 148954fa Corentin Chary
266 148954fa Corentin Chary
static inline void harr(int8_t *px0, int8_t *px1)
267 148954fa Corentin Chary
{
268 148954fa Corentin Chary
    /* Piecewise-Linear Harr(PLHarr) */
269 148954fa Corentin Chary
    int x0 = (int)*px0, x1 = (int)*px1;
270 148954fa Corentin Chary
    int orgx0 = x0, orgx1 = x1;
271 148954fa Corentin Chary
272 148954fa Corentin Chary
    if ((x0 ^ x1) & 0x80) {
273 148954fa Corentin Chary
        /* differ sign */
274 148954fa Corentin Chary
        x1 += x0;
275 148954fa Corentin Chary
        if (((x1 ^ orgx1) & 0x80) == 0) {
276 148954fa Corentin Chary
            /* |x1| > |x0| */
277 148954fa Corentin Chary
            x0 -= x1;        /* H = -B */
278 148954fa Corentin Chary
        }
279 148954fa Corentin Chary
    } else {
280 148954fa Corentin Chary
        /* same sign */
281 148954fa Corentin Chary
        x0 -= x1;
282 148954fa Corentin Chary
        if (((x0 ^ orgx0) & 0x80) == 0) {
283 148954fa Corentin Chary
            /* |x0| > |x1| */
284 148954fa Corentin Chary
            x1 += x0;        /* L = A */
285 148954fa Corentin Chary
        }
286 148954fa Corentin Chary
    }
287 148954fa Corentin Chary
    *px0 = (int8_t)x1;
288 148954fa Corentin Chary
    *px1 = (int8_t)x0;
289 148954fa Corentin Chary
}
290 148954fa Corentin Chary
291 148954fa Corentin Chary
/*
292 148954fa Corentin Chary
 1D-Wavelet transform.
293 148954fa Corentin Chary

294 148954fa Corentin Chary
 In coefficients array, the famous 'pyramid' decomposition is well used.
295 148954fa Corentin Chary

296 148954fa Corentin Chary
 1D Model:
297 148954fa Corentin Chary
   |L0L0L0L0|L0L0L0L0|H0H0H0H0|H0H0H0H0| : level 0
298 148954fa Corentin Chary
   |L1L1L1L1|H1H1H1H1|H0H0H0H0|H0H0H0H0| : level 1
299 148954fa Corentin Chary

300 148954fa Corentin Chary
 But this method needs line buffer because H/L is different position from X0/X1.
301 148954fa Corentin Chary
 So, I used 'interleave' decomposition instead of it.
302 148954fa Corentin Chary

303 148954fa Corentin Chary
 1D Model:
304 148954fa Corentin Chary
   |L0H0L0H0|L0H0L0H0|L0H0L0H0|L0H0L0H0| : level 0
305 148954fa Corentin Chary
   |L1H0H1H0|L1H0H1H0|L1H0H1H0|L1H0H1H0| : level 1
306 148954fa Corentin Chary

307 148954fa Corentin Chary
 In this method, H/L and X0/X1 is always same position.
308 148954fa Corentin Chary
 This lead us to more speed and less memory.
309 148954fa Corentin Chary
 Of cause, the result of both method is quite same
310 148954fa Corentin Chary
 because it's only difference that coefficient position.
311 148954fa Corentin Chary
*/
312 148954fa Corentin Chary
static inline void wavelet_level(int *data, int size, int l, int skip_pixel)
313 148954fa Corentin Chary
{
314 148954fa Corentin Chary
    int s, ofs;
315 148954fa Corentin Chary
    int8_t *px0;
316 148954fa Corentin Chary
    int8_t *end;
317 148954fa Corentin Chary
318 148954fa Corentin Chary
    px0 = (int8_t*)data;
319 148954fa Corentin Chary
    s = (8 << l) * skip_pixel;
320 148954fa Corentin Chary
    end = px0 + (size >> (l + 1)) * s;
321 148954fa Corentin Chary
    s -= 2;
322 148954fa Corentin Chary
    ofs = (4 << l) * skip_pixel;
323 148954fa Corentin Chary
324 148954fa Corentin Chary
    while (px0 < end) {
325 148954fa Corentin Chary
        harr(px0, px0 + ofs);
326 148954fa Corentin Chary
        px0++;
327 148954fa Corentin Chary
        harr(px0, px0 + ofs);
328 148954fa Corentin Chary
        px0++;
329 148954fa Corentin Chary
        harr(px0, px0 + ofs);
330 148954fa Corentin Chary
        px0 += s;
331 148954fa Corentin Chary
    }
332 148954fa Corentin Chary
}
333 148954fa Corentin Chary
334 148954fa Corentin Chary
#ifndef ZYWRLE_QUANTIZE
335 148954fa Corentin Chary
/* Type A:lower bit omitting of EZW style. */
336 148954fa Corentin Chary
static inline void filter_wavelet_square(int *buf, int width, int height,
337 148954fa Corentin Chary
                                         int level, int l)
338 148954fa Corentin Chary
{
339 148954fa Corentin Chary
    int r, s;
340 148954fa Corentin Chary
    int x, y;
341 148954fa Corentin Chary
    int *h;
342 148954fa Corentin Chary
    const unsigned int *m;
343 148954fa Corentin Chary
344 148954fa Corentin Chary
    m = &(zywrle_param[level - 1][l]);
345 148954fa Corentin Chary
    s = 2 << l;
346 148954fa Corentin Chary
347 148954fa Corentin Chary
    for (r = 1; r < 4; r++) {
348 148954fa Corentin Chary
        h = buf;
349 148954fa Corentin Chary
        if (r & 0x01) {
350 148954fa Corentin Chary
            h += s >> 1;
351 148954fa Corentin Chary
        }
352 148954fa Corentin Chary
        if (r & 0x02) {
353 148954fa Corentin Chary
            h += (s >> 1) * width;
354 148954fa Corentin Chary
        }
355 148954fa Corentin Chary
        for (y = 0; y < height / s; y++) {
356 148954fa Corentin Chary
            for (x = 0; x < width / s; x++) {
357 148954fa Corentin Chary
                /*
358 148954fa Corentin Chary
                  these are same following code.
359 148954fa Corentin Chary
                  h[x] = h[x] / (~m[x]+1) * (~m[x]+1);
360 148954fa Corentin Chary
                  ( round h[x] with m[x] bit )
361 148954fa Corentin Chary
                  '&' operator isn't 'round' but is 'floor'.
362 148954fa Corentin Chary
                  So, we must offset when h[x] is negative.
363 148954fa Corentin Chary
                */
364 148954fa Corentin Chary
                if (((int8_t*)h)[0] & 0x80) {
365 148954fa Corentin Chary
                    ((int8_t*)h)[0] += ~((int8_t*)m)[0];
366 148954fa Corentin Chary
                }
367 148954fa Corentin Chary
                if (((int8_t*)h)[1] & 0x80) {
368 148954fa Corentin Chary
                    ((int8_t*)h)[1] += ~((int8_t*)m)[1];
369 148954fa Corentin Chary
                }
370 148954fa Corentin Chary
                if (((int8_t*)h)[2] & 0x80) {
371 148954fa Corentin Chary
                    ((int8_t*)h)[2] += ~((int8_t*)m)[2];
372 148954fa Corentin Chary
                }
373 148954fa Corentin Chary
                *h &= *m;
374 148954fa Corentin Chary
                h += s;
375 148954fa Corentin Chary
            }
376 148954fa Corentin Chary
            h += (s-1)*width;
377 148954fa Corentin Chary
        }
378 148954fa Corentin Chary
    }
379 148954fa Corentin Chary
}
380 148954fa Corentin Chary
#else
381 148954fa Corentin Chary
/*
382 148954fa Corentin Chary
 Type B:Non liner quantization filter.
383 148954fa Corentin Chary

384 148954fa Corentin Chary
 Coefficients have Gaussian curve and smaller value which is
385 148954fa Corentin Chary
 large part of coefficients isn't more important than larger value.
386 148954fa Corentin Chary
 So, I use filter of Non liner quantize/dequantize table.
387 148954fa Corentin Chary
 In general, Non liner quantize formula is explained as following.
388 148954fa Corentin Chary

389 148954fa Corentin Chary
    y=f(x)   = sign(x)*round( ((abs(x)/(2^7))^ r   )* 2^(bo-1) )*2^(8-bo)
390 148954fa Corentin Chary
    x=f-1(y) = sign(y)*round( ((abs(y)/(2^7))^(1/r))* 2^(bi-1) )*2^(8-bi)
391 148954fa Corentin Chary
 ( r:power coefficient  bi:effective MSB in input  bo:effective MSB in output )
392 148954fa Corentin Chary

393 148954fa Corentin Chary
   r < 1.0 : Smaller value is more important than larger value.
394 148954fa Corentin Chary
   r > 1.0 : Larger value is more important than smaller value.
395 148954fa Corentin Chary
   r = 1.0 : Liner quantization which is same with EZW style.
396 148954fa Corentin Chary

397 148954fa Corentin Chary
 r = 0.75 is famous non liner quantization used in MP3 audio codec.
398 148954fa Corentin Chary
 In contrast to audio data, larger value is important in wavelet coefficients.
399 148954fa Corentin Chary
 So, I select r = 2.0 table( quantize is x^2, dequantize sqrt(x) ).
400 148954fa Corentin Chary

401 148954fa Corentin Chary
 As compared with EZW style liner quantization, this filter tended to be
402 148954fa Corentin Chary
 more sharp edge and be more compression rate but be more blocking noise and be
403 148954fa Corentin Chary
 less quality. Especially, the surface of graphic objects has distinguishable
404 148954fa Corentin Chary
 noise in middle quality mode.
405 148954fa Corentin Chary

406 148954fa Corentin Chary
 We need only quantized-dequantized(filtered) value rather than quantized value
407 148954fa Corentin Chary
 itself because all values are packed or palette-lized in later ZRLE section.
408 148954fa Corentin Chary
 This lead us not to need to modify client decoder when we change
409 148954fa Corentin Chary
 the filtering procedure in future.
410 148954fa Corentin Chary
 Client only decodes coefficients given by encoder.
411 148954fa Corentin Chary
*/
412 148954fa Corentin Chary
static inline void filter_wavelet_square(int *buf, int width, int height,
413 148954fa Corentin Chary
                                         int level, int l)
414 148954fa Corentin Chary
{
415 148954fa Corentin Chary
    int r, s;
416 148954fa Corentin Chary
    int x, y;
417 148954fa Corentin Chary
    int *h;
418 148954fa Corentin Chary
    const int8_t **m;
419 148954fa Corentin Chary
420 148954fa Corentin Chary
    m = zywrle_param[level - 1][l];
421 148954fa Corentin Chary
    s = 2 << l;
422 148954fa Corentin Chary
423 148954fa Corentin Chary
    for (r = 1; r < 4; r++) {
424 148954fa Corentin Chary
        h = buf;
425 148954fa Corentin Chary
        if (r & 0x01) {
426 148954fa Corentin Chary
            h += s >> 1;
427 148954fa Corentin Chary
        }
428 148954fa Corentin Chary
        if (r & 0x02) {
429 148954fa Corentin Chary
            h += (s >> 1) * width;
430 148954fa Corentin Chary
        }
431 148954fa Corentin Chary
        for (y = 0; y < height / s; y++) {
432 148954fa Corentin Chary
            for (x = 0; x < width / s; x++) {
433 148954fa Corentin Chary
                ((int8_t*)h)[0] = m[0][((uint8_t*)h)[0]];
434 148954fa Corentin Chary
                ((int8_t*)h)[1] = m[1][((uint8_t*)h)[1]];
435 148954fa Corentin Chary
                ((int8_t*)h)[2] = m[2][((uint8_t*)h)[2]];
436 148954fa Corentin Chary
                h += s;
437 148954fa Corentin Chary
            }
438 148954fa Corentin Chary
            h += (s - 1) * width;
439 148954fa Corentin Chary
        }
440 148954fa Corentin Chary
    }
441 148954fa Corentin Chary
}
442 148954fa Corentin Chary
#endif
443 148954fa Corentin Chary
444 148954fa Corentin Chary
static inline void wavelet(int *buf, int width, int height, int level)
445 148954fa Corentin Chary
{
446 148954fa Corentin Chary
        int l, s;
447 148954fa Corentin Chary
        int *top;
448 148954fa Corentin Chary
        int *end;
449 148954fa Corentin Chary
450 148954fa Corentin Chary
        for (l = 0; l < level; l++) {
451 148954fa Corentin Chary
                top = buf;
452 148954fa Corentin Chary
                end = buf + height * width;
453 148954fa Corentin Chary
                s = width << l;
454 148954fa Corentin Chary
                while (top < end) {
455 148954fa Corentin Chary
                        wavelet_level(top, width, l, 1);
456 148954fa Corentin Chary
                        top += s;
457 148954fa Corentin Chary
                }
458 148954fa Corentin Chary
                top = buf;
459 148954fa Corentin Chary
                end = buf + width;
460 148954fa Corentin Chary
                s = 1<<l;
461 148954fa Corentin Chary
                while (top < end) {
462 148954fa Corentin Chary
                        wavelet_level(top, height, l, width);
463 148954fa Corentin Chary
                        top += s;
464 148954fa Corentin Chary
                }
465 148954fa Corentin Chary
                filter_wavelet_square(buf, width, height, level, l);
466 148954fa Corentin Chary
        }
467 148954fa Corentin Chary
}
468 148954fa Corentin Chary
469 148954fa Corentin Chary
470 148954fa Corentin Chary
/* Load/Save coefficients stuffs.
471 148954fa Corentin Chary
 Coefficients manages as 24 bits little-endian pixel. */
472 148954fa Corentin Chary
#define ZYWRLE_LOAD_COEFF(src, r, g, b)         \
473 148954fa Corentin Chary
    do {                                        \
474 148954fa Corentin Chary
        r = ((int8_t*)src)[2];                  \
475 148954fa Corentin Chary
        g = ((int8_t*)src)[1];                  \
476 148954fa Corentin Chary
        b = ((int8_t*)src)[0];                  \
477 148954fa Corentin Chary
    } while (0)
478 148954fa Corentin Chary
479 148954fa Corentin Chary
#define ZYWRLE_SAVE_COEFF(dst, r, g, b)       \
480 148954fa Corentin Chary
    do {                                      \
481 148954fa Corentin Chary
        ((int8_t*)dst)[2] = (int8_t)r;        \
482 148954fa Corentin Chary
        ((int8_t*)dst)[1] = (int8_t)g;        \
483 148954fa Corentin Chary
        ((int8_t*)dst)[0] = (int8_t)b;        \
484 148954fa Corentin Chary
    } while (0)
485 148954fa Corentin Chary
486 148954fa Corentin Chary
/*
487 148954fa Corentin Chary
  RGB <=> YUV conversion stuffs.
488 148954fa Corentin Chary
  YUV coversion is explained as following formula in strict meaning:
489 148954fa Corentin Chary
  Y =  0.299R + 0.587G + 0.114B (   0<=Y<=255)
490 148954fa Corentin Chary
  U = -0.169R - 0.331G + 0.500B (-128<=U<=127)
491 148954fa Corentin Chary
  V =  0.500R - 0.419G - 0.081B (-128<=V<=127)
492 148954fa Corentin Chary

493 148954fa Corentin Chary
  I use simple conversion RCT(reversible color transform) which is described
494 148954fa Corentin Chary
  in JPEG-2000 specification.
495 148954fa Corentin Chary
  Y = (R + 2G + B)/4 (   0<=Y<=255)
496 148954fa Corentin Chary
  U = B-G (-256<=U<=255)
497 148954fa Corentin Chary
  V = R-G (-256<=V<=255)
498 148954fa Corentin Chary
*/
499 148954fa Corentin Chary
500 148954fa Corentin Chary
/* RCT is N-bit RGB to N-bit Y and N+1-bit UV.
501 148954fa Corentin Chary
   For make Same N-bit, UV is lossy.
502 148954fa Corentin Chary
   More exact PLHarr, we reduce to odd range(-127<=x<=127). */
503 148954fa Corentin Chary
#define ZYWRLE_RGBYUV_(r, g, b, y, u, v, ymask, uvmask)          \
504 148954fa Corentin Chary
    do {                                                         \
505 148954fa Corentin Chary
        y = (r + (g << 1) + b) >> 2;                             \
506 148954fa Corentin Chary
        u =  b - g;                                              \
507 148954fa Corentin Chary
        v =  r - g;                                              \
508 148954fa Corentin Chary
        y -= 128;                                                \
509 148954fa Corentin Chary
        u >>= 1;                                                 \
510 148954fa Corentin Chary
        v >>= 1;                                                 \
511 148954fa Corentin Chary
        y &= ymask;                                              \
512 148954fa Corentin Chary
        u &= uvmask;                                             \
513 148954fa Corentin Chary
        v &= uvmask;                                             \
514 148954fa Corentin Chary
        if (y == -128) {                                         \
515 148954fa Corentin Chary
            y += (0xFFFFFFFF - ymask + 1);                       \
516 148954fa Corentin Chary
        }                                                        \
517 148954fa Corentin Chary
        if (u == -128) {                                         \
518 148954fa Corentin Chary
            u += (0xFFFFFFFF - uvmask + 1);                      \
519 148954fa Corentin Chary
        }                                                        \
520 148954fa Corentin Chary
        if (v == -128) {                                         \
521 148954fa Corentin Chary
            v += (0xFFFFFFFF - uvmask + 1);                      \
522 148954fa Corentin Chary
        }                                                        \
523 148954fa Corentin Chary
    } while (0)
524 148954fa Corentin Chary
525 148954fa Corentin Chary
526 148954fa Corentin Chary
/*
527 148954fa Corentin Chary
 coefficient packing/unpacking stuffs.
528 148954fa Corentin Chary
 Wavelet transform makes 4 sub coefficient image from 1 original image.
529 148954fa Corentin Chary

530 148954fa Corentin Chary
 model with pyramid decomposition:
531 148954fa Corentin Chary
   +------+------+
532 148954fa Corentin Chary
   |      |      |
533 148954fa Corentin Chary
   |  L   |  Hx  |
534 148954fa Corentin Chary
   |      |      |
535 148954fa Corentin Chary
   +------+------+
536 148954fa Corentin Chary
   |      |      |
537 148954fa Corentin Chary
   |  H   |  Hxy |
538 148954fa Corentin Chary
   |      |      |
539 148954fa Corentin Chary
   +------+------+
540 148954fa Corentin Chary

541 148954fa Corentin Chary
 So, we must transfer each sub images individually in strict meaning.
542 148954fa Corentin Chary
 But at least ZRLE meaning, following one decompositon image is same as
543 148954fa Corentin Chary
 avobe individual sub image. I use this format.
544 148954fa Corentin Chary
 (Strictly saying, transfer order is reverse(Hxy->Hy->Hx->L)
545 148954fa Corentin Chary
  for simplified procedure for any wavelet level.)
546 148954fa Corentin Chary

547 148954fa Corentin Chary
   +------+------+
548 148954fa Corentin Chary
   |      L      |
549 148954fa Corentin Chary
   +------+------+
550 148954fa Corentin Chary
   |      Hx     |
551 148954fa Corentin Chary
   +------+------+
552 148954fa Corentin Chary
   |      Hy     |
553 148954fa Corentin Chary
   +------+------+
554 148954fa Corentin Chary
   |      Hxy    |
555 148954fa Corentin Chary
   +------+------+
556 148954fa Corentin Chary
*/
557 148954fa Corentin Chary
#define ZYWRLE_INC_PTR(data)                         \
558 148954fa Corentin Chary
    do {                                             \
559 148954fa Corentin Chary
        data++;                                      \
560 148954fa Corentin Chary
        if( data - p >= (w + uw) ) {                 \
561 148954fa Corentin Chary
            data += scanline-(w + uw);               \
562 148954fa Corentin Chary
            p = data;                                \
563 148954fa Corentin Chary
        }                                            \
564 148954fa Corentin Chary
    } while (0)
565 148954fa Corentin Chary
566 148954fa Corentin Chary
#define ZYWRLE_TRANSFER_COEFF(buf, data, t, w, h, scanline, level, TRANS) \
567 148954fa Corentin Chary
    do {                                                                \
568 148954fa Corentin Chary
        ph = buf;                                                       \
569 148954fa Corentin Chary
        s = 2 << level;                                                 \
570 148954fa Corentin Chary
        if (t & 0x01) {                                                 \
571 148954fa Corentin Chary
            ph += s >> 1;                                               \
572 148954fa Corentin Chary
        }                                                               \
573 148954fa Corentin Chary
        if (t & 0x02) {                                                 \
574 148954fa Corentin Chary
            ph += (s >> 1) * w;                                         \
575 148954fa Corentin Chary
        }                                                               \
576 148954fa Corentin Chary
        end = ph + h * w;                                               \
577 148954fa Corentin Chary
        while (ph < end) {                                              \
578 148954fa Corentin Chary
            line = ph + w;                                              \
579 148954fa Corentin Chary
            while (ph < line) {                                         \
580 148954fa Corentin Chary
                TRANS                                                   \
581 148954fa Corentin Chary
                    ZYWRLE_INC_PTR(data);                               \
582 148954fa Corentin Chary
                ph += s;                                                \
583 148954fa Corentin Chary
            }                                                           \
584 148954fa Corentin Chary
            ph += (s - 1) * w;                                          \
585 148954fa Corentin Chary
        }                                                               \
586 148954fa Corentin Chary
    } while (0)
587 148954fa Corentin Chary
588 148954fa Corentin Chary
#define ZYWRLE_PACK_COEFF(buf, data, t, width, height, scanline, level)        \
589 148954fa Corentin Chary
    ZYWRLE_TRANSFER_COEFF(buf, data, t, width, height, scanline, level, \
590 148954fa Corentin Chary
                          ZYWRLE_LOAD_COEFF(ph, r, g, b);               \
591 148954fa Corentin Chary
                          ZYWRLE_SAVE_PIXEL(data, r, g, b);)
592 148954fa Corentin Chary
593 148954fa Corentin Chary
#define ZYWRLE_UNPACK_COEFF(buf, data, t, width, height, scanline, level) \
594 148954fa Corentin Chary
    ZYWRLE_TRANSFER_COEFF(buf, data, t, width, height, scanline, level, \
595 148954fa Corentin Chary
                          ZYWRLE_LOAD_PIXEL(data, r, g, b);             \
596 148954fa Corentin Chary
                          ZYWRLE_SAVE_COEFF(ph, r, g, b);)
597 148954fa Corentin Chary
598 148954fa Corentin Chary
#define ZYWRLE_SAVE_UNALIGN(data, TRANS)                     \
599 148954fa Corentin Chary
    do {                                                     \
600 148954fa Corentin Chary
        top = buf + w * h;                                   \
601 148954fa Corentin Chary
        end = buf + (w + uw) * (h + uh);                     \
602 148954fa Corentin Chary
        while (top < end) {                                  \
603 148954fa Corentin Chary
            TRANS                                            \
604 148954fa Corentin Chary
                ZYWRLE_INC_PTR(data);                        \
605 148954fa Corentin Chary
                top++;                                       \
606 148954fa Corentin Chary
        }                                                    \
607 148954fa Corentin Chary
    } while (0)
608 148954fa Corentin Chary
609 148954fa Corentin Chary
#define ZYWRLE_LOAD_UNALIGN(data,TRANS)                                 \
610 148954fa Corentin Chary
    do {                                                                \
611 148954fa Corentin Chary
        top = buf + w * h;                                              \
612 148954fa Corentin Chary
        if (uw) {                                                       \
613 148954fa Corentin Chary
            p = data + w;                                               \
614 148954fa Corentin Chary
            end = (int*)(p + h * scanline);                             \
615 148954fa Corentin Chary
            while (p < (ZRLE_PIXEL*)end) {                              \
616 148954fa Corentin Chary
                line = (int*)(p + uw);                                  \
617 148954fa Corentin Chary
                while (p < (ZRLE_PIXEL*)line) {                         \
618 148954fa Corentin Chary
                    TRANS                                               \
619 148954fa Corentin Chary
                        p++;                                            \
620 148954fa Corentin Chary
                    top++;                                              \
621 148954fa Corentin Chary
                }                                                       \
622 148954fa Corentin Chary
                p += scanline - uw;                                     \
623 148954fa Corentin Chary
            }                                                           \
624 148954fa Corentin Chary
        }                                                               \
625 148954fa Corentin Chary
        if (uh) {                                                       \
626 148954fa Corentin Chary
            p = data + h * scanline;                                    \
627 148954fa Corentin Chary
            end = (int*)(p + uh * scanline);                            \
628 148954fa Corentin Chary
            while (p < (ZRLE_PIXEL*)end) {                              \
629 148954fa Corentin Chary
                line = (int*)(p + w);                                   \
630 148954fa Corentin Chary
                while (p < (ZRLE_PIXEL*)line) {                         \
631 148954fa Corentin Chary
                    TRANS                                               \
632 148954fa Corentin Chary
                        p++;                                            \
633 148954fa Corentin Chary
                    top++;                                              \
634 148954fa Corentin Chary
                }                                                       \
635 148954fa Corentin Chary
                p += scanline - w;                                      \
636 148954fa Corentin Chary
            }                                                           \
637 148954fa Corentin Chary
        }                                                               \
638 148954fa Corentin Chary
        if (uw && uh) {                                                 \
639 148954fa Corentin Chary
            p= data + w + h * scanline;                                 \
640 148954fa Corentin Chary
            end = (int*)(p + uh * scanline);                            \
641 148954fa Corentin Chary
            while (p < (ZRLE_PIXEL*)end) {                              \
642 148954fa Corentin Chary
                line = (int*)(p + uw);                                  \
643 148954fa Corentin Chary
                while (p < (ZRLE_PIXEL*)line) {                         \
644 148954fa Corentin Chary
                    TRANS                                               \
645 148954fa Corentin Chary
                        p++;                                            \
646 148954fa Corentin Chary
                    top++;                                              \
647 148954fa Corentin Chary
                }                                                       \
648 148954fa Corentin Chary
                p += scanline-uw;                                       \
649 148954fa Corentin Chary
            }                                                           \
650 148954fa Corentin Chary
        }                                                               \
651 148954fa Corentin Chary
    } while (0)
652 148954fa Corentin Chary
653 148954fa Corentin Chary
static inline void zywrle_calc_size(int *w, int *h, int level)
654 148954fa Corentin Chary
{
655 148954fa Corentin Chary
    *w &= ~((1 << level) - 1);
656 148954fa Corentin Chary
    *h &= ~((1 << level) - 1);
657 148954fa Corentin Chary
}
658 148954fa Corentin Chary
659 148954fa Corentin Chary
#endif