#include "lsdsply.h" #include "lsc.h" #include "lsline.h" #include "lssubl.h" #include "heights.h" #include "lstflow.h" #include "lssubset.h" #include "lstfset.h" #include "port.h" #include "prepdisp.h" #include "dispmain.h" static LSERR LSDrawBreaks(PLSC, PLSLINE, const POINT*, UINT, const RECT*); #define grpfQuickDisplayMask (fPortDisplayInvisible | \ fPortDisplayUnderline | \ fPortDisplayStrike | \ fPortDisplayShade | \ fPortDisplayBorder \ ) // %%Function: LsDisplayLine // %%Contact: victork // /* * Displays formatted line (main subline) from the given point. * Assumes background has been properly erased. */ LSERR WINAPI LsDisplayLine(PLSLINE plsline, const POINT* pptOrg, UINT kdispmode, const RECT *prectClip) { PLSC plsc; LSERR lserr; PLSSUBL plssubl; LSCP cpLim; LSTFLOW lstflow; POINTUV pt; PLSDNODE pdn; PDOBJ pdobj; DISPIN dispin; if (!FIsLSLINE(plsline)) return lserrInvalidParameter; plsc = plsline->lssubl.plsc; Assert(FIsLSC(plsc)); if (plsc->lsstate != LsStateFree) return lserrContextInUse; lserr = PrepareLineForDisplayProc(plsline); plsc->lsstate = LsStateFree; if (lserr != lserrNone) return lserr; plsc->lsstate = LsStateDisplaying; Assert(plsline->lslinfo.dvpDescent >= 0); Assert(plsline->lslinfo.dvpAscent >= 0); Assert(plsline->upStartAutonumberingText <= plsline->upLimAutonumberingText); Assert(plsline->upLimAutonumberingText <= plsline->upStartMainText); // Assert(plsline->upStartMainText <= plsline->upLimUnderline) wrong - negative advance pen Assert(plsline->upLimUnderline <= plsline->upLimLine); plssubl = &(plsline->lssubl); plsc->plslineDisplay = plsline; // set up display context if (plsline->lssubl.plsdnLastDisplay == NULL) { // do nothing - happens with only splat on the line } else // Do it quick way or call general procedure if (!plsline->fNonZeroDvpPosEncounted && !plsline->fNonRealDnodeEncounted && ((plsline->AggregatedDisplayFlags == 0) || ((plsline->AggregatedDisplayFlags & grpfQuickDisplayMask) == 0) ) ) { cpLim = plssubl->cpLimDisplay; lstflow = plssubl->lstflow; dispin.dupLimUnderline = 0; dispin.fDrawUnderline = fFalse; dispin.fDrawStrikethrough = fFalse; dispin.kDispMode = kdispmode; dispin.lstflow = lstflow; dispin.prcClip = (RECT*) prectClip; pt.u = plsline->upStartAutonumberingText; pt.v = 0; pdn = plssubl->plsdnFirst; // can use the loop condition instead of FDnodeBeforeCpLim macro - no borders for (;;) { Assert(pdn->klsdn == klsdnReal); pdobj = pdn->u.real.pdobj; dispin.plschp = &(pdn->u.real.lschp); dispin.plsrun = pdn->u.real.plsrun; dispin.heightsPres = pdn->u.real.objdim.heightsPres; dispin.dup = pdn->u.real.dup; LsPointXYFromPointUV(pptOrg, lstflow, &pt, &(dispin.ptPen)); lserr = (*plsc->lsiobjcontext.rgobj[pdn->u.real.lschp.idObj].lsim.pfnDisplay) (pdobj, &dispin); if (pdn == plsline->lssubl.plsdnLastDisplay || lserr != lserrNone) { break; } pt.u += pdn->u.real.dup; pdn = pdn->plsdnNext; } } else { lserr = DisplaySublineCore(plssubl, pptOrg, kdispmode, prectClip, plsline->upLimUnderline, plsline->upStartAutonumberingText); } if (lserr == lserrNone && plsline->kspl != ksplNone) { lserr = LSDrawBreaks(plsc, plsline, pptOrg, kdispmode, prectClip); } plsc->plslineDisplay = NULL; // invalidate display context plsc->lsstate = LsStateFree; return lserr; } // %%Function: LSDrawBreaks // %%Contact: victork // static LSERR LSDrawBreaks(PLSC plsc, PLSLINE plsline, const POINT* pptOrg, UINT kdispmode, const RECT* prectClip) { LSERR lserr; POINTUV ptUV; POINT pt; long dup; enum lsksplat lsks; LSTFLOW lstflow = plsline->lssubl.lstflow; HEIGHTS heightsLineFull; HEIGHTS heightsLineWithoutAddedSpace; OBJDIM objdimSubline; heightsLineFull.dvAscent = plsline->dvpAbove + plsline->lslinfo.dvpAscent; heightsLineFull.dvDescent = plsline->dvpBelow + plsline->lslinfo.dvpDescent; heightsLineFull.dvMultiLineHeight = dvHeightIgnore; heightsLineWithoutAddedSpace.dvAscent = plsline->lslinfo.dvpAscent; heightsLineWithoutAddedSpace.dvDescent = plsline->lslinfo.dvpDescent; heightsLineWithoutAddedSpace.dvMultiLineHeight = dvHeightIgnore; lserr = LssbGetObjDimSubline(&(plsline->lssubl), &lstflow, &objdimSubline); if (lserr == lserrNone) { ptUV.u = plsline->upLimLine; ptUV.v = 0; dup = plsline->upRightMarginJustify - plsline->upLimLine; if (plsline->kspl == ksplPageBreak) lsks = lsksplPageBreak; else if (plsline->kspl == ksplColumnBreak) lsks = lsksplColumnBreak; else lsks = lsksplSectionBreak; LsPointXYFromPointUV(pptOrg, lstflow, &ptUV, &pt); return (*plsc->lscbk.pfnDrawSplatLine) (plsc->pols, lsks, plsline->lslinfo.cpLim - 1, &pt, &(heightsLineFull), &(heightsLineWithoutAddedSpace), &(objdimSubline.heightsPres), dup, lstflow, kdispmode, prectClip); } return lserr; }