Index: trunk/src/libcschem/cnc_any_obj.c =================================================================== --- trunk/src/libcschem/cnc_any_obj.c (revision 3541) +++ trunk/src/libcschem/cnc_any_obj.c (revision 3542) @@ -148,7 +148,7 @@ case CSCH_CTYPE_CONN: /*return csch_conn_hash((csch_conn_t *)obj);*/ case CSCH_CTYPE_GRP: case CSCH_CTYPE_GRP_REF: return csch_cgrp_hash((csch_cgrp_t *)obj); - case CSCH_CTYPE_PEN: /*return csch_pen_hash((csch_pen_t *)obj);*/ + case CSCH_CTYPE_PEN: return csch_pen_hash((csch_cpen_t *)obj); case CSCH_CTYPE_max: case CSCH_CTYPE_invalid: break; @@ -168,7 +168,7 @@ case CSCH_CTYPE_CONN: /*return csch_conn_keyeq((csch_conn_t *)obj1, (csch_conn_t *)obj2);*/ case CSCH_CTYPE_GRP: case CSCH_CTYPE_GRP_REF: return csch_cgrp_keyeq((csch_cgrp_t *)obj1, (csch_cgrp_t *)obj2); - case CSCH_CTYPE_PEN: /*return csch_pen_keyeq((csch_pen_t *)obj1, (csch_pen_t *)obj2);*/ + case CSCH_CTYPE_PEN: return csch_pen_keyeq((csch_cpen_t *)obj1, (csch_cpen_t *)obj2); case CSCH_CTYPE_max: case CSCH_CTYPE_invalid: break; Index: trunk/src/libcschem/cnc_pen.c =================================================================== --- trunk/src/libcschem/cnc_pen.c (revision 3541) +++ trunk/src/libcschem/cnc_pen.c (revision 3542) @@ -257,7 +257,43 @@ }; +/*** hash ***/ +unsigned csch_pen_hash(const csch_cpen_t *pen) +{ + unsigned res = csch_chdr_hash(&pen->hdr); + + res ^= strhash(pen->name.str); + res ^= ((unsigned)pen->shape); + res ^= csch_coord_hash(pen->size); + res ^= (unsigned)pen->color.r << 16 | (unsigned)pen->color.g << 8 | (unsigned)pen->color.b; + res ^= ((unsigned)pen->dash) << 3; + res ^= csch_coord_hash(pen->dash_period); + return res; +} + +int csch_pen_keyeq(const csch_cpen_t *p1, const csch_cpen_t *p2) +{ + if (!csch_chdr_eq(&p1->hdr, &p2->hdr)) return 0; + + if (p1->shape != p2->shape) return 0; + if (p1->size != p2->size) return 0; + if (p1->color.packed != p2->color.packed) return 0; + if (p1->dash != p2->dash) return 0; + if (p1->dash_period != p2->dash_period) return 0; + + if (p1->hdr.sheet == p2->hdr.sheet) { + if (p1->name.str != p2->name.str) return 0; + } + else { + if (strcmp(p1->name.str, p2->name.str) != 0) return 0; + } + + return 1; +} + + + /*** Modify ***/ typedef struct { csch_cpen_t *pen; /* it is safe to save the object pointer because it is persistent (through the removed object list) */ Index: trunk/src/libcschem/cnc_pen.h =================================================================== --- trunk/src/libcschem/cnc_pen.h (revision 3541) +++ trunk/src/libcschem/cnc_pen.h (revision 3542) @@ -72,7 +72,10 @@ void csch_pen_modify_tip(csch_sheet_t *sheet, csch_cpen_t *pen, csch_pen_shape_t *shape, csch_coord_t *size, rnd_color_t *color, char **name, unsigned short *dash, csch_coord_t *dash_period, int undoable); void csch_pen_modify_font(csch_sheet_t *sheet, csch_cpen_t *pen, csch_coord_t *font_height, char **font_family, char **font_style, int undoable); +unsigned csch_pen_hash(const csch_cpen_t *pen); +int csch_pen_keyeq(const csch_cpen_t *p1, const csch_cpen_t *p2); + extern csch_cpen_t csch_pen_default_unknown; /* Look up pen by name from within grp or NULL */