Changeset 1784 for libcaca


Ignore:
Timestamp:
Jun 28, 2007, 2:56:40 PM (13 years ago)
Author:
Sam Hocevar
Message:
  • Handle multiframe canvases in the caca importer, courtesy of Ben Wiley Sittler. Untested.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/cucul/import.c

    r1462 r1784  
    227227    unsigned int control_size, data_size, expected_size, frames, f, n;
    228228    uint16_t version, flags;
     229    unsigned int offset;
     230    int32_t xmin = 0, ymin = 0, xmax = 0, ymax = 0;
    229231
    230232    if(size < 20)
     
    259261        int x, y, handlex, handley;
    260262
    261         width = sscanu32(buf + 4 + 16 + f * 24);
    262         height = sscanu32(buf + 4 + 16 + f * 24 + 4);
    263         duration = sscanu32(buf + 4 + 16 + f * 24 + 8);
    264         attr = sscanu32(buf + 4 + 16 + f * 24 + 12);
    265         x = (int32_t)sscanu32(buf + 4 + 16 + f * 24 + 16);
    266         y = (int32_t)sscanu32(buf + 4 + 16 + f * 24 + 20);
    267         handlex = (int32_t)sscanu32(buf + 4 + 16 + f * 24 + 24);
    268         handley = (int32_t)sscanu32(buf + 4 + 16 + f * 24 + 28);
    269 
     263        width = sscanu32(buf + 4 + 16 + f * 32);
     264        height = sscanu32(buf + 4 + 16 + f * 32 + 4);
     265        duration = sscanu32(buf + 4 + 16 + f * 32 + 8);
     266        attr = sscanu32(buf + 4 + 16 + f * 32 + 12);
     267        x = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 16);
     268        y = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 20);
     269        handlex = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 24);
     270        handley = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 28);
    270271        expected_size += width * height * 8;
     272        if(-handlex < xmin)
     273            xmin = -handlex;
     274        if(-handley < ymin)
     275            ymin = -handley;
     276        if((((int32_t) width) - handlex) > xmax)
     277            xmax = ((int32_t) width) - handlex;
     278        if((((int32_t) height) - handley) > ymax)
     279            ymax = ((int32_t) height) - handley;
    271280    }
    272281
     
    278287    }
    279288
    280     /* FIXME: read all frames, not only the first one */
    281289    cucul_set_canvas_size(cv, 0, 0);
    282     cucul_set_canvas_size(cv, sscanu32(buf + 4 + 16),
    283                               sscanu32(buf + 4 + 16 + 4));
    284 
    285     /* FIXME: check for return value */
    286 
    287     for(n = sscanu32(buf + 4 + 16) * sscanu32(buf + 4 + 16 + 4); n--; )
    288     {
    289         cv->chars[n] = sscanu32(buf + 4 + control_size + 8 * n);
    290         cv->attrs[n] = sscanu32(buf + 4 + control_size + 8 * n + 4);
    291     }
    292 
    293     cv->curattr = sscanu32(buf + 4 + 16 + 12);
    294     cv->frames[0].x = (int32_t)sscanu32(buf + 4 + 16 + 0 * 24 + 16);
    295     cv->frames[0].y = (int32_t)sscanu32(buf + 4 + 16 + 0 * 24 + 20);
    296     cv->frames[0].handlex = (int32_t)sscanu32(buf + 4 + 16 + 0 * 24 + 24);
    297     cv->frames[0].handley = (int32_t)sscanu32(buf + 4 + 16 + 0 * 24 + 28);
     290    cucul_set_canvas_size(cv, xmax - xmin, ymax - ymin);
     291
     292    for (f = cucul_get_frame_count(cv); f--; )
     293    {
     294        cucul_free_frame(cv, f);
     295    }
     296
     297    for (offset = 0, f = 0; f < frames; f ++)
     298    {
     299        unsigned int width, height;
     300
     301        width = sscanu32(buf + 4 + 16 + f * 32);
     302        height = sscanu32(buf + 4 + 16 + f * 32 + 4);
     303        cucul_create_frame(cv, f);
     304        cucul_set_frame(cv, f);
     305
     306        cv->curattr = sscanu32(buf + 4 + 16 + f * 32 + 12);
     307        cv->frames[f].x = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 16);
     308        cv->frames[f].y = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 20);
     309        cv->frames[f].handlex = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 24);
     310        cv->frames[f].handley = (int32_t)sscanu32(buf + 4 + 16 + f * 32 + 28);
     311
     312        /* FIXME: check for return value */
     313
     314        for(n = width * height; n--; )
     315        {
     316            int x = (n % width) - cv->frames[f].handlex - xmin;
     317            int y = (n / width) - cv->frames[f].handley - ymin;
     318
     319            cucul_put_char(cv, x, y, sscanu32(buf + 4 + control_size
     320                                               + offset + 8 * n));
     321            cucul_put_attr(cv, x, y, sscanu32(buf + 4 + control_size
     322                                               + offset + 8 * n + 4));
     323        }
     324        offset += width * height * 8;
     325
     326        cv->frames[f].x -= cv->frames[f].handlex;
     327        cv->frames[f].y -= cv->frames[f].handley;
     328        cv->frames[f].handlex = -xmin;
     329        cv->frames[f].handley = -ymin;
     330    }
     331
     332    cucul_set_frame(cv, 0);
    298333
    299334    return 4 + control_size + data_size;
Note: See TracChangeset for help on using the changeset viewer.