Changeset 3478
- Timestamp:
- May 19, 2009, 2:46:34 PM (14 years ago)
- Location:
- libcaca/trunk/caca/codec
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/caca/codec/export.c
r3451 r3478 163 163 { 164 164 char *data, *cur; 165 int f, n;166 167 /* 52 bytes for the header:165 int f, i, n; 166 167 /* at least 72 bytes for the header: 168 168 * - 4 bytes for "\xCA\xCA" + "CV" 169 * - 16 bytes for the canvas header 170 * - 32 bytes for the frame info 169 * - 20 bytes for the canvas header 170 * - 16 bytes for each dirty rectangle info 171 * - 32 bytes for each frame info 171 172 * 8 bytes for each character cell */ 172 *bytes = 2 0+ (32 + 8 * cv->width * cv->height) * cv->framecount;173 *bytes = 24 + 16 * cv->ndirty + (32 + 8 * cv->width * cv->height) * cv->framecount; 173 174 cur = data = malloc(*bytes); 174 175 … … 177 178 178 179 /* canvas_header */ 179 cur += sprintu32(cur, 16+ 32 * cv->framecount);180 cur += sprintu32(cur, 20 + 16 * cv->ndirty + 32 * cv->framecount); 180 181 cur += sprintu32(cur, cv->width * cv->height * 8 * cv->framecount); 181 cur += sprintu16(cur, 0x0001); 182 cur += sprintu16(cur, 0x0002); 183 cur += sprintu32(cur, cv->ndirty); 182 184 cur += sprintu32(cur, cv->framecount); 183 185 cur += sprintu16(cur, 0x0000); 186 187 /* dirty rectangles info */ 188 for(i = 0; i < cv->ndirty; i++) 189 { 190 cur += sprintu32(cur, cv->dirty_xmin); 191 cur += sprintu32(cur, cv->dirty_ymin); 192 cur += sprintu32(cur, cv->dirty_xmax); 193 cur += sprintu32(cur, cv->dirty_ymax); 194 } 184 195 185 196 /* frame_info */ -
libcaca/trunk/caca/codec/import.c
r3451 r3478 224 224 uint8_t const *buf = (uint8_t const *)data; 225 225 size_t control_size, data_size, expected_size; 226 unsigned int frames, f, n, offset;226 unsigned int frames, f, i, n, offset, ndirty; 227 227 uint16_t version, flags; 228 228 int32_t xmin = 0, ymin = 0, xmax = 0, ymax = 0; 229 230 if(size < 20) 229 int dirty_xmin, dirty_ymin, dirty_xmax, dirty_ymax; 230 231 if(size < 36) 231 232 return 0; 232 233 … … 240 241 data_size = sscanu32(buf + 8); 241 242 version = sscanu16(buf + 12); 242 frames = sscanu32(buf + 14); 243 flags = sscanu16(buf + 18); 243 ndirty = sscanu32(buf + 14); 244 frames = sscanu32(buf + 18); 245 flags = sscanu16(buf + 22); 246 247 if(version != 2) 248 { 249 debug("caca import error: only version 2 import is supported"); 250 goto invalid_caca; 251 } 244 252 245 253 if(size < 4 + control_size + data_size) 246 254 return 0; 247 255 248 if(control_size < 16 + frames * 32)256 if(control_size < 20 + ndirty * 16 + frames * 32) 249 257 { 250 258 debug("caca import error: control size %u < expected %u", 251 (unsigned int)control_size, 16+ frames * 32);259 (unsigned int)control_size, 32 + frames * 32); 252 260 goto invalid_caca; 261 } 262 263 /* dirty rectangles info */ 264 cv->ndirty = ndirty; 265 for(i = 0; i < ndirty; i++) 266 { 267 dirty_xmin = sscanu32(buf + 4 + 20 + 16 * i); 268 dirty_ymin = sscanu32(buf + 4 + 20 + 16 * i + 4); 269 dirty_xmax = sscanu32(buf + 4 + 20 + 16 * i + 8); 270 dirty_ymax = sscanu32(buf + 4 + 20 + 16 * i + 12); 253 271 } 254 272 … … 259 277 int x, y, handlex, handley; 260 278 261 width = sscanu32(buf + 4 + 16+ f * 32);262 height = sscanu32(buf + 4 + 16+ f * 32 + 4);263 duration = sscanu32(buf + 4 + 16+ f * 32 + 8);264 attr = sscanu32(buf + 4 + 16+ f * 32 + 12);265 x = (int32_t)sscanu32(buf + 4 + 16+ f * 32 + 16);266 y = (int32_t)sscanu32(buf + 4 + 16+ f * 32 + 20);267 handlex = (int32_t)sscanu32(buf + 4 + 16+ f * 32 + 24);268 handley = (int32_t)sscanu32(buf + 4 + 16+ f * 32 + 28);279 width = sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32); 280 height = sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32 + 4); 281 duration = sscanu32(buf + 4 + + f * 32 + 8); 282 attr = sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32 + 12); 283 x = (int32_t)sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32 + 16); 284 y = (int32_t)sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32 + 20); 285 handlex = (int32_t)sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32 + 24); 286 handley = (int32_t)sscanu32(buf + 4 + 20 + 16 * ndirty + f * 32 + 28); 269 287 expected_size += width * height * 8; 270 288 if(-handlex < xmin) … … 297 315 unsigned int width, height; 298 316 299 width = sscanu32(buf + 4 + 16 + f * 32);300 height = sscanu32(buf + 4 + 16 + f * 32 + 4);317 width = sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32); 318 height = sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32 + 4); 301 319 caca_create_frame(cv, f); 302 320 caca_set_frame(cv, f); 303 321 304 cv->curattr = sscanu32(buf + 4 + 16 + f * 32 + 12);305 cv->frames[f].x = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 16);306 cv->frames[f].y = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 20);307 cv->frames[f].handlex = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 24);308 cv->frames[f].handley = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 28);322 cv->curattr = sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32 + 12); 323 cv->frames[f].x = (int32_t)sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32 + 16); 324 cv->frames[f].y = (int32_t)sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32 + 20); 325 cv->frames[f].handlex = (int32_t)sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32 + 24); 326 cv->frames[f].handley = (int32_t)sscanu32(buf + 4 + 20 + ndirty * 16 + f * 32 + 28); 309 327 310 328 /* FIXME: check for return value */
Note: See TracChangeset
for help on using the changeset viewer.