33 #define GLYPH_COORD_VECT_SIZE 16
34 #define PALETTE_SIZE 256
35 #define PALETTE_DELTA 768
38 0, 1, 2, 3, 3, 3, 3, 2, 1, 0, 0, 0, 1, 2, 2, 1
42 0, 0, 0, 0, 1, 2, 3, 3, 3, 3, 2, 1, 1, 1, 2, 2
46 0, 2, 5, 7, 7, 7, 7, 7, 7, 5, 2, 0, 0, 0, 0, 0
50 0, 0, 0, 0, 1, 3, 4, 6, 7, 7, 7, 7, 6, 4, 3, 1
54 static const int8_t
c47_mv[256][2] = {
55 { 0, 0 }, { -1, -43 }, { 6, -43 }, { -9, -42 }, { 13, -41 },
56 { -16, -40 }, { 19, -39 }, { -23, -36 }, { 26, -34 }, { -2, -33 },
57 { 4, -33 }, { -29, -32 }, { -9, -32 }, { 11, -31 }, { -16, -29 },
58 { 32, -29 }, { 18, -28 }, { -34, -26 }, { -22, -25 }, { -1, -25 },
59 { 3, -25 }, { -7, -24 }, { 8, -24 }, { 24, -23 }, { 36, -23 },
60 { -12, -22 }, { 13, -21 }, { -38, -20 }, { 0, -20 }, { -27, -19 },
61 { -4, -19 }, { 4, -19 }, { -17, -18 }, { -8, -17 }, { 8, -17 },
62 { 18, -17 }, { 28, -17 }, { 39, -17 }, { -12, -15 }, { 12, -15 },
63 { -21, -14 }, { -1, -14 }, { 1, -14 }, { -41, -13 }, { -5, -13 },
64 { 5, -13 }, { 21, -13 }, { -31, -12 }, { -15, -11 }, { -8, -11 },
65 { 8, -11 }, { 15, -11 }, { -2, -10 }, { 1, -10 }, { 31, -10 },
66 { -23, -9 }, { -11, -9 }, { -5, -9 }, { 4, -9 }, { 11, -9 },
67 { 42, -9 }, { 6, -8 }, { 24, -8 }, { -18, -7 }, { -7, -7 },
68 { -3, -7 }, { -1, -7 }, { 2, -7 }, { 18, -7 }, { -43, -6 },
69 { -13, -6 }, { -4, -6 }, { 4, -6 }, { 8, -6 }, { -33, -5 },
70 { -9, -5 }, { -2, -5 }, { 0, -5 }, { 2, -5 }, { 5, -5 },
71 { 13, -5 }, { -25, -4 }, { -6, -4 }, { -3, -4 }, { 3, -4 },
72 { 9, -4 }, { -19, -3 }, { -7, -3 }, { -4, -3 }, { -2, -3 },
73 { -1, -3 }, { 0, -3 }, { 1, -3 }, { 2, -3 }, { 4, -3 },
74 { 6, -3 }, { 33, -3 }, { -14, -2 }, { -10, -2 }, { -5, -2 },
75 { -3, -2 }, { -2, -2 }, { -1, -2 }, { 0, -2 }, { 1, -2 },
76 { 2, -2 }, { 3, -2 }, { 5, -2 }, { 7, -2 }, { 14, -2 },
77 { 19, -2 }, { 25, -2 }, { 43, -2 }, { -7, -1 }, { -3, -1 },
78 { -2, -1 }, { -1, -1 }, { 0, -1 }, { 1, -1 }, { 2, -1 },
79 { 3, -1 }, { 10, -1 }, { -5, 0 }, { -3, 0 }, { -2, 0 },
80 { -1, 0 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 5, 0 },
81 { 7, 0 }, { -10, 1 }, { -7, 1 }, { -3, 1 }, { -2, 1 },
82 { -1, 1 }, { 0, 1 }, { 1, 1 }, { 2, 1 }, { 3, 1 },
83 { -43, 2 }, { -25, 2 }, { -19, 2 }, { -14, 2 }, { -5, 2 },
84 { -3, 2 }, { -2, 2 }, { -1, 2 }, { 0, 2 }, { 1, 2 },
85 { 2, 2 }, { 3, 2 }, { 5, 2 }, { 7, 2 }, { 10, 2 },
86 { 14, 2 }, { -33, 3 }, { -6, 3 }, { -4, 3 }, { -2, 3 },
87 { -1, 3 }, { 0, 3 }, { 1, 3 }, { 2, 3 }, { 4, 3 },
88 { 19, 3 }, { -9, 4 }, { -3, 4 }, { 3, 4 }, { 7, 4 },
89 { 25, 4 }, { -13, 5 }, { -5, 5 }, { -2, 5 }, { 0, 5 },
90 { 2, 5 }, { 5, 5 }, { 9, 5 }, { 33, 5 }, { -8, 6 },
91 { -4, 6 }, { 4, 6 }, { 13, 6 }, { 43, 6 }, { -18, 7 },
92 { -2, 7 }, { 0, 7 }, { 2, 7 }, { 7, 7 }, { 18, 7 },
93 { -24, 8 }, { -6, 8 }, { -42, 9 }, { -11, 9 }, { -4, 9 },
94 { 5, 9 }, { 11, 9 }, { 23, 9 }, { -31, 10 }, { -1, 10 },
95 { 2, 10 }, { -15, 11 }, { -8, 11 }, { 8, 11 }, { 15, 11 },
96 { 31, 12 }, { -21, 13 }, { -5, 13 }, { 5, 13 }, { 41, 13 },
97 { -1, 14 }, { 1, 14 }, { 21, 14 }, { -12, 15 }, { 12, 15 },
98 { -39, 17 }, { -28, 17 }, { -18, 17 }, { -8, 17 }, { 8, 17 },
99 { 17, 18 }, { -4, 19 }, { 0, 19 }, { 4, 19 }, { 27, 19 },
100 { 38, 20 }, { -13, 21 }, { 12, 22 }, { -36, 23 }, { -24, 23 },
101 { -8, 24 }, { 7, 24 }, { -3, 25 }, { 1, 25 }, { 22, 25 },
102 { 34, 26 }, { -18, 28 }, { -32, 29 }, { 16, 29 }, { -11, 31 },
103 { 9, 32 }, { 29, 32 }, { -4, 33 }, { 2, 33 }, { -26, 34 },
104 { 23, 36 }, { -19, 39 }, { 16, 40 }, { -13, 41 }, { 9, 42 },
105 { -6, 43 }, { 1, 43 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
110 0, 0, 1, 0, 2, 0, 3, 0, 5, 0,
111 8, 0, 13, 0, 21, 0, -1, 0, -2, 0,
112 -3, 0, -5, 0, -8, 0, -13, 0, -17, 0,
113 -21, 0, 0, 1, 1, 1, 2, 1, 3, 1,
114 5, 1, 8, 1, 13, 1, 21, 1, -1, 1,
115 -2, 1, -3, 1, -5, 1, -8, 1, -13, 1,
116 -17, 1, -21, 1, 0, 2, 1, 2, 2, 2,
117 3, 2, 5, 2, 8, 2, 13, 2, 21, 2,
118 -1, 2, -2, 2, -3, 2, -5, 2, -8, 2,
119 -13, 2, -17, 2, -21, 2, 0, 3, 1, 3,
120 2, 3, 3, 3, 5, 3, 8, 3, 13, 3,
121 21, 3, -1, 3, -2, 3, -3, 3, -5, 3,
122 -8, 3, -13, 3, -17, 3, -21, 3, 0, 5,
123 1, 5, 2, 5, 3, 5, 5, 5, 8, 5,
124 13, 5, 21, 5, -1, 5, -2, 5, -3, 5,
125 -5, 5, -8, 5, -13, 5, -17, 5, -21, 5,
126 0, 8, 1, 8, 2, 8, 3, 8, 5, 8,
127 8, 8, 13, 8, 21, 8, -1, 8, -2, 8,
128 -3, 8, -5, 8, -8, 8, -13, 8, -17, 8,
129 -21, 8, 0, 13, 1, 13, 2, 13, 3, 13,
130 5, 13, 8, 13, 13, 13, 21, 13, -1, 13,
131 -2, 13, -3, 13, -5, 13, -8, 13, -13, 13,
132 -17, 13, -21, 13, 0, 21, 1, 21, 2, 21,
133 3, 21, 5, 21, 8, 21, 13, 21, 21, 21,
134 -1, 21, -2, 21, -3, 21, -5, 21, -8, 21,
135 -13, 21, -17, 21, -21, 21, 0, -1, 1, -1,
136 2, -1, 3, -1, 5, -1, 8, -1, 13, -1,
137 21, -1, -1, -1, -2, -1, -3, -1, -5, -1,
138 -8, -1, -13, -1, -17, -1, -21, -1, 0, -2,
139 1, -2, 2, -2, 3, -2, 5, -2, 8, -2,
140 13, -2, 21, -2, -1, -2, -2, -2, -3, -2,
141 -5, -2, -8, -2, -13, -2, -17, -2, -21, -2,
142 0, -3, 1, -3, 2, -3, 3, -3, 5, -3,
143 8, -3, 13, -3, 21, -3, -1, -3, -2, -3,
144 -3, -3, -5, -3, -8, -3, -13, -3, -17, -3,
145 -21, -3, 0, -5, 1, -5, 2, -5, 3, -5,
146 5, -5, 8, -5, 13, -5, 21, -5, -1, -5,
147 -2, -5, -3, -5, -5, -5, -8, -5, -13, -5,
148 -17, -5, -21, -5, 0, -8, 1, -8, 2, -8,
149 3, -8, 5, -8, 8, -8, 13, -8, 21, -8,
150 -1, -8, -2, -8, -3, -8, -5, -8, -8, -8,
151 -13, -8, -17, -8, -21, -8, 0, -13, 1, -13,
152 2, -13, 3, -13, 5, -13, 8, -13, 13, -13,
153 21, -13, -1, -13, -2, -13, -3, -13, -5, -13,
154 -8, -13, -13, -13, -17, -13, -21, -13, 0, -17,
155 1, -17, 2, -17, 3, -17, 5, -17, 8, -17,
156 13, -17, 21, -17, -1, -17, -2, -17, -3, -17,
157 -5, -17, -8, -17, -13, -17, -17, -17, -21, -17,
158 0, -21, 1, -21, 2, -21, 3, -21, 5, -21,
159 8, -21, 13, -21, 21, -21, -1, -21, -2, -21,
160 -3, -21, -5, -21, -8, -21, -13, -21, -17, -21,
162 0, 0, -8, -29, 8, -29, -18, -25, 17, -25,
163 0, -23, -6, -22, 6, -22, -13, -19, 12, -19,
164 0, -18, 25, -18, -25, -17, -5, -17, 5, -17,
165 -10, -15, 10, -15, 0, -14, -4, -13, 4, -13,
166 19, -13, -19, -12, -8, -11, -2, -11, 0, -11,
167 2, -11, 8, -11, -15, -10, -4, -10, 4, -10,
168 15, -10, -6, -9, -1, -9, 1, -9, 6, -9,
169 -29, -8, -11, -8, -8, -8, -3, -8, 3, -8,
170 8, -8, 11, -8, 29, -8, -5, -7, -2, -7,
171 0, -7, 2, -7, 5, -7, -22, -6, -9, -6,
172 -6, -6, -3, -6, -1, -6, 1, -6, 3, -6,
173 6, -6, 9, -6, 22, -6, -17, -5, -7, -5,
174 -4, -5, -2, -5, 0, -5, 2, -5, 4, -5,
175 7, -5, 17, -5, -13, -4, -10, -4, -5, -4,
176 -3, -4, -1, -4, 0, -4, 1, -4, 3, -4,
177 5, -4, 10, -4, 13, -4, -8, -3, -6, -3,
178 -4, -3, -3, -3, -2, -3, -1, -3, 0, -3,
179 1, -3, 2, -3, 4, -3, 6, -3, 8, -3,
180 -11, -2, -7, -2, -5, -2, -3, -2, -2, -2,
181 -1, -2, 0, -2, 1, -2, 2, -2, 3, -2,
182 5, -2, 7, -2, 11, -2, -9, -1, -6, -1,
183 -4, -1, -3, -1, -2, -1, -1, -1, 0, -1,
184 1, -1, 2, -1, 3, -1, 4, -1, 6, -1,
185 9, -1, -31, 0, -23, 0, -18, 0, -14, 0,
186 -11, 0, -7, 0, -5, 0, -4, 0, -3, 0,
187 -2, 0, -1, 0, 0, -31, 1, 0, 2, 0,
188 3, 0, 4, 0, 5, 0, 7, 0, 11, 0,
189 14, 0, 18, 0, 23, 0, 31, 0, -9, 1,
190 -6, 1, -4, 1, -3, 1, -2, 1, -1, 1,
191 0, 1, 1, 1, 2, 1, 3, 1, 4, 1,
192 6, 1, 9, 1, -11, 2, -7, 2, -5, 2,
193 -3, 2, -2, 2, -1, 2, 0, 2, 1, 2,
194 2, 2, 3, 2, 5, 2, 7, 2, 11, 2,
195 -8, 3, -6, 3, -4, 3, -2, 3, -1, 3,
196 0, 3, 1, 3, 2, 3, 3, 3, 4, 3,
197 6, 3, 8, 3, -13, 4, -10, 4, -5, 4,
198 -3, 4, -1, 4, 0, 4, 1, 4, 3, 4,
199 5, 4, 10, 4, 13, 4, -17, 5, -7, 5,
200 -4, 5, -2, 5, 0, 5, 2, 5, 4, 5,
201 7, 5, 17, 5, -22, 6, -9, 6, -6, 6,
202 -3, 6, -1, 6, 1, 6, 3, 6, 6, 6,
203 9, 6, 22, 6, -5, 7, -2, 7, 0, 7,
204 2, 7, 5, 7, -29, 8, -11, 8, -8, 8,
205 -3, 8, 3, 8, 8, 8, 11, 8, 29, 8,
206 -6, 9, -1, 9, 1, 9, 6, 9, -15, 10,
207 -4, 10, 4, 10, 15, 10, -8, 11, -2, 11,
208 0, 11, 2, 11, 8, 11, 19, 12, -19, 13,
209 -4, 13, 4, 13, 0, 14, -10, 15, 10, 15,
210 -5, 17, 5, 17, 25, 17, -25, 18, 0, 18,
211 -12, 19, 13, 19, -6, 22, 6, 22, 0, 23,
212 -17, 25, 18, 25, -8, 29, 8, 29, 0, 31,
214 0, 0, -6, -22, 6, -22, -13, -19, 12, -19,
215 0, -18, -5, -17, 5, -17, -10, -15, 10, -15,
216 0, -14, -4, -13, 4, -13, 19, -13, -19, -12,
217 -8, -11, -2, -11, 0, -11, 2, -11, 8, -11,
218 -15, -10, -4, -10, 4, -10, 15, -10, -6, -9,
219 -1, -9, 1, -9, 6, -9, -11, -8, -8, -8,
220 -3, -8, 0, -8, 3, -8, 8, -8, 11, -8,
221 -5, -7, -2, -7, 0, -7, 2, -7, 5, -7,
222 -22, -6, -9, -6, -6, -6, -3, -6, -1, -6,
223 1, -6, 3, -6, 6, -6, 9, -6, 22, -6,
224 -17, -5, -7, -5, -4, -5, -2, -5, -1, -5,
225 0, -5, 1, -5, 2, -5, 4, -5, 7, -5,
226 17, -5, -13, -4, -10, -4, -5, -4, -3, -4,
227 -2, -4, -1, -4, 0, -4, 1, -4, 2, -4,
228 3, -4, 5, -4, 10, -4, 13, -4, -8, -3,
229 -6, -3, -4, -3, -3, -3, -2, -3, -1, -3,
230 0, -3, 1, -3, 2, -3, 3, -3, 4, -3,
231 6, -3, 8, -3, -11, -2, -7, -2, -5, -2,
232 -4, -2, -3, -2, -2, -2, -1, -2, 0, -2,
233 1, -2, 2, -2, 3, -2, 4, -2, 5, -2,
234 7, -2, 11, -2, -9, -1, -6, -1, -5, -1,
235 -4, -1, -3, -1, -2, -1, -1, -1, 0, -1,
236 1, -1, 2, -1, 3, -1, 4, -1, 5, -1,
237 6, -1, 9, -1, -23, 0, -18, 0, -14, 0,
238 -11, 0, -7, 0, -5, 0, -4, 0, -3, 0,
239 -2, 0, -1, 0, 0, -23, 1, 0, 2, 0,
240 3, 0, 4, 0, 5, 0, 7, 0, 11, 0,
241 14, 0, 18, 0, 23, 0, -9, 1, -6, 1,
242 -5, 1, -4, 1, -3, 1, -2, 1, -1, 1,
243 0, 1, 1, 1, 2, 1, 3, 1, 4, 1,
244 5, 1, 6, 1, 9, 1, -11, 2, -7, 2,
245 -5, 2, -4, 2, -3, 2, -2, 2, -1, 2,
246 0, 2, 1, 2, 2, 2, 3, 2, 4, 2,
247 5, 2, 7, 2, 11, 2, -8, 3, -6, 3,
248 -4, 3, -3, 3, -2, 3, -1, 3, 0, 3,
249 1, 3, 2, 3, 3, 3, 4, 3, 6, 3,
250 8, 3, -13, 4, -10, 4, -5, 4, -3, 4,
251 -2, 4, -1, 4, 0, 4, 1, 4, 2, 4,
252 3, 4, 5, 4, 10, 4, 13, 4, -17, 5,
253 -7, 5, -4, 5, -2, 5, -1, 5, 0, 5,
254 1, 5, 2, 5, 4, 5, 7, 5, 17, 5,
255 -22, 6, -9, 6, -6, 6, -3, 6, -1, 6,
256 1, 6, 3, 6, 6, 6, 9, 6, 22, 6,
257 -5, 7, -2, 7, 0, 7, 2, 7, 5, 7,
258 -11, 8, -8, 8, -3, 8, 0, 8, 3, 8,
259 8, 8, 11, 8, -6, 9, -1, 9, 1, 9,
260 6, 9, -15, 10, -4, 10, 4, 10, 15, 10,
261 -8, 11, -2, 11, 0, 11, 2, 11, 8, 11,
262 19, 12, -19, 13, -4, 13, 4, 13, 0, 14,
263 -10, 15, 10, 15, -5, 17, 5, 17, 0, 18,
264 -12, 19, 13, 19, -6, 22, 6, 22, 0, 23,
332 const int edge_max = edge_size - 1;
336 else if (y == edge_max)
340 else if (x == edge_max)
369 static void interp_point(int8_t *points,
int x0,
int y0,
int x1,
int y1,
370 int pos,
int npoints)
373 points[0] = (x0 *
pos + x1 * (npoints -
pos) + (npoints >> 1)) / npoints;
374 points[1] = (y0 *
pos + y1 * (npoints -
pos) + (npoints >> 1)) / npoints;
389 static void make_glyphs(int8_t *pglyphs,
const int8_t *xvec,
const int8_t *yvec,
390 const int side_length)
392 const int glyph_size = side_length * side_length;
393 int8_t *pglyph = pglyphs;
409 for (ipoint = 0; ipoint <= npoints; ipoint++) {
417 for (irow = point[1]; irow >= 0; irow--)
418 pglyph[point[0] + irow * side_length] = 1;
422 for (irow = point[1]; irow < side_length; irow++)
423 pglyph[point[0] + irow * side_length] = 1;
427 for (icol = point[0]; icol >= 0; icol--)
428 pglyph[icol + point[1] * side_length] = 1;
432 for (icol = point[0]; icol < side_length; icol++)
433 pglyph[icol + point[1] * side_length] = 1;
450 ctx->buf_size =
ctx->aligned_width *
ctx->aligned_height *
sizeof(
ctx->frm0[0]);
476 &
ctx->stored_frame_size,
ctx->buf_size);
480 if (!
ctx->frm0 || !
ctx->frm1 || !
ctx->frm2 ||
481 (!
ctx->stored_frame && !
ctx->version)) {
491 uint8_t *
dst = &(
ctx->c4tbl[0][0][0]);
492 int i, j, k, l, m, n, o,
p;
494 for (
i = 0;
i < 8;
i++) {
495 for (k = 0; k < 8; k++) {
509 for (
i = 0;
i < 8;
i++) {
510 for (k = 0; k < 8; k++) {
523 for (
i = 0;
i < 8;
i++) {
524 for (k = 0; k < 8; k++) {
538 for (
i = 0;
i < 8;
i++) {
539 for (k = 0; k < 8; k++) {
555 uint8_t *
dst = &(
ctx->c4tbl[0][0][0]);
556 int i, j, k, l, m, n, o;
558 for (
i = 1;
i < 16;
i += 2) {
559 for (k = 0; k < 16; k++) {
565 if (j == m || l == m) {
579 for (
i = 0;
i < 16;
i += 2) {
580 for (k = 0; k < 16; k++) {
586 if (m == j || m == l) {
603 uint16_t param2, uint8_t clr)
605 uint8_t
c, *
dst = (uint8_t *)&(
ctx->c4tbl[1][0][0]);
606 uint32_t
loop = param2 * 8;
612 c = bytestream2_get_byteu(gb);
613 *
dst++ = (
c >> 4) + clr;
614 *
dst++ = (
c & 0xf) + clr;
622 if (rotate_code == 2)
650 if ((avctx->
width <= 640) && (avctx->
height <= 480))
651 ctx->have_dimensions = 1;
655 }
else if (avctx->
width > 800 || avctx->
height > 600 ||
675 if (
ctx->subversion < 2)
676 ctx->pal[0] = 0xFF
U << 24;
678 ctx->c4param = 0xffff;
693 int w,
int h, uint8_t param, uint16_t param2,
int codec)
697 int i, j, k, l,
bit,
ret, x, y;
699 if (
ctx->c4param != param) {
704 ctx->c4param = param;
715 for (j = 0; j <
w; j += 4) {
718 for (
i = 0;
i <
h;
i += 4) {
724 mask = bytestream2_get_byteu(gb);
736 idx = bytestream2_get_byteu(gb);
737 if ((
bit == 0) && (idx == 0x80) && (codec != 5))
739 if ((y >=
my) || ((y + 4) < 0) || ((x + 4) < 0) || (x >=
mx))
741 gs = &(
ctx->c4tbl[
bit][idx][0]);
742 if ((y >= 0) && (x >= 0) && ((y + 4) <
my) && ((x + 4) <
mx)) {
743 for (k = 0; k < 4; k++, gs += 4)
744 memcpy(
dst + x + (y + k) *
p, gs, 4);
746 for (k = 0; k < 4; k++) {
747 for (l = 0; l < 4; l++, gs++) {
748 const int yo = y + k, xo = x + l;
749 if ((yo >= 0) && (yo <
my) && (xo >= 0) && (xo <
mx))
750 *(
dst + yo *
p + xo) = *gs;
764 opcode = bytestream2_get_byte(gb);
770 color = bytestream2_get_byte(gb);
786 int width,
int height, uint8_t param, uint16_t param2)
789 uint8_t
c, lut[256], *
dst = (uint8_t *)
ctx->fbuf;
790 int sk,
i, j, ls, pc, y;
792 if (
ctx->subversion < 2) {
794 for (
i = 0;
i < 256;
i++)
795 lut[
i] = (
i + param + 0xd0) & 0xff;
796 }
else if (param2 == 256) {
800 }
else if (param2 < 256) {
801 for (
i = 0;
i < 256;
i++)
802 lut[
i] = (
i + param2) & 0xff;
804 memcpy(lut,
ctx->c23lut, 256);
815 ls = bytestream2_get_le16u(gb);
826 ls = bytestream2_get_le16u(gb);
830 j = bytestream2_get_byteu(gb);
834 if ((pc >= 0) && (pc <
mx)) {
835 c = *(
dst + (y *
p) + pc);
836 *(
dst + (y *
p) + pc) = lut[
c];
855 uint8_t *
dst = (uint8_t *)
ctx->fbuf,
c;
856 int j, y, pc, sk, ls;
863 ls = bytestream2_get_le16u(gb);
873 j = bytestream2_get_le16u(gb);
880 c = bytestream2_get_byteu(gb);
881 if ((pc >= 0) && (pc <
mx)) {
882 *(
dst + (y *
p) + pc) =
c;
901 int j, x, y,
flag, dlen;
909 dlen = bytestream2_get_le16u(gb);
920 dlen = bytestream2_get_le16u(gb);
923 code = bytestream2_get_byteu(gb);
928 c = bytestream2_get_byteu(gb);
941 for (j = 0; (j <
code) && (
c || opaque); j++) {
942 *(
dst + (y *
p) + x + j) =
c;
948 for (j = 0; j <
code; j++) {
949 c = bytestream2_get_byteu(gb);
950 if ((x >= 0) && (x <
mx) && (
c || opaque))
951 *(
dst + (y *
p) + x) =
c;
967 uint8_t *
dst = (uint8_t *)
ctx->fbuf,
c;
976 dlen = bytestream2_get_le16u(gb);
987 dlen = bytestream2_get_le16u(gb);
990 code = bytestream2_get_byteu(gb);
995 c = bytestream2_get_byteu(gb);
997 for (j = 0; (j <
code); j++) {
998 if ((opaque || (
c & 0
xf)) && (x >= 0) && (x <
mx))
999 *(
dst + (y *
p) + x) = p1 + (
c & 0
xf);
1002 if ((opaque || (
c >> 4)) && (x >= 0) && (x <
mx))
1003 *(
dst + (y *
p) + x) = p1 + (
c >> 4);
1010 for (j = 0; j <
code; j++) {
1011 c = bytestream2_get_byteu(gb);
1012 if ((opaque || (
c & 0
xf)) && (x >= 0) && (x <
mx))
1013 *(
dst + (y *
p) + x) = p1 + (
c & 0xf);
1016 if ((opaque || (
c >> 4)) && (x >= 0) && (x <
mx))
1017 *(
dst + (y *
p) + x) = p1 + (
c >> 4);
1032 uint8_t *
dst = (uint8_t *)
ctx->fbuf, col;
1033 int16_t xpos =
left, ypos = top;
1036 xpos += bytestream2_get_le16u(gb);
1037 ypos += bytestream2_get_byteu(gb);
1038 col = bytestream2_get_byteu(gb);
1039 if (xpos >= 0 && ypos >= 0 &&
1041 *(
dst + xpos + ypos *
ctx->pitch) = col;
1048 uint16_t srcxoff, uint16_t srcyoff, uint16_t srcwidth,
1049 uint16_t srcheight,
const uint16_t srcpitch,
const uint16_t dstpitch,
1052 if ((srcwidth < 1) || (srcheight < 1) || (
size < 1))
1056 if (-top >= srcheight)
1060 size += (srcpitch * top);
1064 if ((top + srcheight) > dstheight) {
1065 int clip = (top + srcheight) - dstheight;
1066 if (
clip >= srcheight)
1072 if (-
left >= srcwidth)
1080 if (
left + srcwidth > dstpitch) {
1081 int clip = (
left + srcwidth) - dstpitch;
1082 if (
clip >= srcwidth)
1087 src += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1088 dst += ((uintptr_t)top * dstpitch) +
left;
1089 while ((srcheight--) && (
size >= srcwidth)) {
1090 memcpy(
dst,
src, srcwidth);
1095 if ((
size > 0) && (
size < srcwidth) && (srcheight > 0))
1100 uint16_t srcxoff, uint16_t srcyoff, uint16_t srcwidth,
1101 uint16_t srcheight,
const uint16_t srcpitch,
const uint16_t dstpitch,
1102 const uint16_t dstheight,
int32_t size,
const uint8_t skipcolor)
1104 if ((srcwidth < 1) || (srcheight < 1) || (
size < 1))
1108 if (-top >= srcheight)
1112 size += (srcpitch * top);
1116 if ((top + srcheight) > dstheight) {
1117 int clip = (top + srcheight) - dstheight;
1118 if (
clip >= srcheight)
1124 if (-
left >= srcwidth)
1132 if (
left + srcwidth > dstpitch) {
1133 int clip = (
left + srcwidth) - dstpitch;
1134 if (
clip >= srcwidth)
1139 src += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1140 dst += ((uintptr_t)top * dstpitch) +
left;
1141 for (
int i = 0; (
size > 0) && (
i < srcheight);
i++) {
1142 for (
int j = 0; (
size > 0) && (j < srcwidth); j++,
size--) {
1143 if (
src[j] != skipcolor)
1152 int16_t
left, int16_t top, uint16_t srcxoff, uint16_t srcyoff,
1153 uint16_t srcwidth, uint16_t srcheight,
const uint16_t srcpitch,
1154 const uint16_t dstpitch,
const uint16_t dstheight,
int32_t size,
1155 const uint8_t *itbl)
1157 if ((srcwidth < 1) || (srcheight < 1) || (
size < 1))
1161 if (-top >= srcheight)
1165 size += (srcpitch * top);
1169 if ((top + srcheight) > dstheight) {
1170 int clip = (top + srcheight) - dstheight;
1171 if (
clip >= srcheight)
1177 if (-
left >= srcwidth)
1185 if (
left + srcwidth > dstpitch) {
1186 int clip = (
left + srcwidth) - dstpitch;
1187 if (
clip >= srcwidth)
1192 src1 += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1193 src2 += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1194 dst += ((uintptr_t)top * dstpitch) +
left;
1195 for (
int i = 0; (
size > 0) && (
i < srcheight);
i++) {
1196 for (
int j = 0; (
size > 0) && (j < srcwidth); j++,
size--) {
1206 const int w,
const int h)
1208 blt_solid((uint8_t*)
ctx->fbuf, gb->
buffer,
left, top, 0, 0,
w,
h,
w,
ctx->pitch,
1220 for (j = 0; j < 4; j++) {
1221 for (
i = 0;
i < 4;
i++) {
1236 int i, j, k, l, t,
run,
len,
code,
skip,
mx,
my;
1237 uint8_t *
dst, *prev;
1247 int compr = bytestream2_get_byteu(gb);
1248 int mvoff = bytestream2_get_byteu(gb);
1249 int seq = bytestream2_get_le16u(gb);
1250 uint32_t decoded_size = bytestream2_get_le32u(gb);
1254 flags = bytestream2_get_byteu(gb);
1262 if (((seq & 1) || !(
flags & 1)) && (compr && compr != 2)) {
1266 dst = ((uint8_t*)
ctx->frm0);
1267 prev = ((uint8_t*)
ctx->frm2);
1279 memset(
ctx->frm2, 0,
ctx->frm2_size);
1286 for (j = 0; j <
height; j += 4) {
1291 code = bytestream2_get_byte(gb);
1302 code = bytestream2_get_byte(gb);
1305 for (k = 0; k < 4; k++) {
1306 for (l = 0; l < 4; l++) {
1310 code = bytestream2_get_byte(gb);
1316 code = bytestream2_get_byte(gb);
1322 code = bytestream2_get_byte(gb);
1345 memset(
ctx->frm2, 0,
ctx->frm2_size);
1349 for (j = 0; j <
height; j += 4) {
1359 code = bytestream2_get_byteu(gb);
1363 for (k = 0; k < 4; k++)
1365 }
else if ((
flags & 4) && (
code == 0xFE)) {
1368 for (k = 0; k < 4; k += 2) {
1369 uint8_t
c1 = bytestream2_get_byteu(gb);
1370 uint8_t
c2 = bytestream2_get_byteu(gb);
1371 for (l = 0; l < 2; l++) {
1378 }
else if ((
flags & 4) && (
code == 0xFD)) {
1381 t = bytestream2_get_byteu(gb);
1382 for (k = 0; k < 4; k++)
1390 if ((compr == 4) && (
code == 0)) {
1393 skip_run = bytestream2_get_byteu(gb);
1403 "Subcodec 37 compression %d", compr);
1407 if ((
flags & 2) == 0) {
1418 uint8_t *prev1, uint8_t *prev2,
int stride,
int size)
1427 code = bytestream2_get_byteu(gb);
1434 dst[0] = bytestream2_get_byteu(gb);
1435 dst[1] = bytestream2_get_byteu(gb);
1436 dst[0 +
stride] = bytestream2_get_byteu(gb);
1437 dst[1 +
stride] = bytestream2_get_byteu(gb);
1459 t = bytestream2_get_byteu(gb);
1460 for (k = 0; k <
size; k++)
1467 code = bytestream2_get_byteu(gb);
1471 for (k = 0; k <
size; k++)
1472 for (t = 0; t <
size; t++)
1473 dst[t + k *
stride] = colors[!*pglyph++];
1476 for (k = 0; k <
size; k++)
1480 for (k = 0; k <
size; k++)
1486 int index = prev2 - (
const uint8_t *)
ctx->frm2;
1496 for (k = 0; k <
size; k++)
1508 for (
i = 0;
i < 256;
i++) {
1510 for (j = 256 -
i; j; j--) {
1511 *p1 = *p2 = bytestream2_get_byte(gb);
1520 const int height,
const ptrdiff_t
stride,
const uint8_t *itbl)
1528 p1 = bytestream2_get_byte(gb);
1532 for (j = 2; j <
width; j += 2) {
1533 p1 = bytestream2_get_byte(gb);
1534 px = (
px << 8) | p1;
1544 for (j = 0; j <
width; j++) {
1555 uint32_t decoded_size;
1557 uint8_t *
dst = (uint8_t *)
ctx->frm0;
1558 uint8_t *prev1 = (uint8_t *)
ctx->frm1;
1559 uint8_t *prev2 = (uint8_t *)
ctx->frm2;
1569 int seq = bytestream2_get_le16u(gb);
1570 int compr = bytestream2_get_byteu(gb);
1571 int new_rot = bytestream2_get_byteu(gb);
1572 int skip = bytestream2_get_byteu(gb);
1576 auxcol[0] = bytestream2_get_byteu(gb);
1577 auxcol[1] = bytestream2_get_byteu(gb);
1578 decoded_size = bytestream2_get_le32u(gb);
1581 if (decoded_size >
ctx->aligned_height *
width) {
1593 memset(prev1, auxcol[0],
ctx->frm0_size);
1594 memset(prev2, auxcol[1],
ctx->frm0_size);
1609 if (seq ==
ctx->prev_seq + 1) {
1610 for (j = 0; j <
height; j += 8) {
1621 memcpy(
ctx->frm0,
ctx->frm2,
ctx->frm0_size);
1624 memcpy(
ctx->frm0,
ctx->frm1,
ctx->frm0_size);
1632 "Subcodec 47 compression %d", compr);
1639 if ((seq ==
ctx->prev_seq + 1) && new_rot)
1642 ctx->prev_seq = seq;
1652 for (
int i = 0;
i < 4;
i++) {
1653 for (
int j = 0; j < 8; j += 2) {
1656 *((uint16_t *)(
dst +
w * 0 + j)) =
p;
1657 *((uint16_t *)(
dst +
w * 1 + j)) =
p;
1664 if (mvofs < -x + -y*
w)
1667 if (mvofs >
w-x-blocksize +
w*(
h-y-blocksize))
1674 const uint16_t
w,
const int aligned_height,
const uint8_t *itbl)
1676 uint8_t opc, sb[16];
1684 opc = bytestream2_get_byteu(gb);
1690 if (y > 0 && x > 0) {
1691 sb[15] = bytestream2_get_byteu(gb);
1692 sb[ 7] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[15]];
1693 sb[ 3] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[ 7]];
1694 sb[11] = itbl[(sb[15] << 8) | sb[ 7]];
1695 sb[ 1] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 3]];
1696 sb[ 0] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 1]];
1697 sb[ 2] = itbl[(sb[ 3] << 8) | sb[ 1]];
1698 sb[ 5] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 7]];
1699 sb[ 4] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 5]];
1700 sb[ 6] = itbl[(sb[ 7] << 8) | sb[ 5]];
1701 sb[ 9] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[11]];
1702 sb[ 8] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[ 9]];
1703 sb[10] = itbl[(sb[11] << 8) | sb[ 9]];
1704 sb[13] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[15]];
1705 sb[12] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[13]];
1706 sb[14] = itbl[(sb[15] << 8) | sb[13]];
1708 opc = bytestream2_get_byteu(gb);
1709 for (
i = 0;
i < 16;
i++)
1717 mvofs = bytestream2_get_le16(gb);
1720 for (
i = 0;
i < 8;
i++) {
1722 for (k = 0; k < 8; k++)
1723 *(
dst + ofs + k) = *(db + ofs + k + mvofs);
1729 sb[ 5] = bytestream2_get_byteu(gb);
1730 sb[ 7] = bytestream2_get_byteu(gb);
1731 sb[13] = bytestream2_get_byteu(gb);
1732 sb[15] = bytestream2_get_byteu(gb);
1734 if (y > 0 && x >0) {
1735 sb[ 1] = itbl[(*(
dst - 1*
w + 3) << 8) | sb[ 5]];
1736 sb[ 3] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[ 7]];
1737 sb[ 9] = itbl[(sb[13] << 8) | sb[ 5]];
1738 sb[11] = itbl[(sb[15] << 8) | sb[ 7]];
1739 sb[ 0] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 1]];
1740 sb[ 2] = itbl[(sb[ 3] << 8) | sb[ 1]];
1741 sb[ 4] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 5]];
1742 sb[ 6] = itbl[(sb[ 7] << 8) | sb[ 5]];
1743 sb[ 8] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[ 9]];
1744 sb[10] = itbl[(sb[11] << 8) | sb[ 9]];
1745 sb[12] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[13]];
1746 sb[14] = itbl[(sb[15] << 8) | sb[13]];
1748 sb[ 0] = sb[ 1] = sb[ 4] = sb[ 5];
1749 sb[ 2] = sb[ 3] = sb[ 6] = sb[ 7];
1750 sb[ 8] = sb[ 9] = sb[12] = sb[13];
1751 sb[10] = sb[11] = sb[14] = sb[15];
1758 for (
i = 0;
i < 8;
i += 4) {
1759 for (k = 0; k < 8; k += 4) {
1760 opc = bytestream2_get_byteu(gb);
1764 for (j = 0; j < 4; j++) {
1765 ofs = (
w * (j +
i)) + k;
1766 for (l = 0; l < 4; l++)
1767 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1775 for (
i = 0;
i < 8;
i += 4) {
1776 for (k = 0; k < 8; k += 4) {
1777 mvofs = bytestream2_get_le16(gb);
1780 for (j = 0; j < 4; j++) {
1781 ofs = (
w * (j +
i)) + k;
1782 for (l = 0; l < 4; l++)
1783 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1797 for (
i = 0;
i < 8;
i += 2) {
1798 for (j = 0; j < 8; j += 2) {
1800 opc = bytestream2_get_byteu(gb);
1804 for (l = 0; l < 2; l++) {
1805 *(
dst + ofs + l + 0) = *(db + ofs + l + 0 + mvofs);
1806 *(
dst + ofs + l +
w) = *(db + ofs + l +
w + mvofs);
1814 for (
i = 0;
i < 8;
i += 2) {
1815 for (j = 0; j < 8; j += 2) {
1817 mvofs = bytestream2_get_le16(gb);
1820 for (l = 0; l < 2; l++) {
1821 *(
dst + ofs + l + 0) = *(db + ofs + l + 0 + mvofs);
1822 *(
dst + ofs + l +
w) = *(db + ofs + l +
w + mvofs);
1830 for (
i = 0;
i < 8;
i++) {
1832 for (l = 0; l < 8; l++)
1833 *(
dst + ofs + l) = bytestream2_get_byteu(gb);
1840 for (
i = 0;
i < 8;
i++) {
1842 for (l = 0; l < 8; l++)
1843 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1853 uint8_t *
dst, *prev;
1861 if (ah >
ctx->aligned_height)
1867 int compr = bytestream2_get_byteu(gb);
1868 int mvidx = bytestream2_get_byteu(gb);
1869 int seq = bytestream2_get_le16u(gb);
1870 uint32_t decoded_size = bytestream2_get_le32u(gb);
1879 flags = bytestream2_get_byteu(gb);
1888 dst = (uint8_t*)
ctx->frm0;
1889 prev = (uint8_t*)
ctx->frm2;
1892 memset(
ctx->frm2, 0,
ctx->frm2_size);
1910 if ((seq == 0) || (seq ==
ctx->prev_seq + 1)) {
1911 if ((seq & 1) || ((
flags & 1) == 0) || (
flags & 0x10)) {
1913 dst = (uint8_t*)
ctx->frm0;
1914 prev = (uint8_t*)
ctx->frm2;
1916 for (j = 0; j <
height; j += 8) {
1936 "Subcodec 48 compression %d", compr);
1940 ctx->prev_seq = seq;
1941 if ((
flags & 2) == 0) {
1969 t1 = bytestream2_get_le16u(gb);
1970 t2 = bytestream2_get_byteu(gb);
1980 uint8_t
len = bytestream2_get_byteu(gb);
1981 uint8_t
val = bytestream2_get_byteu(gb);
1982 if ((
i +
len) > 0x8000)
1993 left += (int16_t)bytestream2_get_le16u(gb);
1994 top += bytestream2_get_byteu(gb);
1995 int len = bytestream2_get_byteu(gb);
1997 if ((
left > 0) && (top > 0) && (
left < (
ctx->width - 1))) {
1998 if (top >= (
ctx->height - 1))
2001 uint8_t *
dst = (uint8_t *)
ctx->fbuf +
left + top *
ctx->pitch;
2002 unsigned int c1 = *(
dst - 1) * 3;
2003 unsigned int c2 = *(
dst + 1) * 3;
2004 unsigned int r =
ctx->c45tbl1[
c1 + 0] +
ctx->c45tbl1[
c2 + 0];
2005 unsigned int g =
ctx->c45tbl1[
c1 + 1] +
ctx->c45tbl1[
c2 + 1];
2006 unsigned int b =
ctx->c45tbl1[
c1 + 2] +
ctx->c45tbl1[
c2 + 2];
2012 *
dst =
ctx->c45tbl2[((
r << 5) & 0x7c00) | (
g & 0x3e0) | (
b >> 5)];
2024 uint16_t
w,
h, parm2;
2025 uint8_t codec, param;
2029 codec = bytestream2_get_byteu(gb);
2030 param = bytestream2_get_byteu(gb);
2031 left = bytestream2_get_le16u(gb);
2032 top = bytestream2_get_le16u(gb);
2033 w = bytestream2_get_le16u(gb);
2034 h = bytestream2_get_le16u(gb);
2036 parm2 = bytestream2_get_le16u(gb);
2038 if (
w < 1 || h < 1 || w > 640 ||
h > 480 ||
left > 640 || top > 480 ||
left +
w <= 0 || top +
h <= 0) {
2046 "ignoring invalid fobj dimensions: c%d %d %d @ %d %d\n",
2052 fsc = (codec == 37 || codec == 47 || codec == 48);
2058 if ((
w == 640) && (
h == 272) && (top == 60) && (codec == 47))
2061 if (!
ctx->have_dimensions && (codec != 45)) {
2063 if (
ctx->subversion < 2) {
2067 if (
w > xres ||
h > yres)
2069 ctx->have_dimensions = 1;
2074 if (((xres == 424) && (yres == 260)) ||
2075 ((xres == 320) && (yres == 200)) ||
2076 ((xres == 640) && (yres == 272)) ||
2077 ((xres == 640) && (yres == 350)) ||
2078 ((xres == 640) && (yres == 480))) {
2079 ctx->have_dimensions = 1;
2086 if ((xres < (fsc ? 8 : 1)) || (yres < (fsc ? 8 : 1)) || (xres > 640) || (yres > 480))
2089 if (
ctx->width < xres ||
ctx->height < yres) {
2103 if (((
w >
ctx->width) || (
h >
ctx->height) || (
w *
h >
ctx->buf_size)) && fsc)
2108 if (fsc &&
ctx->subversion < 2) {
2109 ctx->subversion = 2;
2114 if (
ctx->first_fob) {
2117 memset(
ctx->fbuf, 0,
ctx->frm0_size);
2161 int xoff, yoff,
ret;
2167 xoff = bytestream2_get_le16u(&
ctx->gb);
2168 yoff = bytestream2_get_le16u(&
ctx->gb);
2169 }
else if (
size == 12) {
2172 xoff = bytestream2_get_be32u(&
ctx->gb);
2173 yoff = bytestream2_get_be32u(&
ctx->gb);
2177 if (
ctx->stor_size > 0) {
2182 memcpy(bitstream,
ctx->stored_frame,
ctx->stor_size);
2201 int16_t *dp =
ctx->delta_pal;
2202 uint32_t *pal =
ctx->pal;
2210 cmd = bytestream2_get_be16(&
ctx->gb);
2215 for (j = 0; j < 3; j++) {
2216 ctx->shift_pal[
i + j] += dp[
i + j];
2219 *pal++ = 0xFF
U << 24 |
c[0] << 16 |
c[1] << 8 |
c[2];
2221 }
else if (cmd == 0 || cmd == 2) {
2224 "Incorrect palette change block size %"PRIu32
".\n",
size);
2228 dp[
i] = bytestream2_get_le16u(&
ctx->gb);
2233 ctx->pal[
i] = 0xFFU << 24 | bytestream2_get_be24u(&
ctx->gb);
2234 if (
ctx->subversion < 2)
2235 ctx->pal[0] = 0xFF
U << 24;
2238 ctx->shift_pal[
i + 0] = (((
ctx->pal[j]) >> 16) & 0xFF
U) << 7;
2239 ctx->shift_pal[
i + 1] = (((
ctx->pal[j]) >> 8) & 0xFF
U) << 7;
2240 ctx->shift_pal[
i + 2] = (((
ctx->pal[j]) >> 0) & 0xFF
U) << 7;
2248 uint16_t *frm =
ctx->frm0;
2255 for (y = 0; y <
ctx->height; y++) {
2256 for (x = 0; x <
ctx->width; x++)
2257 frm[x] = bytestream2_get_le16u(&
ctx->gb);
2266 return (((
c2 & 0x07e0) + (
c1 & 0x07e0)) & 0x00fc0) |
2267 (((
c2 & 0xf800) + (
c1 & 0xf800)) & 0x1f000) |
2268 (((
c2 & 0x001f) + (
c1 & 0x001f))) >> 1;
2277 uint16_t hh, hw, hw1,
c1,
c2, *dst1, *dst2;
2279 hh = (
ctx->height + 1) >> 1;
2280 hw1 = (
ctx->width - 1) >> 1;
2283 dst1 = (uint16_t *)
ctx->frm0 +
ctx->pitch;
2286 c1 = bytestream2_get_le16u(&
ctx->gb);
2291 c2 = bytestream2_get_le16u(&
ctx->gb);
2296 dst1 +=
ctx->pitch * 2;
2304 dst1 =
ctx->frm0 + (
ctx->pitch * 2);
2305 hh = (
ctx->height - 1) >> 1;
2310 c1 = *(dst2 -
ctx->pitch);
2311 c2 = *(dst2 +
ctx->pitch);
2314 dst1 +=
ctx->pitch * 2;
2319 static void copy_block(uint16_t *pdest, uint16_t *psrc,
int block_size, ptrdiff_t pitch)
2321 uint8_t *
dst = (uint8_t *)pdest;
2322 uint8_t *
src = (uint8_t *)psrc;
2323 ptrdiff_t
stride = pitch * 2;
2325 switch (block_size) {
2342 pitch -= block_size;
2343 for (y = 0; y < block_size; y++, pdest += pitch)
2344 for (x = 0; x < block_size; x++)
2349 uint16_t fg_color, uint16_t bg_color,
int block_size,
2353 uint16_t colors[2] = { fg_color, bg_color };
2361 pglyph = block_size == 8 ?
ctx->p8x8glyphs[
index] :
ctx->p4x4glyphs[
index];
2362 pitch -= block_size;
2364 for (y = 0; y < block_size; y++,
dst += pitch)
2365 for (x = 0; x < block_size; x++)
2366 *
dst++ = colors[*pglyph++];
2372 uint16_t *
dst =
ctx->frm0 + cx + cy *
ctx->pitch;
2374 if (block_size == 2) {
2380 indices = bytestream2_get_le32u(&
ctx->gb);
2381 dst[0] =
ctx->codebook[indices & 0xFF];
2383 dst[1] =
ctx->codebook[indices & 0xFF];
2385 dst[pitch] =
ctx->codebook[indices & 0xFF];
2387 dst[pitch + 1] =
ctx->codebook[indices & 0xFF];
2389 uint16_t fgcolor, bgcolor;
2395 glyph = bytestream2_get_byteu(&
ctx->gb);
2396 bgcolor =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2397 fgcolor =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2406 uint16_t *
dst =
ctx->frm0 + cx + cy *
ctx->pitch;
2408 if (block_size == 2) {
2412 dst[0] = bytestream2_get_le16u(&
ctx->gb);
2413 dst[1] = bytestream2_get_le16u(&
ctx->gb);
2414 dst[pitch] = bytestream2_get_le16u(&
ctx->gb);
2415 dst[pitch + 1] = bytestream2_get_le16u(&
ctx->gb);
2417 uint16_t fgcolor, bgcolor;
2423 glyph = bytestream2_get_byteu(&
ctx->gb);
2424 bgcolor = bytestream2_get_le16u(&
ctx->gb);
2425 fgcolor = bytestream2_get_le16u(&
ctx->gb);
2435 int start_pos = cx +
mx + (cy +
my) *
ctx->pitch;
2436 int end_pos = start_pos + (block_size - 1) * (
ctx->pitch + 1);
2438 int good = start_pos >= 0 && end_pos < (
ctx->buf_size >> 1);
2442 "Ignoring invalid motion vector (%i, %i)->(%u, %u), block size = %u\n",
2443 cx +
mx, cy +
my, cx, cy, block_size);
2456 opcode = bytestream2_get_byteu(&
ctx->gb);
2472 if (
ctx->width > 761) {
2479 ctx->frm2 + cx +
mx +
ctx->pitch * (cy +
my),
2480 blk_size,
ctx->pitch);
2486 index = bytestream2_get_le16u(&
ctx->gb);
2493 ctx->frm2 + cx +
mx +
ctx->pitch * (cy +
my),
2494 blk_size,
ctx->pitch);
2499 ctx->frm1 + cx +
ctx->pitch * cy,
2500 blk_size,
ctx->pitch);
2514 ctx->small_codebook[opcode - 0xf9], blk_size,
ctx->pitch);
2520 ctx->codebook[bytestream2_get_byteu(&
ctx->gb)], blk_size,
ctx->pitch);
2526 bytestream2_get_le16u(&
ctx->gb), blk_size,
ctx->pitch);
2529 if (blk_size == 2) {
2539 if (
bl16_block(
ctx, cx + blk_size, cy + blk_size, blk_size))
2551 for (cy = 0; cy <
ctx->aligned_height; cy += 8)
2552 for (cx = 0; cx <
ctx->aligned_width; cx += 8)
2565 uint8_t *
dst = (uint8_t*)
ctx->frm0;
2571 npixels =
ctx->npixels;
2584 int npixels =
ctx->npixels;
2585 uint16_t *frm =
ctx->frm0;
2592 *frm++ =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2604 uint16_t hh, hw, hw1,
c1,
c2, *dst1, *dst2;
2606 hh = (
ctx->height + 1) >> 1;
2607 hw1 = (
ctx->width - 1) >> 1;
2610 dst1 = (uint16_t *)
ctx->frm0 +
ctx->pitch;
2613 c1 =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2618 c2 =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2623 dst1 +=
ctx->pitch * 2;
2631 dst1 =
ctx->frm0 + (
ctx->pitch * 2);
2632 hh = (
ctx->height - 1) >> 1;
2637 c1 = *(dst2 -
ctx->pitch);
2638 c2 = *(dst2 +
ctx->pitch);
2641 dst1 +=
ctx->pitch * 2;
2648 uint16_t *pdest =
ctx->frm0;
2650 long npixels =
ctx->npixels;
2653 if (!
ctx->rle_buf) {
2657 rsrc =
ctx->rle_buf;
2663 *pdest++ =
ctx->codebook[*rsrc++];
2679 const uint8_t *
src = sanm ? (uint8_t *)
ctx->frm0 : (uint8_t *)
ctx->fbuf;
2681 ptrdiff_t dstpitch, srcpitch =
ctx->pitch * (sanm ?
sizeof(
ctx->frm0[0]) : 1);
2686 dst =
ctx->frame->data[0];
2687 dstpitch =
ctx->frame->linesize[0];
2690 memcpy(
dst,
src, srcpitch);
2701 int i,
ret,
w,
h, seq_num, codec, bg_color, rle_output_size, rcode;
2710 w = bytestream2_get_le32u(&
ctx->gb);
2711 h = bytestream2_get_le32u(&
ctx->gb);
2713 if (
w !=
ctx->width ||
h !=
ctx->height) {
2718 seq_num = bytestream2_get_le16u(&
ctx->gb);
2719 codec = bytestream2_get_byteu(&
ctx->gb);
2720 rcode = bytestream2_get_byteu(&
ctx->gb);
2724 for (
i = 0;
i < 4;
i++)
2725 ctx->small_codebook[
i] = bytestream2_get_le16u(&
ctx->gb);
2726 bg_color = bytestream2_get_le16u(&
ctx->gb);
2730 rle_output_size = bytestream2_get_le32u(&
ctx->gb);
2731 if (rle_output_size >
w *
ctx->aligned_height * 2) {
2734 rle_output_size =
w *
ctx->aligned_height * 2;
2737 for (
i = 0;
i < 256;
i++)
2738 ctx->codebook[
i] = bytestream2_get_le16u(&
ctx->gb);
2757 case 3: memcpy(
ctx->frm0,
ctx->frm2,
ctx->frm2_size);
break;
2758 case 4: memcpy(
ctx->frm0,
ctx->frm1,
ctx->frm1_size);
break;
2770 "Subcodec %d: error decoding frame.\n", codec);
2787 int i,
ret, to_store = 0, have_img = 0;
2794 sig = bytestream2_get_be32u(&
ctx->gb);
2795 size = bytestream2_get_be32u(&
ctx->gb);
2803 case MKBETAG(
'N',
'P',
'A',
'L'):
2806 "Incorrect palette block size %"PRIu32
".\n",
size);
2810 ctx->pal[
i] = 0xFFU << 24 | bytestream2_get_be24u(&
ctx->gb);
2811 if (
ctx->subversion < 2)
2812 ctx->pal[0] = 0xFF
U << 24;
2814 case MKBETAG(
'F',
'O',
'B',
'J'):
2831 if (
ctx->subversion < 2) {
2832 if (size <= ctx->stored_frame_size) {
2841 memcpy(
ctx->stored_frame,
ctx->fbuf,
ctx->buf_size);
2842 ctx->stor_size =
ctx->buf_size;
2847 case MKBETAG(
'X',
'P',
'A',
'L'):
2851 case MKBETAG(
'S',
'T',
'O',
'R'):
2854 case MKBETAG(
'F',
'T',
'C',
'H'):
2855 if (
ctx->subversion < 2) {
2858 have_img = (
ret == 0) ? 1 : 0;
2860 if (
ctx->stor_size > 0) {
2861 memcpy(
ctx->fbuf,
ctx->stored_frame,
ctx->buf_size);
2869 "Unknown/unsupported chunk %"PRIx32
".\n", sig);
2880 if (bytestream2_peek_byte(&
ctx->gb) == 0)
2888 memcpy(
ctx->frame->data[1],
ctx->pal, 1024);
2903 if (!
ctx->version) {