Index: trunk/src/libcschem/cnc_any_obj.c =================================================================== --- trunk/src/libcschem/cnc_any_obj.c (revision 3539) +++ trunk/src/libcschem/cnc_any_obj.c (revision 3540) @@ -142,7 +142,7 @@ switch(obj->type) { case CSCH_CTYPE_LINE: return csch_line_hash((csch_line_t *)obj); case CSCH_CTYPE_ARC: return csch_arc_hash((csch_arc_t *)obj); - case CSCH_CTYPE_POLY: /*return csch_poly_hash((csch_poly_t *)obj);*/ + case CSCH_CTYPE_POLY: return csch_cpoly_hash((csch_cpoly_t *)obj); case CSCH_CTYPE_TEXT: /*return csch_text_hash((csch_text_t *)obj);*/ case CSCH_CTYPE_BITMAP: /*return csch_bitmap_hash((csch_bitmap_t *)obj);*/ case CSCH_CTYPE_CONN: /*return csch_conn_hash((csch_conn_t *)obj);*/ @@ -162,7 +162,7 @@ switch(obj1->type) { case CSCH_CTYPE_LINE: return csch_line_keyeq((csch_line_t *)obj1, (csch_line_t *)obj2); case CSCH_CTYPE_ARC: return csch_arc_keyeq((csch_arc_t *)obj1, (csch_arc_t *)obj2); - case CSCH_CTYPE_POLY: /*return csch_poly_keyeq((csch_poly_t *)obj1, (csch_poly_t *)obj2);*/ + case CSCH_CTYPE_POLY: return csch_cpoly_keyeq((csch_cpoly_t *)obj1, (csch_cpoly_t *)obj2); case CSCH_CTYPE_TEXT: /*return csch_text_keyeq((csch_text_t *)obj1, (csch_text_t *)obj2);*/ case CSCH_CTYPE_BITMAP: /*return csch_bitmap_keyeq((csch_bitmap_t *)obj1, (csch_bitmap_t *)obj2);*/ case CSCH_CTYPE_CONN: /*return csch_conn_keyeq((csch_conn_t *)obj1, (csch_conn_t *)obj2);*/ Index: trunk/src/libcschem/cnc_poly.c =================================================================== --- trunk/src/libcschem/cnc_poly.c (revision 3539) +++ trunk/src/libcschem/cnc_poly.c (revision 3540) @@ -35,6 +35,7 @@ #include "event.h" #include "concrete.h" #include "cnc_obj.h" +#include "cnc_any_obj.h" #include "cnc_arc.h" #include "operation.h" #include "op_common.h" @@ -357,7 +358,35 @@ poly_inst2spec }; +unsigned csch_cpoly_hash(const csch_cpoly_t *poly) +{ + unsigned res = csch_chdr_hash(&poly->hdr); + long n; + res ^= ((unsigned)poly->has_stroke) << 13; + res ^= ((unsigned)poly->has_fill) << 15; + res ^= ((unsigned)poly->outline.used) << 3; + + for(n = 0; n < poly->outline.used; n++) + res ^= csch_cobj_hash(&poly->outline.array[n].hdr); + + return res; + +} + +int csch_cpoly_keyeq(const csch_cpoly_t *p1, const csch_cpoly_t *p2) +{ + long n; + if (!csch_chdr_eq(&p1->hdr, &p2->hdr)) return 0; + if (p1->has_stroke != p2->has_stroke) return 0; + if (p1->has_fill != p2->has_fill) return 0; + if (p1->outline.used != p2->outline.used) return 0; + for(n = 0; n < p1->outline.used; n++) + if (!csch_cobj_keyeq(&p1->outline.array[n].hdr, &p2->outline.array[n].hdr)) + return 0; + return 1; +} + /*** Modify ***/ typedef struct { csch_cpoly_t *poly; /* it is safe to save the object pointer because it is persistent (through the removed object list) */ Index: trunk/src/libcschem/cnc_poly.h =================================================================== --- trunk/src/libcschem/cnc_poly.h (revision 3539) +++ trunk/src/libcschem/cnc_poly.h (revision 3540) @@ -45,6 +45,10 @@ csch_cpoly_t *csch_cpoly_get(csch_sheet_t *sheet, csch_cgrp_t *grp, csch_oid_t oid); void csch_poly_update(csch_sheet_t *sheet, csch_cpoly_t *poly, int do_xform); +unsigned csch_cpoly_hash(const csch_cpoly_t *poly); +int csch_cpoly_keyeq(const csch_cpoly_t *p1, const csch_cpoly_t *p2); + + void csch_cpoly_modify(csch_sheet_t *sheet, csch_cpoly_t *poly, int *has_stroke, int *has_fill, int undoable); /* Call these to change poly outline in an undoable manner: