📄 pgedit.cpp
字号:
/********************************************************************** * pgeditor_read_file() * * Deserialise source file **********************************************************************/void pgeditor_read_file( //of serialised file STRING &name, BLOCK_LIST *blocks //block list to add to ) { int c; //input character FILE *infp; //input file BLOCK_IT block_it(blocks); //iterator BLOCK *block; //current block ICOORD page_tr; //topright of page char *filename_extension; block_it.move_to_last (); // ptr to last dot filename_extension = strrchr (name.string (), '.'); #ifdef __UNIX__ /* TEXTROW* tessrows; TBLOB* tessblobs; TPOINT tess_tr; if (strcmp( filename_extension, ".r" ) == 0) { tprintf( "Converting from .r file format.\n" ); tessrows = get_tess_row_file( name.string(), //get the row file &tess_tr ); page_tr = ICOORD( tess_tr.x, tess_tr.y ); make_blocks_from_rows( tessrows, name.string(), //reconstruct blocks page_tr, TRUE, &block_it ); } else if (strcmp( filename_extension, ".b" ) == 0) { tprintf( "Converting from .b file format.\n" ); tessblobs = get_tess_blob_file( name.string(), //get the blob file &tess_tr ); page_tr = ICOORD( tess_tr.x, tess_tr.y ); make_blocks_from_blobs( tessblobs, name.string(), //reconstruct blocks page_tr, FALSE,blocks); } else*/ if (strcmp (filename_extension, ".pb") == 0) { tprintf ("Converting from .pb file format.\n"); //construct blocks read_and_textord (name.string (), blocks); } else #endif if ((strcmp (filename_extension, ".pg") == 0) || // read a .pg file // or a .sp file (strcmp (filename_extension, ".sp") == 0)) { tprintf ("Reading %s file format.\n", filename_extension); infp = fopen (name.string (), "r"); if (infp == NULL) CANTOPENFILE.error ("pgeditor_read_file", EXIT, name.string ()); //can't open file while (((c = fgetc (infp)) != EOF) && (ungetc (c, infp) != EOF)) { //get one block = BLOCK::de_serialise (infp); //add to list block_it.add_after_then_move (block); } fclose(infp); } else { edges_and_textord (name.string (), blocks); }}/********************************************************************** * pgeditor_show_point() * * Display the coordinates of a point in the command window **********************************************************************/void pgeditor_show_point( //display coords GRAPHICS_EVENT *event) { char msg[160]; sprintf (msg, "Pointing at (%f, %f)", event->x, event->y); command_window->msg (msg);}/********************************************************************** * pgeditor_write_file() * * Serialise a block list to file * **********************************************************************/void pgeditor_write_file( //serialise char *name, //file name BLOCK_LIST *blocks //block list to write ) { FILE *infp; //input file BLOCK_IT block_it(blocks); //block iterator BLOCK *block; //current block ROW_IT row_it; //row iterator infp = fopen (name, "w"); //create output file if (infp == NULL) CANTCREATEFILE.error ("pgeditor_write_file", EXIT, name); for (block_it.mark_cycle_pt (); !block_it.cycled_list (); block_it.forward ()) { block = block_it.extract (); row_it.set_to_list (block->row_list ()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) //ensure correct row_it.data ()->recalc_bounding_box (); block->serialise (infp); //serialize non-empty block_it.add_after_then_move (block); } fclose(infp);}/********************************************************************** * process_cmd_win_event() * * Process a command returned from the command window * (Just call the appropriate command handler) **********************************************************************/BOOL8 process_cmd_win_event( //UI command semantics INT32 cmd_event, //which menu item? char *new_value //any prompt data ) { char msg[160]; BOOL8 exit = FALSE; char response_str[MAX_CHARS + 1]; char *token; //first response token switch (cmd_event) { case NULL_CMD_EVENT: break; case VIEW_CMD_EVENT: do_view_cmd(); break; case CHANGE_DISP_CMD_EVENT: case DELETE_CMD_EVENT: case CHANGE_TEXT_CMD_EVENT: case TOGGLE_SEG_CMD_EVENT: case DUMP_WERD_CMD_EVENT: case SHOW_POINT_CMD_EVENT: case ROW_SPACE_STAT_CMD_EVENT: case BLOCK_SPACE_STAT_CMD_EVENT: case SHOW_BLN_WERD_CMD_EVENT: case SEGMENT_WERD_CMD_EVENT: mode = (CMD_EVENTS) cmd_event; break; case COPY_CMD_EVENT: mode = (CMD_EVENTS) cmd_event; if (!viewing_source) command_window->msg ("Can't COPY while viewing target!"); break; case BOUNDING_BOX_CMD_EVENT: if (new_value[0] == 'T') word_display_mode.turn_on_bit (DF_BOX); else word_display_mode.turn_off_bit (DF_BOX); command_window->press_radio_button (modes_menu_item, change_display_menu_item); mode = CHANGE_DISP_CMD_EVENT; break; case CORRECT_TEXT_CMD_EVENT: if (new_value[0] == 'T') word_display_mode.turn_on_bit (DF_TEXT); else word_display_mode.turn_off_bit (DF_TEXT); command_window->press_radio_button (modes_menu_item, change_display_menu_item); mode = CHANGE_DISP_CMD_EVENT; break; case POLYGONAL_CMD_EVENT: if (new_value[0] == 'T') word_display_mode.turn_on_bit (DF_POLYGONAL); else word_display_mode.turn_off_bit (DF_POLYGONAL); command_window->press_radio_button (modes_menu_item, change_display_menu_item); mode = CHANGE_DISP_CMD_EVENT; break; case BL_NORM_CMD_EVENT: if (new_value[0] == 'T') word_display_mode.turn_on_bit (DF_BN_POLYGONAL); else word_display_mode.turn_off_bit (DF_BN_POLYGONAL); command_window->press_radio_button (modes_menu_item, change_display_menu_item); mode = CHANGE_DISP_CMD_EVENT; break; case BITMAP_CMD_EVENT: if (new_value[0] == 'T') word_display_mode.turn_on_bit (DF_EDGE_STEP); else word_display_mode.turn_off_bit (DF_EDGE_STEP); command_window->press_radio_button (modes_menu_item, change_display_menu_item); mode = CHANGE_DISP_CMD_EVENT; break; case UNIFORM_DISP_CMD_EVENT: do_re_display(&word_set_display); *current_image_changed = TRUE; break; case WRITE_CMD_EVENT: do_write_file(new_value); break; case SMD_CMD_EVENT: smd_cmd(); break; case TIDY_CMD_EVENT: if (!target_block_list.empty ()) { viewing_source = TRUE; //Force viewing target do_tidy_cmd(); } break; case NEW_SOURCE_CMD_EVENT: do_new_source(new_value); break; case IMAGE_CMD_EVENT: display_image = (new_value[0] == 'T'); do_re_display(&word_display); break; case BLOCKS_CMD_EVENT: display_blocks = (new_value[0] == 'T'); do_re_display(&word_display); break; case BASELINES_CMD_EVENT: display_baselines = (new_value[0] == 'T'); do_re_display(&word_display); break; case REFRESH_CMD_EVENT: do_re_display(&word_display); break; case QUIT_CMD_EVENT: if (source_changed || target_changed) { response_str[0] = '\0'; command_window->prompt ("Changes not saved. Exit anyway? (Y/N)", response_str); token = strtok (response_str, " "); if (tolower (token[0]) == 'y') exit = TRUE; } else exit = TRUE; break; default: if ((cmd_event >= EXTENDED_MODES_BASE) && (cmd_event < EXTENDED_OTHER_BASE)) mode = (CMD_EVENTS) cmd_event; else { if (cmd_event >= EXTENDED_OTHER_BASE) extend_unmoded_commands (cmd_event - EXTENDED_OTHER_BASE, new_value); else { sprintf (msg, "Unrecognised event " INT32FORMAT " (%s)", cmd_event, new_value); command_window->msg (msg); } } break; } return exit;}/********************************************************************** * process_image_event() * * User has done something in the image window - mouse down or up. Work out * what it is and do something with it. * If DOWN - just remember where it was. * If UP - for each word in the selected area do the operation defined by * the current mode. **********************************************************************/void process_image_event( //action in image win GRAPHICS_EVENT event) { static ICOORD down; ICOORD up; BOX selection_box; char msg[80]; switch (event.type) { case DOWN_EVENT: down.set_x ((INT16) floor (event.x + 0.5)); down.set_y ((INT16) floor (event.y + 0.5)); if (mode == SHOW_POINT_CMD_EVENT) show_point (current_block_list, event.x, event.y); break; case UP_EVENT: case SELECT_EVENT: if (event.type == SELECT_EVENT) { down.set_x ((INT16) floor (event.xmax + 0.5)); down.set_y ((INT16) floor (event.ymax + 0.5)); if (mode == SHOW_POINT_CMD_EVENT) show_point (current_block_list, event.x, event.y); } if (mode != SHOW_POINT_CMD_EVENT) command_window->msg ("");//Clear old message up.set_x ((INT16) floor (event.x + 0.5)); up.set_y ((INT16) floor (event.y + 0.5)); selection_box = BOX (up, down); switch (mode) { case CHANGE_DISP_CMD_EVENT: process_selected_words(current_block_list, selection_box, &word_blank_and_set_display); break; case COPY_CMD_EVENT: if (!viewing_source) command_window->msg ("Can't COPY while viewing target!"); else process_selected_words(current_block_list, selection_box, &word_copy); break; case DELETE_CMD_EVENT: process_selected_words_it(current_block_list, selection_box, &word_delete); break; case CHANGE_TEXT_CMD_EVENT: process_selected_words(current_block_list, selection_box, &word_change_text); break; case TOGGLE_SEG_CMD_EVENT: process_selected_words(current_block_list, selection_box, &word_toggle_seg); break; case DUMP_WERD_CMD_EVENT: process_selected_words(current_block_list, selection_box, &word_dumper); break; case SHOW_BLN_WERD_CMD_EVENT: process_selected_words(current_block_list, selection_box, &word_bln_display); break; case SEGMENT_WERD_CMD_EVENT: re_segment_word(current_block_list, selection_box); break; case ROW_SPACE_STAT_CMD_EVENT: row_space_stat(current_block_list, selection_box); break; case BLOCK_SPACE_STAT_CMD_EVENT: block_space_stat(current_block_list, selection_box); break; case SHOW_POINT_CMD_EVENT: break; //ignore up event default: if ((mode >= EXTENDED_MODES_BASE) && (mode < EXTENDED_OTHER_BASE)) extend_moded_commands (mode - EXTENDED_MODES_BASE, selection_box); else { sprintf (msg, "Mode %d not yet implemented", mode); command_window->msg (msg); } break; } default: break; }}/********************************************************************** * re_scale_and_move_bln_word() * * Scale and move a bln word so that it fits in a specified bounding box.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -