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,
161 0, 0, -8, -29, 8, -29, -18, -25, 17, -25,
162 0, -23, -6, -22, 6, -22, -13, -19, 12, -19,
163 0, -18, 25, -18, -25, -17, -5, -17, 5, -17,
164 -10, -15, 10, -15, 0, -14, -4, -13, 4, -13,
165 19, -13, -19, -12, -8, -11, -2, -11, 0, -11,
166 2, -11, 8, -11, -15, -10, -4, -10, 4, -10,
167 15, -10, -6, -9, -1, -9, 1, -9, 6, -9,
168 -29, -8, -11, -8, -8, -8, -3, -8, 3, -8,
169 8, -8, 11, -8, 29, -8, -5, -7, -2, -7,
170 0, -7, 2, -7, 5, -7, -22, -6, -9, -6,
171 -6, -6, -3, -6, -1, -6, 1, -6, 3, -6,
172 6, -6, 9, -6, 22, -6, -17, -5, -7, -5,
173 -4, -5, -2, -5, 0, -5, 2, -5, 4, -5,
174 7, -5, 17, -5, -13, -4, -10, -4, -5, -4,
175 -3, -4, -1, -4, 0, -4, 1, -4, 3, -4,
176 5, -4, 10, -4, 13, -4, -8, -3, -6, -3,
177 -4, -3, -3, -3, -2, -3, -1, -3, 0, -3,
178 1, -3, 2, -3, 4, -3, 6, -3, 8, -3,
179 -11, -2, -7, -2, -5, -2, -3, -2, -2, -2,
180 -1, -2, 0, -2, 1, -2, 2, -2, 3, -2,
181 5, -2, 7, -2, 11, -2, -9, -1, -6, -1,
182 -4, -1, -3, -1, -2, -1, -1, -1, 0, -1,
183 1, -1, 2, -1, 3, -1, 4, -1, 6, -1,
184 9, -1, -31, 0, -23, 0, -18, 0, -14, 0,
185 -11, 0, -7, 0, -5, 0, -4, 0, -3, 0,
186 -2, 0, -1, 0, 0, -31, 1, 0, 2, 0,
187 3, 0, 4, 0, 5, 0, 7, 0, 11, 0,
188 14, 0, 18, 0, 23, 0, 31, 0, -9, 1,
189 -6, 1, -4, 1, -3, 1, -2, 1, -1, 1,
190 0, 1, 1, 1, 2, 1, 3, 1, 4, 1,
191 6, 1, 9, 1, -11, 2, -7, 2, -5, 2,
192 -3, 2, -2, 2, -1, 2, 0, 2, 1, 2,
193 2, 2, 3, 2, 5, 2, 7, 2, 11, 2,
194 -8, 3, -6, 3, -4, 3, -2, 3, -1, 3,
195 0, 3, 1, 3, 2, 3, 3, 3, 4, 3,
196 6, 3, 8, 3, -13, 4, -10, 4, -5, 4,
197 -3, 4, -1, 4, 0, 4, 1, 4, 3, 4,
198 5, 4, 10, 4, 13, 4, -17, 5, -7, 5,
199 -4, 5, -2, 5, 0, 5, 2, 5, 4, 5,
200 7, 5, 17, 5, -22, 6, -9, 6, -6, 6,
201 -3, 6, -1, 6, 1, 6, 3, 6, 6, 6,
202 9, 6, 22, 6, -5, 7, -2, 7, 0, 7,
203 2, 7, 5, 7, -29, 8, -11, 8, -8, 8,
204 -3, 8, 3, 8, 8, 8, 11, 8, 29, 8,
205 -6, 9, -1, 9, 1, 9, 6, 9, -15, 10,
206 -4, 10, 4, 10, 15, 10, -8, 11, -2, 11,
207 0, 11, 2, 11, 8, 11, 19, 12, -19, 13,
208 -4, 13, 4, 13, 0, 14, -10, 15, 10, 15,
209 -5, 17, 5, 17, 25, 17, -25, 18, 0, 18,
210 -12, 19, 13, 19, -6, 22, 6, 22, 0, 23,
211 -17, 25, 18, 25, -8, 29, 8, 29, 0, 31,
212 0, 0, -6, -22, 6, -22, -13, -19, 12, -19,
213 0, -18, -5, -17, 5, -17, -10, -15, 10, -15,
214 0, -14, -4, -13, 4, -13, 19, -13, -19, -12,
215 -8, -11, -2, -11, 0, -11, 2, -11, 8, -11,
216 -15, -10, -4, -10, 4, -10, 15, -10, -6, -9,
217 -1, -9, 1, -9, 6, -9, -11, -8, -8, -8,
218 -3, -8, 0, -8, 3, -8, 8, -8, 11, -8,
219 -5, -7, -2, -7, 0, -7, 2, -7, 5, -7,
220 -22, -6, -9, -6, -6, -6, -3, -6, -1, -6,
221 1, -6, 3, -6, 6, -6, 9, -6, 22, -6,
222 -17, -5, -7, -5, -4, -5, -2, -5, -1, -5,
223 0, -5, 1, -5, 2, -5, 4, -5, 7, -5,
224 17, -5, -13, -4, -10, -4, -5, -4, -3, -4,
225 -2, -4, -1, -4, 0, -4, 1, -4, 2, -4,
226 3, -4, 5, -4, 10, -4, 13, -4, -8, -3,
227 -6, -3, -4, -3, -3, -3, -2, -3, -1, -3,
228 0, -3, 1, -3, 2, -3, 3, -3, 4, -3,
229 6, -3, 8, -3, -11, -2, -7, -2, -5, -2,
230 -4, -2, -3, -2, -2, -2, -1, -2, 0, -2,
231 1, -2, 2, -2, 3, -2, 4, -2, 5, -2,
232 7, -2, 11, -2, -9, -1, -6, -1, -5, -1,
233 -4, -1, -3, -1, -2, -1, -1, -1, 0, -1,
234 1, -1, 2, -1, 3, -1, 4, -1, 5, -1,
235 6, -1, 9, -1, -23, 0, -18, 0, -14, 0,
236 -11, 0, -7, 0, -5, 0, -4, 0, -3, 0,
237 -2, 0, -1, 0, 0, -23, 1, 0, 2, 0,
238 3, 0, 4, 0, 5, 0, 7, 0, 11, 0,
239 14, 0, 18, 0, 23, 0, -9, 1, -6, 1,
240 -5, 1, -4, 1, -3, 1, -2, 1, -1, 1,
241 0, 1, 1, 1, 2, 1, 3, 1, 4, 1,
242 5, 1, 6, 1, 9, 1, -11, 2, -7, 2,
243 -5, 2, -4, 2, -3, 2, -2, 2, -1, 2,
244 0, 2, 1, 2, 2, 2, 3, 2, 4, 2,
245 5, 2, 7, 2, 11, 2, -8, 3, -6, 3,
246 -4, 3, -3, 3, -2, 3, -1, 3, 0, 3,
247 1, 3, 2, 3, 3, 3, 4, 3, 6, 3,
248 8, 3, -13, 4, -10, 4, -5, 4, -3, 4,
249 -2, 4, -1, 4, 0, 4, 1, 4, 2, 4,
250 3, 4, 5, 4, 10, 4, 13, 4, -17, 5,
251 -7, 5, -4, 5, -2, 5, -1, 5, 0, 5,
252 1, 5, 2, 5, 4, 5, 7, 5, 17, 5,
253 -22, 6, -9, 6, -6, 6, -3, 6, -1, 6,
254 1, 6, 3, 6, 6, 6, 9, 6, 22, 6,
255 -5, 7, -2, 7, 0, 7, 2, 7, 5, 7,
256 -11, 8, -8, 8, -3, 8, 0, 8, 3, 8,
257 8, 8, 11, 8, -6, 9, -1, 9, 1, 9,
258 6, 9, -15, 10, -4, 10, 4, 10, 15, 10,
259 -8, 11, -2, 11, 0, 11, 2, 11, 8, 11,
260 19, 12, -19, 13, -4, 13, 4, 13, 0, 14,
261 -10, 15, 10, 15, -5, 17, 5, 17, 0, 18,
262 -12, 19, 13, 19, -6, 22, 6, 22, 0, 23,
329 const int edge_max = edge_size - 1;
333 else if (y == edge_max)
337 else if (x == edge_max)
366 static void interp_point(int8_t *points,
int x0,
int y0,
int x1,
int y1,
367 int pos,
int npoints)
370 points[0] = (x0 *
pos + x1 * (npoints -
pos) + (npoints >> 1)) / npoints;
371 points[1] = (y0 *
pos + y1 * (npoints -
pos) + (npoints >> 1)) / npoints;
386 static void make_glyphs(int8_t *pglyphs,
const int8_t *xvec,
const int8_t *yvec,
387 const int side_length)
389 const int glyph_size = side_length * side_length;
390 int8_t *pglyph = pglyphs;
406 for (ipoint = 0; ipoint <= npoints; ipoint++) {
414 for (irow = point[1]; irow >= 0; irow--)
415 pglyph[point[0] + irow * side_length] = 1;
419 for (irow = point[1]; irow < side_length; irow++)
420 pglyph[point[0] + irow * side_length] = 1;
424 for (icol = point[0]; icol >= 0; icol--)
425 pglyph[icol + point[1] * side_length] = 1;
429 for (icol = point[0]; icol < side_length; icol++)
430 pglyph[icol + point[1] * side_length] = 1;
447 ctx->buf_size =
ctx->aligned_width *
ctx->aligned_height *
sizeof(
ctx->frm0[0]);
473 &
ctx->stored_frame_size,
ctx->buf_size);
477 if (!
ctx->frm0 || !
ctx->frm1 || !
ctx->frm2 ||
478 (!
ctx->stored_frame && !
ctx->version)) {
488 uint8_t *
dst = &(
ctx->c4tbl[0][0][0]);
489 int i, j, k, l, m, n, o,
p;
491 for (
i = 0;
i < 8;
i++) {
492 for (k = 0; k < 8; k++) {
506 for (
i = 0;
i < 8;
i++) {
507 for (k = 0; k < 8; k++) {
520 for (
i = 0;
i < 8;
i++) {
521 for (k = 0; k < 8; k++) {
535 for (
i = 0;
i < 8;
i++) {
536 for (k = 0; k < 8; k++) {
552 uint8_t *
dst = &(
ctx->c4tbl[0][0][0]);
553 int i, j, k, l, m, n, o;
555 for (
i = 1;
i < 16;
i += 2) {
556 for (k = 0; k < 16; k++) {
562 if (j == m || l == m) {
576 for (
i = 0;
i < 16;
i += 2) {
577 for (k = 0; k < 16; k++) {
583 if (m == j || m == l) {
600 uint16_t param2, uint8_t clr)
602 uint8_t
c, *
dst = (uint8_t *)&(
ctx->c4tbl[1][0][0]);
603 uint32_t
loop = param2 * 8;
609 c = bytestream2_get_byteu(gb);
610 *
dst++ = (
c >> 4) + clr;
611 *
dst++ = (
c & 0xf) + clr;
619 if (rotate_code == 2)
641 ctx->have_dimensions = 0;
642 }
else if (avctx->
width > 800 || avctx->
height > 600 ||
662 if (
ctx->subversion < 2)
663 ctx->pal[0] = 0xFF
U << 24;
665 ctx->c4param = 0xffff;
680 int w,
int h, uint8_t param, uint16_t param2,
int codec)
684 int i, j, k, l,
bit,
ret, x, y;
686 if (
ctx->c4param != param) {
691 ctx->c4param = param;
702 for (j = 0; j <
w; j += 4) {
705 for (
i = 0;
i <
h;
i += 4) {
711 mask = bytestream2_get_byteu(gb);
723 idx = bytestream2_get_byteu(gb);
724 if ((
bit == 0) && (idx == 0x80) && (codec != 5))
726 if ((y >=
my) || ((y + 4) < 0) || ((x + 4) < 0) || (x >=
mx))
728 gs = &(
ctx->c4tbl[
bit][idx][0]);
729 if ((y >= 0) && (x >= 0) && ((y + 4) <
my) && ((x + 4) <
mx)) {
730 for (k = 0; k < 4; k++, gs += 4)
731 memcpy(
dst + x + (y + k) *
p, gs, 4);
733 for (k = 0; k < 4; k++) {
734 for (l = 0; l < 4; l++, gs++) {
735 const int yo = y + k, xo = x + l;
736 if ((yo >= 0) && (yo <
my) && (xo >= 0) && (xo <
mx))
737 *(
dst + yo *
p + xo) = *gs;
751 opcode = bytestream2_get_byte(gb);
757 color = bytestream2_get_byte(gb);
773 int width,
int height, uint8_t param, uint16_t param2)
776 uint8_t
c, lut[256], *
dst = (uint8_t *)
ctx->fbuf;
777 int sk,
i, j, ls, pc, y;
779 if (
ctx->subversion < 2) {
781 for (
i = 0;
i < 256;
i++)
782 lut[
i] = (
i + param + 0xd0) & 0xff;
783 }
else if (param2 == 256) {
787 }
else if (param2 < 256) {
788 for (
i = 0;
i < 256;
i++)
789 lut[
i] = (
i + param2) & 0xff;
791 memcpy(lut,
ctx->c23lut, 256);
802 ls = bytestream2_get_le16u(gb);
813 ls = bytestream2_get_le16u(gb);
817 j = bytestream2_get_byteu(gb);
821 if ((pc >= 0) && (pc <
mx)) {
822 c = *(
dst + (y *
p) + pc);
823 *(
dst + (y *
p) + pc) = lut[
c];
842 uint8_t *
dst = (uint8_t *)
ctx->fbuf,
c;
843 int j, y, pc, sk, ls;
850 ls = bytestream2_get_le16u(gb);
860 j = bytestream2_get_le16u(gb);
867 c = bytestream2_get_byteu(gb);
868 if ((pc >= 0) && (pc <
mx)) {
869 *(
dst + (y *
p) + pc) =
c;
888 int j, x, y,
flag, dlen;
896 dlen = bytestream2_get_le16u(gb);
907 dlen = bytestream2_get_le16u(gb);
910 code = bytestream2_get_byteu(gb);
915 c = bytestream2_get_byteu(gb);
928 for (j = 0; (j <
code) && (
c || opaque); j++) {
929 *(
dst + (y *
p) + x + j) =
c;
935 for (j = 0; j <
code; j++) {
936 c = bytestream2_get_byteu(gb);
937 if ((x >= 0) && (x <
mx) && (
c || opaque))
938 *(
dst + (y *
p) + x) =
c;
954 uint8_t *
dst = (uint8_t *)
ctx->fbuf,
c;
963 dlen = bytestream2_get_le16u(gb);
974 dlen = bytestream2_get_le16u(gb);
977 code = bytestream2_get_byteu(gb);
982 c = bytestream2_get_byteu(gb);
984 for (j = 0; (j <
code); j++) {
985 if ((opaque || (
c & 0
xf)) && (x >= 0) && (x <
mx))
986 *(
dst + (y *
p) + x) = p1 + (
c & 0
xf);
989 if ((opaque || (
c >> 4)) && (x >= 0) && (x <
mx))
990 *(
dst + (y *
p) + x) = p1 + (
c >> 4);
997 for (j = 0; j <
code; j++) {
998 c = bytestream2_get_byteu(gb);
999 if ((opaque || (
c & 0
xf)) && (x >= 0) && (x <
mx))
1000 *(
dst + (y *
p) + x) = p1 + (
c & 0xf);
1003 if ((opaque || (
c >> 4)) && (x >= 0) && (x <
mx))
1004 *(
dst + (y *
p) + x) = p1 + (
c >> 4);
1019 uint8_t *
dst = (uint8_t *)
ctx->fbuf, col;
1020 int16_t xpos =
left, ypos = top;
1023 xpos += bytestream2_get_le16u(gb);
1024 ypos += bytestream2_get_byteu(gb);
1025 col = bytestream2_get_byteu(gb);
1026 if (xpos >= 0 && ypos >= 0 &&
1028 *(
dst + xpos + ypos *
ctx->pitch) = col;
1035 uint16_t srcxoff, uint16_t srcyoff, uint16_t srcwidth,
1036 uint16_t srcheight,
const uint16_t srcpitch,
const uint16_t dstpitch,
1039 if ((srcwidth < 1) || (srcheight < 1) || (
size < 1))
1043 if (-top >= srcheight)
1047 size += (srcpitch * top);
1051 if ((top + srcheight) > dstheight) {
1052 int clip = (top + srcheight) - dstheight;
1053 if (
clip >= srcheight)
1059 if (-
left >= srcwidth)
1067 if (
left + srcwidth > dstpitch) {
1068 int clip = (
left + srcwidth) - dstpitch;
1069 if (
clip >= srcwidth)
1074 src += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1075 dst += ((uintptr_t)top * dstpitch) +
left;
1076 while ((srcheight--) && (
size >= srcwidth)) {
1077 memcpy(
dst,
src, srcwidth);
1082 if ((
size > 0) && (
size < srcwidth) && (srcheight > 0))
1087 uint16_t srcxoff, uint16_t srcyoff, uint16_t srcwidth,
1088 uint16_t srcheight,
const uint16_t srcpitch,
const uint16_t dstpitch,
1089 const uint16_t dstheight,
int32_t size,
const uint8_t skipcolor)
1091 if ((srcwidth < 1) || (srcheight < 1) || (
size < 1))
1095 if (-top >= srcheight)
1099 size += (srcpitch * top);
1103 if ((top + srcheight) > dstheight) {
1104 int clip = (top + srcheight) - dstheight;
1105 if (
clip >= srcheight)
1111 if (-
left >= srcwidth)
1119 if (
left + srcwidth > dstpitch) {
1120 int clip = (
left + srcwidth) - dstpitch;
1121 if (
clip >= srcwidth)
1126 src += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1127 dst += ((uintptr_t)top * dstpitch) +
left;
1128 for (
int i = 0; (
size > 0) && (
i < srcheight);
i++) {
1129 for (
int j = 0; (
size > 0) && (j < srcwidth); j++,
size--) {
1130 if (
src[j] != skipcolor)
1139 int16_t
left, int16_t top, uint16_t srcxoff, uint16_t srcyoff,
1140 uint16_t srcwidth, uint16_t srcheight,
const uint16_t srcpitch,
1141 const uint16_t dstpitch,
const uint16_t dstheight,
int32_t size,
1142 const uint8_t *itbl)
1144 if ((srcwidth < 1) || (srcheight < 1) || (
size < 1))
1148 if (-top >= srcheight)
1152 size += (srcpitch * top);
1156 if ((top + srcheight) > dstheight) {
1157 int clip = (top + srcheight) - dstheight;
1158 if (
clip >= srcheight)
1164 if (-
left >= srcwidth)
1172 if (
left + srcwidth > dstpitch) {
1173 int clip = (
left + srcwidth) - dstpitch;
1174 if (
clip >= srcwidth)
1179 src1 += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1180 src2 += ((uintptr_t)srcyoff * srcpitch) + srcxoff;
1181 dst += ((uintptr_t)top * dstpitch) +
left;
1182 for (
int i = 0; (
size > 0) && (
i < srcheight);
i++) {
1183 for (
int j = 0; (
size > 0) && (j < srcwidth); j++,
size--) {
1193 const int w,
const int h)
1195 blt_solid((uint8_t*)
ctx->fbuf, gb->
buffer,
left, top, 0, 0,
w,
h,
w,
ctx->pitch,
1207 for (j = 0; j < 4; j++) {
1208 for (
i = 0;
i < 4;
i++) {
1223 int i, j, k, l, t,
run,
len,
code,
skip,
mx,
my;
1224 uint8_t *
dst, *prev;
1237 int compr = bytestream2_get_byteu(gb);
1238 int mvoff = bytestream2_get_byteu(gb);
1239 int seq = bytestream2_get_le16u(gb);
1240 uint32_t decoded_size = bytestream2_get_le32u(gb);
1244 flags = bytestream2_get_byteu(gb);
1252 if (((seq & 1) || !(
flags & 1)) && (compr && compr != 2)) {
1256 dst = ((uint8_t*)
ctx->frm0);
1257 prev = ((uint8_t*)
ctx->frm2);
1269 memset(
ctx->frm2, 0,
ctx->frm2_size);
1276 for (j = 0; j <
height; j += 4) {
1281 code = bytestream2_get_byte(gb);
1292 code = bytestream2_get_byte(gb);
1295 for (k = 0; k < 4; k++) {
1296 for (l = 0; l < 4; l++) {
1300 code = bytestream2_get_byte(gb);
1306 code = bytestream2_get_byte(gb);
1312 code = bytestream2_get_byte(gb);
1336 memset(
ctx->frm2, 0,
ctx->frm2_size);
1340 for (j = 0; j <
height; j += 4) {
1350 code = bytestream2_get_byteu(gb);
1354 for (k = 0; k < 4; k++)
1356 }
else if ((
flags & 4) && (
code == 0xFE)) {
1359 for (k = 0; k < 4; k += 2) {
1360 uint8_t
c1 = bytestream2_get_byteu(gb);
1361 uint8_t
c2 = bytestream2_get_byteu(gb);
1362 for (l = 0; l < 2; l++) {
1369 }
else if ((
flags & 4) && (
code == 0xFD)) {
1372 t = bytestream2_get_byteu(gb);
1373 for (k = 0; k < 4; k++)
1381 if ((compr == 4) && (
code == 0)) {
1384 skip_run = bytestream2_get_byteu(gb);
1394 "Subcodec 37 compression %d", compr);
1398 if ((
flags & 2) == 0) {
1409 uint8_t *prev1, uint8_t *prev2,
int stride,
int size)
1418 code = bytestream2_get_byteu(gb);
1425 dst[0] = bytestream2_get_byteu(gb);
1426 dst[1] = bytestream2_get_byteu(gb);
1427 dst[0 +
stride] = bytestream2_get_byteu(gb);
1428 dst[1 +
stride] = bytestream2_get_byteu(gb);
1450 t = bytestream2_get_byteu(gb);
1451 for (k = 0; k <
size; k++)
1458 code = bytestream2_get_byteu(gb);
1462 for (k = 0; k <
size; k++)
1463 for (t = 0; t <
size; t++)
1464 dst[t + k *
stride] = colors[!*pglyph++];
1467 for (k = 0; k <
size; k++)
1471 for (k = 0; k <
size; k++)
1477 int index = prev2 - (
const uint8_t *)
ctx->frm2;
1487 for (k = 0; k <
size; k++)
1499 for (
i = 0;
i < 256;
i++) {
1501 for (j = 256 -
i; j; j--) {
1502 *p1 = *p2 = bytestream2_get_byte(gb);
1511 const int height,
const ptrdiff_t
stride,
const uint8_t *itbl)
1519 p1 = bytestream2_get_byte(gb);
1523 for (j = 2; j <
width; j += 2) {
1524 p1 = bytestream2_get_byte(gb);
1525 px = (
px << 8) | p1;
1535 for (j = 0; j <
width; j++) {
1546 uint32_t decoded_size;
1548 uint8_t *
dst = (uint8_t *)
ctx->frm0;
1549 uint8_t *prev1 = (uint8_t *)
ctx->frm1;
1550 uint8_t *prev2 = (uint8_t *)
ctx->frm2;
1563 int seq = bytestream2_get_le16u(gb);
1564 int compr = bytestream2_get_byteu(gb);
1565 int new_rot = bytestream2_get_byteu(gb);
1566 int skip = bytestream2_get_byteu(gb);
1570 auxcol[0] = bytestream2_get_byteu(gb);
1571 auxcol[1] = bytestream2_get_byteu(gb);
1572 decoded_size = bytestream2_get_le32u(gb);
1575 if (decoded_size >
ctx->aligned_height *
width) {
1587 memset(prev1, auxcol[0],
ctx->frm0_size);
1588 memset(prev2, auxcol[1],
ctx->frm0_size);
1603 if (seq ==
ctx->prev_seq + 1) {
1604 for (j = 0; j <
height; j += 8) {
1615 memcpy(
ctx->frm0,
ctx->frm2,
ctx->frm0_size);
1618 memcpy(
ctx->frm0,
ctx->frm1,
ctx->frm0_size);
1626 "Subcodec 47 compression %d", compr);
1633 if ((seq ==
ctx->prev_seq + 1) && new_rot)
1636 ctx->prev_seq = seq;
1646 for (
int i = 0;
i < 4;
i++) {
1647 for (
int j = 0; j < 8; j += 2) {
1650 *((uint16_t *)(
dst +
w * 0 + j)) =
p;
1651 *((uint16_t *)(
dst +
w * 1 + j)) =
p;
1658 if (mvofs < -x + -y*
w)
1661 if (mvofs >
w-x-blocksize +
w*(
h-y-blocksize))
1668 const uint16_t
w,
const int aligned_height,
const uint8_t *itbl)
1670 uint8_t opc, sb[16];
1678 opc = bytestream2_get_byteu(gb);
1684 if (y > 0 && x > 0) {
1685 sb[15] = bytestream2_get_byteu(gb);
1686 sb[ 7] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[15]];
1687 sb[ 3] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[ 7]];
1688 sb[11] = itbl[(sb[15] << 8) | sb[ 7]];
1689 sb[ 1] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 3]];
1690 sb[ 0] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 1]];
1691 sb[ 2] = itbl[(sb[ 3] << 8) | sb[ 1]];
1692 sb[ 5] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 7]];
1693 sb[ 4] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 5]];
1694 sb[ 6] = itbl[(sb[ 7] << 8) | sb[ 5]];
1695 sb[ 9] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[11]];
1696 sb[ 8] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[ 9]];
1697 sb[10] = itbl[(sb[11] << 8) | sb[ 9]];
1698 sb[13] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[15]];
1699 sb[12] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[13]];
1700 sb[14] = itbl[(sb[15] << 8) | sb[13]];
1702 opc = bytestream2_get_byteu(gb);
1703 for (
i = 0;
i < 16;
i++)
1711 mvofs = bytestream2_get_le16(gb);
1714 for (
i = 0;
i < 8;
i++) {
1716 for (k = 0; k < 8; k++)
1717 *(
dst + ofs + k) = *(db + ofs + k + mvofs);
1723 sb[ 5] = bytestream2_get_byteu(gb);
1724 sb[ 7] = bytestream2_get_byteu(gb);
1725 sb[13] = bytestream2_get_byteu(gb);
1726 sb[15] = bytestream2_get_byteu(gb);
1728 if (y > 0 && x >0) {
1729 sb[ 1] = itbl[(*(
dst - 1*
w + 3) << 8) | sb[ 5]];
1730 sb[ 3] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[ 7]];
1731 sb[ 9] = itbl[(sb[13] << 8) | sb[ 5]];
1732 sb[11] = itbl[(sb[15] << 8) | sb[ 7]];
1733 sb[ 0] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 1]];
1734 sb[ 2] = itbl[(sb[ 3] << 8) | sb[ 1]];
1735 sb[ 4] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 5]];
1736 sb[ 6] = itbl[(sb[ 7] << 8) | sb[ 5]];
1737 sb[ 8] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[ 9]];
1738 sb[10] = itbl[(sb[11] << 8) | sb[ 9]];
1739 sb[12] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[13]];
1740 sb[14] = itbl[(sb[15] << 8) | sb[13]];
1742 sb[ 0] = sb[ 1] = sb[ 4] = sb[ 5];
1743 sb[ 2] = sb[ 3] = sb[ 6] = sb[ 7];
1744 sb[ 8] = sb[ 9] = sb[12] = sb[13];
1745 sb[10] = sb[11] = sb[14] = sb[15];
1752 for (
i = 0;
i < 8;
i += 4) {
1753 for (k = 0; k < 8; k += 4) {
1754 opc = bytestream2_get_byteu(gb);
1755 opc = (opc == 255) ? 0 : opc;
1759 for (j = 0; j < 4; j++) {
1760 ofs = (
w * (j +
i)) + k;
1761 for (l = 0; l < 4; l++)
1762 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1770 for (
i = 0;
i < 8;
i += 4) {
1771 for (k = 0; k < 8; k += 4) {
1772 mvofs = bytestream2_get_le16(gb);
1775 for (j = 0; j < 4; j++) {
1776 ofs = (
w * (j +
i)) + k;
1777 for (l = 0; l < 4; l++)
1778 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1792 for (
i = 0;
i < 8;
i += 2) {
1793 for (j = 0; j < 8; j += 2) {
1795 opc = bytestream2_get_byteu(gb);
1796 opc = (opc == 255) ? 0 : opc;
1800 for (l = 0; l < 2; l++) {
1801 *(
dst + ofs + l + 0) = *(db + ofs + l + 0 + mvofs);
1802 *(
dst + ofs + l +
w) = *(db + ofs + l +
w + mvofs);
1810 for (
i = 0;
i < 8;
i += 2) {
1811 for (j = 0; j < 8; j += 2) {
1813 mvofs = bytestream2_get_le16(gb);
1816 for (l = 0; l < 2; l++) {
1817 *(
dst + ofs + l + 0) = *(db + ofs + l + 0 + mvofs);
1818 *(
dst + ofs + l +
w) = *(db + ofs + l +
w + mvofs);
1826 for (
i = 0;
i < 8;
i++) {
1828 for (l = 0; l < 8; l++)
1829 *(
dst + ofs + l) = bytestream2_get_byteu(gb);
1836 for (
i = 0;
i < 8;
i++) {
1838 for (l = 0; l < 8; l++)
1839 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1849 uint8_t *
dst, *prev;
1857 if (ah >
ctx->aligned_height)
1863 int compr = bytestream2_get_byteu(gb);
1864 int mvidx = bytestream2_get_byteu(gb);
1865 int seq = bytestream2_get_le16u(gb);
1866 uint32_t decoded_size = bytestream2_get_le32u(gb);
1875 flags = bytestream2_get_byteu(gb);
1884 dst = (uint8_t*)
ctx->frm0;
1885 prev = (uint8_t*)
ctx->frm2;
1888 memset(
ctx->frm2, 0,
ctx->frm2_size);
1906 if ((seq == 0) || (seq ==
ctx->prev_seq + 1)) {
1907 if ((seq & 1) || ((
flags & 1) == 0) || (
flags & 0x10)) {
1909 dst = (uint8_t*)
ctx->frm0;
1910 prev = (uint8_t*)
ctx->frm2;
1912 for (j = 0; j <
height; j += 8) {
1932 "Subcodec 48 compression %d", compr);
1936 ctx->prev_seq = seq;
1937 if ((
flags & 2) == 0) {
1965 t1 = bytestream2_get_le16u(gb);
1966 t2 = bytestream2_get_byteu(gb);
1976 uint8_t
len = bytestream2_get_byteu(gb);
1977 uint8_t
val = bytestream2_get_byteu(gb);
1978 if ((
i +
len) > 0x8000)
1989 left += (int16_t)bytestream2_get_le16u(gb);
1990 top += bytestream2_get_byteu(gb);
1991 int len = bytestream2_get_byteu(gb);
1993 if ((
left > 0) && (top > 0) && (
left < (
ctx->width - 1))) {
1994 if (top >= (
ctx->height - 1))
1997 uint8_t *
dst = (uint8_t *)
ctx->fbuf +
left + top *
ctx->pitch;
1998 unsigned int c1 = *(
dst - 1) * 3;
1999 unsigned int c2 = *(
dst + 1) * 3;
2000 unsigned int r =
ctx->c45tbl1[
c1 + 0] +
ctx->c45tbl1[
c2 + 0];
2001 unsigned int g =
ctx->c45tbl1[
c1 + 1] +
ctx->c45tbl1[
c2 + 1];
2002 unsigned int b =
ctx->c45tbl1[
c1 + 2] +
ctx->c45tbl1[
c2 + 2];
2008 *
dst =
ctx->c45tbl2[((
r << 5) & 0x7c00) | (
g & 0x3e0) | (
b >> 5)];
2020 uint16_t
w,
h, parm2;
2021 uint8_t codec, param;
2025 codec = bytestream2_get_byteu(gb);
2026 param = bytestream2_get_byteu(gb);
2027 left = bytestream2_get_le16u(gb) + xoff;
2028 top = bytestream2_get_le16u(gb) + yoff;
2029 w = bytestream2_get_le16u(gb);
2030 h = bytestream2_get_le16u(gb);
2032 parm2 = bytestream2_get_le16u(gb);
2034 if (
w < 1 || h < 1 || w > 640 ||
h > 480 ||
left > 640 || top > 480 ||
left +
w <= 0 || top +
h <= 0) {
2042 "ignoring invalid fobj dimensions: c%d %d %d @ %d %d\n",
2048 fsc = (codec == 37 || codec == 47 || codec == 48);
2054 if ((
w == 640) && (
h == 272) && (top == 60) && (codec == 47))
2057 if (!
ctx->have_dimensions && (codec != 45)) {
2059 if (
ctx->subversion < 2) {
2063 if (
w > xres ||
h > yres)
2065 ctx->have_dimensions = 1;
2070 ctx->have_dimensions = 1;
2075 if (((xres == 424) && (yres == 260)) ||
2076 ((xres == 320) && (yres == 200)) ||
2077 ((xres == 640) && (yres == 272)) ||
2078 ((xres == 640) && (yres == 350)) ||
2079 ((xres == 640) && (yres == 480))) {
2080 ctx->have_dimensions = 1;
2087 if ((xres < (fsc ? 8 : 1)) || (yres < (fsc ? 8 : 1)) || (xres > 640) || (yres > 480))
2090 if (
ctx->width < xres ||
ctx->height < yres) {
2101 if (((
w >
ctx->width) || (
h >
ctx->height) || (
w *
h >
ctx->buf_size)) && fsc) {
2108 "resizing too large fobj: c%d %d %d @ %d %d\n", codec,
w,
h,
left, top);
2115 if (fsc &&
ctx->subversion < 2) {
2116 ctx->subversion = 2;
2121 if (
ctx->first_fob) {
2124 memset(
ctx->fbuf, 0,
ctx->frm0_size);
2165 int xoff, yoff,
ret;
2171 xoff = bytestream2_get_le16u(&
ctx->gb);
2172 yoff = bytestream2_get_le16u(&
ctx->gb);
2173 }
else if (
size == 12) {
2176 xoff = bytestream2_get_be32u(&
ctx->gb);
2177 yoff = bytestream2_get_be32u(&
ctx->gb);
2181 if (
ctx->stor_size > 0) {
2186 memcpy(bitstream,
ctx->stored_frame,
ctx->stor_size);
2205 int16_t *dp =
ctx->delta_pal;
2206 uint32_t *pal =
ctx->pal;
2214 cmd = bytestream2_get_be16(&
ctx->gb);
2219 for (j = 0; j < 3; j++) {
2220 ctx->shift_pal[
i + j] += dp[
i + j];
2223 *pal++ = 0xFF
U << 24 |
c[0] << 16 |
c[1] << 8 |
c[2];
2225 }
else if (cmd == 0 || cmd == 2) {
2228 "Incorrect palette change block size %"PRIu32
".\n",
size);
2232 dp[
i] = bytestream2_get_le16u(&
ctx->gb);
2237 ctx->pal[
i] = 0xFFU << 24 | bytestream2_get_be24u(&
ctx->gb);
2238 if (
ctx->subversion < 2)
2239 ctx->pal[0] = 0xFF
U << 24;
2242 ctx->shift_pal[
i + 0] = (((
ctx->pal[j]) >> 16) & 0xFF
U) << 7;
2243 ctx->shift_pal[
i + 1] = (((
ctx->pal[j]) >> 8) & 0xFF
U) << 7;
2244 ctx->shift_pal[
i + 2] = (((
ctx->pal[j]) >> 0) & 0xFF
U) << 7;
2252 uint16_t *frm =
ctx->frm0;
2259 for (y = 0; y <
ctx->height; y++) {
2260 for (x = 0; x <
ctx->width; x++)
2261 frm[x] = bytestream2_get_le16u(&
ctx->gb);
2270 return (((
c2 & 0x07e0) + (
c1 & 0x07e0)) & 0x00fc0) |
2271 (((
c2 & 0xf800) + (
c1 & 0xf800)) & 0x1f000) |
2272 (((
c2 & 0x001f) + (
c1 & 0x001f))) >> 1;
2281 uint16_t hh, hw, hw1,
c1,
c2, *dst1, *dst2;
2283 hh = (
ctx->height + 1) >> 1;
2284 hw1 = (
ctx->width - 1) >> 1;
2287 dst1 = (uint16_t *)
ctx->frm0 +
ctx->pitch;
2290 c1 = bytestream2_get_le16u(&
ctx->gb);
2295 c2 = bytestream2_get_le16u(&
ctx->gb);
2300 dst1 +=
ctx->pitch * 2;
2308 dst1 =
ctx->frm0 + (
ctx->pitch * 2);
2309 hh = (
ctx->height - 1) >> 1;
2314 c1 = *(dst2 -
ctx->pitch);
2315 c2 = *(dst2 +
ctx->pitch);
2318 dst1 +=
ctx->pitch * 2;
2323 static void copy_block(uint16_t *pdest, uint16_t *psrc,
int block_size, ptrdiff_t pitch)
2325 uint8_t *
dst = (uint8_t *)pdest;
2326 uint8_t *
src = (uint8_t *)psrc;
2327 ptrdiff_t
stride = pitch * 2;
2329 switch (block_size) {
2346 pitch -= block_size;
2347 for (y = 0; y < block_size; y++, pdest += pitch)
2348 for (x = 0; x < block_size; x++)
2353 uint16_t fg_color, uint16_t bg_color,
int block_size,
2357 uint16_t colors[2] = { fg_color, bg_color };
2365 pglyph = block_size == 8 ?
ctx->p8x8glyphs[
index] :
ctx->p4x4glyphs[
index];
2366 pitch -= block_size;
2368 for (y = 0; y < block_size; y++,
dst += pitch)
2369 for (x = 0; x < block_size; x++)
2370 *
dst++ = colors[*pglyph++];
2376 uint16_t *
dst =
ctx->frm0 + cx + cy *
ctx->pitch;
2378 if (block_size == 2) {
2384 indices = bytestream2_get_le32u(&
ctx->gb);
2385 dst[0] =
ctx->codebook[indices & 0xFF];
2387 dst[1] =
ctx->codebook[indices & 0xFF];
2389 dst[pitch] =
ctx->codebook[indices & 0xFF];
2391 dst[pitch + 1] =
ctx->codebook[indices & 0xFF];
2393 uint16_t fgcolor, bgcolor;
2399 glyph = bytestream2_get_byteu(&
ctx->gb);
2400 bgcolor =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2401 fgcolor =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2410 uint16_t *
dst =
ctx->frm0 + cx + cy *
ctx->pitch;
2412 if (block_size == 2) {
2416 dst[0] = bytestream2_get_le16u(&
ctx->gb);
2417 dst[1] = bytestream2_get_le16u(&
ctx->gb);
2418 dst[pitch] = bytestream2_get_le16u(&
ctx->gb);
2419 dst[pitch + 1] = bytestream2_get_le16u(&
ctx->gb);
2421 uint16_t fgcolor, bgcolor;
2427 glyph = bytestream2_get_byteu(&
ctx->gb);
2428 bgcolor = bytestream2_get_le16u(&
ctx->gb);
2429 fgcolor = bytestream2_get_le16u(&
ctx->gb);
2439 int start_pos = cx +
mx + (cy +
my) *
ctx->pitch;
2440 int end_pos = start_pos + (block_size - 1) * (
ctx->pitch + 1);
2442 int good = start_pos >= 0 && end_pos < (
ctx->buf_size >> 1);
2446 "Ignoring invalid motion vector (%i, %i)->(%u, %u), block size = %u\n",
2447 cx +
mx, cy +
my, cx, cy, block_size);
2460 opcode = bytestream2_get_byteu(&
ctx->gb);
2476 if (
ctx->width > 761) {
2483 ctx->frm2 + cx +
mx +
ctx->pitch * (cy +
my),
2484 blk_size,
ctx->pitch);
2490 index = bytestream2_get_le16u(&
ctx->gb);
2497 ctx->frm2 + cx +
mx +
ctx->pitch * (cy +
my),
2498 blk_size,
ctx->pitch);
2503 ctx->frm1 + cx +
ctx->pitch * cy,
2504 blk_size,
ctx->pitch);
2518 ctx->small_codebook[opcode - 0xf9], blk_size,
ctx->pitch);
2524 ctx->codebook[bytestream2_get_byteu(&
ctx->gb)], blk_size,
ctx->pitch);
2530 bytestream2_get_le16u(&
ctx->gb), blk_size,
ctx->pitch);
2533 if (blk_size == 2) {
2543 if (
bl16_block(
ctx, cx + blk_size, cy + blk_size, blk_size))
2555 for (cy = 0; cy <
ctx->aligned_height; cy += 8)
2556 for (cx = 0; cx <
ctx->aligned_width; cx += 8)
2569 uint8_t *
dst = (uint8_t*)
ctx->frm0;
2575 npixels =
ctx->npixels;
2588 int npixels =
ctx->npixels;
2589 uint16_t *frm =
ctx->frm0;
2596 *frm++ =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2608 uint16_t hh, hw, hw1,
c1,
c2, *dst1, *dst2;
2610 hh = (
ctx->height + 1) >> 1;
2611 hw1 = (
ctx->width - 1) >> 1;
2614 dst1 = (uint16_t *)
ctx->frm0 +
ctx->pitch;
2617 c1 =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2622 c2 =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2627 dst1 +=
ctx->pitch * 2;
2635 dst1 =
ctx->frm0 + (
ctx->pitch * 2);
2636 hh = (
ctx->height - 1) >> 1;
2641 c1 = *(dst2 -
ctx->pitch);
2642 c2 = *(dst2 +
ctx->pitch);
2645 dst1 +=
ctx->pitch * 2;
2652 uint16_t *pdest =
ctx->frm0;
2654 long npixels =
ctx->npixels;
2657 if (!
ctx->rle_buf) {
2661 rsrc =
ctx->rle_buf;
2667 *pdest++ =
ctx->codebook[*rsrc++];
2683 const uint8_t *
src = sanm ? (uint8_t *)
ctx->frm0 : (uint8_t *)
ctx->fbuf;
2685 ptrdiff_t dstpitch, srcpitch =
ctx->pitch * (sanm ?
sizeof(
ctx->frm0[0]) : 1);
2690 dst =
ctx->frame->data[0];
2691 dstpitch =
ctx->frame->linesize[0];
2694 memcpy(
dst,
src, srcpitch);
2705 int i,
ret,
w,
h, seq_num, codec, bg_color, rle_output_size, rcode;
2714 w = bytestream2_get_le32u(&
ctx->gb);
2715 h = bytestream2_get_le32u(&
ctx->gb);
2717 if (
w !=
ctx->width ||
h !=
ctx->height) {
2722 seq_num = bytestream2_get_le16u(&
ctx->gb);
2723 codec = bytestream2_get_byteu(&
ctx->gb);
2724 rcode = bytestream2_get_byteu(&
ctx->gb);
2728 for (
i = 0;
i < 4;
i++)
2729 ctx->small_codebook[
i] = bytestream2_get_le16u(&
ctx->gb);
2730 bg_color = bytestream2_get_le16u(&
ctx->gb);
2734 rle_output_size = bytestream2_get_le32u(&
ctx->gb);
2735 if (rle_output_size >
w *
ctx->aligned_height * 2) {
2738 rle_output_size =
w *
ctx->aligned_height * 2;
2741 for (
i = 0;
i < 256;
i++)
2742 ctx->codebook[
i] = bytestream2_get_le16u(&
ctx->gb);
2761 case 3: memcpy(
ctx->frm0,
ctx->frm2,
ctx->frm2_size);
break;
2762 case 4: memcpy(
ctx->frm0,
ctx->frm1,
ctx->frm1_size);
break;
2774 "Subcodec %d: error decoding frame.\n", codec);
2791 int i,
ret, to_store = 0, have_img = 0;
2798 sig = bytestream2_get_be32u(&
ctx->gb);
2799 size = bytestream2_get_be32u(&
ctx->gb);
2807 case MKBETAG(
'N',
'P',
'A',
'L'):
2810 "Incorrect palette block size %"PRIu32
".\n",
size);
2814 ctx->pal[
i] = 0xFFU << 24 | bytestream2_get_be24u(&
ctx->gb);
2815 if (
ctx->subversion < 2)
2816 ctx->pal[0] = 0xFF
U << 24;
2818 case MKBETAG(
'F',
'O',
'B',
'J'):
2835 if (
ctx->subversion < 2) {
2836 if (size <= ctx->stored_frame_size) {
2845 memcpy(
ctx->stored_frame,
ctx->fbuf,
ctx->buf_size);
2846 ctx->stor_size =
ctx->buf_size;
2851 case MKBETAG(
'X',
'P',
'A',
'L'):
2855 case MKBETAG(
'S',
'T',
'O',
'R'):
2858 case MKBETAG(
'F',
'T',
'C',
'H'):
2859 if (
ctx->subversion < 2) {
2862 have_img = (
ret == 0) ? 1 : 0;
2864 if (
ctx->stor_size > 0) {
2865 memcpy(
ctx->fbuf,
ctx->stored_frame,
ctx->buf_size);
2873 "Unknown/unsupported chunk %"PRIx32
".\n", sig);
2884 if (bytestream2_peek_byte(&
ctx->gb) == 0)
2892 memcpy(
ctx->frame->data[1],
ctx->pal, 1024);
2907 if (!
ctx->version) {