#include "lsidefs.h" #include "sublutil.h" #include "dnutils.h" #include "lssubl.h" #include "lsdnode.h" #include "dninfo.h" #include "lsimeth.h" #include "iobj.h" #include "lsmem.h" #include "chnutils.h" #include "posichnk.h" #include "getfmtst.h" #include "lstext.h" #ifdef DEBUG #define DebugMemset(a,b,c) if ((a) != NULL) memset(a,b,c); else #else #define DebugMemset(a,b,c) (void)(0) #endif LSERR GetSpecialEffectsSublineCore(PLSSUBL plssubl,PLSIOBJCONTEXT plsiobjcontext, UINT* pfEffectsFlags) { PLSDNODE plsdn; PLSDNODE plsdnPrev; UINT fEffectsFlagsObject; DWORD iobj; LSERR lserr; LSIMETHODS* plsim; Assert(FIsLSSUBL(plssubl)); *pfEffectsFlags = 0; plsdn = plssubl->plsdnFirst; plsdnPrev = NULL; while(plsdnPrev != plssubl->plsdnLast) { if (FIsDnodeReal(plsdn)) { *pfEffectsFlags |= plsdn->u.real.lschp.EffectsFlags; iobj = IdObjFromDnode(plsdn); if (iobj != IobjTextFromLsc(plsiobjcontext) && !FIsDnodeSplat(plsdn)) { plsim = PLsimFromLsc(plsiobjcontext, iobj); if (plsim->pfnGetSpecialEffectsInside != NULL) { lserr = plsim->pfnGetSpecialEffectsInside(plsdn->u.real.pdobj, &fEffectsFlagsObject); if (lserr != lserrNone) return lserr; *pfEffectsFlags |= fEffectsFlagsObject; } } } plsdnPrev = plsdn; plsdn = plsdn->plsdnNext; } return lserrNone; } LSERR GetObjDimSublineCore( PLSSUBL plssubl, /* IN: subline */ POBJDIM pobjdim) /* OUT: dimension of subline */ { PLSDNODE plsdnFirst = plssubl->plsdnFirst; PLSDNODE plsdnLast = plssubl->plsdnLast; /* skip autonumber for the main subline */ if (FIsSubLineMain(plssubl)) { while (plsdnFirst != NULL && plsdnFirst->cpFirst < 0) { plsdnFirst = plsdnFirst->plsdnNext; } /* because of splat right after autonumber plsdnFirst can be NULL */ if (plsdnFirst == NULL) plsdnLast = NULL; } return FindListDims(plsdnFirst, plsdnLast, pobjdim); } LSERR GetDupSublineCore( PLSSUBL plssubl, /* IN: Subline Context */ long* pdup) /* OUT: dup of subline */ { FindListDup(plssubl->plsdnFirst, plssubl->cpLim, pdup); return lserrNone; } LSERR FIsSublineEmpty( PLSSUBL plssubl, /* IN: subline */ BOOL* pfEmpty) /* OUT:is this subline empty */ { PLSDNODE plsdnLast; Assert(FIsLSSUBL(plssubl)); Assert((plssubl->plsdnFirst == NULL) == (plssubl->plsdnLast == NULL)); plsdnLast = plssubl->plsdnLast; if (FIsSubLineMain(plssubl)) { if (plsdnLast != NULL && FIsDnodeSplat(plsdnLast)) { plsdnLast = plsdnLast->plsdnPrev; } *pfEmpty = (plsdnLast == NULL || FIsNotInContent(plsdnLast)); } else { *pfEmpty = (plsdnLast == NULL ); } return lserrNone; } LSERR DestroySublineCore(PLSSUBL plssubl,LSCBK* plscbk, POLS pols, PLSIOBJCONTEXT plsiobjcontext, BOOL fDontReleaseRuns)/* IN: subline to destroy */ { LSERR lserr; Assert(FIsLSSUBL(plssubl)); lserr = DestroyDnodeList(plscbk, pols, plsiobjcontext, plssubl->plsdnFirst, fDontReleaseRuns); if (lserr != lserrNone) return lserr; /* destroy chunk context */ DestroyChunkContext(plssubl->plschunkcontext); /* destroy break context */ Assert(plssubl->pbrkcontext != NULL); /* we don't expect main subline to be called */ DebugMemset(plssubl->pbrkcontext, 0xE9, sizeof(BRKCONTEXT)); plscbk->pfnDisposePtr(pols, plssubl->pbrkcontext); plssubl->tag = tagInvalid; DebugMemset(plssubl, 0xE9, sizeof(LSSUBL)); plscbk->pfnDisposePtr(pols, plssubl); return lserrNone; } BOOL FAreTabsPensInSubline( PLSSUBL plssubl) /* IN: subline */ { PLSDNODE plsdn; PLSDNODE plsdnPrev; BOOL fAreTabsPensInSubline; Assert(FIsLSSUBL(plssubl)); fAreTabsPensInSubline = fFalse; plsdn = plssubl->plsdnFirst; plsdnPrev = NULL; while(plsdnPrev != plssubl->plsdnLast) { if (FIsDnodePen(plsdn) || plsdn->fTab) { fAreTabsPensInSubline = fTrue; break; } plsdnPrev = plsdn; plsdn = plsdn->plsdnNext; } return fAreTabsPensInSubline; } LSERR GetPlsrunFromSublineCore( PLSSUBL plssubl, /* IN: subline */ DWORD crgPlsrun, /* IN: size of array */ PLSRUN* rgPlsrun) /* OUT: array of plsruns */ { DWORD i = 0; PLSDNODE plsdn; PLSDNODE plsdnPrev; Assert(FIsLSSUBL(plssubl)); plsdn = plssubl->plsdnFirst; plsdnPrev = NULL; while(plsdnPrev != plssubl->plsdnLast && i < crgPlsrun) { if (FIsDnodeReal(plsdn)) { rgPlsrun[i] = plsdn->u.real.plsrun; } else /* pen */ { rgPlsrun[i] = NULL; } plsdnPrev = plsdn; plsdn = plsdn->plsdnNext; i++; } return lserrNone; } LSERR GetNumberDnodesCore( PLSSUBL plssubl, /* IN: subline */ DWORD* cDnodes) /* OUT: numberof dnodes in subline */ { PLSDNODE plsdn; PLSDNODE plsdnPrev; Assert(FIsLSSUBL(plssubl)); *cDnodes = 0; plsdn = plssubl->plsdnFirst; plsdnPrev = NULL; while(plsdnPrev != plssubl->plsdnLast) { (*cDnodes)++; plsdnPrev = plsdn; plsdn = plsdn->plsdnNext; } return lserrNone; } LSERR GetVisibleDcpInSublineCore( PLSSUBL plssubl, /* IN: subline */ LSDCP* pndcp) /* OUT:amount of visible characters in subline */ { PLSDNODE plsdn; PLSDNODE plsdnPrev; Assert(FIsLSSUBL(plssubl)); *pndcp = 0; plsdn = plssubl->plsdnFirst; plsdnPrev = NULL; while(plsdnPrev != plssubl->plsdnLast) { if (FIsDnodeReal(plsdn)) { *pndcp += plsdn->dcp; } plsdnPrev = plsdn; plsdn = plsdn->plsdnNext; } return lserrNone; } LSERR GetDurTrailInSubline( PLSSUBL plssubl, /* IN: Subline Context */ long* pdurTrail) /* OUT: width of trailing area in subline */ { LSERR lserr; PLSCHUNKCONTEXT plschunkcontext; PLSDNODE plsdn; LSDCP dcpTrail; PLSDNODE plsdnStartTrail; LSDCP dcpStartTrailingText; int cDnodesTrailing; PLSDNODE plsdnTrailingObject; LSDCP dcpTrailingObject; BOOL fClosingBorderStartsTrailing; *pdurTrail = 0; plsdn = GetCurrentDnodeSubl(plssubl); plschunkcontext = PlschunkcontextFromSubline(plssubl); if (plsdn != NULL) { lserr = GetTrailingInfoForTextGroupChunk(plsdn, plsdn->dcp, IobjTextFromLsc(plschunkcontext->plsiobjcontext), pdurTrail, &dcpTrail, &plsdnStartTrail, &dcpStartTrailingText, &cDnodesTrailing, &plsdnTrailingObject, &dcpTrailingObject, &fClosingBorderStartsTrailing); if (lserr != lserrNone) return lserr; } return lserrNone; } LSERR GetDurTrailWithPensInSubline( PLSSUBL plssubl, /* IN: Subline Context */ long* pdurTrail) /* OUT: width of trailing area in subline */ { LSERR lserr; PLSCHUNKCONTEXT plschunkcontext; PLSDNODE plsdn; LSDCP dcpTrail; PLSDNODE plsdnStartTrail; LSDCP dcpStartTrailingText; int cDnodesTrailing; PLSDNODE plsdnTrailingObject; LSDCP dcpTrailingObject; BOOL fClosingBorderStartsTrailing; long durTrailLoc; BOOL fContinue = fTrue; *pdurTrail = 0; plsdn = GetCurrentDnodeSubl(plssubl); plschunkcontext = PlschunkcontextFromSubline(plssubl); while(fContinue) { if (plsdn != NULL) { lserr = GetTrailingInfoForTextGroupChunk(plsdn, plsdn->dcp, IobjTextFromLsc(plschunkcontext->plsiobjcontext), &durTrailLoc, &dcpTrail, &plsdnStartTrail, &dcpStartTrailingText, &cDnodesTrailing, &plsdnTrailingObject, &dcpTrailingObject, &fClosingBorderStartsTrailing); if (lserr != lserrNone) return lserr; *pdurTrail += durTrailLoc; if (dcpTrailingObject == 0) { /* we stopped just before group chunk, may be because of pen */ Assert(FIsLSDNODE(plsdnTrailingObject)); plsdn = plsdnTrailingObject->plsdnPrev; while(plsdn != NULL && FIsDnodePen(plsdn)) { *pdurTrail += DurFromDnode(plsdn); plsdn = plsdn->plsdnPrev; } } else { fContinue = fFalse; } } else { fContinue = fFalse; } } return lserrNone; }