ccstruct/normalis.cpp

Go to the documentation of this file.
00001 
00020 #include "mfcpch.h"
00021 #include          "werd.h"
00022 #include          "normalis.h"
00023 
00024 /* ================== */
00030 const DENORM_SEG *DENORM::binary_search_segment(float src_x) const {
00031   int bottom, top, middle;       //binary search
00032 
00033   bottom = 0;
00034   top = segments;
00035   do {
00036     middle = (bottom + top) / 2;
00037     if (segs[middle].xstart > src_x)
00038       top = middle;
00039     else
00040       bottom = middle;
00041   }
00042   while (top - bottom > 1);
00043   return &segs[bottom];
00044 }
00045 
00046 /* ================== */
00050 float DENORM::scale_at_x(float src_x) const {  // In normalized coords.
00051   if (segments != 0) {
00052     const DENORM_SEG* seg = binary_search_segment(src_x);
00053     if (seg->scale_factor > 0.0)
00054       return seg->scale_factor;
00055   }
00056   return scale_factor;
00057 }
00058 
00059 /* ================== */
00063 float DENORM::yshift_at_x(float src_x) const {  // In normalized coords.
00064   if (segments != 0) {
00065     const DENORM_SEG* seg = binary_search_segment(src_x);
00066     if (seg->ycoord == -MAX_INT32) {
00067       if (base_is_row)
00068         return source_row->base_line(x(src_x)/scale_at_x(src_x) + x_centre);
00069       else
00070         return m * x(src_x) + c;
00071     } else {
00072       return seg->ycoord;
00073     }
00074   }
00075   return source_row->base_line (x(src_x)/scale_at_x(src_x) + x_centre);
00076 }
00077 
00078 /* ================== */
00082 float DENORM::x(             //convert x coord
00083                 float src_x  //coord to convert
00084                ) const {
00085   return src_x / scale_at_x(src_x) + x_centre;
00086 }
00087 
00088 
00089 /* ================== */
00093 float DENORM::y(                  //convert y coord
00094                 float src_y,      //coord to convert
00095                 float src_centre  //x location for base
00096                ) const {
00097   return (src_y - bln_baseline_offset) / scale_at_x(src_centre)
00098     + yshift_at_x(src_centre);
00099 }
00100 
00101 
00102 /* ================== */
00106 DENORM::DENORM(float x,              //from same pieces
00107                float scaling,
00108                double line_m,        //default line
00109                double line_c,
00110                INT16 seg_count,      //no of segments
00111                DENORM_SEG *seg_pts,  //actual segments
00112                BOOL8 using_row,      //as baseline
00113                ROW *src) {
00114   x_centre = x;                  //just copy
00115   scale_factor = scaling;
00116   source_row = src;
00117   if (seg_count > 0) {
00118     segs = new DENORM_SEG[seg_count];
00119     for (segments = 0; segments < seg_count; segments++) {
00123       if (segments == 0 || segs[segments - 1].xstart <=
00124           seg_pts[segments].xstart) {
00125         segs[segments] = seg_pts[segments];
00126       } else {
00127         int i;
00128         for (i = 0; i < segments
00129              && segs[segments - 1 - i].xstart > seg_pts[segments].xstart;
00130              ++i) {
00131           segs[segments - i ] = segs[segments - 1 - i];
00132         }
00133         segs[segments - i] = seg_pts[segments];
00134       }
00135     }//for
00136   }
00137   else {
00138     segments = 0;
00139     segs = NULL;
00140   }
00141   base_is_row = using_row;
00142   m = line_m;
00143   c = line_c;
00144 }
00145 
00146 
00147 /* ================== */
00151 DENORM::DENORM(const DENORM &src) { 
00152   segments = 0;
00153   segs = NULL;
00154   *this = src;
00155 }
00156 
00157 
00158 /* ================== */
00162 DENORM & DENORM::operator= (const DENORM & src) {
00163   x_centre = src.x_centre;
00164   scale_factor = src.scale_factor;
00165   source_row = src.source_row;
00166   if (segments > 0)
00167     delete[]segs;
00168   if (src.segments > 0) {
00169     segs = new DENORM_SEG[src.segments];
00170     for (segments = 0; segments < src.segments; segments++)
00171       segs[segments] = src.segs[segments];
00172   }
00173   else {
00174     segments = 0;
00175     segs = NULL;
00176   }
00177   base_is_row = src.base_is_row;
00178   m = src.m;
00179   c = src.c;
00180   return *this;
00181 }

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