00001
00020
00021
00022
00023 #include "makechop.h"
00024 #include "render.h"
00025 #include "structures.h"
00026 #ifdef __UNIX__
00027 #include <assert.h>
00028 #include <unistd.h>
00029 #endif
00030
00031
00032
00033
00034
00039 void apply_seam(TBLOB *blob, TBLOB *other_blob, SEAM *seam) {
00040 check_outline_mem();
00041 if (seam->split1 == NULL) {
00042 divide_blobs (blob, other_blob, seam->location);
00043 }
00044 else if (seam->split2 == NULL) {
00045 make_split_blobs(blob, other_blob, seam);
00046 }
00047 else if (seam->split3 == NULL) {
00048 make_double_split(blob, other_blob, seam);
00049 }
00050 else {
00051 make_triple_split(blob, other_blob, seam);
00052 }
00053
00054 check_outline_mem();
00055 }
00056
00057
00058
00066 void divide_blobs(TBLOB *blob, TBLOB *other_blob, INT32 location) {
00067 TESSLINE *outline;
00068 TESSLINE *outline1 = NULL;
00069 TESSLINE *outline2 = NULL;
00070
00071 outline = blob->outlines;
00072 blob->outlines = NULL;
00073
00074 while (outline != NULL) {
00075 if ((outline->topleft.x + outline->botright.x) / 2 < location) {
00076
00077 if (outline1) {
00078 outline1->next = outline;
00079 }
00080 else {
00081 blob->outlines = outline;
00082 }
00083 outline1 = outline;
00084 }
00085 else {
00086
00087 if (outline2) {
00088 outline2->next = outline;
00089 }
00090 else {
00091 other_blob->outlines = outline;
00092 }
00093 outline2 = outline;
00094 }
00095
00096 outline = outline->next;
00097 }
00098
00099 if (outline1)
00100 outline1->next = NULL;
00101 if (outline2)
00102 outline2->next = NULL;
00103 }
00104
00105
00106
00111 void form_two_blobs(TBLOB *blob, TBLOB *other_blob, INT32 location) {
00112 setup_blob_outlines(blob);
00113
00114 divide_blobs(blob, other_blob, location);
00115
00116 eliminate_duplicate_outlines(blob);
00117 eliminate_duplicate_outlines(other_blob);
00118
00119 correct_blob_order(blob, other_blob);
00120
00121 #ifndef GRAPHICS_DISABLED
00122 if (chop_debug) {
00123 display_blob(blob, Red);
00124 #ifdef __UNIX__
00125 sleep (1);
00126 #endif
00127 display_blob(other_blob, Cyan);
00128 }
00129 #endif
00130 }
00131
00132
00133
00139 void make_double_split(TBLOB *blob, TBLOB *other_blob, SEAM *seam) {
00140 make_single_split (blob->outlines, seam->split1);
00141 make_single_split (blob->outlines, seam->split2);
00142 form_two_blobs (blob, other_blob, seam->location);
00143 }
00144
00145
00146
00152 void make_single_split(TESSLINE *outlines, SPLIT *split) {
00153 assert (outlines != NULL);
00154
00155 split_outline (split->point1, split->point2);
00156
00157 while (outlines->next != NULL)
00158 outlines = outlines->next;
00159
00160 outlines->next = newoutline ();
00161 outlines->next->loop = split->point1;
00162 outlines->next->child = NULL;
00163 setup_outline (outlines->next);
00164
00165 outlines = outlines->next;
00166
00167 outlines->next = newoutline ();
00168 outlines->next->loop = split->point2;
00169 outlines->next->child = NULL;
00170 setup_outline (outlines->next);
00171
00172 outlines->next->next = NULL;
00173 }
00174
00175
00176
00182 void make_split_blobs(TBLOB *blob, TBLOB *other_blob, SEAM *seam) {
00183 make_single_split (blob->outlines, seam->split1);
00184
00185 form_two_blobs (blob, other_blob, seam->location);
00186 }
00187
00188
00189
00197 void make_triple_split(TBLOB *blob, TBLOB *other_blob, SEAM *seam) {
00198 make_single_split (blob->outlines, seam->split1);
00199 make_single_split (blob->outlines, seam->split2);
00200 make_single_split (blob->outlines, seam->split3);
00201
00202 form_two_blobs (blob, other_blob, seam->location);
00203 }
00204
00205
00206
00213 void undo_seam(TBLOB *blob, TBLOB *other_blob, SEAM *seam) {
00214 TESSLINE *outline;
00215
00216 if (!seam)
00217 return;
00218 if (blob->outlines == NULL) {
00219 blob->outlines = other_blob->outlines;
00220 other_blob->outlines = NULL;
00221 }
00222
00223 outline = blob->outlines;
00224 while (outline->next)
00225 outline = outline->next;
00226 outline->next = other_blob->outlines;
00227 oldblob(other_blob);
00228
00229 if (seam->split1 == NULL) {
00230 }
00231 else if (seam->split2 == NULL) {
00232 undo_single_split (blob, seam->split1);
00233 }
00234 else if (seam->split3 == NULL) {
00235 undo_single_split (blob, seam->split1);
00236 undo_single_split (blob, seam->split2);
00237 }
00238 else {
00239 undo_single_split (blob, seam->split3);
00240 undo_single_split (blob, seam->split2);
00241 undo_single_split (blob, seam->split1);
00242 }
00243
00244 setup_blob_outlines(blob);
00245 eliminate_duplicate_outlines(blob);
00246
00247 check_outline_mem();
00248 }
00249
00250
00251
00258 void undo_single_split(TBLOB *blob, SPLIT *split) {
00259 TESSLINE *outline1;
00260 TESSLINE *outline2;
00261
00262 unsplit_outlines (split->point1, split->point2);
00263
00264 outline1 = newoutline ();
00265 outline1->next = blob->outlines;
00266 blob->outlines = outline1;
00267 outline1->loop = split->point1;
00268 outline1->child = NULL;
00269
00270 outline2 = newoutline ();
00271 outline2->next = blob->outlines;
00272 blob->outlines = outline2;
00273 outline2->loop = split->point2;
00274 outline2->child = NULL;
00275 }