/************************************************************************** * * * LOWLEVEL.H Created: 28 May 1991. * * * * This file contains the items needed for the low word processing * * part of the recognizer which are needed only in kernel variant. * * * **************************************************************************/ #ifndef LOW_LEVEL_INCLUDED #define LOW_LEVEL_INCLUDED #include "ams_mg.h" #include "floats.h" #define NEW_VERSION _TRUE /* New version - born in Sept.1992 */ #define LOW_INLINE _FALSE /* If small low-level functions should be */ /* expanded inline (as macros). */ #define USE_FRM_WORD _FALSE /* _TRUE - makes it able to provide */ /* formulas wordbreaking and */ /* recogn. enhancing by cost of */ /* code enlarging. */ /* _FALSE- no fromula wordbreaking and */ /* additional enhancement, but */ /* code size reduces. */ /**************************************************************************/ /* CODES OF SPECIAL POINTS */ /**************************************************************************/ /* */ #define EMPTY 0x00 /* empty mark */ #define MINW 0x01 /* wide minimum */ #define MINN 0x02 /* narrow minimum */ #define MAXW 0x03 /* wide maximum */ #define MAXN 0x04 /* narrow maximum */ #define _MINX 0x11 /* */ #define _MAXX 0x13 /* */ #define MINXY 0x21 /* */ #define MAXXY 0x23 /* */ #define MINYX 0x31 /* */ #define MAXYX 0x33 /* */ #define SHELF 0x05 /* shelf */ #define CROSS 0x06 /* crossing */ #define STROKE 0x07 /* stroke */ #define DOT 0x08 /* point */ #define STICK 0x09 /* hypothetical stick */ #define HATCH 0x0a /* crossing with the stroke */ /* #define BIRD 0x12 */ /* */ /* #define STAFF 0x21 */ /* */ #define ANGLE 0x0b /* angle */ #define BEG 0x10 /* beginning of unbroken group of points */ #define END 0x20 /* end of the unbroken group of points */ #define DROP 0x44 /* break */ //GIT - new marks for SDS #define SDS_INTERSECTED 0x80 #define SDS_ISOLATE 0x81 /* */ /**************************************************************************/ /* Constants - direction setters for extrema searching. */ /* They are bits in the variable and may be combined using "|". */ /**************************************************************************/ #define EMPTY_DIR 0x0000 #define X_DIR 0x0001 #define Y_DIR 0x0002 #define XY_DIR 0x0004 #define YX_DIR 0x0008 /**************************************************************************/ /* CONSTANTS DEFINITION */ /**************************************************************************/ /* */ #define MAXBUF 8000 /* max size */ /* buffer of data */ #define LOWBUF (MAXBUF+3) /* size of buffer for */ /* lower level. */ #define SPECVAL 640 /* masssive measurity */ /* structure of special*/ /* points . */ #define N_GR_BORD 50 /* Size of an array of */ /* moveable SPECL elems*/ #define N_ABSNUM 50 /* Size of an array of */ /* moveable SPECL elems*/ #define UMSPC 50 /* */ /* */ #define N_SDS 200 /* Size of SDS array */ /* */ #define LENTH_E 64 /* */ /* */ #define LENTH_Q 64 /* */ /* */ #define LENTH_S 128 /* */ /* */ #define ALEF 32767 /* the biggest number */ /* y (for regime EGA ).*/ #define SQRT_ALEF 181 /* sqrt(ALEF) */ /* */ #define ELEM 0 /* the smallest */ /* bite number */ /* without sign */ #define BREAK -1 /* number-symbol of */ /* style break */ #define RIGHT 319 /* the most right point*/ /* */ #define CONSTVAL 8 /* max number of files */ /* with constants */ /* */ #define ABSENCE 1 /* */ /* */ #define NOABSENCE 0 /* */ /* */ #define CELLSIZE 7 /*size of rastre square*/ /* */ #define END_OF_WORDS 0xff /* End of list */ /* */ #define UNDEF -2 /* Undef value for in- */ /* dexes in arrays etc.*/ /* */ /* */ /***************************************************************************/ /* STRUCTURE OF DATA FOR LOW LEVEL */ /***************************************************************************/ /*------------------------------------------------------------------------*/ #if defined(FOR_GERMAN) || defined(FOR_FRENCH) || defined(FOR_INTERNATIONAL) typedef struct { _SHORT GroupNum ; _SHORT numMin ; _CHAR tH ; _CHAR bH ; _CHAR UmEls ; _CHAR ElsUm ; _CHAR UmDot ; _CHAR DotUm ; _CHAR UmStr ; _CHAR StrUm ; _CHAR UmCom ; _CHAR ComUm ; _CHAR CrossFeature ; _CHAR PositionFeature ; } _UM_MARKS , _PTR p_UM_MARKS ; typedef struct { p_UM_MARKS pUmMarks ; _SHORT Um_buf_Len ; _SHORT tmpUMnumber ; _SHORT termSpecl ; _SHORT termSpecl1 ; } _UM_MARKS_CONTROL , _PTR p_UM_MARKS_CONTROL ; #endif /* FOR_GERMAN... */ /********************************************************/ /* Lines description structures: */ /********************************************************/ typedef struct SDB_TYPE { _SHORT s ; _SHORT a ; _SHORT dL ; _SHORT iLmax ; _SHORT dR ; _SHORT iRmax ; _SHORT d ; _SHORT imax ; _LONG l ; _SHORT cr ; _SHORT ld ; _SHORT lg ; } _SAD ; typedef _SAD _PTR p_SAD ; /* cr == (BASE*d/s); "Curvity" */ /* ld == (BASE*l/s); */ /* lg == (BASE*l/(length of all part between breaks)); */ /* ooo "l" */ /* ooooooo | ooo */ /* ooo | o ooOO */ /* ooo | oo ooo */ /* oo | oo oo */ /* oo | "d" o o */ /* ------- OO -------------- | ---------- o --------- o ---------- */ /* ------- "s"| o o */ /* ------------ o o */ /* "a" - slope of this > --------OO oo */ /* (BASE*"dy"/"dx") oo oo */ /* ooo */ typedef struct _SDS_TYPE { _SHORT mark ; _SHORT ibeg ; _SHORT iend ; _SHORT xmax ; _SHORT xmin ; _SHORT ymax ; _SHORT ymin ; _SAD des ; } _SDS ; typedef _SDS _PTR p_SDS ; typedef struct _SDS_CONTROL_TYPE { _SHORT sizeSDS ; _SHORT iBegLock_SDS ; _SHORT lenSDS ; p_SDS pSDS ; } _SDS_CONTROL ; typedef _SDS_CONTROL _PTR p_C_SDS ; /* links description structure */ typedef enum { ARC_UNKNOWN = 0 , ARC_LEFT , ARC_RIGHT , ARC_UP , ARC_DOWN , ARC_UP_LEFT , ARC_DOWN_LEFT , ARC_UP_RIGHT , ARC_DOWN_RIGHT , ARC_LINE_VERT , ARC_LINE_HOR , ARC_LINE_SLASH , ARC_LINE_BACKSLASH , ARC_S_LIKE , ARC_Z_LIKE , ARC_SHORT } _ARC_TYPE ; /* new links description structure */ typedef enum { LINK_UNKNOWN = 0, // 0 LINK_HCR_CCW , // 1 LINK_LCR_CCW , // 2 LINK_MCR_CCW , // 3 LINK_SCR_CCW , // 4 LINK_TCR_CCW , // 5 LINK_LINE , // 6 LINK_TCR_CW , // 7 LINK_SCR_CW , // 8 LINK_MCR_CW , // 9 LINK_LCR_CW , // 10 LINK_HCR_CW , // 11 LINK_HS_LIKE , // 12 LINK_S_LIKE , // 13 LINK_Z_LIKE , // 14 LINK_HZ_LIKE // 15 } _LINK_TYPE ; /*--------------- SPECIAL POINTS DESCRIPTOR ------------------------------*/ typedef struct SPEC_TYPE { _UCHAR mark ; _UCHAR code ; _UCHAR attr ; _UCHAR other ; _SHORT ibeg ; _SHORT iend ; _SHORT ipoint0 ; _SHORT ipoint1 ; struct SPEC_TYPE near * next ; struct SPEC_TYPE near * prev ; } SPECL, _PTR p_FSPECL; /* grafy.h definitions */ typedef SPECL near* p_SPECL ; /*--------------- LIST OF CONSTANTS --------------------------------------*/ typedef struct CON_TYPE /* table for interpolaton constants */ { _SHORT horda ; /* chord of normalizaton */ _SHORT dlt0 ; /* */ _SHORT nsr ; /* */ _SHORT j_step ; /* beginning steps of crossings */ _SHORT i_step ; /* search */ _SHORT eps_y ; /* environs of extremums marking out*/ _SHORT eps_x ; /* and preliminary marking out */ /* of shelves */ _SHORT eps_py ; /* max.(vertical and horisontal) */ _SHORT eps_px ; /* sizes of 'points */ _SHORT eps_st ; /* max stroke legnth */ _SHORT a0 ; /* */ _SHORT b0 ; /* */ _SHORT lf0 ; /* */ _SHORT lz0 ; /* */ _SHORT a1 ; /* */ _SHORT b1 ; /* */ _SHORT lf1 ; /* */ _SHORT lz1 ; /* */ _SHORT a2 ; /* */ _SHORT b2 ; /* */ _SHORT lf2 ; /* */ _SHORT lz2 ; /* */ _SHORT a3 ; /* */ _SHORT b3 ; /* */ _SHORT lf3 ; /* */ _SHORT lz3 ; /* */ } CONSTS ; /*--------------- HEIGHTS ------------------------------------------------*/ typedef struct { /* If y<=y_US_, then height==_US_ */ _SHORT y_US1_ ; _SHORT y_US2_ ; _SHORT y_UE1_ ; _SHORT y_UE2_ ; _SHORT y_UI1_ ; _SHORT y_UI2_ ; _SHORT y_MD_ ; _SHORT y_DI1_ ; _SHORT y_DI2_ ; _SHORT y_DE1_ ; _SHORT y_DE2_ ; _SHORT y_DS1_ ; _SHORT y_DS2_ ; } HEIGHTS_DEF ; /*--------------- BUFFER'S STRUCTURE -------------------------------------*/ typedef struct { p_SHORT ptr ; /* Pointer to buffer. */ _SHORT nSize ; /* # of _SHORTs in buffer. */ } BUF_DESCR, _PTR p_BUF_DESCR ; /*--------------- NUMBER OF BEGIN & END OF POINTS GROUP ------------------*/ typedef struct { _SHORT iBeg ; _SHORT iEnd ; _RECT GrBox ; } POINTS_GROUP, _PTR p_POINTS_GROUP ; /*--------------- LOW LEVEL MAIN DATA STRUCTURE --------------------------*/ #define NUM_BUF 4 /* buffers quantity */ typedef struct { rc_type _PTR rc ; BUF_DESCR buffers[NUM_BUF] ; PS_point_type _PTR p_trace ; _SHORT nLenXYBuf ; p_SHORT xBuf ; p_SHORT yBuf ; p_SHORT x ; p_SHORT y ; _SHORT ii ; p_SPECL specl ; _SHORT nMaxLenSpecl ; _SHORT len_specl ; _SHORT LastSpeclIndex ; p_SHORT pAbsnum ; _SHORT lenabs ; _SHORT rmAbsnum ; p_POINTS_GROUP pGroupsBorder ; _SHORT lenGrBord ; _SHORT rmGrBord ; _SHORT iBegBlankGroups ; #if defined(FOR_GERMAN) || defined(FOR_FRENCH) || defined(FOR_INTERNATIONAL) p_UM_MARKS_CONTROL pUmMarksControl ; #endif p_C_SDS p_cSDS ; /* array of geometric features */ _SHORT VertSticksNum ; p_POINTS_GROUP pVS_Collector ; _SHORT padding ; _SHORT slope ; _SHORT width_letter ; _SHORT StepSure ; _RECT box ; /* the smallest and the biggest y */ /* the smallest and the biggest x */ HEIGHTS_DEF hght ; _SHORT o_little ; _SHORT z_little ; } low_type, _PTR p_low_type ; typedef p_low_type p_LowData ; #if PG_DEBUG _VOID draw_SDS(p_low_type low_data); #endif _SHORT GetLinkBetweenThisAndNextXr(p_low_type low_data,p_SPECL pXr, xrd_el_type _PTR xrd_elem); _SHORT RecountBegEndInSDS(p_low_type low_data); /* bCalc determines, whether or not to calculate some features in this function */ _SHORT iMostFarDoubleSide( p_SHORT xArray, p_SHORT yArray, p_SDS pSDS, p_SHORT pxd, p_SHORT pyd, _BOOL bCalc ) ; /***************************************************************************/ /* FUNCTIONS */ /***************************************************************************/ /*------------------------- module lk_begin ------------------------------*/ _SHORT lk_begin(low_type _PTR low_data); /*beginning working out of elem.*/ _SHORT get_last_in_specl(low_type _PTR low_data); _SHORT Sort_specl(p_SPECL specl,_SHORT l_specl); /*sorting SPECL in time*/ _SHORT Clear_specl(p_SPECL specl,_SHORT len_specl); _SHORT extremum(_UCHAR code,_SHORT beg,_SHORT end,_SHORT _PTR y); /*------------------------ module lk_cross ------------------------------*/ _SHORT lk_cross(low_type _PTR low_data); /*sorting out of elem. crossings*/ /*------------------------ module lk_next ------------------------------*/ /* Parsing of different arcs on the ends: */ _SHORT lk_duga( low_type _PTR low_data ); /*------------------------ module low_3 -------------------------------*/ _SHORT FindDArcs ( low_type _PTR pld ) ; /* see fig. at the */ /* func. text */ /* Checks, if some _IU(D)_s should be _UU(D)_ and vice versa: */ _VOID Adjust_I_U ( low_type _PTR low_data ) ; _BOOL FindSideExtr( low_type _PTR low_data ) ; _BOOL PostFindSideExtr( low_type _PTR low_data ); _SHORT RestoreColons( low_type _PTR low_data ); #if !defined (FOR_GERMAN) _BOOL RestoreApostroph(p_low_type low_data,p_SPECL pCurr); /*Eric*/ #endif /*------------------------ module breaks -------------------------------*/ _SHORT xt_st_zz(low_type _PTR low_data); /* working out of tear-off parts */ _BOOL find_CROSS(p_low_type low_data,_SHORT ibeg_X,_SHORT iend_X, p_SPECL _PTR pCross); /*------------------------ module FILTER -------------------------------*/ _SHORT Filt( low_type _PTR pLowData , _SHORT t_horda , _SHORT fl_absence ) ; _SHORT PreFilt( _SHORT t_horda , low_type _PTR p_low_data ) ; _VOID Errorprov(low_type _PTR low_data) ; /* check tablete co-ordinates*/ /*------------------------ module INIT_GRF -------------------------------*/ _VOID AcceptEps( _SHORT a,_SHORT b,_SHORT lf,_SHORT lz,p_SHORT eps ) ; _VOID AcceptNbcut (_VOID) ; _VOID glob_low_init( _VOID ) ; /* initialisation of globals */ /*----------------------- module CHECK, PICT, CROSS ---------------------*/ _SHORT InitSpecl( low_type _PTR low_data, _SHORT n ) ; _SHORT InitSpeclElement( SPECL _PTR specl ) ; _SHORT Mark( low_type _PTR low_data , _UCHAR mark , _UCHAR code, _UCHAR attr , _UCHAR other , _SHORT begin, _SHORT end , _SHORT ipoint0, _SHORT ipoint1 ) ; _SHORT MarkSpecl( low_type _PTR low_data , SPECL _PTR p_tmpSpecl ) ; _BOOL NoteSpecl( low_type _PTR pLowData , SPECL _PTR pTmpSpecl , SPECL _PTR pSpecl , _SHORT _PTR pLspecl , _SHORT limSpecl ) ; #if PG_DEBUG _VOID PaintSpeclElement( low_type _PTR pLowData, SPECL _PTR pNewSpecl, SPECL _PTR pSpecl , _SHORT _PTR pLspecl ); #endif p_SPECL LastElemAnyKind ( p_SPECL pSpecl , _UCHAR kind_of_mark ) ; p_SPECL FirstElemAnyKind ( p_SPECL pSpecl , _UCHAR kind_of_mark ) ; _SHORT Pict( low_type _PTR low_data ) ; _SHORT Surgeon( low_type _PTR pLowData ) ; _SHORT OperateSpeclArray( low_type _PTR pLowData ) ; #define NO_CONTACT 0x0000 #define END_RESTRICTION 0x0001 #define ANY_OCCUARANCE 0x0002 #define END_INSIDE 0x0004 #define IP0_INSIDE 0x0008 #define BEG_INSIDE 0x0010 #define TOTALY_INSIDE 0x0020 #define TOTALY_COVERED 0x0040 #define MOD_SKIP 0x0080 _SHORT SpcElemFirstOccArr( low_type _PTR pLowData, p_INT pModeWord , p_POINTS_GROUP pTrajectoryCut, _UCHAR mark ) ; #define NREDUCTION 5 #define NREDUCTION_FOR_BORDER 0 _SHORT Extr( low_type _PTR low_data, _SHORT eps_fy, _SHORT eps_fx , _SHORT eps_fxy , _SHORT eps_fyx , _SHORT nMaxReduct , _SHORT extr_axis ) ; _SHORT Cross( low_type _PTR low_data ) ; _SHORT Clash( _SHORT _PTR x, _SHORT _PTR y, _SHORT i, _SHORT j, _SHORT of, _SHORT bf ) ; /***************************************************************************/ /* module LOW_UTIL */ /***************************************************************************/ #define LEFT_OUTSIDE 1 #define RIGHT_OUTSIDE 2 #define LEFT_SHIFT 3 #define RIGHT_SHIFT 4 #define INSIDE 5 #define COVERS 6 _VOID SetXYToInitial ( low_type _PTR pLowData ) ; _SHORT LowAlloc( _SHORT _PTR _PTR buffer, _SHORT num_buffers , _SHORT len_buf , low_type _PTR pLowData ) ; _SHORT low_dealloc( _SHORT _PTR _PTR buffer ) ; _SHORT alloc_rastr( _ULONG _PTR _PTR rastr , _SHORT num_rastrs,_SHORT len_rastr ) ; _SHORT dealloc_rastr( _ULONG _PTR _PTR rastr ) ; _BOOL AllocSpecl ( p_SPECL _PTR ppSpecl, _SHORT nElements ) ; _VOID DeallocSpecl ( p_SPECL _PTR ppSpecl ) ; _BOOL CreateSDS ( low_type _PTR pLowData , _SHORT nSDS ) ; _VOID DestroySDS( low_type _PTR pLowData ) ; _SHORT MaxPointsGrown( #ifdef FORMULA _TRACE trace, #endif /*FORMULA*/ _SHORT nPoints ) ; /* Max # of points */ /* after "Errorprov" or oth-*/ /* er functions in "x" and */ /* "y" arrays. nPoints - */ /* initial value. */ _INT MaxesCount( p_SHORT xyArr, low_type _PTR pLowData ) ; /* Counts (and returns) the total number of */ /* x- or y-maxima in the whole trajectory. */ _BOOL BorderForSpecSymbol ( low_type _PTR pLowData , rc_type _PTR rc ); /* If the trace looks like some special */ /* symbol (fraction line,"-","=","+"), then */ /* finds borders for it and returns _TRUE, */ /* otherwise does nothing and returns _FALSE. */ _LONG DistanceSquare ( _INT i1, _INT i2, p_SHORT xAr, p_SHORT yAr ) ; /* The square of the distance between */ /* points #i1 and #i2. */ #if 0 #define PRESERVE_GLOB_EXTR _TRUE /* For usage as parameter */ /* "bPreserveGlobExtr" in funct- */ /* ion "SmoothXY". */ _BOOL SmoothXY ( p_SHORT x, p_SHORT y, _INT iLeft, _INT iRight, _INT nTimes, _BOOL bPreserveGlobExtr ); #endif /* This function computes the square of the distance of the */ /* point (xPoint,yPoint) to the straight line going through */ /* (x1,y1) and (x2,y2). See figure in the function code. */ _LONG QDistFromChord ( _INT x1, _INT y1, _INT x2, _INT y2, _INT xPoint, _INT yPoint ); #define CURV_MAX (1000L) #define CURV_NORMA (100L) _SHORT CurvMeasure ( p_SHORT x, p_SHORT y, _INT iBeg, _INT iEnd, _INT iMostFar ); /* This function computes the distance whose "circle" */ /* is the 8-angles figure: */ _INT Distance8 ( _INT x1, _INT y1, _INT x2, _INT y2 ); #if PG_DEBUG _VOID SetNewAttr ( p_SPECL pElem, _UCHAR hght, _UCHAR fb_dir ); /* Clears attrs and sets */ /* specified height and cir- */ /* cle direction. */ #else #define SetNewAttr(el,h,fb) (el)->attr = (((h)&_umd_) | ((fb)&_fb_)) #endif #if (PG_DEBUG || PG_DEBUG_WIN) p_SPECL BadSPECLPtr (_VOID); #define REF(elem) ((elem)? (elem):BadSPECLPtr()) #define CHECK_PTR(p) {if ((p)==_NULL) BadSPECLPtr();} #else #define REF(elem) (elem) #define CHECK_PTR(p) {} #endif /*!(PG_DEBUG || PG_DEBUG_WIN)*/ #define ANY_CROSSING(pElem) ( REF(pElem)->mark==CROSS \ || REF(pElem)->mark==HATCH \ || REF(pElem)->mark==STICK ) #define IU_OR_ID(pElem) (REF(pElem)->code==_IU_ || REF(pElem)->code==_ID_) /* #define SET_XTST_BITS(pElem) {SetBit(pElem,X_XT); SetBit(pElem,X_ST);}*/ #define NULL_OR_ZZ(pElem) ( (pElem)==_NULL \ || REF(pElem)->code==_ZZZ_ \ || REF(pElem)->code==_ZZ_ \ || REF(pElem)->code==_Z_ \ || REF(pElem)->code==_FF_ ) #define ANY_BREAK(pElem) ( REF(pElem)->code==_ZZZ_ \ || REF(pElem)->code==_ZZ_ \ || REF(pElem)->code==_Z_ \ || REF(pElem)->code==_FF_ ) #define ANY_ARC_WITH_TAIL(pElem) ( REF(pElem)->code==_UUR_ \ || REF(pElem)->code==_UUL_ \ || REF(pElem)->code==_UDR_ \ || REF(pElem)->code==_UDL_) #define ANY_GAMMA_SMALL(pElem) ( REF(pElem)->code==_GUs_ \ || REF(pElem)->code==_GDs_ \ || REF(pElem)->code==_Gl_ \ || REF(pElem)->code==_Gr_) #define ANY_ANGLE(pElem) ( REF(pElem)->code==_ANl \ || REF(pElem)->code==_ANr \ || REF(pElem)->code==_AN_UR \ || REF(pElem)->code==_AN_UL \ ) #define XT_OR_ST(pElem) ( REF(pElem)->code==_XT_ \ || REF(pElem)->code==_ST_) #define ANY_MOVEMENT(pElem) ( REF(pElem)->code==_TZ_ \ || REF(pElem)->code==_TS_ \ || REF(pElem)->code==_BL_ \ || REF(pElem)->code==_BR_) #if LOW_INLINE #define IsAnyCrossing(e) ANY_CROSSING(e) #define Is_IU_or_ID(e) IU_OR_ID(e) #define NULL_or_ZZ_this(el) NULL_OR_ZZ(el) #define NULL_or_ZZ_after(el) NULL_or_ZZ_this(REF(el)->next) #define NULL_or_ZZ_before(el) NULL_or_ZZ_this(REF(el)->prev) #define IsAnyBreak(el) ANY_BREAK(el) #define IsAnyArcWithTail(el) ANY_ARC_WITH_TAIL(el) #define IsAnyGsmall(el) ANY_GAMMA_SMALL(el) #define IsAnyAngle(el) ANY_ANGLE(el) #define IsXTorST(el) XT_OR_ST(el) #define IsAnyMovement(el) ANY_MOVEMENT(el) #else _BOOL IsAnyCrossing ( p_SPECL pElem ); /* Checks if the "Elem" has the */ /* HATCH,CROSS or STICK mark. */ _BOOL IsAnyBreak( p_SPECL pElem ); /* Checks if the "Elem" is BREAK*/ _BOOL Is_IU_or_ID ( p_SPECL pElem ); /* _VOID SetXTSTBits ( p_SPECL pElem );*/ /* Sets both XT and ST bits */ /* (frequently used operation). */ _BOOL NULL_or_ZZ_this ( p_SPECL pElem ); _BOOL NULL_or_ZZ_after ( p_SPECL pElem ); _BOOL NULL_or_ZZ_before( p_SPECL pElem ); _BOOL IsAnyArcWithTail(p_SPECL pElem); _BOOL IsAnyGsmall(p_SPECL pElem); _BOOL IsAnyAngle(p_SPECL pElem); _BOOL IsXTorST(p_SPECL pElem); _BOOL IsAnyMovement(p_SPECL pElem); #endif /*LOW_INLINE*/ p_SPECL SkipAnglesAfter ( p_SPECL pElem ); p_SPECL SkipAnglesBefore ( p_SPECL pElem ); p_SPECL FindStrongElemAfter ( p_SPECL pElem ); p_SPECL FindStrongElemBefore ( p_SPECL pElem ); _BOOL IsUpperElem ( p_SPECL pElem ); _BOOL IsLowerElem ( p_SPECL pElem ); _BOOL IsStrongElem ( p_SPECL pElem ); _BOOL X_IsBreak ( p_xrd_el_type pXr ); _BOOL X_IsStrongElem( p_xrd_el_type pXr ); _INT iRefPoint( p_SPECL pElem, p_SHORT y ); _UCHAR HeightInLine ( _SHORT y, /* Calculating height in */ low_type _PTR pLowData ); /* the line of the point */ /* with abs.coord "y". */ _UCHAR MidPointHeight ( p_SPECL pElem, low_type _PTR pLowData ); /* The height of the middle point */ /* of the "pElem" */ _INT iMidPointPlato ( _INT iFirst, _INT iToStop, p_SHORT val, p_SHORT y ); _BOOL GetBoxFromTrace ( _TRACE trace, _INT iLeft, _INT iRight, p_RECT pRect ); _VOID GetTraceBox ( p_SHORT xArray, p_SHORT yArray, _INT iLeft, _INT iRight, p_RECT pRect ); _BOOL GetTraceBoxInsideYZone ( p_SHORT x, p_SHORT y, _INT ibeg, _INT iend, _SHORT yUpZone, _SHORT yDnZone, p_RECT pRect, p_SHORT ixmax,p_SHORT ixmin,p_SHORT iymax,p_SHORT iymin); #define size_cross(jb,je,x,y,pr) GetTraceBox((x),(y),(jb),(je),(pr)) /* Values of (*ptRetCod) after "ClosedSquare" worked: */ #define RETC_OK ((_SHORT)0) #define RETC_NO_PTS_IN_TRAJECTORY ((_SHORT)1) #define RETC_BREAK_WHERE_SHOULDNT ((_SHORT)2) _LONG ClosedSquare( p_SHORT xTrace, p_SHORT yTrace, _INT iBeg, _INT iEnd, p_SHORT ptRetCod ); _LONG TriangleSquare( p_SHORT x, p_SHORT y, _INT i1, _INT i2, _INT i3 ); _SHORT CurvFromSquare( p_SHORT x, p_SHORT y, _INT iBeg, _INT iEnd ); _LONG LengthOfTraj( p_SHORT xTrace, p_SHORT yTrace, _INT iBeg, _INT iEnd, p_LONG pChord ,p_SHORT ptRetCod ); /* Calc. angle cos */ _LONG cos_pointvect ( _INT xbeg1, _INT ybeg1, _INT xend1, _INT yend1, _INT xbeg2, _INT ybeg2, _INT xend2, _INT yend2 ); _LONG cos_vect( _INT beg1, _INT end1, /* beg and end first */ _INT beg2, _INT end2, /* and second vector's */ _SHORT _PTR x, _SHORT _PTR y); _LONG cos_horizline ( _INT beg1, _INT end1, _SHORT _PTR x, _SHORT _PTR y); _LONG cos_normalslope ( _INT beg1, _INT end1, _INT slope, _SHORT _PTR x, _SHORT _PTR y ); _UCHAR GetBit (p_SPECL elem,_SHORT bitnum); _BOOL SetBit (p_SPECL elem, _SHORT bitnum); _BOOL ClrBit (p_SPECL elem, _SHORT bitnum); _INT ixMin ( _INT iStart, _INT iEnd, p_SHORT xArray, p_SHORT yArray ); _INT ixMax ( _INT iStart, _INT iEnd, p_SHORT xArray, p_SHORT yArray ); _INT iXYweighted_max_right ( p_SHORT xArray, p_SHORT yArray, _INT iStart, _INT nDepth, _INT xCoef, _INT yCoef ); _INT iXmax_right ( p_SHORT xArray, p_SHORT yArray, _INT iStart, _INT nDepth ); _INT iXmin_right ( p_SHORT xArray, p_SHORT yArray, _INT iStart, _INT nDepth ); _INT iXmax_left ( p_SHORT xArray, p_SHORT yArray, _INT iStart, _INT nDepth ); _INT iXmin_left ( p_SHORT xArray, p_SHORT yArray, _INT iStart, _INT nDepth ); #define iYup_right(y,iStart,nDepth) (iXmin_right((y),(y),(iStart),(nDepth))) #define iYdown_right(y,iStart,nDepth) (iXmax_right((y),(y),(iStart),(nDepth))) #define iYup_left(y,iStart,nDepth) (iXmin_left((y),(y),(iStart),(nDepth))) #define iYdown_left(y,iStart,nDepth) (iXmax_left((y),(y),(iStart),(nDepth))) _BOOL xMinMax ( _INT ibeg, _INT iend, p_SHORT x, p_SHORT y, p_SHORT pxMin, p_SHORT pxMax ); _BOOL yMinMax ( _INT ibeg, _INT iend, p_SHORT y, p_SHORT pyMin, p_SHORT pyMax ); _INT iyMin ( _INT iStart, _INT iEnd, p_SHORT yArray ); _INT iyMax ( _INT iStart, _INT iEnd, p_SHORT yArray ); _INT iYup_range ( p_SHORT yArray, _INT iStart, _INT iEnd ); _INT iYdown_range ( p_SHORT yArray, _INT iStart, _INT iEnd ); _INT iClosestToXY ( _INT iBeg, _INT iEnd, p_SHORT xAr, p_SHORT yAr, _SHORT xRef, _SHORT yRef ); _INT iClosestToY( p_SHORT yAr, _INT iBeg, _INT iEnd, _SHORT yVal ); _BOOL FindCrossPoint ( _SHORT x1, _SHORT y1, _SHORT x2, _SHORT y2, _SHORT x3, _SHORT y3, _SHORT x4, _SHORT y4, p_SHORT pxAnswer, p_SHORT pyAnswer ); _BOOL is_cross ( _SHORT x1, _SHORT y1, _SHORT x2, _SHORT y2, _SHORT x3, _SHORT y3, _SHORT x4, _SHORT y4 ); _INT iMostFarFromChord ( p_SHORT xArray, p_SHORT yArray, _INT iLeft, _INT iRight ); /* Constants - return values of the "SideExtr" */ /* function: */ /* "NO_SIDE_EXTR" Must be ZERO */ #define NO_SIDE_EXTR 0 #define SIDE_EXTR_LIKE_1ST 1 #define SIDE_EXTR_LIKE_2ND 2 #define SIDE_EXTR_LIKE_1ST_WEAK 3 #define SIDE_EXTR_LIKE_2ND_WEAK 4 #if defined(FOR_GERMAN) || defined(FOR_FRENCH) #define SIDE_EXTR_TRACE_FOR_er 5 #endif /*FOR_GERMAN*/ /* Constant for usage as "bStrict" argument of "SideExtr": */ #define STRICT_ANGLE_STRUCTURE _TRUE _INT SideExtr( p_SHORT x, p_SHORT y, _INT iBeg, _INT iEnd, _INT nSlope, p_SHORT xBuf, p_SHORT yBuf, p_SHORT ind_back, p_INT piSideExtr, _BOOL bStrict ); _INT iMostCurvedPoint( p_SHORT x, p_SHORT y, _INT iBeg, _INT iEnd, _INT nCurvAll ); /* "CurrIndex" finds the current index of the point */ /* with the "ind_old" source index (i.e. on the un- */ /* modified trajectory). Or UNDEF, if this wasn't */ /* found. */ _SHORT CurrIndex ( p_SHORT indBack, _INT ind_old, _INT nIndexes ); _SHORT SlopeShiftDx ( _SHORT dy, _INT slope ); #define STRICT_OVERLAP _TRUE _BOOL xHardOverlapRect ( p_RECT pr1, p_RECT pr2, _BOOL bStrict ); _BOOL yHardOverlapRect ( p_RECT pr1, p_RECT pr2, _BOOL bStrict ); _BOOL HardOverlapRect ( p_RECT pr1, p_RECT pr2, _BOOL bStrict ); #define STRICT_IN _TRUE _BOOL SoftInRect ( p_RECT pr1, p_RECT pr2, _BOOL bStrict ); _BOOL IsRightGulfLikeIn3 ( p_SHORT x, p_SHORT y, _INT iBeg, _INT iEnd, p_INT piGulf ); _INT brk_right ( p_SHORT yArray, _INT iStart, _INT iEnd ); _INT brk_left ( p_SHORT yArray, _INT iStart, _INT iEnd ); _INT nobrk_right ( p_SHORT yArray, _INT iStart, _INT iEnd ); _INT nobrk_left ( p_SHORT yArray, _INT iStart, _INT iEnd ); #define _FIRST 0 #define _MEAD 1 #define _LAST 2 _SHORT NewIndex ( p_SHORT indBack , p_SHORT newY , _SHORT ind_old , _SHORT nIndexes , _SHORT fl ) ; _SHORT R_ClosestToLine( p_SHORT xAr, p_SHORT yAr, PS_point_type _PTR pRef, p_POINTS_GROUP pLine , p_SHORT p_iClosest ) ; _VOID DefLineThresholds ( p_low_type pLowData ) ; _LONG SquareDistance ( _SHORT xBeg , _SHORT yBeg, _SHORT xEnd , _SHORT yEnd ); #define INIT 1 #define NOINIT 0 _SHORT InitGroupsBorder( low_type _PTR pLowData , _SHORT fl_BoxInit ) ; _INT GetGroupNumber( low_type _PTR pLowData , _INT iPoint ) ; _BOOL HeightMeasure( _INT iBeg, _INT iEnd, low_type _PTR pLowData , p_UCHAR pUpperHeight, p_UCHAR pLowerHeight ) ; _SHORT IsPointCont( low_type _PTR pLowData, _INT iPoint, _UCHAR mark ); /* Return values of the function "DefineWritingStep": */ //with bUseMediana == _TRUE #define STEP_INDEPENDENT 0 #define STEP_MEDIANA 1 #define STEP_COMBINED 2 //with bUseMediana == _FALSE #define STEP_SURE STEP_INDEPENDENT #define STEP_REJECT STEP_MEDIANA #define STEP_UNSURE STEP_COMBINED _SHORT DefineWritingStep( low_type _PTR low_data, p_SHORT pxWrtStep, _BOOL bUseMediana ); _BOOL IsInnerAngle ( p_SHORT xArray, p_SHORT yArray, SPECL _PTR pFrst, SPECL _PTR pLast, SPECL _PTR pAngle ); _INT CalcDistBetwXr(p_SHORT xTrace,p_SHORT yTrace, _INT ibeg1,_INT iend1,_INT ibeg2,_INT iend2, p_SHORT Retcod); _BOOL CurveHasSelfCrossing( p_SHORT x, p_SHORT y, _INT iBeg, _INT iEnd, p_INT pInd1, p_INT pInd2, _LONG lMinAbsSquare ); #define POINT_ON_BORDER 0 #define POINT_INSIDE 1 #define POINT_OUTSIDE 2 /* in case of moving those two prototypes below, move defines above with them */ _SHORT IsPointInsideArea(p_SHORT pxBorder,p_SHORT pyBorder,_INT NumPntsInBorder, _SHORT xPoint,_SHORT yPoint,p_SHORT position); _BOOL IsPointOnBorder(p_SHORT pxBorder,p_SHORT pyBorder,_INT Pnt1st,_INT Pnt2nd, _SHORT xPoint,_SHORT yPoint,p_BOOL pbIsCross); _BOOL GetTraceBoxWithoutXT_ST(p_low_type low_data,_INT ibeg,_INT iend,p_RECT pRect); _BOOL IsPointBelongsToXT_ST(_INT iPoint,p_SPECL specl); /***************************************************************************/ /* module TRANSFRM */ /***************************************************************************/ _SHORT transfrmN(low_type _PTR low_data); /* */ /***************************************************************************/ /* module OVER */ /***************************************************************************/ _SHORT measure_slope(low_type _PTR low_data); /* calculation of */ /* slope */ /* */ _SHORT def_over(low_type _PTR low_data); /* setting OVR */ /* */ /***************************************************************************/ /* module ANGLE */ /***************************************************************************/ _SHORT angl(low_type _PTR low_data); /* search for angles */ /* */ /* */ _SHORT angle_direction(_SHORT x0, /* calculate any angle direction */ _SHORT y0, /* vector of angle direction*/ _SHORT slope); /* script slope */ /* */ /***************************************************************************/ /* module LU_SPECL */ /***************************************************************************/ p_SPECL NewSPECLElem( low_type _PTR low_data ); _VOID DelFromSPECLList ( p_SPECL pElem ); _VOID DelThisAndNextFromSPECLList ( p_SPECL pElem ); _VOID DelCrossingFromSPECLList ( p_SPECL pElem ); _VOID SwapThisAndNext ( p_SPECL pElem ); _VOID Insert2ndAfter1st ( p_SPECL p1st, p_SPECL p2nd ); _VOID InsertCrossing2ndAfter1st ( p_SPECL p1st, p_SPECL p2nd ); _VOID Move2ndAfter1st ( p_SPECL p1st, p_SPECL p2nd ); _VOID MoveCrossing2ndAfter1st ( p_SPECL p1st, p_SPECL p2nd ); #define ATTACH_2nd_TO_1st(p1,p2) {if (p1) {(p1)->next=(p2); } if(p2)(p2)->prev=(p1);} #define CROSS_IN_TIME(p1,p2) ( p1 && p2 && (p1)->iend >= (p2)->ibeg \ && (p2)->iend >= (p1)->ibeg ) #define FIRST_IN_SECOND(p1,p2) ( p1 && p2 && (p1)->ibeg >= (p2)->ibeg \ && (p1)->iend <= (p2)->iend ) #if LOW_INLINE #define Attach2ndTo1st(p1,p2) ATTACH_2nd_TO_1st(p1,p2) #define CrossInTime(p1,p2) CROSS_IN_TIME(p1,p2) #define FirstBelongsTo2nd(p1,p2) FIRST_IN_SECOND(p1,p2) #else _VOID Attach2ndTo1st ( p_SPECL p1st, p_SPECL p2nd ); _BOOL CrossInTime ( p_SPECL p1st, p_SPECL p2nd ); /* TRUE if some part */ /* of trajectory belongs to */ /* both elems. */ _BOOL FirstBelongsTo2nd ( p_SPECL p1st, p_SPECL p2nd ); /* TRUE if all */ /* trajectory of the 1st elem */ /* is part of that of the 2nd */ /* one */ #endif /*LOW_INLINE*/ _VOID RefreshElem ( p_SPECL pElem, _UCHAR mark, _UCHAR code, _UCHAR attr #if !NEW_VERSION , _SHORT bitToSet #endif /*NEW_VERSION*/ ); /* Set the fields of "pElem". */ p_SPECL FindMarkRight ( p_SPECL pElem, _UCHAR mark ); /* Goes "next" */ /* until "mark" is found or end */ /* of specl. If pElem->mark==mark*/ /* returns pElem. */ p_SPECL FindMarkLeft ( p_SPECL pElem, _UCHAR mark ); /* Same, but "prev" */ /***************************************************************************/ /* module CONVERT */ /***************************************************************************/ _SHORT exchange( low_type _PTR low_data, xrdata_type _PTR xrd); _SHORT form_pseudo_xr_data(low_type _PTR low_data, xrdata_type _PTR xrdata); /***************************************************************************/ /* module CIRCLE */ /***************************************************************************/ _SHORT Circle(low_type _PTR low_data); /* */ /* */ /***************************************************************************/ /* module frm_word */ /***************************************************************************/ _BOOL MayBeFrline ( p_SHORT xArray, p_SHORT yArray, _INT iBeg, _INT iEnd, _SHORT xRange ); /* Possible return values of "chk_sign" function: */ #define SGN_NOT_SIGN 0 /* CHE: This MUST be zero !!! */ #define SGN_SOME 1 /* Some of the possible signs listed */ /* below in "#define"'s */ #define SGN_PLUS 2 #define SGN_EQUAL 3 _SHORT chk_sign ( p_SHORT xArray, p_SHORT yArray, _INT iBeg, _INT iEnd, _SHORT xRange, _SHORT yRange ); /* Definition for "chk_slash" function: */ #define WHOLE_TRAJECTORY _TRUE _BOOL chk_slash (p_SHORT xArray, p_SHORT yArray, _INT iLeft, _INT iRight, _SHORT yRange, _BOOL bWholeTrj ); _VOID FindStraightPart ( p_SHORT xArray, p_SHORT yArray, p_INT piBeg, p_INT piEnd); _BOOL delta_interval ( p_SHORT xArray, p_SHORT yArray, _INT iLeft, _INT iRight, _INT nMaxRectRatio, _INT nSlope, p_LONG pldxSum, p_LONG pldySum, p_LONG plNumIntervals, _BOOL bThrowBigAndSmall ); #if USE_FRM_WORD /* Constants for usage as "bIncrementalBreak" parameter values: */ #define INCREMENTAL_BREAK _TRUE #define NOT_INCREMENTAL_BREAK (!INCREMENTAL_BREAK) _SHORT FrmWordBreak ( _TRACE trace, _INT nPoints, _BOOL bIncrementalBreak, p_SHORT pn1stWrdPoints, p_SHORT pnFrLinePoints ); _VOID ResetFrmWordBreak(_VOID); /* Should be called before the passing */ /* the first stroke of the new formula. */ /***************************************************************************/ /* module LOW_UTIL */ /***************************************************************************/ _INT brk_left_trace ( PS_point_type _PTR trace, _INT iStart, _INT iEnd ); _INT nobrk_left_trace ( PS_point_type _PTR trace, _INT iStart, _INT iEnd ); _INT brk_right_trace ( PS_point_type _PTR trace, _INT iStart, _INT iEnd ); _INT nobrk_right_trace ( PS_point_type _PTR trace, _INT iStart, _INT iEnd ); _SHORT Xmean_range ( p_SHORT xArray, p_SHORT yArray, _INT iStart, _INT iEnd ); _SHORT Ymean_range ( p_SHORT yArray, _INT iStart, _INT iEnd ); _SHORT Yup_range ( p_SHORT yArray, _INT iStart, _INT iEnd ); _SHORT Ydown_range ( p_SHORT yArray, _INT iStart, _INT iEnd ); _VOID xy_to_trace ( p_SHORT xArray, p_SHORT yArray, _INT nPoints, _TRACE trace ); #endif /*USE_FRM_WORD*/ _VOID trace_to_xy ( p_SHORT xArray, p_SHORT yArray, _INT nPoints, _TRACE trace ); /***************************************************************************/ /* module SPECWIN */ /***************************************************************************/ _SHORT low_level(PS_point_type _PTR trace, /* completeness of low level */ xrdata_type _PTR xrdata, /* */ rc_type _PTR rc ); _INT BaselineAndScale(low_type _PTR pLowData); _BOOL PrepareLowData(low_type _PTR pLowData, PS_point_type _PTR trace, rc_type _PTR rc, p_SHORT _PTR pbuffer); _VOID FillLowDataTrace(low_type _PTR pLowData, PS_point_type _PTR trace); _VOID GetLowDataRect (low_type _PTR pLowData); _INT AnalyzeLowData(low_type _PTR pLowData, PS_point_type _PTR trace); /***************************************************************************/ #endif /* LOW_LEVEL_INCLUDED */ /***************************************************************************/