📄 pageblk.cpp
字号:
#include "mfcpch.h"#include "pageblk.h"#include <stdio.h>#include <ctype.h>#include <math.h>#ifdef __UNIX__#include <unistd.h>#else#include <io.h>#endif#include "hpddef.h" //must be last (handpd.dll)#define G_START 0#define I_START 1#define R_START 3#define S_START 5extern char blabel[NUM_BLOCK_ATTR][4][MAXLENGTH];extern char backlabel[NUM_BACKGROUNDS][MAXLENGTH];ELISTIZE_S (PAGE_BLOCK)void PAGE_BLOCK::pb_delete() { switch (pb_type) { case PB_TEXT: delete ((TEXT_BLOCK *) this); break; case PB_GRAPHICS: delete ((GRAPHICS_BLOCK *) this); break; case PB_IMAGE: delete ((IMAGE_BLOCK *) this); break; case PB_RULES: delete ((RULE_BLOCK *) this); break; case PB_SCRIBBLE: delete ((SCRIBBLE_BLOCK *) this); break; case PB_WEIRD: delete ((WEIRD_BLOCK *) this); break; default: break; }}#define QUOTE_IT( parm ) #parmvoid PAGE_BLOCK::serialise(FILE *f) { if (fwrite (&pb_type, sizeof (PB_TYPE), 1, f) != 1) WRITEFAILED.error (QUOTE_IT (PAGE_BLOCK::serialise), ABORT, NULL); switch (pb_type) { case PB_TEXT: ((TEXT_BLOCK *) this)->serialise (f); break; case PB_GRAPHICS: ((GRAPHICS_BLOCK *) this)->serialise (f); break; case PB_RULES: ((RULE_BLOCK *) this)->serialise (f); break; case PB_IMAGE: ((IMAGE_BLOCK *) this)->serialise (f); break; case PB_SCRIBBLE: ((SCRIBBLE_BLOCK *) this)->serialise (f); break; case PB_WEIRD: ((WEIRD_BLOCK *) this)->serialise (f); break; default: break; }}PAGE_BLOCK *PAGE_BLOCK::de_serialise(FILE *f) { PB_TYPE type; TEXT_BLOCK *tblock; GRAPHICS_BLOCK *gblock; RULE_BLOCK *rblock; IMAGE_BLOCK *iblock; SCRIBBLE_BLOCK *sblock; WEIRD_BLOCK *wblock; if (fread ((void *) &type, sizeof (PB_TYPE), 1, f) != 1) WRITEFAILED.error (QUOTE_IT (PAGE_BLOCK::serialise), ABORT, NULL); switch (type) { case PB_TEXT: tblock = (TEXT_BLOCK *) alloc_struct (sizeof (TEXT_BLOCK)); return tblock->de_serialise (f); case PB_GRAPHICS: gblock = (GRAPHICS_BLOCK *) alloc_struct (sizeof (GRAPHICS_BLOCK)); return gblock->de_serialise (f); case PB_RULES: rblock = (RULE_BLOCK *) alloc_struct (sizeof (RULE_BLOCK)); return rblock->de_serialise (f); case PB_IMAGE: iblock = (IMAGE_BLOCK *) alloc_struct (sizeof (IMAGE_BLOCK)); return iblock->de_serialise (f); case PB_SCRIBBLE: sblock = (SCRIBBLE_BLOCK *) alloc_struct (sizeof (SCRIBBLE_BLOCK)); return sblock->de_serialise (f); case PB_WEIRD: wblock = (WEIRD_BLOCK *) alloc_struct (sizeof (SCRIBBLE_BLOCK)); return wblock->de_serialise (f); default: return NULL; }}/********************************************************************** * PAGE_BLOCK::serialise_asc() Convert to ascii file. * **********************************************************************/void PAGE_BLOCK::serialise_asc( //convert to ascii FILE *f //file to use ) { serialise_INT32(f, pb_type); switch (pb_type) { case PB_TEXT: ((TEXT_BLOCK *) this)->serialise_asc (f); break; case PB_GRAPHICS: ((GRAPHICS_BLOCK *) this)->serialise_asc (f); break; case PB_RULES: ((RULE_BLOCK *) this)->serialise_asc (f); break; case PB_IMAGE: ((IMAGE_BLOCK *) this)->serialise_asc (f); break; case PB_SCRIBBLE: ((SCRIBBLE_BLOCK *) this)->serialise_asc (f); break; case PB_WEIRD: ((WEIRD_BLOCK *) this)->serialise_asc (f); break; default: break; }}/********************************************************************** * PAGE_BLOCK::internal_serialise_asc() Convert to ascii file. * **********************************************************************/void PAGE_BLOCK::internal_serialise_asc( //convert to ascii FILE *f //file to use ) { ((POLY_BLOCK *) this)->serialise_asc (f); serialise_INT32(f, pb_type); children.serialise_asc (f);}/********************************************************************** * PAGE_BLOCK::de_serialise_asc() Convert from ascii file. * **********************************************************************/void PAGE_BLOCK::de_serialise_asc( //convert from ascii FILE *f //file to use ) { PAGE_BLOCK *page_block; //new block for list INT32 len; /*length to retrive */ PAGE_BLOCK_IT it; ((POLY_BLOCK *) this)->de_serialise_asc (f); pb_type = (PB_TYPE) de_serialise_INT32 (f); // children.de_serialise_asc(f); len = de_serialise_INT32 (f); it.set_to_list (&children); for (; len > 0; len--) { page_block = new_de_serialise_asc (f); it.add_to_end (page_block); /*put on the list */ }}/********************************************************************** * PAGE_BLOCK::new_de_serialise_asc() Convert from ascii file. * **********************************************************************/PAGE_BLOCK *PAGE_BLOCK::new_de_serialise_asc( //convert from ascii FILE *f //file to use ) { PB_TYPE type; TEXT_BLOCK *tblock; GRAPHICS_BLOCK *gblock; RULE_BLOCK *rblock; IMAGE_BLOCK *iblock; SCRIBBLE_BLOCK *sblock; WEIRD_BLOCK *wblock; type = (PB_TYPE) de_serialise_INT32 (f); switch (type) { case PB_TEXT: tblock = new TEXT_BLOCK; tblock->de_serialise_asc (f); return tblock; case PB_GRAPHICS: gblock = new GRAPHICS_BLOCK; gblock->de_serialise_asc (f); return gblock; case PB_RULES: rblock = new RULE_BLOCK; rblock->de_serialise_asc (f); return rblock; case PB_IMAGE: iblock = new IMAGE_BLOCK; iblock->de_serialise_asc (f); return iblock; case PB_SCRIBBLE: sblock = new SCRIBBLE_BLOCK; sblock->de_serialise_asc (f); return sblock; case PB_WEIRD: wblock = new WEIRD_BLOCK; wblock->de_serialise_asc (f); return wblock; default: return NULL; }}void PAGE_BLOCK::show_attrs(DEBUG_WIN *f) { PAGE_BLOCK_IT it; switch (pb_type) { case PB_TEXT: ((TEXT_BLOCK *) this)->show_attrs (f); break; case PB_GRAPHICS: ((GRAPHICS_BLOCK *) this)->show_attrs (f); break; case PB_RULES: ((RULE_BLOCK *) this)->show_attrs (f); break; case PB_IMAGE: ((IMAGE_BLOCK *) this)->show_attrs (f); break; case PB_SCRIBBLE: ((SCRIBBLE_BLOCK *) this)->show_attrs (f); break; case PB_WEIRD: ((WEIRD_BLOCK *) this)->show_attrs (f); break; default: break; } if (!children.empty ()) { f->dprintf ("containing subblocks\n"); it.set_to_list (&children); for (it.mark_cycle_pt (); !it.cycled_list (); it.forward ()) it.data ()->show_attrs (f); f->dprintf ("end of subblocks\n"); }}PAGE_BLOCK::PAGE_BLOCK (ICOORDELT_LIST * points, PB_TYPE type, PAGE_BLOCK_LIST * child):POLY_BLOCK (points,POLY_PAGE) { PAGE_BLOCK_IT c = &children; pb_type = type; children.clear (); c.move_to_first (); c.add_list_before (child);}PAGE_BLOCK::PAGE_BLOCK (ICOORDELT_LIST * points, PB_TYPE type):POLY_BLOCK (points,POLY_PAGE) { pb_type = type; children.clear ();}void PAGE_BLOCK::add_a_child(PAGE_BLOCK *newchild) { PAGE_BLOCK_IT c = &children; c.move_to_first (); c.add_to_end (newchild);}/********************************************************************** * PAGE_BLOCK::rotate * * Rotate the PAGE_BLOCK and its children **********************************************************************/void PAGE_BLOCK::rotate( //cos,sin FCOORD rotation) { //sub block iterator PAGE_BLOCK_IT child_it = &children; PAGE_BLOCK *child; //child block for (child_it.mark_cycle_pt (); !child_it.cycled_list (); child_it.forward ()) { child = child_it.data (); child->rotate (rotation); } if (pb_type == PB_TEXT) ((TEXT_BLOCK *) this)->rotate (rotation); else POLY_BLOCK::rotate(rotation); }/********************************************************************** * PAGE_BLOCK::move * * Move the PAGE_BLOCK and its children **********************************************************************/void PAGE_BLOCK::move(ICOORD shift //amount to move ) { //sub block iterator PAGE_BLOCK_IT child_it = &children; PAGE_BLOCK *child; //child block for (child_it.mark_cycle_pt (); !child_it.cycled_list (); child_it.forward ()) { child = child_it.data (); child->move (shift); } if (pb_type == PB_TEXT) ((TEXT_BLOCK *) this)->move (shift); else POLY_BLOCK::move(shift); }#ifndef GRAPHICS_DISABLEDvoid PAGE_BLOCK::basic_plot(WINDOW window, COLOUR colour) { PAGE_BLOCK_IT c = &children; POLY_BLOCK::plot (window, colour, 0); if (!c.empty ()) for (c.mark_cycle_pt (); !c.cycled_list (); c.forward ()) c.data ()->plot (window, colour);}void PAGE_BLOCK::plot(WINDOW window, COLOUR colour) { TEXT_BLOCK *tblock; WEIRD_BLOCK *wblock; switch (pb_type) { case PB_TEXT: basic_plot(window, colour); tblock = (TEXT_BLOCK *) this; tblock->plot (window, colour, REGION_COLOUR, SUBREGION_COLOUR); break; case PB_WEIRD: wblock = (WEIRD_BLOCK *) this; wblock->plot (window, colour); break; default: basic_plot(window, colour); break; }}#endifvoid show_all_in(PAGE_BLOCK *pblock, POLY_BLOCK *show_area, DEBUG_WIN *f) { PAGE_BLOCK_IT c; INT16 i, pnum; c.set_to_list (pblock->child ()); pnum = pblock->child ()->length (); for (i = 0; i < pnum; i++, c.forward ()) { if (show_area->contains (c.data ())) c.data ()->show_attrs (f); else if (show_area->overlap (c.data ())) show_all_in (c.data (), show_area, f); }}void delete_all_in(PAGE_BLOCK *pblock, POLY_BLOCK *delete_area) { PAGE_BLOCK_IT c; INT16 i, pnum; c.set_to_list (pblock->child ()); pnum = pblock->child ()->length (); for (i = 0; i < pnum; i++, c.forward ()) { if (delete_area->contains (c.data ())) c.extract ()->pb_delete (); else if (delete_area->overlap (c.data ())) delete_all_in (c.data (), delete_area); }}PAGE_BLOCK *smallest_containing(PAGE_BLOCK *pblock, POLY_BLOCK *other) { PAGE_BLOCK_IT c; c.set_to_list (pblock->child ()); if (c.empty ()) return (pblock); for (c.mark_cycle_pt (); !c.cycled_list (); c.forward ()) if (c.data ()->contains (other)) return (smallest_containing (c.data (), other)); return (pblock);}TEXT_BLOCK::TEXT_BLOCK (ICOORDELT_LIST * points, BOOL8 backg[NUM_BACKGROUNDS]):PAGE_BLOCK (points,PB_TEXT) { int i; for (i = 0; i < NUM_BACKGROUNDS; i++) background.set_bit (i, backg[i]); text_regions.clear ();}voidTEXT_BLOCK::set_attrs (BOOL8 backg[NUM_BACKGROUNDS]) { int i; for (i = 0; i < NUM_BACKGROUNDS; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -