windows-nt/Source/XPSP1/NT/drivers/tpg/hwx/zilla/inc/zillatool.h
2020-09-26 16:20:57 +08:00

244 lines
7.1 KiB
C

/**************************************************************************\
* FILE: zillatool.h
*
* Lists functions Zilla exports to its tools but nothing else.
\**************************************************************************/
#ifndef ZILLATOOL_H
#define ZILLATOOL_H
#include "runnet.h"
#ifdef __cplusplus
extern "C" {
#endif
// Version of primitive with x and y values stored in bytes, not nibbles.
#pragma pack(1)
typedef struct tagBIGPRIM
{
BYTE code; /* 0-15 stroke fpendown, 4 unused bits. */
BYTE x1;
BYTE x2;
BYTE y1;
BYTE y2;
} BIGPRIM, *PBIGPRIM;
#pragma pack()
#ifdef ZTRAIN
typedef struct tagTRAININFO
{
WORD wclass;
BYTE rgfInfo;
BYTE cstrokes;
int chits; // How many times this guy appeared in the top10 correctly
int cmishits; // How many times this guy appeared incorrectly top1
int cattempts; // How many times this guy appeared in the top10 list
float eHits; // How many times this guy appeared in the top10 correctly
float eMishits; // How many times this guy appeared incorrectly top1
float eAttempts; // How many times this guy appeared in the top10 list before the correct answer
} TRAININFO;
#endif
typedef struct tagGEOMETRIC
{
BYTE x1:4; /* start x-coord */
BYTE x2:4; /* end x */
BYTE y1:4; /* start y-coord */
BYTE y2:4; /* end y */
} GEOMETRIC;
#pragma pack(1)
typedef struct tagPRIMITIVE
{
BYTE code;
union
{
struct
{
BYTE x1:4; /* start x-coord */
BYTE x2:4; /* end x */
BYTE y1:4; /* start y-coord */
BYTE y2:4; /* end y */
};
char rgch[2];
};
} PRIMITIVE, *PPRIMITIVE;
#pragma pack()
typedef struct tagPROTOHEADER
{
DWORD cprotoRom;
WORD *rgdbcRom;
BYTE *rgfeatRom;
GEOMETRIC *rggeomRom;
#ifdef ZTRAIN
DWORD cprotoDynamic;
WORD *rgdbcDynamic;
PRIMITIVE *rgprimDynamic;
TRAININFO **rgptraininfo;
#endif // ZTRAIN
} PROTOHEADER;
typedef struct tagMATCH
{
SYM sym;
WORD dist;
#ifdef ZTRAIN
TRAININFO *ptraininfo;
#endif // ZTRAIN
} MATCH;
typedef struct tagPROTOTYPE
{
WORD dbc;
GEOMETRIC *rggeom;
BYTE *rgfeat;
BOOL nybble;
RECMASK recmask;
#ifdef ZTRAIN
PRIMITIVE *rgprim;
TRAININFO *ptraininfo;
#endif // ZTRAIN
} PROTOTYPE;
typedef struct tagBIGPROTOTYPE
{
WORD dbc;
PBIGPRIM rgprim;
ALC recmask;
#ifdef ZTRAIN
TRAININFO *ptraininfo;
#endif // ZTRAIN
} BIGPROTOTYPE;
// Internal constants needed by the tools.
#define CMATCHMAX 20
#define CPRIM_DIFF 18 // number of different primitives
#define CPRIMMAX 30 // max primitives per character.
#define GEOM_DIST_MAX 900 // maximum geometric distance for 1 prim
// Internal declerations needed by tools.
typedef BYTE **COST_TABLE;
// Featurize ink
int ZillaFeaturize(GLYPH **glyph, BIGPRIM *rgprim, BYTE *pHoundFeat);
// Globals to hold pointers to loaded data.
extern PROTOHEADER mpcfeatproto[CPRIMMAX];
extern int g_iCostTableSize;
extern COST_TABLE g_ppCostTable;
extern BYTE *pGeomCost;
// Magic key the identifies the NN bin file
#define ZILLA_HOUND_FILE_TYPE 0x31142253
// Version information for file.
#define ZILLA_HOUND_MIN_FILE_VERSION 0 // First version of code that can read this file
#define ZILLA_HOUND_OLD_FILE_VERSION 0 // Oldest file version this code can read.
#define ZILLA_HOUND_CUR_FILE_VERSION 0 // Current version of code.
// Load info for Zilla-Hound
typedef struct tagZILLA_HOUND_LOAD_INFO
{
LOAD_INFO info;
LOCAL_NET net;
int iNetSize;
} ZILLA_HOUND_LOAD_INFO;
// Feature count information for Zilla/Hound combiner net
#define NUM_ZILLA_HOUND_ALTERNATES 4
#define NUM_ZILLA_HOUND_FEATURES 9
// Load the Zilla-Hound combining net.
BOOL ZillaHoundLoadFile(wchar_t *wszPath);
// Unload the Zilla-Hound combining net.
BOOL ZillaHoundUnloadFile();
// Load from a resource.
BOOL ZillaHoundLoadRes(HINSTANCE hInst, int nResID, int nType);
// Given Zilla results run Hound and combine the results.
void ZillaHoundMatch(MATCH *pMatch, int cPrim, BYTE *pSampleVector, LOCRUN_INFO *pLocRunInfo);
// Generate features used by Zilla/Hound combiner net.
RREAL *ZillaHoundFeat(
MATCH *pMatch, int cPrim, BYTE *pSampleVector, RREAL *pZillaHoundNetMemory, LOCRUN_INFO *pLocRunInfo
);
// Train time only stuff
#ifdef ZTRAIN
// Flags set per prototype during training.
#define MASK_INFO_IN 0x01 // Prototype has been added to database
#define MASK_INFO_NOISY 0x04 // Don't match against this prototype
#define IsInsertedLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo & MASK_INFO_IN)
#define MarkInsertedLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo |= MASK_INFO_IN)
#define MarkNoisyLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo |= MASK_INFO_NOISY)
#define MarkNotNoisyLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo &= ~MASK_INFO_NOISY)
#define IsNoisyLPTRAININFO(lptraininfoIn) (lptraininfoIn->rgfInfo & MASK_INFO_NOISY)
#define ProtoheaderFromMpcfeatproto(cprim) &(mpcfeatproto[cprim])
#define GetCprotoDynamicPROTOHEADER(pprotohdr) \
((pprotohdr)->cprotoDynamic)
#define SetCprotoDynamicPROTOHEADER(pprotohdr, cproto) \
((pprotohdr)->cprotoDynamic = (cproto))
#define PrototypeFromPROTOHEADER(pprotohdr, cprim, iproto, proto) { \
if ((iproto) < (pprotohdr)->cprotoRom) { \
ASSERT(0); \
} else { \
UINT iprotoD = (iproto) - (pprotohdr)->cprotoRom; \
ASSERT(iprotoD < (pprotohdr)->cprotoDynamic); \
(proto).dbc = (pprotohdr)->rgdbcDynamic[iprotoD]; \
(proto).rgprim = &((pprotohdr)->rgprimDynamic[(cprim) * (iprotoD)]);\
} \
(proto).recmask = LocRun2ALC(&g_locRunInfo, (proto).dbc); \
SetTraininfoPROTO(proto, (pprotohdr), iproto); \
}
#define SetTraininfoPROTO(proto, pphdr, iproto) \
(proto).ptraininfo = (pphdr)->rgptraininfo[iproto]
// Write out the cost calc table.
BOOL CostCalcWriteFile(COST_TABLE ppCostTable, int iCostTableSize, FILE *pFile, wchar_t *pLocale);
// Write out the geostats table.
BOOL GeoStatWriteFile(BYTE *pGeomCost, FILE *pFile, wchar_t *pLocale);
// Match primitives with extra stuff for training.
extern VOID MatchPrimitivesTrain(
const BIGPRIM * const pprim, // Featurized Query
const UINT cprim, // Number of features in query (aka feature space)
MATCH * const rgmatch, // Output: ranked list of characters and distances
const UINT cmatchmax, // size of rgmatch array
const CHARSET * const cs, // Allowed character set
const FLOAT zillaGeo // How important geometrics are vs. features.
);
BOOL AddPrototypeToDatabase(BIGPRIM *pprim, int cprim, WORD wTrain, VOID *pti);
BOOL TrimDatabase(VOID);
BOOL WriteTextDatabase(FILE *fpText, FILE *fpLog);
BOOL WriteZillaDat(LOCRUN_INFO *pLocRunInfo, FILE *cp, wchar_t *pLocale, BOOL bNibbleFeat);
VOID FreeDynamicMpcfeatproto(VOID);
int ComputeZillaSize(void);
void GetDynamicProto(PROTOHEADER *pphdr, UINT cprim, UINT iproto, BIGPROTOTYPE *proto);
int CountPrototypes(void);
#endif
#ifdef __cplusplus
};
#endif
#endif // ZILLATOOL_H