wordrec/makechop.cpp

Go to the documentation of this file.
00001 
00020 /*----------------------------------------------------------------------
00021       I n c l u d e s
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         Public Function Code
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       /* Outline is in 1st blob */
00077       if (outline1) {
00078         outline1->next = outline;
00079       }
00080       else {
00081         blob->outlines = outline;
00082       }
00083       outline1 = outline;
00084     }
00085     else {
00086       /* Outline is in 2nd blob */
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;                      /* Append other blob outlines */
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   /* Modify edge points */
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 }

Generated on Wed Feb 28 19:49:13 2007 for Tesseract by  doxygen 1.5.1