Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1127 lines
49 KiB

/**************************************************************************
* *
* 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 */
/***************************************************************************/