double Get_Skew::histogram( const Raster &raster, double angle) { int i; double sum; double mean; double angle_diff = tan(angle / (180.0 / M_PI)); int diff_y = -static_cast<int>( raster.width() * angle_diff); int min_y = max( 0, diff_y); int max_y = min( static_cast<int>( raster.height()) , raster.height() + diff_y); int num_rows; Fixed dx; int dy; if (raster.height() > m_max_rows) { delete []m_rows; m_rows = new unsigned[ raster.height()]; m_max_rows = raster.height(); } num_rows = (max_y - min_y) / m_sample_skip + 1; if (angle < 0) { dy = -1; } else { dy = +1; } if ((-0.05 < angle) && (angle < 0.05)) { dx = static_cast<int>( raster.width()); } else { dx = dy / (tan( angle / (180.0 / M_PI))); } for (i = 0; i < num_rows; ++i) { m_rows[ i] = cast_ray( raster, min_y + i * m_sample_skip, dx, dy); } sum = 0.0; for (i = 0; i < num_rows; ++i) { sum += m_rows[ i]; } mean = sum / num_rows; sum = 0.0; for (i = 0; i < num_rows; ++i) { sum += sqr( m_rows[ i] - mean); } return sum / num_rows; }
bool Invert::do_invert( const Raster &src, Raster &dest) { try { if (&src != &dest) { dest.redimension( src.width(), src.height(), src.depth(), src.interp()); } size_t words = src.data_words(); Raster_Word * s = src.raster_word(); Raster_Word * d = src.raster_word(); for (size_t i = 0; i < words; ++i) { d[ i] = ~s[ i]; } return true; } catch (...) { return false; } }
unsigned Get_Skew::cast_ray( const Raster &raster, int row, const Fixed &dx, int dy) { unsigned bits = 0; Fixed start = 0; Fixed end = 0; Fixed width = static_cast<int>( raster.width()); int r = row; while (start < width) { end = start + dx; if (end > width) { end = width; } bits += bit_count( raster[ r] , static_cast<int>( start) , static_cast<int>( end)); start = end; r += dy; } return bits; }