X-Git-Url: https://git.kengrimes.com/?p=henge%2Fapc.git;a=blobdiff_plain;f=src%2Fir.c;fp=src%2Fir.c;h=857f73fb017bb3509fcafe40386cd20392677e5b;hp=bdf0d36e23468ad00a5f264aef40abea4d299380;hb=b14fd3a9556894089856bbee50ebe727d9b64635;hpb=d6c67861eaed9dc64d8bf2c1ddd91bf7a1f458fe diff --git a/src/ir.c b/src/ir.c index bdf0d36..857f73f 100644 --- a/src/ir.c +++ b/src/ir.c @@ -32,6 +32,11 @@ int ir_linker(void); int ir_condenser(void); /* Set data mem */ enum dtype { FSDAT, MSDAT, ADAT, LDAT, FBDAT }; +struct ir_facinglist_t; +struct ir_facinglist_t +{ struct ir_facinglist_t* nextsib; + apc_facing facing; +}; struct ir_namelist_t; struct ir_namelist_t { struct ir_namelist_t* nextsib; @@ -54,7 +59,9 @@ struct ir_setdata_header_t }; struct ir_framedata_t { struct ir_setdata_header_t header; - struct ir_frameinfo_t frameinfo; + apc_facing facing; + int w, h; + struct ir_facinglist_t* mirrorlist,* nextmirror; }; struct ir_framebox_t { struct ir_setdata_header_t header; @@ -96,7 +103,7 @@ struct ir_set_t static inline struct ir_framebox_t* ir_set_add_framebox(struct ir_set_t*,uint8_t*); static inline -union ir_setdata_t* ir_framedata (enum dtype,const uint8_t*,apc_facing,int,int); +union ir_setdata_t* ir_framedata (enum dtype,const uint8_t*,facinglist,int,int); static inline void ir_linkdata_resolve_set(union ir_setdata_t*); static inline @@ -398,17 +405,17 @@ void ir_set_assign_data switch (setdata->header.type) { case FSDAT: framebox = ir_set_add_framebox(set, setdata->header.data_name); - if (framebox->framesheets[setdata->framesheet.frameinfo.facing].header.data_name != NULL) + if (framebox->framesheets[setdata->framesheet.facing].header.data_name != NULL) wprintf("Duplicate framesheet [%i] %s\n", - setdata->framesheet.frameinfo.facing, setdata->header.data_name); - framebox->framesheets[setdata->framesheet.frameinfo.facing] = setdata->framesheet; + setdata->framesheet.facing, setdata->header.data_name); + framebox->framesheets[setdata->framesheet.facing] = setdata->framesheet; break; case MSDAT: framebox = ir_set_add_framebox(set, setdata->header.data_name); - if (framebox->mapsheets[setdata->mapsheet.frameinfo.facing].header.data_name != NULL) + if (framebox->mapsheets[setdata->mapsheet.facing].header.data_name != NULL) wprintf("Duplicate mapsheet [%i] %s\n", - setdata->mapsheet.frameinfo.facing, setdata->header.data_name); - framebox->mapsheets[setdata->mapsheet.frameinfo.facing] = setdata->mapsheet; + setdata->mapsheet.facing, setdata->header.data_name); + framebox->mapsheets[setdata->mapsheet.facing] = setdata->mapsheet; break; case ADAT: if (set->audio == NULL) @@ -486,28 +493,28 @@ void ir_data_assign_path } union ir_setdata_t* ir_framesheet -( const uint8_t* name, - apc_facing d, - int width, - int height +( const uint8_t* name, + struct ir_facinglist_t* facinglist, + int width, + int height ) -{ return ir_framedata(FSDAT, name, d, width, height); } +{ return ir_framedata(FSDAT, name, facinglist, width, height); } union ir_setdata_t* ir_mapsheet -( const uint8_t* name, - apc_facing d, - int width, - int height +( const uint8_t* name, + struct ir_facinglist_t* facinglist, + int width, + int height ) -{ return ir_framedata(MSDAT, name, d, width, height); } +{ return ir_framedata(MSDAT, name, facinglist, width, height); } static inline union ir_setdata_t* ir_framedata -( enum dtype type, - const uint8_t* name, - apc_facing d, - int width, - int height +( enum dtype type, + const uint8_t* name, + struct ir_facinglist_t* facinglist, + int width, + int height ) { struct ir_framedata_t* framedata = struct_alloc(ir_framedata_t); struct_clear(framedata); @@ -515,9 +522,17 @@ union ir_setdata_t* ir_framedata eprintf("Null name in set allocation\n"); framedata->header.type = type; framedata->header.data_name = name_alloc(name); - framedata->frameinfo.facing = d; - framedata->frameinfo.w = width; - framedata->frameinfo.h = height; + if (facinglist != NULL) + { framedata->facing = facinglist->facing; + framedata->mirrorlist = facinglist->nextsib; + } + else + { framedata->facing = SFACE; + framedata->mirrorlist = NULL; + } + framedata->nextmirror = framedata->mirrorlist; + framedata->w = width; + framedata->h = height; return (union ir_setdata_t*) framedata; } @@ -834,13 +849,40 @@ void ir_setdata_assign_name ( union ir_setdata_t* setdata, uint8_t* name ) { setdata->header.data_name = name;} +/* Create a new facinglist from an apc_facing */ +struct ir_facinglist_t* ir_facinglist +( apc_facing facing ) +{ struct ir_facinglist_t* list = struct_alloc(ir_facinglist_t); + list->facing = facing; + return list; +} + +/* Add a child to the facing list */ +struct ir_facinglist_t* ir_facinglist_push +( struct ir_facinglist_t* list, + apc_facing facing +) +{ struct ir_facinglist_t* iter = list; + if (iter != NULL) + { while (iter->nextsib != NULL) + iter = iter->nextsib; + iter->nextsib = struct_alloc(ir_facinglist_t); + iter->nextsib->facing = facing; + } + return list; +} + +#define assert_framebox(fbox) if (DEBUG) { \ + if (fbox->header.type != FBDAT) \ + eprintf("Data %s is not a framebox\n", fbox->header.data_name); \ + } + /* Return a framebox's specified framesheet */ union ir_setdata_t* ir_framebox_framesheet ( union ir_setdata_t* fbox, apc_facing facing ) -{ if (fbox->header.type != FBDAT) - eprintf("Data %s is not a framebox\n", fbox->header.data_name); +{ assert_framebox(fbox); return (union ir_setdata_t*) &fbox->framebox.framesheets[facing]; } @@ -849,19 +891,51 @@ union ir_setdata_t* ir_framebox_mapsheet ( union ir_setdata_t* fbox, apc_facing facing ) -{ if (fbox->header.type != FBDAT) - eprintf("Data %s is not a framebox\n", fbox->header.data_name); +{ assert_framebox(fbox); return (union ir_setdata_t*) &fbox->framebox.mapsheets[facing]; } +#define assert_framedata(fdat) if (DEBUG) { \ + if (fdat->header.type != MSDAT && fdat->header.type != FSDAT) \ + eprintf("Data %s is not a framedata\n", fdat->header.data_name); \ + } + +/* Return a framedata's frame info */ +int ir_framedata_width +( union ir_setdata_t* framedata ) +{ assert_framedata(framedata); + return framedata->mapsheet.w; +} + /* Return a framedata's frame info */ -struct ir_frameinfo_t* ir_framedata_frameinfo +int ir_framedata_height ( union ir_setdata_t* framedata ) -{ if (framedata->header.type != MSDAT && framedata->header.type != FSDAT) - eprintf("Data %s is not a framedata\n", framedata->header.data_name); - return &framedata->mapsheet.frameinfo; +{ assert_framedata(framedata); + return framedata->mapsheet.h; } +/* Return the next facing in the framedata's facing list, and reset the + 'nextmirror' head to mirrorlist, so that 'ir_framedata_nextmirror' will now + refer to the second facing in the framedata */ +apc_facing ir_framedata_firstfacing +( union ir_setdata_t* framedata ) +{ assert_framedata(framedata); + framedata->mapsheet.nextmirror = framedata->mapsheet.mirrorlist; + return framedata->mapsheet.facing; +} + +/* Return the next facing for this framedata, incrementing the 'nextmirror' + head. Returns FACING_MAX when there are no more facings to return. */ +apc_facing ir_framedata_nextfacing +( union ir_setdata_t* framedata ) +{ apc_facing facing; + assert_framedata(framedata); + if (framedata->mapsheet.nextmirror == NULL) + return FACING_MAX; + facing = framedata->mapsheet.nextmirror->facing; + framedata->mapsheet.nextmirror = framedata->mapsheet.nextmirror->nextsib; + return facing; +} /** Allocators **/ static