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;
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 {
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 {
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(
00083 float src_x
00084 ) const {
00085 return src_x / scale_at_x(src_x) + x_centre;
00086 }
00087
00088
00089
00093 float DENORM::y(
00094 float src_y,
00095 float src_centre
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,
00107 float scaling,
00108 double line_m,
00109 double line_c,
00110 INT16 seg_count,
00111 DENORM_SEG *seg_pts,
00112 BOOL8 using_row,
00113 ROW *src) {
00114 x_centre = x;
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 }
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 }