📄 drawtord.cpp
字号:
/********************************************************************** * File: drawtord.cpp (Formerly drawto.c) * Description: Draw things to do with textord. * Author: Ray Smith * Created: Thu Jul 30 15:40:57 BST 1992 * * (C) Copyright 1992, Hewlett-Packard Ltd. ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** http://www.apache.org/licenses/LICENSE-2.0 ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. * **********************************************************************/#include "mfcpch.h"#include "pithsync.h"#include "topitch.h"#include "drawtord.h"#include "debugwin.h"#define TO_WIN_XPOS -1 //default window pos#define TO_WIN_YPOS 0#define TO_WIN_NAME "Textord" //title of window#define DEBUG_WIN_NAME "TODebug"#define DEBUG_XPOS 0#define DEBUG_YPOS 120#define DEBUG_XSIZE 80#define DEBUG_YSIZE 32#define YMAX 3508#define XMAX 2550#define EXTERNEXTERN BOOL_VAR (textord_show_fixed_cuts, FALSE,"Draw fixed pitch cell boundaries");EXTERN STRING_VAR (to_debugfile, DEBUG_WIN_NAME, "Name of debugfile");EXTERN STRING_VAR (to_smdfile, NO_SMD, "Name of SMD file");EXTERN WINDOW to_win = NO_WINDOW;EXTERN FILE *to_debug = NULL;/********************************************************************** * create_to_win * * Create the to window used to show the fit. **********************************************************************/void create_to_win( //make features win ICOORD page_tr //size of page ) { if (strcmp (to_smdfile.string (), NO_SMD)) { to_win = create_window (to_smdfile.string (), SMDWINDOW, 0, 0, page_tr.x () + 1, page_tr.y () + 1, 0.0, page_tr.x (), 0.0, page_tr.y (), TRUE, FALSE, TRUE, TRUE); } else { to_win = create_window (TO_WIN_NAME, SCROLLINGWIN, TO_WIN_XPOS, TO_WIN_YPOS, 0, 0, 0.0, page_tr.x (), 0.0, page_tr.y (), TRUE, FALSE, TRUE, TRUE); }}void close_to_win() { //make features win if (to_win != NO_WINDOW && strcmp (to_smdfile.string (), NO_SMD)) { destroy_window(to_win); overlap_picture_ops(TRUE); }}/********************************************************************** * create_todebug_win * * Create the to window used to show the fit. **********************************************************************/void create_todebug_win() { //make gradients win if (strcmp (to_debugfile.string (), DEBUG_WIN_NAME) != 0) // create_debug_window(); // else to_debug = fopen (to_debugfile.string (), "w");}/********************************************************************** * plot_blob_list * * Draw a list of blobs. **********************************************************************/void plot_blob_list( //make gradients win WINDOW win, //window to draw in BLOBNBOX_LIST *list, //blob list COLOUR body_colour, //colour to draw COLOUR child_colour //colour of child ) { BLOBNBOX_IT it = list; //iterator for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) { it.data ()->plot (win, body_colour, child_colour); }}/********************************************************************** * plot_box_list * * Draw a list of blobs. **********************************************************************/void plot_box_list( //make gradients win WINDOW win, //window to draw in BLOBNBOX_LIST *list, //blob list COLOUR body_colour //colour to draw ) { BLOBNBOX_IT it = list; //iterator perimeter_color_index(win, body_colour); interior_style(win, INT_HOLLOW, TRUE); for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) { it.data ()->bounding_box ().plot (win); }}/********************************************************************** * plot_to_row * * Draw the blobs of a row in a given colour and draw the line fit. **********************************************************************/void plot_to_row( //draw a row TO_ROW *row, //row to draw COLOUR colour, //colour to draw in FCOORD rotation //rotation for line ) { FCOORD plot_pt; //point to plot //blobs BLOBNBOX_IT it = row->blob_list (); float left, right; //end of row if (it.empty ()) { tprintf ("No blobs in row at %g\n", row->parallel_c ()); return; } left = it.data ()->bounding_box ().left (); it.move_to_last (); right = it.data ()->bounding_box ().right (); plot_blob_list (to_win, row->blob_list (), colour, BROWN); line_color_index(to_win, colour); plot_pt = FCOORD (left, row->line_m () * left + row->line_c ()); plot_pt.rotate (rotation); move2d (to_win, plot_pt.x (), plot_pt.y ()); plot_pt = FCOORD (right, row->line_m () * right + row->line_c ()); plot_pt.rotate (rotation); draw2d (to_win, plot_pt.x (), plot_pt.y ());}/********************************************************************** * plot_parallel_row * * Draw the blobs of a row in a given colour and draw the line fit. **********************************************************************/void plot_parallel_row( //draw a row TO_ROW *row, //row to draw float gradient, //gradients of lines INT32 left, //edge of block COLOUR colour, //colour to draw in FCOORD rotation //rotation for line ) { FCOORD plot_pt; //point to plot //blobs BLOBNBOX_IT it = row->blob_list (); float fleft = (float) left; //floating version float right; //end of row // left=it.data()->bounding_box().left(); it.move_to_last (); right = it.data ()->bounding_box ().right (); plot_blob_list (to_win, row->blob_list (), colour, BROWN); line_color_index(to_win, colour); plot_pt = FCOORD (fleft, gradient * left + row->max_y ()); plot_pt.rotate (rotation); move2d (to_win, plot_pt.x (), plot_pt.y ()); plot_pt = FCOORD (fleft, gradient * left + row->min_y ()); plot_pt.rotate (rotation); draw2d (to_win, plot_pt.x (), plot_pt.y ()); plot_pt = FCOORD (fleft, gradient * left + row->parallel_c ()); plot_pt.rotate (rotation); move2d (to_win, plot_pt.x (), plot_pt.y ()); plot_pt = FCOORD (right, gradient * right + row->parallel_c ()); plot_pt.rotate (rotation); draw2d (to_win, plot_pt.x (), plot_pt.y ());}/********************************************************************** * draw_occupation * * Draw the row occupation with points above the threshold in white * and points below the threshold in black. **********************************************************************/voiddraw_occupation ( //draw projectionINT32 xleft, //edge of blockINT32 ybottom, //bottom of blockINT32 min_y, //coordinate limitsINT32 max_y, INT32 occupation[], //projection countsINT32 thresholds[] //for drop out) { INT32 line_index; //pixel coord COLOUR colour; //of histogram float fleft = (float) xleft; //float version colour = WHITE; line_color_index(to_win, colour); move2d (to_win, fleft, (float) ybottom); for (line_index = min_y; line_index <= max_y; line_index++) { if (occupation[line_index - min_y] < thresholds[line_index - min_y]) { if (colour != BLUE) { colour = BLUE; line_color_index(to_win, colour); } } else { if (colour != WHITE) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -