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;
1234 int compr = bytestream2_get_byteu(gb);
1235 int mvoff = bytestream2_get_byteu(gb);
1236 int seq = bytestream2_get_le16u(gb);
1237 uint32_t decoded_size = bytestream2_get_le32u(gb);
1241 flags = bytestream2_get_byteu(gb);
1249 if (((seq & 1) || !(
flags & 1)) && (compr && compr != 2)) {
1253 dst = ((uint8_t*)
ctx->frm0);
1254 prev = ((uint8_t*)
ctx->frm2);
1266 memset(
ctx->frm2, 0,
ctx->frm2_size);
1273 for (j = 0; j <
height; j += 4) {
1278 code = bytestream2_get_byte(gb);
1289 code = bytestream2_get_byte(gb);
1292 for (k = 0; k < 4; k++) {
1293 for (l = 0; l < 4; l++) {
1297 code = bytestream2_get_byte(gb);
1303 code = bytestream2_get_byte(gb);
1309 code = bytestream2_get_byte(gb);
1333 memset(
ctx->frm2, 0,
ctx->frm2_size);
1337 for (j = 0; j <
height; j += 4) {
1347 code = bytestream2_get_byteu(gb);
1351 for (k = 0; k < 4; k++)
1353 }
else if ((
flags & 4) && (
code == 0xFE)) {
1356 for (k = 0; k < 4; k += 2) {
1357 uint8_t
c1 = bytestream2_get_byteu(gb);
1358 uint8_t
c2 = bytestream2_get_byteu(gb);
1359 for (l = 0; l < 2; l++) {
1366 }
else if ((
flags & 4) && (
code == 0xFD)) {
1369 t = bytestream2_get_byteu(gb);
1370 for (k = 0; k < 4; k++)
1378 if ((compr == 4) && (
code == 0)) {
1381 skip_run = bytestream2_get_byteu(gb);
1391 "Subcodec 37 compression %d", compr);
1395 if ((
flags & 2) == 0) {
1406 uint8_t *prev1, uint8_t *prev2,
int stride,
int size)
1415 code = bytestream2_get_byteu(gb);
1422 dst[0] = bytestream2_get_byteu(gb);
1423 dst[1] = bytestream2_get_byteu(gb);
1424 dst[0 +
stride] = bytestream2_get_byteu(gb);
1425 dst[1 +
stride] = bytestream2_get_byteu(gb);
1447 t = bytestream2_get_byteu(gb);
1448 for (k = 0; k <
size; k++)
1455 code = bytestream2_get_byteu(gb);
1459 for (k = 0; k <
size; k++)
1460 for (t = 0; t <
size; t++)
1461 dst[t + k *
stride] = colors[!*pglyph++];
1464 for (k = 0; k <
size; k++)
1468 for (k = 0; k <
size; k++)
1474 int index = prev2 - (
const uint8_t *)
ctx->frm2;
1484 for (k = 0; k <
size; k++)
1496 for (
i = 0;
i < 256;
i++) {
1498 for (j = 256 -
i; j; j--) {
1499 *p1 = *p2 = bytestream2_get_byte(gb);
1508 const int height,
const ptrdiff_t
stride,
const uint8_t *itbl)
1516 p1 = bytestream2_get_byte(gb);
1520 for (j = 2; j <
width; j += 2) {
1521 p1 = bytestream2_get_byte(gb);
1522 px = (
px << 8) | p1;
1532 for (j = 0; j <
width; j++) {
1543 uint32_t decoded_size;
1545 uint8_t *
dst = (uint8_t *)
ctx->frm0;
1546 uint8_t *prev1 = (uint8_t *)
ctx->frm1;
1547 uint8_t *prev2 = (uint8_t *)
ctx->frm2;
1557 int seq = bytestream2_get_le16u(gb);
1558 int compr = bytestream2_get_byteu(gb);
1559 int new_rot = bytestream2_get_byteu(gb);
1560 int skip = bytestream2_get_byteu(gb);
1564 auxcol[0] = bytestream2_get_byteu(gb);
1565 auxcol[1] = bytestream2_get_byteu(gb);
1566 decoded_size = bytestream2_get_le32u(gb);
1569 if (decoded_size >
ctx->aligned_height *
width) {
1581 memset(prev1, auxcol[0],
ctx->frm0_size);
1582 memset(prev2, auxcol[1],
ctx->frm0_size);
1597 if (seq ==
ctx->prev_seq + 1) {
1598 for (j = 0; j <
height; j += 8) {
1609 memcpy(
ctx->frm0,
ctx->frm2,
ctx->frm0_size);
1612 memcpy(
ctx->frm0,
ctx->frm1,
ctx->frm0_size);
1620 "Subcodec 47 compression %d", compr);
1627 if ((seq ==
ctx->prev_seq + 1) && new_rot)
1630 ctx->prev_seq = seq;
1640 for (
int i = 0;
i < 4;
i++) {
1641 for (
int j = 0; j < 8; j += 2) {
1644 *((uint16_t *)(
dst +
w * 0 + j)) =
p;
1645 *((uint16_t *)(
dst +
w * 1 + j)) =
p;
1652 if (mvofs < -x + -y*
w)
1655 if (mvofs >
w-x-blocksize +
w*(
h-y-blocksize))
1662 const uint16_t
w,
const int aligned_height,
const uint8_t *itbl)
1664 uint8_t opc, sb[16];
1672 opc = bytestream2_get_byteu(gb);
1678 if (y > 0 && x > 0) {
1679 sb[15] = bytestream2_get_byteu(gb);
1680 sb[ 7] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[15]];
1681 sb[ 3] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[ 7]];
1682 sb[11] = itbl[(sb[15] << 8) | sb[ 7]];
1683 sb[ 1] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 3]];
1684 sb[ 0] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 1]];
1685 sb[ 2] = itbl[(sb[ 3] << 8) | sb[ 1]];
1686 sb[ 5] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 7]];
1687 sb[ 4] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 5]];
1688 sb[ 6] = itbl[(sb[ 7] << 8) | sb[ 5]];
1689 sb[ 9] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[11]];
1690 sb[ 8] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[ 9]];
1691 sb[10] = itbl[(sb[11] << 8) | sb[ 9]];
1692 sb[13] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[15]];
1693 sb[12] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[13]];
1694 sb[14] = itbl[(sb[15] << 8) | sb[13]];
1696 opc = bytestream2_get_byteu(gb);
1697 for (
i = 0;
i < 16;
i++)
1705 mvofs = bytestream2_get_le16(gb);
1708 for (
i = 0;
i < 8;
i++) {
1710 for (k = 0; k < 8; k++)
1711 *(
dst + ofs + k) = *(db + ofs + k + mvofs);
1717 sb[ 5] = bytestream2_get_byteu(gb);
1718 sb[ 7] = bytestream2_get_byteu(gb);
1719 sb[13] = bytestream2_get_byteu(gb);
1720 sb[15] = bytestream2_get_byteu(gb);
1722 if (y > 0 && x >0) {
1723 sb[ 1] = itbl[(*(
dst - 1*
w + 3) << 8) | sb[ 5]];
1724 sb[ 3] = itbl[(*(
dst - 1*
w + 7) << 8) | sb[ 7]];
1725 sb[ 9] = itbl[(sb[13] << 8) | sb[ 5]];
1726 sb[11] = itbl[(sb[15] << 8) | sb[ 7]];
1727 sb[ 0] = itbl[(*(
dst + 0*
w - 1) << 8) | sb[ 1]];
1728 sb[ 2] = itbl[(sb[ 3] << 8) | sb[ 1]];
1729 sb[ 4] = itbl[(*(
dst + 2*
w - 1) << 8) | sb[ 5]];
1730 sb[ 6] = itbl[(sb[ 7] << 8) | sb[ 5]];
1731 sb[ 8] = itbl[(*(
dst + 3*
w - 1) << 8) | sb[ 9]];
1732 sb[10] = itbl[(sb[11] << 8) | sb[ 9]];
1733 sb[12] = itbl[(*(
dst + 4*
w - 1) << 8) | sb[13]];
1734 sb[14] = itbl[(sb[15] << 8) | sb[13]];
1736 sb[ 0] = sb[ 1] = sb[ 4] = sb[ 5];
1737 sb[ 2] = sb[ 3] = sb[ 6] = sb[ 7];
1738 sb[ 8] = sb[ 9] = sb[12] = sb[13];
1739 sb[10] = sb[11] = sb[14] = sb[15];
1746 for (
i = 0;
i < 8;
i += 4) {
1747 for (k = 0; k < 8; k += 4) {
1748 opc = bytestream2_get_byteu(gb);
1749 opc = (opc == 255) ? 0 : opc;
1753 for (j = 0; j < 4; j++) {
1754 ofs = (
w * (j +
i)) + k;
1755 for (l = 0; l < 4; l++)
1756 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1764 for (
i = 0;
i < 8;
i += 4) {
1765 for (k = 0; k < 8; k += 4) {
1766 mvofs = bytestream2_get_le16(gb);
1769 for (j = 0; j < 4; j++) {
1770 ofs = (
w * (j +
i)) + k;
1771 for (l = 0; l < 4; l++)
1772 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1786 for (
i = 0;
i < 8;
i += 2) {
1787 for (j = 0; j < 8; j += 2) {
1789 opc = bytestream2_get_byteu(gb);
1790 opc = (opc == 255) ? 0 : opc;
1794 for (l = 0; l < 2; l++) {
1795 *(
dst + ofs + l + 0) = *(db + ofs + l + 0 + mvofs);
1796 *(
dst + ofs + l +
w) = *(db + ofs + l +
w + mvofs);
1804 for (
i = 0;
i < 8;
i += 2) {
1805 for (j = 0; j < 8; j += 2) {
1807 mvofs = bytestream2_get_le16(gb);
1810 for (l = 0; l < 2; l++) {
1811 *(
dst + ofs + l + 0) = *(db + ofs + l + 0 + mvofs);
1812 *(
dst + ofs + l +
w) = *(db + ofs + l +
w + mvofs);
1820 for (
i = 0;
i < 8;
i++) {
1822 for (l = 0; l < 8; l++)
1823 *(
dst + ofs + l) = bytestream2_get_byteu(gb);
1830 for (
i = 0;
i < 8;
i++) {
1832 for (l = 0; l < 8; l++)
1833 *(
dst + ofs + l) = *(db + ofs + l + mvofs);
1843 uint8_t *
dst, *prev;
1851 if (ah >
ctx->aligned_height)
1857 int compr = bytestream2_get_byteu(gb);
1858 int mvidx = bytestream2_get_byteu(gb);
1859 int seq = bytestream2_get_le16u(gb);
1860 uint32_t decoded_size = bytestream2_get_le32u(gb);
1869 flags = bytestream2_get_byteu(gb);
1878 dst = (uint8_t*)
ctx->frm0;
1879 prev = (uint8_t*)
ctx->frm2;
1882 memset(
ctx->frm2, 0,
ctx->frm2_size);
1900 if ((seq == 0) || (seq ==
ctx->prev_seq + 1)) {
1901 if ((seq & 1) || ((
flags & 1) == 0) || (
flags & 0x10)) {
1903 dst = (uint8_t*)
ctx->frm0;
1904 prev = (uint8_t*)
ctx->frm2;
1906 for (j = 0; j <
height; j += 8) {
1926 "Subcodec 48 compression %d", compr);
1930 ctx->prev_seq = seq;
1931 if ((
flags & 2) == 0) {
1959 t1 = bytestream2_get_le16u(gb);
1960 t2 = bytestream2_get_byteu(gb);
1970 uint8_t
len = bytestream2_get_byteu(gb);
1971 uint8_t
val = bytestream2_get_byteu(gb);
1972 if ((
i +
len) > 0x8000)
1983 left += (int16_t)bytestream2_get_le16u(gb);
1984 top += bytestream2_get_byteu(gb);
1985 int len = bytestream2_get_byteu(gb);
1987 if ((
left > 0) && (top > 0) && (
left < (
ctx->width - 1))) {
1988 if (top >= (
ctx->height - 1))
1991 uint8_t *
dst = (uint8_t *)
ctx->fbuf +
left + top *
ctx->pitch;
1992 unsigned int c1 = *(
dst - 1) * 3;
1993 unsigned int c2 = *(
dst + 1) * 3;
1994 unsigned int r =
ctx->c45tbl1[
c1 + 0] +
ctx->c45tbl1[
c2 + 0];
1995 unsigned int g =
ctx->c45tbl1[
c1 + 1] +
ctx->c45tbl1[
c2 + 1];
1996 unsigned int b =
ctx->c45tbl1[
c1 + 2] +
ctx->c45tbl1[
c2 + 2];
2002 *
dst =
ctx->c45tbl2[((
r << 5) & 0x7c00) | (
g & 0x3e0) | (
b >> 5)];
2014 uint16_t
w,
h, parm2;
2015 uint8_t codec, param;
2019 codec = bytestream2_get_byteu(gb);
2020 param = bytestream2_get_byteu(gb);
2021 left = bytestream2_get_le16u(gb) + xoff;
2022 top = bytestream2_get_le16u(gb) + yoff;
2023 w = bytestream2_get_le16u(gb);
2024 h = bytestream2_get_le16u(gb);
2026 parm2 = bytestream2_get_le16u(gb);
2028 if (
w < 1 || h < 1 || w > 640 ||
h > 480 ||
left > 640 || top > 480 ||
left +
w <= 0 || top +
h <= 0) {
2036 "ignoring invalid fobj dimensions: c%d %d %d @ %d %d\n",
2042 fsc = (codec == 37 || codec == 47 || codec == 48);
2048 if ((
w == 640) && (
h == 272) && (top == 60) && (codec == 47))
2051 if (!
ctx->have_dimensions && (codec != 45)) {
2053 if (
ctx->subversion < 2) {
2057 if (
w > xres ||
h > yres)
2059 ctx->have_dimensions = 1;
2064 ctx->have_dimensions = 1;
2069 if (((xres == 424) && (yres == 260)) ||
2070 ((xres == 320) && (yres == 200)) ||
2071 ((xres == 640) && (yres == 272)) ||
2072 ((xres == 640) && (yres == 350)) ||
2073 ((xres == 640) && (yres == 480))) {
2074 ctx->have_dimensions = 1;
2081 if ((xres < (fsc ? 8 : 1)) || (yres < (fsc ? 8 : 1)) || (xres > 640) || (yres > 480))
2084 if (
ctx->width < xres ||
ctx->height < yres) {
2095 if (((
w >
ctx->width) || (
h >
ctx->height) || (
w *
h >
ctx->buf_size)) && fsc) {
2102 "resizing too large fobj: c%d %d %d @ %d %d\n", codec,
w,
h,
left, top);
2109 if (fsc &&
ctx->subversion < 2) {
2110 ctx->subversion = 2;
2115 if (
ctx->first_fob) {
2118 memset(
ctx->fbuf, 0,
ctx->frm0_size);
2159 int xoff, yoff,
ret;
2165 xoff = bytestream2_get_le16u(&
ctx->gb);
2166 yoff = bytestream2_get_le16u(&
ctx->gb);
2167 }
else if (
size == 12) {
2170 xoff = bytestream2_get_be32u(&
ctx->gb);
2171 yoff = bytestream2_get_be32u(&
ctx->gb);
2175 if (
ctx->stor_size > 0) {
2180 memcpy(bitstream,
ctx->stored_frame,
ctx->stor_size);
2199 int16_t *dp =
ctx->delta_pal;
2200 uint32_t *pal =
ctx->pal;
2208 cmd = bytestream2_get_be16(&
ctx->gb);
2213 for (j = 0; j < 3; j++) {
2214 ctx->shift_pal[
i + j] += dp[
i + j];
2217 *pal++ = 0xFF
U << 24 |
c[0] << 16 |
c[1] << 8 |
c[2];
2219 }
else if (cmd == 0 || cmd == 2) {
2222 "Incorrect palette change block size %"PRIu32
".\n",
size);
2226 dp[
i] = bytestream2_get_le16u(&
ctx->gb);
2231 ctx->pal[
i] = 0xFFU << 24 | bytestream2_get_be24u(&
ctx->gb);
2232 if (
ctx->subversion < 2)
2233 ctx->pal[0] = 0xFF
U << 24;
2236 ctx->shift_pal[
i + 0] = (((
ctx->pal[j]) >> 16) & 0xFF
U) << 7;
2237 ctx->shift_pal[
i + 1] = (((
ctx->pal[j]) >> 8) & 0xFF
U) << 7;
2238 ctx->shift_pal[
i + 2] = (((
ctx->pal[j]) >> 0) & 0xFF
U) << 7;
2246 uint16_t *frm =
ctx->frm0;
2253 for (y = 0; y <
ctx->height; y++) {
2254 for (x = 0; x <
ctx->width; x++)
2255 frm[x] = bytestream2_get_le16u(&
ctx->gb);
2264 return (((
c2 & 0x07e0) + (
c1 & 0x07e0)) & 0x00fc0) |
2265 (((
c2 & 0xf800) + (
c1 & 0xf800)) & 0x1f000) |
2266 (((
c2 & 0x001f) + (
c1 & 0x001f))) >> 1;
2275 uint16_t hh, hw,
c1,
c2, *dst1, *dst2;
2280 hh = (
ctx->height + 1) >> 1;
2281 dst1 = (uint16_t *)
ctx->frm0 +
ctx->pitch;
2283 hw = (
ctx->width - 1) >> 1;
2284 c1 = bytestream2_get_le16u(&
ctx->gb);
2289 c2 = bytestream2_get_le16u(&
ctx->gb);
2294 dst1 +=
ctx->pitch * 2;
2302 dst1 =
ctx->frm0 + (
ctx->pitch * 2);
2303 hh = (
ctx->height - 1) >> 1;
2308 c1 = *(dst2 -
ctx->pitch);
2309 c2 = *(dst2 +
ctx->pitch);
2312 dst1 +=
ctx->pitch * 2;
2317 static void copy_block(uint16_t *pdest, uint16_t *psrc,
int block_size, ptrdiff_t pitch)
2319 uint8_t *
dst = (uint8_t *)pdest;
2320 uint8_t *
src = (uint8_t *)psrc;
2321 ptrdiff_t
stride = pitch * 2;
2323 switch (block_size) {
2340 pitch -= block_size;
2341 for (y = 0; y < block_size; y++, pdest += pitch)
2342 for (x = 0; x < block_size; x++)
2347 uint16_t fg_color, uint16_t bg_color,
int block_size,
2351 uint16_t colors[2] = { fg_color, bg_color };
2359 pglyph = block_size == 8 ?
ctx->p8x8glyphs[
index] :
ctx->p4x4glyphs[
index];
2360 pitch -= block_size;
2362 for (y = 0; y < block_size; y++,
dst += pitch)
2363 for (x = 0; x < block_size; x++)
2364 *
dst++ = colors[*pglyph++];
2370 uint16_t *
dst =
ctx->frm0 + cx + cy *
ctx->pitch;
2372 if (block_size == 2) {
2378 indices = bytestream2_get_le32u(&
ctx->gb);
2379 dst[0] =
ctx->codebook[indices & 0xFF];
2381 dst[1] =
ctx->codebook[indices & 0xFF];
2383 dst[pitch] =
ctx->codebook[indices & 0xFF];
2385 dst[pitch + 1] =
ctx->codebook[indices & 0xFF];
2387 uint16_t fgcolor, bgcolor;
2393 glyph = bytestream2_get_byteu(&
ctx->gb);
2394 bgcolor =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2395 fgcolor =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2404 uint16_t *
dst =
ctx->frm0 + cx + cy *
ctx->pitch;
2406 if (block_size == 2) {
2410 dst[0] = bytestream2_get_le16u(&
ctx->gb);
2411 dst[1] = bytestream2_get_le16u(&
ctx->gb);
2412 dst[pitch] = bytestream2_get_le16u(&
ctx->gb);
2413 dst[pitch + 1] = bytestream2_get_le16u(&
ctx->gb);
2415 uint16_t fgcolor, bgcolor;
2421 glyph = bytestream2_get_byteu(&
ctx->gb);
2422 bgcolor = bytestream2_get_le16u(&
ctx->gb);
2423 fgcolor = bytestream2_get_le16u(&
ctx->gb);
2433 int start_pos = cx +
mx + (cy +
my) *
ctx->pitch;
2434 int end_pos = start_pos + (block_size - 1) * (
ctx->pitch + 1);
2436 int good = start_pos >= 0 && end_pos < (
ctx->buf_size >> 1);
2440 "Ignoring invalid motion vector (%i, %i)->(%u, %u), block size = %u\n",
2441 cx +
mx, cy +
my, cx, cy, block_size);
2454 opcode = bytestream2_get_byteu(&
ctx->gb);
2470 if (
ctx->width > 761) {
2477 ctx->frm2 + cx +
mx +
ctx->pitch * (cy +
my),
2478 blk_size,
ctx->pitch);
2484 index = bytestream2_get_le16u(&
ctx->gb);
2491 ctx->frm2 + cx +
mx +
ctx->pitch * (cy +
my),
2492 blk_size,
ctx->pitch);
2497 ctx->frm1 + cx +
ctx->pitch * cy,
2498 blk_size,
ctx->pitch);
2512 ctx->small_codebook[opcode - 0xf9], blk_size,
ctx->pitch);
2518 ctx->codebook[bytestream2_get_byteu(&
ctx->gb)], blk_size,
ctx->pitch);
2524 bytestream2_get_le16u(&
ctx->gb), blk_size,
ctx->pitch);
2527 if (blk_size == 2) {
2537 if (
bl16_block(
ctx, cx + blk_size, cy + blk_size, blk_size))
2549 for (cy = 0; cy <
ctx->aligned_height; cy += 8)
2550 for (cx = 0; cx <
ctx->aligned_width; cx += 8)
2563 uint8_t *
dst = (uint8_t*)
ctx->frm0;
2569 npixels =
ctx->npixels;
2582 int npixels =
ctx->npixels;
2583 uint16_t *frm =
ctx->frm0;
2590 *frm++ =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2602 uint16_t hh, hw,
c1,
c2, *dst1, *dst2;
2607 hh = (
ctx->height + 1) >> 1;
2608 dst1 = (uint16_t *)
ctx->frm0 +
ctx->pitch;
2610 hw = (
ctx->width - 1) >> 1;
2611 c1 =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2616 c2 =
ctx->codebook[bytestream2_get_byteu(&
ctx->gb)];
2621 dst1 +=
ctx->pitch * 2;
2629 dst1 =
ctx->frm0 + (
ctx->pitch * 2);
2630 hh = (
ctx->height - 1) >> 1;
2635 c1 = *(dst2 -
ctx->pitch);
2636 c2 = *(dst2 +
ctx->pitch);
2639 dst1 +=
ctx->pitch * 2;
2646 uint16_t *pdest =
ctx->frm0;
2648 long npixels =
ctx->npixels;
2651 if (!
ctx->rle_buf) {
2655 rsrc =
ctx->rle_buf;
2661 *pdest++ =
ctx->codebook[*rsrc++];
2677 const uint8_t *
src = sanm ? (uint8_t *)
ctx->frm0 : (uint8_t *)
ctx->fbuf;
2679 ptrdiff_t dstpitch, srcpitch =
ctx->pitch * (sanm ?
sizeof(
ctx->frm0[0]) : 1);
2684 dst =
ctx->frame->data[0];
2685 dstpitch =
ctx->frame->linesize[0];
2688 memcpy(
dst,
src, srcpitch);
2699 int i,
ret,
w,
h, seq_num, codec, bg_color, rle_output_size, rcode;
2708 w = bytestream2_get_le32u(&
ctx->gb);
2709 h = bytestream2_get_le32u(&
ctx->gb);
2711 if (
w !=
ctx->width ||
h !=
ctx->height) {
2716 seq_num = bytestream2_get_le16u(&
ctx->gb);
2717 codec = bytestream2_get_byteu(&
ctx->gb);
2718 rcode = bytestream2_get_byteu(&
ctx->gb);
2722 for (
i = 0;
i < 4;
i++)
2723 ctx->small_codebook[
i] = bytestream2_get_le16u(&
ctx->gb);
2724 bg_color = bytestream2_get_le16u(&
ctx->gb);
2728 rle_output_size = bytestream2_get_le32u(&
ctx->gb);
2729 if (rle_output_size >
w *
ctx->aligned_height * 2) {
2732 rle_output_size =
w *
ctx->aligned_height * 2;
2735 for (
i = 0;
i < 256;
i++)
2736 ctx->codebook[
i] = bytestream2_get_le16u(&
ctx->gb);
2755 case 3: memcpy(
ctx->frm0,
ctx->frm2,
ctx->frm2_size);
break;
2756 case 4: memcpy(
ctx->frm0,
ctx->frm1,
ctx->frm1_size);
break;
2768 "Subcodec %d: error decoding frame.\n", codec);
2785 int i,
ret, to_store = 0, have_img = 0;
2792 sig = bytestream2_get_be32u(&
ctx->gb);
2793 size = bytestream2_get_be32u(&
ctx->gb);
2801 case MKBETAG(
'N',
'P',
'A',
'L'):
2804 "Incorrect palette block size %"PRIu32
".\n",
size);
2808 ctx->pal[
i] = 0xFFU << 24 | bytestream2_get_be24u(&
ctx->gb);
2809 if (
ctx->subversion < 2)
2810 ctx->pal[0] = 0xFF
U << 24;
2812 case MKBETAG(
'F',
'O',
'B',
'J'):
2829 if (
ctx->subversion < 2) {
2830 if (size <= ctx->stored_frame_size) {
2839 memcpy(
ctx->stored_frame,
ctx->fbuf,
ctx->buf_size);
2840 ctx->stor_size =
ctx->buf_size;
2845 case MKBETAG(
'X',
'P',
'A',
'L'):
2849 case MKBETAG(
'S',
'T',
'O',
'R'):
2852 case MKBETAG(
'F',
'T',
'C',
'H'):
2853 if (
ctx->subversion < 2) {
2856 have_img = (
ret == 0) ? 1 : 0;
2858 if (
ctx->stor_size > 0) {
2859 memcpy(
ctx->fbuf,
ctx->stored_frame,
ctx->buf_size);
2867 "Unknown/unsupported chunk %"PRIx32
".\n", sig);
2878 if (bytestream2_peek_byte(&
ctx->gb) == 0)
2886 memcpy(
ctx->frame->data[1],
ctx->pal, 1024);
2901 if (!
ctx->version) {