windows-nt/Source/XPSP1/NT/windows/richedit/lssrc/hih.c
2020-09-26 16:20:57 +08:00

473 lines
12 KiB
C

#include "lsmem.h"
#include "limits.h"
#include "hih.h"
#include "objhelp.h"
#include "lscbk.h"
#include "lsdevres.h"
#include "pdobj.h"
#include "objdim.h"
#include "plssubl.h"
#include "plsdnode.h"
#include "pilsobj.h"
#include "lscrsubl.h"
#include "lssubset.h"
#include "lsdnset.h"
#include "zqfromza.h"
#include "lsdocinf.h"
#include "fmti.h"
#include "posichnk.h"
#include "locchnk.h"
#include "lsdnfin.h"
#include "brko.h"
#include "lspap.h"
#include "plspap.h"
#include "lsqsubl.h"
#include "dispi.h"
#include "lsdssubl.h"
#include "lsems.h"
#include "dispmisc.h"
#include "sobjhelp.h"
#define HIH_ESC_CNT 1
struct ilsobj
{
POLS pols;
LSCBK lscbk;
PLSC plsc;
PFNHIHENUM pfnEnum;
LSESC lsescHih;
};
struct dobj
{
SOBJHELP sobjhelp; /* common area for simple objects */
PILSOBJ pilsobj; /* ILS object */
LSCP cpStart; /* Starting LS cp for object */
PLSSUBL plssubl; /* Handle to second line */
};
/* H I H F R E E D O B J */
/*----------------------------------------------------------------------------
%%Function: HihFreeDobj
%%Contact: antons
Free all resources associated with Hih dobj.
----------------------------------------------------------------------------*/
static LSERR HihFreeDobj (PDOBJ pdobj)
{
LSERR lserr = lserrNone;
PILSOBJ pilsobj = pdobj->pilsobj;
if (pdobj->plssubl != NULL)
{
lserr = LsDestroySubline(pdobj->plssubl);
}
pilsobj->lscbk.pfnDisposePtr(pilsobj->pols, pdobj);
return lserr;
}
/* H I H C R E A T E I L S O B J */
/*----------------------------------------------------------------------------
%%Function: HihCreateILSObj
%%Contact: ricksa
CreateILSObj
Create the ILS object for all Hih objects.
----------------------------------------------------------------------------*/
LSERR WINAPI HihCreateILSObj(
POLS pols, /* (IN): client application context */
PLSC plsc, /* (IN): LS context */
PCLSCBK pclscbk, /* (IN): callbacks to client application */
DWORD idObj, /* (IN): id of the object */
PILSOBJ *ppilsobj) /* (OUT): object ilsobj */
{
PILSOBJ pilsobj;
LSERR lserr;
HIHINIT hihinit;
hihinit.dwVersion = HIH_VERSION;
/* Get initialization data */
lserr = pclscbk->pfnGetObjectHandlerInfo(pols, idObj, &hihinit);
if (lserr != lserrNone)
{
return lserr;
}
pilsobj = pclscbk->pfnNewPtr(pols, sizeof(*pilsobj));
if (NULL == pilsobj)
{
return lserrOutOfMemory;
}
pilsobj->pols = pols;
pilsobj->lscbk = *pclscbk;
pilsobj->plsc = plsc;
pilsobj->lsescHih.wchFirst = hihinit.wchEndHih;
pilsobj->lsescHih.wchLast = hihinit.wchEndHih;
pilsobj->pfnEnum = hihinit.pfnEnum;
*ppilsobj = pilsobj;
return lserrNone;
}
/* H I H D E S T R O Y I L S O B J */
/*----------------------------------------------------------------------------
%%Function: HihDestroyILSObj
%%Contact: ricksa
DestroyILSObj
Free all resources assocaiated with Hih ILS object.
----------------------------------------------------------------------------*/
LSERR WINAPI HihDestroyILSObj(
PILSOBJ pilsobj) /* (IN): object ilsobj */
{
pilsobj->lscbk.pfnDisposePtr(pilsobj->pols, pilsobj);
return lserrNone;
}
/* H I H S E T D O C */
/*----------------------------------------------------------------------------
%%Function: HihSetDoc
%%Contact: ricksa
SetDoc
Keep track of device information for scaling purposes.
----------------------------------------------------------------------------*/
LSERR WINAPI HihSetDoc(
PILSOBJ pilsobj, /* (IN): object ilsobj */
PCLSDOCINF pclsdocinf) /* (IN): initialization data of the document level */
{
Unreferenced(pilsobj);
Unreferenced(pclsdocinf);
return lserrNone;
}
/* H I H C R E A T E L N O B J */
/*----------------------------------------------------------------------------
%%Function: HihCreateLNObj
%%Contact: ricksa
CreateLNObj
Create the Line Object for the Hih. No real need for a line
object so don't allocated it.
----------------------------------------------------------------------------*/
LSERR WINAPI HihCreateLNObj(
PCILSOBJ pcilsobj, /* (IN): object ilsobj */
PLNOBJ *pplnobj) /* (OUT): object lnobj */
{
*pplnobj = (PLNOBJ) pcilsobj;
return lserrNone;
}
/* H I H D E S T R O Y L N O B J */
/*----------------------------------------------------------------------------
%%Function: HihDestroyLNObj
%%Contact: ricksa
DestroyLNObj
Frees resources associated with the Hih line object. Since
there isn't any this is a no-op.
----------------------------------------------------------------------------*/
LSERR WINAPI HihDestroyLNObj(
PLNOBJ plnobj) /* (OUT): object lnobj */
{
Unreferenced(plnobj);
return lserrNone;
}
/* H I H F M T */
/*----------------------------------------------------------------------------
%%Function: HihFmt
%%Contact: ricksa
Fmt
Format the Hih object.
----------------------------------------------------------------------------*/
LSERR WINAPI HihFmt(
PLNOBJ plnobj, /* (IN): object lnobj */
PCFMTIN pcfmtin, /* (IN): formatting input */
FMTRES *pfmtres) /* (OUT): formatting result */
{
PDOBJ pdobj;
LSERR lserr;
PILSOBJ pilsobj = (PILSOBJ) plnobj;
POLS pols = pilsobj->pols;
LSCP cpStartMain = pcfmtin->lsfgi.cpFirst + 1;
LSCP cpOut;
FMTRES fmtres;
FMTRES fmtr = fmtrCompletedRun;
/*
* Allocate the DOBJ
*/
pdobj = pilsobj->lscbk.pfnNewPtr(pols, sizeof(*pdobj));
if (NULL == pdobj)
{
return lserrOutOfMemory;
}
ZeroMemory(pdobj, sizeof(*pdobj));
pdobj->pilsobj = pilsobj;
pdobj->cpStart = pcfmtin->lsfgi.cpFirst;
/*
* Build main line of text
*/
lserr = FormatLine(pilsobj->plsc, cpStartMain, LONG_MAX, pcfmtin->lsfgi.lstflow,
&pdobj->plssubl, HIH_ESC_CNT, &pilsobj->lsescHih,
&pdobj->sobjhelp.objdimAll, &cpOut, NULL, NULL, &fmtres);
if (lserr != lserrNone)
{
HihFreeDobj(pdobj); /* do not need to check return error code */
return lserr;
}
/*
* Note: the + 2 in the following is because cpStartMain is + 1 from the
* actual start of the object (it is the cpStartMain of the Hih
* data) and additional + 1 for the escape character at the end of the
* tatenakayoko.
*/
Assert (fmtres != fmtrExceededMargin);
pdobj->sobjhelp.dcp = cpOut - cpStartMain + 2;
lserr = LsdnFinishRegular(pilsobj->plsc, pdobj->sobjhelp.dcp,
pcfmtin->lsfrun.plsrun, pcfmtin->lsfrun.plschp, pdobj,
&pdobj->sobjhelp.objdimAll);
if (lserr != lserrNone)
{
HihFreeDobj(pdobj); /* do not need to check return error code */
return lserr;
}
if (pcfmtin->lsfgi.urPen + pdobj->sobjhelp.objdimAll.dur > pcfmtin->lsfgi.urColumnMax)
{
fmtr = fmtrExceededMargin;
}
*pfmtres = fmtr;
return lserrNone;
}
/* H I H G E T S P E C I A L E F F E C T S I N S I D E */
/*----------------------------------------------------------------------------
%%Function: HihGetSpecialEffectsInside
%%Contact: ricksa
GetSpecialEffectsInside
.
----------------------------------------------------------------------------*/
LSERR WINAPI HihGetSpecialEffectsInside(
PDOBJ pdobj, /* (IN): dobj */
UINT *pEffectsFlags) /* (OUT): Special effects for this object */
{
return LsGetSpecialEffectsSubline(pdobj->plssubl, pEffectsFlags);
}
/* H I H C A L C P R E S E N T A T I O N */
/*----------------------------------------------------------------------------
%%Function: HihCalcPresentation
%%Contact: ricksa
CalcPresentation
This has three jobs. First it distributes space to the shorter string
if so requested. Next it prepares each line for presentation. Finally,
it calculates the positions of the lines in output device coordinates.
----------------------------------------------------------------------------*/
LSERR WINAPI HihCalcPresentation(
PDOBJ pdobj, /* (IN): dobj */
long dup, /* (IN): dup of dobj */
LSKJUST lskjust, /* (IN): Justification type */
BOOL fLastVisibleOnLine ) /* (IN): Is this object last visible on line? */
{
Unreferenced (fLastVisibleOnLine);
Unreferenced(dup);
Unreferenced (lskjust);
return LsMatchPresSubline(pdobj->plssubl);
}
/* H I H Q U E R Y P O I N T P C P */
/*----------------------------------------------------------------------------
%%Function: HihQueryPointPcp
%%Contact: ricksa
Map dup to dcp
Just call through to Query result helper.
----------------------------------------------------------------------------*/
LSERR WINAPI HihQueryPointPcp(
PDOBJ pdobj, /*(IN): dobj to query */
PCPOINTUV ppointuvQuery, /*(IN): query point (uQuery,vQuery) */
PCLSQIN plsqin, /*(IN): query input */
PLSQOUT plsqout) /*(OUT): query output */
{
Unreferenced(ppointuvQuery);
return CreateQueryResult(pdobj->plssubl, 0, 0, plsqin, plsqout);
}
/* H I H Q U E R Y C P P P O I N T */
/*----------------------------------------------------------------------------
%%Function: HihQueryCpPpoint
%%Contact: ricksa
Map dcp to dup
Just call through to Query result helper.
----------------------------------------------------------------------------*/
LSERR WINAPI HihQueryCpPpoint(
PDOBJ pdobj, /*(IN): dobj to query, */
LSDCP dcp, /*(IN): dcp for the query */
PCLSQIN plsqin, /*(IN): query input */
PLSQOUT plsqout) /*(OUT): query output */
{
Unreferenced(dcp);
return CreateQueryResult(pdobj->plssubl, 0, 0, plsqin, plsqout);
}
/* H I H D I S P L A Y */
/*----------------------------------------------------------------------------
%%Function: HihDisplay
%%Contact: ricksa
Display
This calculates the positions of the various lines for the
display and then displays them.
----------------------------------------------------------------------------*/
LSERR WINAPI HihDisplay(
PDOBJ pdobj, /*(IN): dobj to display */
PCDISPIN pcdispin) /*(IN): info for display */
{
/* display the Hih line */
return LsDisplaySubline(pdobj->plssubl, &pcdispin->ptPen, pcdispin->kDispMode,
pcdispin->prcClip);
}
/* H I H D E S T R O Y D O B J */
/*----------------------------------------------------------------------------
%%Function: HihDestroyDobj
%%Contact: ricksa
DestroyDobj
Free all resources connected with the input dobj.
----------------------------------------------------------------------------*/
LSERR WINAPI HihDestroyDobj(
PDOBJ pdobj) /*(IN): dobj to destroy */
{
return HihFreeDobj(pdobj);
}
/* H I H E N U M */
/*----------------------------------------------------------------------------
%%Function: HihEnum
%%Contact: ricksa
Enumeration callback - passed to client.
----------------------------------------------------------------------------*/
LSERR WINAPI HihEnum(
PDOBJ pdobj, /*(IN): dobj to enumerate */
PLSRUN plsrun, /*(IN): from DNODE */
PCLSCHP plschp, /*(IN): from DNODE */
LSCP cp, /*(IN): from DNODE */
LSDCP dcp, /*(IN): from DNODE */
LSTFLOW lstflow, /*(IN): text flow*/
BOOL fReverse, /*(IN): enumerate in reverse order */
BOOL fGeometryNeeded, /*(IN): */
const POINT* pt, /*(IN): starting position (top left), iff fGeometryNeeded */
PCHEIGHTS pcheights, /*(IN): from DNODE, relevant iff fGeometryNeeded */
long dupRun) /*(IN): from DNODE, relevant iff fGeometryNeeded */
{
return pdobj->pilsobj->pfnEnum(pdobj->pilsobj->pols, plsrun, plschp, cp,
dcp, lstflow, fReverse, fGeometryNeeded, pt, pcheights, dupRun,
pdobj->plssubl);
}
/* H I H H A N D L E R I N I T */
/*----------------------------------------------------------------------------
%%Function: HihHandlerInit
%%Contact: ricksa
Initialize global Hih data and return LSIMETHODS.
----------------------------------------------------------------------------*/
LSERR WINAPI LsGetHihLsimethods(
LSIMETHODS *plsim)
{
plsim->pfnCreateILSObj = HihCreateILSObj;
plsim->pfnDestroyILSObj = HihDestroyILSObj;
plsim->pfnSetDoc = HihSetDoc;
plsim->pfnCreateLNObj = HihCreateLNObj;
plsim->pfnDestroyLNObj = HihDestroyLNObj;
plsim->pfnFmt = HihFmt;
plsim->pfnFmtResume = ObjHelpFmtResume;
plsim->pfnGetModWidthPrecedingChar = ObjHelpGetModWidthChar;
plsim->pfnGetModWidthFollowingChar = ObjHelpGetModWidthChar;
plsim->pfnTruncateChunk = SobjTruncateChunk;
plsim->pfnFindPrevBreakChunk = SobjFindPrevBreakChunk;
plsim->pfnFindNextBreakChunk = SobjFindNextBreakChunk;
plsim->pfnForceBreakChunk = SobjForceBreakChunk;
plsim->pfnSetBreak = ObjHelpSetBreak;
plsim->pfnGetSpecialEffectsInside = HihGetSpecialEffectsInside;
plsim->pfnFExpandWithPrecedingChar = ObjHelpFExpandWithPrecedingChar;
plsim->pfnFExpandWithFollowingChar = ObjHelpFExpandWithFollowingChar;
plsim->pfnCalcPresentation = HihCalcPresentation;
plsim->pfnQueryPointPcp = HihQueryPointPcp;
plsim->pfnQueryCpPpoint = HihQueryCpPpoint;
plsim->pfnDisplay = HihDisplay;
plsim->pfnDestroyDObj = HihDestroyDobj;
plsim->pfnEnum = HihEnum;
return lserrNone;
}