EDGEPT *make_tess_edgepts( //make tess edgepts POLYPT_LIST *edgeptlist, //list to convert TPOINT &tl, //bounding box TPOINT &br) { inT32 index; POLYPT_IT it = edgeptlist; //iterator POLYPT *edgept; //current edgept EDGEPT *head; //output list EDGEPT *tail; //end of list EDGEPT *tessedgept; head = NULL; tail = NULL; tl.x = MAX_INT16; tl.y = -MAX_INT16; br.x = -MAX_INT16; br.y = MAX_INT16; for (it.mark_cycle_pt (); !it.cycled_list ();) { edgept = it.data (); tessedgept = newedgept (); tessedgept->pos.x = (inT16) edgept->pos.x (); tessedgept->pos.y = (inT16) edgept->pos.y (); if (tessedgept->pos.x < tl.x) tl.x = tessedgept->pos.x; if (tessedgept->pos.x > br.x) br.x = tessedgept->pos.x; if (tessedgept->pos.y > tl.y) tl.y = tessedgept->pos.y; if (tessedgept->pos.y < br.y) br.y = tessedgept->pos.y; if (head != NULL && tessedgept->pos.x == tail->pos.x && tessedgept->pos.y == tail->pos.y) { oldedgept(tessedgept); } else { for (index = 0; index < EDGEPTFLAGS; index++) tessedgept->flags[index] = 0; if (head != NULL) { tail->vec.x = tessedgept->pos.x - tail->pos.x; tail->vec.y = tessedgept->pos.y - tail->pos.y; tessedgept->prev = tail; } tessedgept->next = head; if (head) tail->next = tessedgept; else head = tessedgept; tail = tessedgept; } it.forward (); } head->prev = tail; tail->vec.x = head->pos.x - tail->pos.x; tail->vec.y = head->pos.y - tail->pos.y; if (head == tail) { oldedgept(head); return NULL; //empty } return head; }
/********************************************************************** * restore_outline_tree * * Copy the list of outlines. **********************************************************************/ EDGEPT *restore_outline(EDGEPT *start) { EDGEPT *srcpt; EDGEPT *real_start; EDGEPT *deadpt; if (start == NULL) return NULL; srcpt = start; do { if (srcpt->flags[1] == 2) break; srcpt = srcpt->next; } while (srcpt != start); real_start = srcpt; do { if (srcpt->flags[1] == 0) { deadpt = srcpt; srcpt = srcpt->next; srcpt->prev = deadpt->prev; deadpt->prev->next = srcpt; deadpt->prev->vec.x = srcpt->pos.x - deadpt->prev->pos.x; deadpt->prev->vec.y = srcpt->pos.y - deadpt->prev->pos.y; oldedgept(deadpt); } else srcpt = srcpt->next; } while (srcpt != real_start); return real_start; }
/********************************************************************** * unsplit_outlines * * Remove the split that was put between these two points. **********************************************************************/ void unsplit_outlines(EDGEPT *p1, EDGEPT *p2) { EDGEPT *tmp1 = p1->next; EDGEPT *tmp2 = p2->next; assert (p1 != p2); tmp1->next->prev = p2; tmp2->next->prev = p1; p1->next = tmp2->next; p2->next = tmp1->next; oldedgept(tmp1); oldedgept(tmp2); p1->vec.x = p1->next->pos.x - p1->pos.x; p1->vec.y = p1->next->pos.y - p1->pos.y; p2->vec.x = p2->next->pos.x - p2->pos.x; p2->vec.y = p2->next->pos.y - p2->pos.y; }