|
|
#include "lsidefs.h"
#include "lsmem.h"
#include "limits.h"
#include "objhelp.h"
#include "lscrsubl.h"
#include "lssubset.h"
#include "lsdnset.h"
#include "lstfset.h"
#include "lsdocinf.h"
#include "fmti.h"
#include "lsqout.h"
#include "lsqin.h"
#include "mwcls.h"
#include "brkkind.h"
#include "brko.h"
/* G E T B R E A K R E C O R D I N D E X */ /*----------------------------------------------------------------------------
%%Function: GetBreakRecordIndex %%Contact: antons
Index of the break record from brkkind. Assert if brrkkind = brkkindImposedAfter. ----------------------------------------------------------------------------*/
DWORD GetBreakRecordIndex (BRKKIND brkkind) { DWORD result = 0; Assert (brkkind != brkkindImposedAfter); Assert (NBreaksToSave == 3);
switch (brkkind) { case brkkindPrev: result = 0; break; case brkkindNext: result = 1; break; case brkkindForce: result = 2; break;
case brkkindImposedAfter: break;
default: AssertSz (FALSE, "Unknown brkkind"); };
Assert (result < NBreaksToSave); return result; }
/* F O R M A T L I N E */ /*----------------------------------------------------------------------------
%%Function: FormatLine %%Contact: antons
Formats a line of text with the given escape characters ignoring all tabs, eops, etc. ----------------------------------------------------------------------------*/ LSERR FormatLine( PLSC plsc, LSCP cpStart, long durColMax, LSTFLOW lstflow, PLSSUBL *pplssubl, DWORD cdwlsesc, const LSESC *plsesc, OBJDIM *pobjdim, LSCP *pcpOut, PLSDNODE *pplsdnStart, PLSDNODE *pplsdnEnd, FMTRES *pfmtres) { return FormatResumedLine ( plsc, cpStart, durColMax, lstflow, pplssubl, cdwlsesc, plsesc, pobjdim, pcpOut, pplsdnStart, pplsdnEnd, pfmtres, NULL, /* Array of break records */ 0 ); /* Number of break record */
}
/* F O R M A T R E S U M E D L I N E */ /*----------------------------------------------------------------------------
%%Function: FormatResumedLine %%Contact: ricksa
Formats a line that contains broken objects at its beginning. ----------------------------------------------------------------------------*/ LSERR FormatResumedLine( PLSC plsc, LSCP cpStart, long durColMax, LSTFLOW lstflow, PLSSUBL *pplssubl, DWORD cdwlsesc, const LSESC *plsesc, POBJDIM pobjdim, LSCP *pcpOut, PLSDNODE *pplsdnStart, PLSDNODE *pplsdnEnd, FMTRES *pfmtres, const BREAKREC *pbreakrec, DWORD cbreakrec) { LSERR lserr; PLSDNODE plsdnStart; PLSDNODE plsdnEnd; LSCP cpOut; FMTRES fmtres; PLSSUBL plssubl = NULL; BOOL fSuccessful = FALSE; LSTFLOW lstflowUnused;
*pplssubl = NULL; /* In case of lserr */
while (! fSuccessful) { lserr = LsCreateSubline(plsc, cpStart, durColMax, lstflow, FALSE);
if (lserr != lserrNone) return lserr;
lserr = LsFetchAppendToCurrentSublineResume(plsc, pbreakrec, cbreakrec, 0, plsesc, cdwlsesc, &fSuccessful, &fmtres, &cpOut, &plsdnStart, &plsdnEnd);
if (lserr != lserrNone) return lserr;
/* REVIEW (antons): fmtrStopped is not handled */ Assert (fmtres == fmtrCompletedRun || fmtres == fmtrExceededMargin || fmtres == fmtrTab);
if (pplsdnStart != NULL) *pplsdnStart = plsdnStart;
while (fSuccessful && (fmtres == fmtrTab)) { /* Format as much as we can - note we move max to maximum postive value. */ lserr = LsFetchAppendToCurrentSubline(plsc, 0, plsesc, cdwlsesc, &fSuccessful, &fmtres, &cpOut, &plsdnStart, &plsdnEnd);
if (lserr != lserrNone) return lserr;
/* REVIEW (antons): fmtrStopped is not handled */ Assert (fmtres == fmtrCompletedRun || fmtres == fmtrExceededMargin || fmtres == fmtrTab); }
if (! fSuccessful) { /* FetchAppend UnSuccessful => Finish and Destroy subline, then repeat */
lserr = LsFinishCurrentSubline(plsc, &plssubl); if (lserr != lserrNone) return lserr;
lserr = LsDestroySubline(plssubl); if (lserr != lserrNone) return lserr; } else { if (pplsdnEnd != NULL) *pplsdnEnd = plsdnEnd;
*pcpOut = cpOut; *pfmtres = fmtres; };
}; /* while (! fSuccessful) */
lserr = LsFinishCurrentSubline(plsc, &plssubl);
if (lserrNone != lserr) return lserr;
lserr = LssbGetObjDimSubline(plssubl, &lstflowUnused, pobjdim);
if (lserr != lserrNone) { LsDestroySubline(plssubl); return lserr; }
*pplssubl = plssubl;
return lserrNone; }
/* C R E A T E Q U E R Y R E S U L T */ /*----------------------------------------------------------------------------
%%Function: CreateQueryResult %%Contact: ricksa
Common routine to fill in query output record for Query methods.
. ----------------------------------------------------------------------------*/ LSERR CreateQueryResult( PLSSUBL plssubl, /*(IN): subline of ruby */ long dupAdj, /*(IN): u offset of start of subline */ long dvpAdj, /*(IN): v offset of start of subline */ PCLSQIN plsqin, /*(IN): query input */ PLSQOUT plsqout) /*(OUT): query output */ { ZeroMemory(plsqout, sizeof(LSQOUT)); plsqout->heightsPresObj = plsqin->heightsPresRun; plsqout->dupObj = plsqin->dupRun; ZeroMemory(&plsqout->lstextcell, sizeof(plsqout->lstextcell)); plsqout->plssubl = plssubl; plsqout->pointUvStartSubline.u += dupAdj; plsqout->pointUvStartSubline.v += dvpAdj; return lserrNone; }
/* O B J H E L P F M T R E S U M E */ /*----------------------------------------------------------------------------
%%Function: ObjHelpFmtResume %%Contact: ricksa
This is a helper that is used by objects that don't support the resuming of formatting. ----------------------------------------------------------------------------*/ LSERR WINAPI ObjHelpFmtResume( PLNOBJ plnobj, /* (IN): object lnobj */ const BREAKREC *rgBreakRecord, /* (IN): array of break records */ DWORD nBreakRecord, /* (IN): size of the break records array */ PCFMTIN pcfmtin, /* (IN): formatting input */ FMTRES *pfmtres) /* (OUT): formatting result */ { Unreferenced(plnobj); Unreferenced(rgBreakRecord); Unreferenced(nBreakRecord); Unreferenced(pcfmtin); Unreferenced(pfmtres);
return lserrInvalidBreakRecord; }
/* O B J H E L P G E T M O D W I D T H C H A R */ /*----------------------------------------------------------------------------
%%Function: ObjHelpGetModWidthChar %%Contact: ricksa
Implementation of LSIMETHOD for objects that do nothing for mod width. Tatenakayoko and Hih are examples of this kind of object. ----------------------------------------------------------------------------*/ LSERR WINAPI ObjHelpGetModWidthChar( PDOBJ pdobj, /* (IN): dobj */ PLSRUN plsrun, /* (IN): plsrun of the object */ PLSRUN plsrunText, /* (IN): plsrun of the preceding char */ PCHEIGHTS pcheightsRef, /* (IN): height info about character */ WCHAR wchar, /* (IN): preceding character */ MWCLS mwcls, /* (IN): ModWidth class of preceding character */ long *pdurChange) /* (OUT): amount by which width of the preceding char is to be changed */ { Unreferenced(pdobj); Unreferenced(plsrun); Unreferenced(plsrunText); Unreferenced(pcheightsRef); Unreferenced(wchar); Unreferenced(mwcls); *pdurChange = 0; return lserrNone; }
/* O B J H E L P S E T B R E A K */ /*----------------------------------------------------------------------------
%%Function: ObjHelpSetBreak %%Contact: ricksa
SetBreak
Implementation of LSIMETHOD for objects that do nothing for SetBreak. Tatenakayoko and Hih are examples of this kind of object.
----------------------------------------------------------------------------*/ LSERR WINAPI ObjHelpSetBreak( PDOBJ pdobj, /* (IN): dobj which is broken */ BRKKIND brkkind, /* (IN): Previous / Next / Force / Imposed was chosen */ DWORD cBreakRecord, /* (IN): size of array */ BREAKREC *rgBreakRecord, /* (IN): array of break records */ DWORD *pcActualBreakRecord) /* (IN): actual number of used elements in array */ { Unreferenced(pdobj); Unreferenced(brkkind); Unreferenced(rgBreakRecord); Unreferenced(cBreakRecord);
*pcActualBreakRecord = 0;
return lserrNone; }
/* ObjHelpFExpandWithPrecedingChar */ /*----------------------------------------------------------------------------
%%Function: ObjHelpFExpandWithPrecedingChar %%Contact: ricksa
Default implementation of LSIMETHOD for objects that do not allow expanding the previous character.
----------------------------------------------------------------------------*/ LSERR WINAPI ObjHelpFExpandWithPrecedingChar( PDOBJ pdobj, /* (IN): dobj */ PLSRUN plsrun, /* (IN): plsrun of the object */ PLSRUN plsrunText, /* (IN): plsrun of the preceding char */ WCHAR wchar, /* (IN): preceding character */ MWCLS mwcls, /* (IN): ModWidth class of preceding character*/ BOOL *pfExpand) /* (OUT): (OUT): expand preceding character? */ { Unreferenced(pdobj); Unreferenced(plsrun); Unreferenced(plsrunText); Unreferenced(wchar); Unreferenced(mwcls);
*pfExpand = fTrue; return lserrNone; }
/* ObjHelpFExpandWithFollowingChar */ /*----------------------------------------------------------------------------
%%Function: ObjHelpFExpandWithFollowingChar %%Contact: ricksa
Default implementation of LSIMETHOD for objects that do not allow expanding themselves.
----------------------------------------------------------------------------*/ LSERR WINAPI ObjHelpFExpandWithFollowingChar( PDOBJ pdobj, /* (IN): dobj */ PLSRUN plsrun, /* (IN): plsrun of the object */ PLSRUN plsrunText, /* (IN): plsrun of the following char */ WCHAR wchar, /* (IN): following character */ MWCLS mwcls, /* (IN): ModWidth class of following character*/ BOOL *pfExpand) /* (OUT): expand object? */ { Unreferenced(pdobj); Unreferenced(plsrun); Unreferenced(plsrunText); Unreferenced(wchar); Unreferenced(mwcls);
*pfExpand = fTrue; return lserrNone; }
|