Index: trunk/src/libcschem/cnc_arc.c =================================================================== --- trunk/src/libcschem/cnc_arc.c (revision 572) +++ trunk/src/libcschem/cnc_arc.c (revision 573) @@ -35,12 +35,12 @@ { csch_arc_t *arc; - arc = htip_get(&sheet->id2obj, oid); + arc = htip_get(&parent->id2obj, oid); if (arc != NULL) return NULL; arc = calloc(sizeof(csch_arc_t), 1); - csch_cobj_init(&arc->hdr, sheet, oid, CSCH_CTYPE_ARC, CSCH_INVALID_OID); + csch_cobj_init(&arc->hdr, sheet, parent, oid, CSCH_CTYPE_ARC); return arc; } @@ -50,9 +50,9 @@ free(arc); } -csch_arc_t *csch_arc_get(csch_sheet_t *sheet, csch_oid_t oid) +csch_arc_t *csch_arc_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid) { - csch_arc_t *arc = htip_get(&sheet->id2obj, oid); + csch_arc_t *arc = htip_get(&grp->id2obj, oid); if ((arc != NULL) && (arc->hdr.type != CSCH_CTYPE_ARC)) return NULL; return arc; Index: trunk/src/libcschem/cnc_arc.h =================================================================== --- trunk/src/libcschem/cnc_arc.h (revision 572) +++ trunk/src/libcschem/cnc_arc.h (revision 573) @@ -43,6 +43,6 @@ csch_arc_t *csch_arc_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_arc_free(csch_arc_t *arc); -csch_arc_t *csch_arc_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_arc_t *csch_arc_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); #endif Index: trunk/src/libcschem/cnc_bitmap.c =================================================================== --- trunk/src/libcschem/cnc_bitmap.c (revision 572) +++ trunk/src/libcschem/cnc_bitmap.c (revision 573) @@ -34,12 +34,12 @@ { csch_cbitmap_t *bitmap; - bitmap = htip_get(&sheet->id2obj, oid); + bitmap = htip_get(&parent->id2obj, oid); if (bitmap != NULL) return NULL; bitmap = calloc(sizeof(csch_cbitmap_t), 1); - csch_cobj_init(&bitmap->hdr, sheet, oid, CSCH_CTYPE_BITMAP, CSCH_INVALID_OID); + csch_cobj_init(&bitmap->hdr, sheet, parent, oid, CSCH_CTYPE_BITMAP); return bitmap; } @@ -49,9 +49,9 @@ free(bitmap); } -csch_cbitmap_t *csch_cbitmap_get(csch_sheet_t *sheet, csch_oid_t oid) +csch_cbitmap_t *csch_cbitmap_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid) { - csch_cbitmap_t *bitmap = htip_get(&sheet->id2obj, oid); + csch_cbitmap_t *bitmap = htip_get(&grp->id2obj, oid); if ((bitmap != NULL) && (bitmap->hdr.type != CSCH_CTYPE_BITMAP)) return NULL; return bitmap; Index: trunk/src/libcschem/cnc_bitmap.h =================================================================== --- trunk/src/libcschem/cnc_bitmap.h (revision 572) +++ trunk/src/libcschem/cnc_bitmap.h (revision 573) @@ -40,6 +40,6 @@ csch_cbitmap_t *csch_cbitmap_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_cbitmap_free(csch_cbitmap_t *bitmap); -csch_cbitmap_t *csch_cbitmap_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_cbitmap_t *csch_cbitmap_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); #endif Index: trunk/src/libcschem/cnc_conn.c =================================================================== --- trunk/src/libcschem/cnc_conn.c (revision 572) +++ trunk/src/libcschem/cnc_conn.c (revision 573) @@ -34,12 +34,12 @@ { csch_conn_t *conn; - conn = htip_get(&sheet->id2obj, oid); + conn = htip_get(&parent->id2obj, oid); if (conn != NULL) return NULL; conn = calloc(sizeof(csch_conn_t), 1); - csch_cobj_init(&conn->hdr, sheet, oid, CSCH_CTYPE_CONN, CSCH_INVALID_OID); + csch_cobj_init(&conn->hdr, sheet, parent, oid, CSCH_CTYPE_CONN); return conn; } @@ -51,7 +51,7 @@ csch_conn_t *csch_conn_get(csch_sheet_t *sheet, csch_oid_t oid) { - csch_conn_t *conn = htip_get(&sheet->id2obj, oid); + csch_conn_t *conn = htip_get(&sheet->direct.id2obj, oid); if ((conn != NULL) && (conn->hdr.type != CSCH_CTYPE_CONN)) return NULL; return conn; Index: trunk/src/libcschem/cnc_grp.c =================================================================== --- trunk/src/libcschem/cnc_grp.c (revision 572) +++ trunk/src/libcschem/cnc_grp.c (revision 573) @@ -30,17 +30,24 @@ #include "cnc_grp.h" #include "cnc_obj.h" +csch_cgrp_t *csch_cgrp_init(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_cgrp_t *parent, csch_oid_t oid) +{ + csch_cobj_init(&grp->hdr, sheet, parent, oid, CSCH_CTYPE_GRP); + htip_init(&grp->id2obj, longhash, longkeyeq); + return grp; +} + + csch_cgrp_t *csch_cgrp_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid) { csch_cgrp_t *grp; - grp = htip_get(&sheet->id2obj, oid); + grp = htip_get(&parent->id2obj, oid); if (grp != NULL) return NULL; grp = calloc(sizeof(csch_cgrp_t), 1); - csch_cobj_init(&grp->hdr, sheet, oid, CSCH_CTYPE_GRP, CSCH_INVALID_OID); - return grp; + return csch_cgrp_init(sheet, grp, parent, oid); } void csch_cgrp_free(csch_cgrp_t *grp) @@ -49,9 +56,9 @@ free(grp); } -csch_cgrp_t *csch_cgrp_get(csch_sheet_t *sheet, csch_oid_t oid) +csch_cgrp_t *csch_cgrp_get(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid) { - csch_cgrp_t *grp = htip_get(&sheet->id2obj, oid); + csch_cgrp_t *grp = htip_get(&parent->id2obj, oid); if ((grp != NULL) && (grp->hdr.type != CSCH_CTYPE_GRP)) return NULL; return grp; @@ -64,12 +71,12 @@ { csch_cgrp_ref_t *grp; - grp = htip_get(&sheet->id2obj, oid); + grp = htip_get(&parent->id2obj, oid); if (grp != NULL) return NULL; grp = calloc(sizeof(csch_cgrp_ref_t), 1); - csch_cobj_init(&grp->hdr, sheet, oid, CSCH_CTYPE_GRP, CSCH_INVALID_OID); + csch_cobj_init(&grp->hdr, sheet, parent, oid, CSCH_CTYPE_GRP); return grp; } @@ -79,9 +86,9 @@ free(grp); } -csch_cgrp_ref_t *csch_cgrp_refget(csch_sheet_t *sheet, csch_oid_t oid) +csch_cgrp_ref_t *csch_cgrp_refget(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid) { - csch_cgrp_ref_t *grp = htip_get(&sheet->id2obj, oid); + csch_cgrp_ref_t *grp = htip_get(&parent->id2obj, oid); if ((grp != NULL) && (grp->hdr.type != CSCH_CTYPE_GRP)) return NULL; return grp; Index: trunk/src/libcschem/cnc_grp.h =================================================================== --- trunk/src/libcschem/cnc_grp.h (revision 572) +++ trunk/src/libcschem/cnc_grp.h (revision 573) @@ -42,13 +42,13 @@ csch_cgrp_t *csch_cgrp_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_cgrp_free(csch_cgrp_t *grp); -csch_cgrp_t *csch_cgrp_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_cgrp_t *csch_cgrp_get(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); /*** standard calls on group refs ***/ csch_cgrp_ref_t *csch_cgrp_ref_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_cgrp_ref_free(csch_cgrp_ref_t *grp); -csch_cgrp_ref_t *csch_cgrp_ref_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_cgrp_ref_t *csch_cgrp_ref_get(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); /*** non-standard calls on groups ***/ void csch_cgrp_insert_(csch_cgrp_t *grp, csch_chdr_t *hdr); Index: trunk/src/libcschem/cnc_line.c =================================================================== --- trunk/src/libcschem/cnc_line.c (revision 572) +++ trunk/src/libcschem/cnc_line.c (revision 573) @@ -35,12 +35,12 @@ { csch_line_t *line; - line = htip_get(&sheet->id2obj, oid); + line = htip_get(&parent->id2obj, oid); if (line != NULL) return NULL; line = calloc(sizeof(csch_line_t), 1); - csch_cobj_init(&line->hdr, sheet, oid, CSCH_CTYPE_LINE, CSCH_INVALID_OID); + csch_cobj_init(&line->hdr, sheet, parent, oid, CSCH_CTYPE_LINE); return line; } @@ -50,9 +50,9 @@ free(line); } -csch_line_t *csch_line_get(csch_sheet_t *sheet, csch_oid_t oid) +csch_line_t *csch_line_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid) { - csch_line_t *line = htip_get(&sheet->id2obj, oid); + csch_line_t *line = htip_get(&grp->id2obj, oid); if ((line != NULL) && (line->hdr.type != CSCH_CTYPE_LINE)) return NULL; return line; Index: trunk/src/libcschem/cnc_line.h =================================================================== --- trunk/src/libcschem/cnc_line.h (revision 572) +++ trunk/src/libcschem/cnc_line.h (revision 573) @@ -40,7 +40,7 @@ csch_line_t *csch_line_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_line_free(csch_line_t *line); -csch_line_t *csch_line_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_line_t *csch_line_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); void csch_line_update(csch_line_t *line); #endif Index: trunk/src/libcschem/cnc_loop.h =================================================================== --- trunk/src/libcschem/cnc_loop.h (revision 572) +++ trunk/src/libcschem/cnc_loop.h (revision 573) @@ -29,56 +29,58 @@ /*** API ***/ /* Iterate over sheet objects */ -typedef struct csch_sheeto_iter_s csch_sheeto_iter_t; -csch_inline csch_chdr_t *csch_sheeto_first(csch_sheeto_iter_t *it, const csch_sheet_t *sheet); -csch_inline csch_chdr_t *csch_sheeto_next(csch_sheeto_iter_t *it); +typedef struct csch_grpo_iter_s csch_grpo_iter_t; +csch_inline csch_chdr_t *csch_grpo_first(csch_grpo_iter_t *it, const csch_sheet_t *sheet, const csch_cgrp_t *grp); +csch_inline csch_chdr_t *csch_grpo_next(csch_grpo_iter_t *it); /* this one also includes removed objects in the iteration */ -csch_inline csch_chdr_t *csch_sheeto_first_with_rem(csch_sheeto_iter_t *it, const csch_sheet_t *sheet); +csch_inline csch_chdr_t *csch_grpo_first_with_rem(csch_grpo_iter_t *it, const csch_sheet_t *sheet, const csch_cgrp_t *grp); /*** Implementation ***/ -struct csch_sheeto_iter_s { +struct csch_grpo_iter_s { unsigned removed:1; const csch_sheet_t *sheet; + const csch_cgrp_t *grp; htip_entry_t *e; }; -csch_inline csch_chdr_t *csch_sheeto_first_(csch_sheeto_iter_t *it, const csch_sheet_t *sheet) +csch_inline csch_chdr_t *csch_grpo_first_(csch_grpo_iter_t *it, const csch_sheet_t *sheet, const csch_cgrp_t *grp) { csch_chdr_t *h; it->sheet = sheet; - it->e = htip_first(&it->sheet->id2obj); + it->grp = grp; + it->e = htip_first(&it->grp->id2obj); if (it->e == NULL) return NULL; h = it->e->value; if ((!it->removed) && (h->removed)) - return csch_sheeto_next(it); + return csch_grpo_next(it); return h; } -csch_inline csch_chdr_t *csch_sheeto_first(csch_sheeto_iter_t *it, const csch_sheet_t *sheet) +csch_inline csch_chdr_t *csch_grpo_first(csch_grpo_iter_t *it, const csch_sheet_t *sheet, const csch_cgrp_t *grp) { it->removed = 0; - return csch_sheeto_first_(it, sheet); + return csch_grpo_first_(it, sheet, grp); } -csch_inline csch_chdr_t *csch_sheeto_first_with_rem(csch_sheeto_iter_t *it, const csch_sheet_t *sheet) +csch_inline csch_chdr_t *csch_grpo_first_with_rem(csch_grpo_iter_t *it, const csch_sheet_t *sheet, const csch_cgrp_t *grp) { it->removed = 1; - return csch_sheeto_first_(it, sheet); + return csch_grpo_first_(it, sheet, grp); } -csch_inline csch_chdr_t *csch_sheeto_next(csch_sheeto_iter_t *it) +csch_inline csch_chdr_t *csch_grpo_next(csch_grpo_iter_t *it) { for(;;) { csch_chdr_t *h; - it->e = htip_next(&it->sheet->id2obj, it->e); + it->e = htip_next(&it->grp->id2obj, it->e); if (it->e == NULL) return NULL; Index: trunk/src/libcschem/cnc_obj.h =================================================================== --- trunk/src/libcschem/cnc_obj.h (revision 572) +++ trunk/src/libcschem/cnc_obj.h (revision 573) @@ -46,7 +46,7 @@ /* Initialize an object by setting the common header fields; the only purpose of this function is to get compiler warnings at every caller when the header is extended (because the number of args would be extended here) */ -csch_inline void csch_cobj_init(csch_chdr_t *dst, csch_sheet_t *sheet, csch_oid_t oid, csch_ctype_t type, csch_oid_t parent) +csch_inline void csch_cobj_init(csch_chdr_t *dst, csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid, csch_ctype_t type) { dst->oid = oid; dst->type = type; @@ -55,8 +55,8 @@ dst->sheet = sheet; csch_bbox_reset(&dst->bbox); csch_attrib_init(&dst->attr); - htip_set(&sheet->id2obj, oid, dst); - + if (dst->parent != NULL) + htip_set(&parent->id2obj, oid, dst); } csch_inline void csch_cobj_uninit(csch_chdr_t *dst) @@ -64,8 +64,8 @@ csch_chdr_t *o; #ifndef NDEBUG - if (dst->sheet != NULL) { - o = htip_pop(&dst->sheet->id2obj, dst->oid); + if ((dst->sheet != NULL) && (dst->parent != NULL)) { + o = htip_pop(&dst->parent->id2obj, dst->oid); if (o != NULL) assert(o == dst); } Index: trunk/src/libcschem/cnc_pen.c =================================================================== --- trunk/src/libcschem/cnc_pen.c (revision 572) +++ trunk/src/libcschem/cnc_pen.c (revision 573) @@ -42,12 +42,12 @@ { csch_cpen_t *pen; - pen = htip_get(&sheet->id2obj, oid); + pen = htip_get(&parent->id2obj, oid); if (pen != NULL) return NULL; pen = calloc(sizeof(csch_cpen_t), 1); - csch_cobj_init(&pen->hdr, sheet, oid, CSCH_CTYPE_PEN, CSCH_INVALID_OID); + csch_cobj_init(&pen->hdr, sheet, parent, oid, CSCH_CTYPE_PEN); return pen; } @@ -58,7 +58,7 @@ /* remove cached pens from any object */ if (sheet != NULL) { - for(e = htip_first(&sheet->id2obj); e; e = htip_next(&sheet->id2obj, e)) { + for(e = htip_first(&pen->hdr.parent->id2obj); e; e = htip_next(&pen->hdr.parent->id2obj, e)) { csch_chdr_t *hdr = e->value; if ((hdr->pen_oid == pen->hdr.oid) || (hdr->pen == pen)) hdr->pen = NULL; @@ -69,9 +69,9 @@ } -csch_cpen_t *csch_pen_get(csch_sheet_t *sheet, csch_oid_t oid) +csch_cpen_t *csch_pen_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid) { - csch_cpen_t *pen = htip_get(&sheet->id2obj, oid); + csch_cpen_t *pen = htip_get(&grp->id2obj, oid); if ((pen != NULL) && (pen->hdr.type != CSCH_CTYPE_PEN)) return NULL; return pen; Index: trunk/src/libcschem/cnc_pen.h =================================================================== --- trunk/src/libcschem/cnc_pen.h (revision 572) +++ trunk/src/libcschem/cnc_pen.h (revision 573) @@ -46,7 +46,7 @@ csch_cpen_t *csch_pen_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_pen_free(csch_cpen_t *pen); -csch_cpen_t *csch_pen_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_cpen_t *csch_pen_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); extern csch_cpen_t csch_pen_default_unknown; @@ -54,9 +54,9 @@ csch_inline csch_cpen_t *csch_pen_(csch_chdr_t *hdr) { if (hdr->pen == NULL) { - csch_sheet_t *sheet = hdr->sheet; - if (sheet != NULL) - hdr->pen = csch_pen_get(sheet, hdr->pen_oid); + csch_cgrp_t *grp = hdr->parent; + if (grp != NULL) + hdr->pen = csch_pen_get(hdr->sheet, grp, hdr->pen_oid); } if (hdr->pen == NULL) return &csch_pen_default_unknown; Index: trunk/src/libcschem/cnc_poly.c =================================================================== --- trunk/src/libcschem/cnc_poly.c (revision 572) +++ trunk/src/libcschem/cnc_poly.c (revision 573) @@ -34,12 +34,12 @@ { csch_cpoly_t *poly; - poly = htip_get(&sheet->id2obj, oid); + poly = htip_get(&parent->id2obj, oid); if (poly != NULL) return NULL; poly = calloc(sizeof(csch_cpoly_t), 1); - csch_cobj_init(&poly->hdr, sheet, oid, CSCH_CTYPE_POLY, CSCH_INVALID_OID); + csch_cobj_init(&poly->hdr, sheet, parent, oid, CSCH_CTYPE_POLY); return poly; } @@ -49,9 +49,9 @@ free(poly); } -csch_cpoly_t *csch_cpoly_get(csch_sheet_t *sheet, csch_oid_t oid) +csch_cpoly_t *csch_cpoly_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid) { - csch_cpoly_t *poly = htip_get(&sheet->id2obj, oid); + csch_cpoly_t *poly = htip_get(&grp->id2obj, oid); if ((poly != NULL) && (poly->hdr.type != CSCH_CTYPE_POLY)) return NULL; return poly; Index: trunk/src/libcschem/cnc_poly.h =================================================================== --- trunk/src/libcschem/cnc_poly.h (revision 572) +++ trunk/src/libcschem/cnc_poly.h (revision 573) @@ -39,6 +39,6 @@ csch_cpoly_t *csch_cpoly_alloc(csch_sheet_t *sheet, csch_cgrp_t *parent, csch_oid_t oid); void csch_cpoly_free(csch_cpoly_t *poly); -csch_cpoly_t *csch_cpoly_get(csch_sheet_t *sheet, csch_oid_t oid); +csch_cpoly_t *csch_cpoly_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); #endif Index: trunk/src/libcschem/concrete.c =================================================================== --- trunk/src/libcschem/concrete.c (revision 572) +++ trunk/src/libcschem/concrete.c (revision 573) @@ -36,11 +36,11 @@ { csch_sheet_t *sheet = calloc(sizeof(csch_sheet_t), 1); - htip_init(&sheet->id2obj, longhash, longkeyeq); csch_rtree_init(&sheet->rtree); - csch_cobj_init(&sheet->direct.hdr, sheet, oid, CSCH_CTYPE_GRP, CSCH_INVALID_OID); - csch_cobj_init(&sheet->indirect.hdr, sheet, oid, CSCH_CTYPE_GRP, CSCH_INVALID_OID); - sheet->next_id = oid+1; + + csch_cgrp_init(sheet, &sheet->direct.hdr, NULL, oid); + csch_cgrp_init(sheet, &sheet->indirect.hdr, NULL, oid); + csch_bbox_invalidate(&sheet->bbox); return sheet; } @@ -53,18 +53,17 @@ #warning TODO: free all objects in the hash csch_rtree_uninit(&sheet->rtree); - htip_uninit(&sheet->id2obj); free(sheet->filename); free(sheet); } -void csch_sheet_bbox_update(csch_sheet_t *sheet) +static void csch_sheet_bbox_update_(csch_sheet_t *sheet, csch_cgrp_t *grp) { csch_chdr_t *h; - csch_sheeto_iter_t it; + csch_grpo_iter_t it; csch_bbox_reset(&sheet->bbox); - for(h = csch_sheeto_first(&it, sheet); h != NULL; h = csch_sheeto_next(&it)) { + for(h = csch_grpo_first(&it, sheet, grp); h != NULL; h = csch_grpo_next(&it)) { if (csch_bbox_is_invalid(&h->bbox)) continue; csch_bbox_bump(&sheet->bbox, x, h->bbox.x1); @@ -74,8 +73,13 @@ } } -csch_oid_t csch_oid_new(csch_sheet_t *sheet) +void csch_sheet_bbox_update(csch_sheet_t *sheet) { - assert(sheet->next_id < CSCH_MAX_OID); - return sheet->next_id++; + csch_sheet_bbox_update_(sheet, &sheet->direct); } + +csch_oid_t csch_oid_new(csch_sheet_t *sheet, csch_cgrp_t *grp) +{ + assert(grp->next_id < CSCH_MAX_OID); + return grp->next_id++; +} Index: trunk/src/libcschem/concrete.h =================================================================== --- trunk/src/libcschem/concrete.h (revision 572) +++ trunk/src/libcschem/concrete.h (revision 573) @@ -37,6 +37,7 @@ /* Forward declare basic types other objects depend on */ typedef struct csch_pen_s csch_cpen_t; typedef struct csch_sheet_s csch_sheet_t; +typedef struct csch_cgrp_s csch_cgrp_t; typedef enum csch_ctype_s { CSCH_CTYPE_INVALID = 0, @@ -53,7 +54,7 @@ struct csch_chdr_s { csch_oid_t oid; csch_ctype_t type; - csch_oid_t parent; + csch_cgrp_t *parent; htsp_t attr; unsigned removed:1; csch_oid_t pen_oid; @@ -64,14 +65,14 @@ csch_rtree_box_t bbox; }; -typedef struct csch_cgrp_s { /* type=CSCH_CTYPE_GRP */ +struct csch_cgrp_s { /* type=CSCH_CTYPE_GRP */ csch_chdr_t hdr; - htip_t memb; /* id -> object pointer (primary storage); rarely delete from this (undo needs deleted objects) */ + htip_t id2obj; /* members (memb): id -> object pointer (primary storage); rarely delete from this (undo needs deleted objects) */ csch_oid_t next_id; double rot; csch_coord_t xc, yc, x, y; -} csch_cgrp_t; +}; struct csch_sheet_s { csch_rtree_t rtree; /* IDs in screen coords */ @@ -102,7 +103,7 @@ csch_inline const csch_rtree_box_t *csch_sheet_bbox(csch_sheet_t *sheet); void csch_sheet_bbox_update(csch_sheet_t *sheet); -csch_oid_t csch_oid_new(csch_sheet_t *sheet); +csch_oid_t csch_oid_new(csch_sheet_t *sheet, csch_cgrp_t *grp); /*** implementation ***/ Index: trunk/src/plugins/export_animator/export_animator.c =================================================================== --- trunk/src/plugins/export_animator/export_animator.c (revision 572) +++ trunk/src/plugins/export_animator/export_animator.c (revision 573) @@ -94,7 +94,7 @@ { FILE *f; csch_chdr_t *h; - csch_sheeto_iter_t it; + csch_grpo_iter_t it; ctx_t ctx; const csch_rtree_box_t *shbb; csch_coord_t mx, my; @@ -115,7 +115,7 @@ ctx.fn = fn; ctx.f = f; ctx.sheet = src; - for(h = csch_sheeto_first(&it, src); h != NULL; h = csch_sheeto_next(&it)) + for(h = csch_grpo_first(&it, src, &src->direct); h != NULL; h = csch_grpo_next(&it)) anim_draw_obj(&ctx, h); fprintf(f, "flush\n"); Index: trunk/src/plugins/io_lihata/read.c =================================================================== --- trunk/src/plugins/io_lihata/read.c (revision 572) +++ trunk/src/plugins/io_lihata/read.c (revision 573) @@ -83,7 +83,7 @@ } /* Convert an oid from string, making sure there's no duplicate */ -static csch_oid_t load_oid(read_ctx_t *ctx, lht_node_t *nd, const char *oids) +static csch_oid_t load_oid(read_ctx_t *ctx, csch_cgrp_t *parent, lht_node_t *nd, const char *oids) { csch_oid_t oid; char *end; @@ -94,13 +94,13 @@ return 0; } - if ((htip_get(&ctx->sheet->id2obj, oid) != NULL) || (oid == ctx->sheet->direct.hdr.oid)) { + if ((htip_get(&parent->id2obj, oid) != NULL) || (oid == ctx->sheet->direct.hdr.oid)) { error(nd, ("duplicate oid %lu\n", oid)); return 0; } - if (oid >= ctx->sheet->next_id) - ctx->sheet->next_id = oid+1; + if (oid >= parent->next_id) + parent->next_id = oid+1; return oid; } @@ -108,7 +108,7 @@ /* Make sure node name matches the expected name and node type matches the expected type. On match, parse or invent the oid and return it. On error return 0. */ -csch_oid_t check_type_oid_(read_ctx_t *ctx, lht_node_t *nd, const char *name, int namelen, lht_node_type_t type) +csch_oid_t check_type_oid_(read_ctx_t *ctx, csch_cgrp_t *grp, lht_node_t *nd, const char *name, int namelen, lht_node_type_t type) { const char *oids; csch_oid_t oid; @@ -124,19 +124,21 @@ oids = nd->name + namelen; #warning TODO: delayed ID allocation! - if (*oids == '\0') - return ctx->sheet->next_id++; + if (*oids == '\0') { + return -1; +/* return ctx->sheet->next_id++;*/ + } if (*oids != '.') { error(nd, ("invalid ID appendix or wrong node name (expected %s. got %s)\n", name, nd->name)); return 0; } - return load_oid(ctx, nd, oids+1); + return load_oid(ctx, grp, nd, oids+1); } /* shorthand with compile-time string length */ -#define check_type_oid(ctx, nd, name, type) \ - check_type_oid_(ctx, nd, #name, strlen(#name), type) +#define check_type_oid(ctx, grp, nd, name, type) \ + check_type_oid_(ctx, grp, nd, #name, strlen(#name), type) #warning TODO: revise whether this is needed at all #if 0 @@ -184,7 +186,7 @@ if (sep != NULL) { len = sep - nd->name; - oid = load_oid(ctx, nd, sep+1); + oid = load_oid(ctx, parent, nd, sep+1); if (oid == 0) return -1; } @@ -338,7 +340,7 @@ } -static int parse_pens(read_ctx_t *ctx, lht_node_t *subtree) +static int parse_pens(read_ctx_t *ctx, csch_cgrp_t *grp, lht_node_t *subtree) { lht_node_t *ndpen; lht_dom_iterator_t it; @@ -352,7 +354,7 @@ } for(ndpen = lht_dom_first(&it, subtree); ndpen != NULL; ndpen = lht_dom_next(&it)) { - csch_oid_t oid = check_type_oid(ctx, ndpen, pen, LHT_HASH); + csch_oid_t oid = check_type_oid(ctx, grp, ndpen, pen, LHT_HASH); csch_cpen_t *pen; if (oid == 0) return -1; @@ -481,6 +483,7 @@ } parent = direct ? &ctx->sheet->direct : &ctx->sheet->indirect; + return dispatch_subtree(ctx, parent, subtree, objs_tbl, 1); } @@ -493,8 +496,10 @@ /* parse_uid(&ctx->sheet->uid, lht_dom_hash_get(subtree, "uid"));*/ if (parse_attribs(ctx, &ctx->sheet->direct.hdr.attr, lht_dom_hash_get(subtree, "attrib")) != 0) return -1; - if (parse_pens(ctx, lht_dom_hash_get(subtree, "pens")) != 0) + + if (parse_pens(ctx, &ctx->sheet->direct, lht_dom_hash_get(subtree, "pens")) != 0) return -1; + if (parse_sheet_objs(ctx, lht_dom_hash_get(subtree, "obj_indirect"), 0) != 0) return -1; if (parse_sheet_objs(ctx, lht_dom_hash_get(subtree, "obj_direct"), 1) != 0)