Ignore:
Timestamp:
06/28/07 14:56:40 (6 years ago)
Author:
sam
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.