root / ui / vnc-enc-zywrle.h @ d4970b07
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 |