/* LSCRSUBL.C */ #include "lscrsubl.h" #include "lsidefs.h" #include "lsc.h" #include "lsfetch.h" #include "getfmtst.h" #include "setfmtst.h" #include "fmtres.h" #include "sublutil.h" #include "break.h" #include "prepdisp.h" #include #define DO_COMPRESSION fTrue #define DO_EXPANSION fFalse static LSERR ErrorInCurrentSubline(PLSC plsc, LSERR error) { Assert(GetCurrentSubline(plsc) != NULL); DestroySublineCore(GetCurrentSubline(plsc),&plsc->lscbk, plsc->pols, &plsc->lsiobjcontext, plsc->fDontReleaseRuns); SetCurrentSubline(plsc, NULL); return error; } /* ---------------------------------------------------------------------- */ /* L S C R E A T E S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsCreateSubline %%Contact: igorzv Parameters: plsc - (IN) LS context cpFirst - (IN) first cp of a subline urColumnMax - (IN) width restriction for a subline lstflow - (IN) text flow of a subline fContiguos - (IN) if TRUE such line has the same coordinate system as main line and is allowed to have tabs ----------------------------------------------------------------------------*/ LSERR WINAPI LsCreateSubline(PLSC plsc, LSCP cpFirst, long urColumnMax, LSTFLOW lstflow, BOOL fContiguos) { if (!FIsLSC(plsc)) return lserrInvalidParameter; if (!FFormattingAllowed(plsc) && !FBreakingAllowed(plsc)) return lserrCreateSublineDisabled; if (GetCurrentSubline(plsc) != NULL) return lserrCreateSublineDisabled; if (fContiguos) /* this flag is allowed only in formating time and only within fmt method */ { if (!FFormattingAllowed(plsc)) return lserrInvalidParameter; if (GetDnodeToFinish(plsc) == NULL) return lserrInvalidParameter; if (!(SublineFromDnode(GetDnodeToFinish(plsc))->fContiguous)) fContiguos = fFalse; } if (urColumnMax > uLsInfiniteRM) urColumnMax = uLsInfiniteRM; return CreateSublineCore(plsc, cpFirst, urColumnMax, lstflow, fContiguos); } /* ---------------------------------------------------------------------- */ /* L S F E T C H A P P E N D T O C U R R E N T S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsFetchAppendToCurrentSubline %%Contact: igorzv Parameters: plsc - (IN) LS context lsdcp - (IN) increse cp before fetching plsesc - (IN) escape characters cEsc - (IN) # of escape characters pfSuccessful- (OUT) Successful?---if not, finish subline, destroy it and start anew pfmtres - (OUT) result of last formatter pcpLim - (OUT) where we stop fetching pplsdnFirst - (OUT) first dnode that was created pplsdnLast - (OUT) last dnode that was created ----------------------------------------------------------------------------*/ LSERR WINAPI LsFetchAppendToCurrentSubline(PLSC plsc, LSDCP lsdcp, const LSESC* plsesc, DWORD cEsc, BOOL *pfSuccessful, FMTRES* pfmtres, LSCP* pcpLim, PLSDNODE* pplsdnFirst, PLSDNODE* pplsdnLast) { LSERR lserr; PLSSUBL plssubl; long dur; long urColumnMaxIncreased; BOOL fDone = fFalse; LSSTATE lsstateOld; BOOL fFirstIteration = fTrue; PLSDNODE plsdnFirstCurrent; PLSDNODE plsdnLastCurrent; if (!FIsLSC(plsc)) return lserrInvalidParameter; plssubl = GetCurrentSubline(plsc); if (plssubl == NULL) return lserrFormattingFunctionDisabled; /* client can use this function only in formatting or breaking time */ if (!FFormattingAllowed(plsc) && !FBreakingAllowed(plsc)) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* in formatting time it should be some dnode to finish */ if (FFormattingAllowed(plsc) && GetDnodeToFinish(plsc) == NULL) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* we don't allow to continue formatting if right margin is exceeded */ if (plssubl->fRightMarginExceeded) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); *pfSuccessful = fTrue; /* we must to set state to formatting and later restore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateFormatting; /*Initialization; */ AdvanceCurrentCpLimSubl(plssubl, lsdcp); *pplsdnLast = NULL; urColumnMaxIncreased = RightMarginIncreasing(plsc, plssubl->urColumnMax); while(!fDone) /* we continue fetching when we have tab that are not allowed in our subline */ { lserr = FetchAppendEscCore(plsc, urColumnMaxIncreased, plsesc, cEsc, pfmtres, pcpLim, &plsdnFirstCurrent, &plsdnLastCurrent, &dur); if (lserr != lserrNone) return ErrorInCurrentSubline(plsc, lserr); Assert((plsdnFirstCurrent == NULL) == (plsdnLastCurrent == NULL)); Assert((plsdnLastCurrent == NULL) || ((plsdnLastCurrent)->plsdnNext == NULL)); if (fFirstIteration) { *pplsdnFirst = plsdnFirstCurrent; fFirstIteration = fFalse; } if (plsdnLastCurrent != NULL) *pplsdnLast = plsdnLastCurrent; if (*pfmtres == fmtrTab && !plssubl->fContiguous) { fDone = fFalse; } else { fDone = fTrue; } } plsc->lsstate = lsstateOld; if (*pfmtres == fmtrExceededMargin) { if (GetCurrentUrSubl(plssubl) <= plssubl->urColumnMax) { *pfSuccessful = fFalse; if (plsc->lMarginIncreaseCoefficient >= uLsInfiniteRM / 2 ) plsc->lMarginIncreaseCoefficient = uLsInfiniteRM; else plsc->lMarginIncreaseCoefficient *= 2; /* increase coefficient to be successful next time */ return lserrNone; } plssubl->fRightMarginExceeded = fTrue; } Assert((*pplsdnFirst == NULL) == (*pplsdnLast == NULL)); Assert((*pplsdnLast == NULL) || ((*pplsdnLast)->plsdnNext == NULL)); return lserrNone; } /* ---------------------------------------------------------------------- */ /* L S F E T C H A P P E N D T O C U R R E N T S U B L I N E R E S U M E*/ /*---------------------------------------------------------------------------- %%Function: LsFetchAppendToCurrentSublineResume %%Contact: igorzv Parameters: plsc - (IN) LS context rgbreakrec - (IN) input array of break records cbreakrec, (IN) number of records in input array lsdcp - (IN) increse cp before fetching plsesc - (IN) escape characters cEsc - (IN) # of escape characters pfSuccessful- (OUT) Successful?---if not, finish subline, destroy it and start anew pfmtres - (OUT) result of last formatter pcpLim - (OUT) where we stop fetching pplsdnFirst - (OUT) first dnode that was created pplsdnLast - (OUT) last dnode that was created ----------------------------------------------------------------------------*/ LSERR WINAPI LsFetchAppendToCurrentSublineResume(PLSC plsc, const BREAKREC* rgbreakrec, DWORD cbreakrec, LSDCP lsdcp, const LSESC* plsesc, DWORD cEsc, BOOL *pfSuccessful, FMTRES* pfmtres, LSCP* pcpLim, PLSDNODE* pplsdnFirst, PLSDNODE* pplsdnLast) { LSERR lserr; PLSSUBL plssubl; long dur; long urColumnMaxIncreased; BOOL fDone = fFalse; LSSTATE lsstateOld; BOOL fFirstIteration = fTrue; PLSDNODE plsdnFirstCurrent; PLSDNODE plsdnLastCurrent; if (!FIsLSC(plsc)) return lserrInvalidParameter; plssubl = GetCurrentSubline(plsc); if (plssubl == NULL) return lserrFormattingFunctionDisabled; /* client can use this function only in formatting or breaking time */ if (!FFormattingAllowed(plsc) && !FBreakingAllowed(plsc)) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* in formatting time it should be some dnode to finish */ if (FFormattingAllowed(plsc) && GetDnodeToFinish(plsc) == NULL) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* subline should be empty to use this function */ if (GetCurrentDnode(plsc) != NULL) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* we don't allow to continue formatting if right margin is exceeded */ if (plssubl->fRightMarginExceeded) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); *pfSuccessful = fTrue; /* we must to set state to formatting and later restore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateFormatting; /*Initialization; */ AdvanceCurrentCpLimSubl(plssubl, lsdcp); *pplsdnLast = NULL; urColumnMaxIncreased = RightMarginIncreasing(plsc, plssubl->urColumnMax); while(!fDone) /* we continue fetching when we have tab that are not allowed in our subline */ { if (fFirstIteration) { lserr = FetchAppendEscResumeCore(plsc, urColumnMaxIncreased, plsesc, cEsc, rgbreakrec, cbreakrec,pfmtres, pcpLim, &plsdnFirstCurrent, &plsdnLastCurrent, &dur); } else { lserr = FetchAppendEscCore(plsc, urColumnMaxIncreased, plsesc, cEsc, pfmtres, pcpLim, &plsdnFirstCurrent, &plsdnLastCurrent, &dur); } if (lserr != lserrNone) return ErrorInCurrentSubline(plsc, lserr); Assert((plsdnFirstCurrent == NULL) == (plsdnLastCurrent == NULL)); Assert((plsdnLastCurrent == NULL) || ((plsdnLastCurrent)->plsdnNext == NULL)); if (fFirstIteration) { *pplsdnFirst = plsdnFirstCurrent; fFirstIteration = fFalse; } if (plsdnLastCurrent != NULL) *pplsdnLast = plsdnLastCurrent; if (*pfmtres == fmtrTab && !plssubl->fContiguous) { fDone = fFalse; } else { fDone = fTrue; } } plsc->lsstate = lsstateOld; if (*pfmtres == fmtrExceededMargin) { if (GetCurrentUrSubl(plssubl) <= plssubl->urColumnMax) { *pfSuccessful = fFalse; if (plsc->lMarginIncreaseCoefficient >= uLsInfiniteRM / 2 ) plsc->lMarginIncreaseCoefficient = uLsInfiniteRM; else plsc->lMarginIncreaseCoefficient *= 2; /* increase coefficient to be successful next time */ return lserrNone; } plssubl->fRightMarginExceeded = fTrue; } Assert((*pplsdnFirst == NULL) == (*pplsdnLast == NULL)); Assert((*pplsdnLast == NULL) || ((*pplsdnLast)->plsdnNext == NULL)); return lserrNone; } /* ---------------------------------------------------------------------- */ /* L S A P P E N D R U N T O C U R R E N T S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsAppendRunToCurrentSubline %%Contact: igorzv Parameters: plsc - (IN) LS context plsfrun - (IN) given run pfSuccessful- (OUT) Successful?---if not, finish subline, destroy it and start anew pfmtres - (OUT) result of last formatter pcpLim - (OUT) where we stop fetching pplsdn - (OUT) dnode created ----------------------------------------------------------------------------*/ LSERR WINAPI LsAppendRunToCurrentSubline(PLSC plsc, const LSFRUN* plsfrun, BOOL *pfSuccessful, FMTRES* pfmtres, LSCP* pcpLim, PLSDNODE* pplsdn) { LSERR lserr; PLSSUBL plssubl; LSSTATE lsstateOld; long urColumnMaxIncreased; if (!FIsLSC(plsc)) return lserrInvalidParameter; plssubl = GetCurrentSubline(plsc); if (plssubl == NULL) return lserrFormattingFunctionDisabled; /* client can use this function only in formatting or breaking time */ if (!FFormattingAllowed(plsc) && !FBreakingAllowed(plsc)) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* in formatting time it should be some dnode to finish */ if (FFormattingAllowed(plsc) && GetDnodeToFinish(plsc) == NULL) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); /* we don't allow to continue formatting if right margin is exceeded */ if (plssubl->fRightMarginExceeded) return ErrorInCurrentSubline(plsc, lserrFormattingFunctionDisabled); *pfSuccessful = fTrue; /* we must to set state to formatting and later restore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateFormatting; urColumnMaxIncreased = RightMarginIncreasing(plsc, plssubl->urColumnMax); lserr = ProcessOneRun(plsc, urColumnMaxIncreased, plsfrun, NULL, 0, pfmtres); if (lserr != lserrNone) return ErrorInCurrentSubline(plsc, lserr); plsc->lsstate = lsstateOld; if (*pfmtres == fmtrExceededMargin) { if (GetCurrentUrSubl(plssubl) <= plssubl->urColumnMax) { *pfSuccessful = fFalse; if (plsc->lMarginIncreaseCoefficient >= uLsInfiniteRM / 2 ) plsc->lMarginIncreaseCoefficient = uLsInfiniteRM; else plsc->lMarginIncreaseCoefficient *= 2; /* increase coefficient to be successful next time */ return lserrNone; } plssubl->fRightMarginExceeded = fTrue; } /* prepare output */ *pplsdn = GetCurrentDnodeSubl(plssubl); *pcpLim = GetCurrentCpLimSubl(plssubl); return lserrNone; } /* ---------------------------------------------------------------------- */ /* L S R E S E T R M I N C U R R E N T S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsResetRMInCurrentSubline %%Contact: igorzv Parameters: plsc - (IN) LS context urColumnMax - (IN) new value of right margin ----------------------------------------------------------------------------*/ LSERR WINAPI LsResetRMInCurrentSubline(PLSC plsc, long urColumnMax) { PLSSUBL plssubl; if (!FIsLSC(plsc)) return lserrInvalidParameter; plssubl = GetCurrentSubline(plsc); if (plssubl == NULL) return lserrCurrentSublineDoesNotExist; /* we don't allow to change right margin if it is exceeded */ if (plssubl->fRightMarginExceeded) return lserrFormattingFunctionDisabled; Assert(FIsLSSUBL(plssubl)); plssubl->urColumnMax = urColumnMax; return lserrNone; } /* ---------------------------------------------------------------------- */ /* L S F I N I S H C U R R E N T S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsFinishCurrentSubline %%Contact: igorzv Parameters: plsc - (IN) LS context pplssubl - (OUT) subline context ----------------------------------------------------------------------------*/ LSERR WINAPI LsFinishCurrentSubline(PLSC plsc, PLSSUBL* pplssubl) { if (!FIsLSC(plsc)) return lserrInvalidParameter; *pplssubl = GetCurrentSubline(plsc); if (*pplssubl == NULL) return lserrCurrentSublineDoesNotExist; Assert(FIsLSSUBL(*pplssubl)); return FinishSublineCore(*pplssubl); } /* ---------------------------------------------------------------------- */ /* L S T R U N C A T E S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsTruncateSubline %%Contact: igorzv Parameters: plsc - (IN) LS context urColumnMax - (IN) right margin pcpTruncate - (OUT) truncation point ----------------------------------------------------------------------------*/ LSERR WINAPI LsTruncateSubline(PLSSUBL plssubl, long urColumnMax, LSCP* pcpTruncate) { LSERR lserr; LSSTATE lsstateOld; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; /* it's error if urColumnmMax is biger then lenght of subline */ if (urColumnMax >= GetCurrentUrSubl(plssubl)) return lserrInvalidParameter; /* we must to set state to breaking and later restore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateBreaking; lserr = TruncateSublineCore(plssubl, urColumnMax, pcpTruncate); plssubl->plsc->lsstate = lsstateOld; return lserr; } /* ---------------------------------------------------------------------- */ /* L S F I N D P R E V B R E A K S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsFindPrevBreakSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context fFirstSubline - (IN) to apply rules for first character to the first character of this subline cpTruncate - (IN) truncation point urColumnMax - (IN) right margin pfSuccessful - (OUT) do we find break? pcpBreak - (OUT) position of break pobjdimSubline - (OUT) objdim from begining of the subline up to break pbkpos - (OUT) Before/Inside/After ----------------------------------------------------------------------------*/ LSERR WINAPI LsFindPrevBreakSubline(PLSSUBL plssubl, BOOL fFirstSubline, LSCP cpTruncate, long urColumnMax, BOOL* pfSuccessful, LSCP* pcpBreak, POBJDIM pobjdimSubline, BRKPOS* pbkpos) { LSERR lserr; LSSTATE lsstateOld; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; /* we must to set state to breaking and later retore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateBreaking; lserr = FindPrevBreakSublineCore(plssubl, fFirstSubline, cpTruncate, urColumnMax, pfSuccessful, pcpBreak, pobjdimSubline, pbkpos); plssubl->plsc->lsstate = lsstateOld; return lserr; } /* ---------------------------------------------------------------------- */ /* L S F I N D N E X T B R E A K S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsFindNextBreakSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context fFirstSubline - (IN) to apply rules for first character to the first character of this subline cpTruncate - (IN) truncation point urColumnMax - (IN) right margin pfSuccessful - (OUT) do we find break? pcpBreak - (OUT) position of break pobjdimSubline - (OUT) objdim from begining of the subline up to break pbkpos - (OUT) Before/Inside/After ----------------------------------------------------------------------------*/ LSERR WINAPI LsFindNextBreakSubline(PLSSUBL plssubl, BOOL fFirstSubline, LSCP cpTruncate, long urColumnMax, BOOL* pfSuccessful, LSCP* pcpBreak, POBJDIM pobjdimSubline, BRKPOS* pbkpos) { LSERR lserr; LSSTATE lsstateOld; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; /* we must to set state to breaking and later retore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateBreaking; lserr = FindNextBreakSublineCore(plssubl, fFirstSubline, cpTruncate, urColumnMax, pfSuccessful, pcpBreak, pobjdimSubline, pbkpos); plssubl->plsc->lsstate = lsstateOld; return lserr; } /* ---------------------------------------------------------------------- */ /* L S F O R C E B R E A K S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsForceBreakSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context fFirstSubline - (IN) to apply rules for first character to the first character of this subline cpTruncate - (IN) truncation point urColumnMax - (IN) right margin pcpBreak - (OUT) position of break pobjdimSubline - (OUT) objdim from begining of the subline up to break pbkpos - (OUT) Before/Inside/After ----------------------------------------------------------------------------*/ LSERR WINAPI LsForceBreakSubline(PLSSUBL plssubl, BOOL fFirstSubline, LSCP cpTruncate, long urColumnMax, LSCP* pcpBreak, POBJDIM pobjdimSubline, BRKPOS* pbkpos) { LSERR lserr; LSSTATE lsstateOld; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; /* we must to set state to breaking and later retore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateBreaking; lserr = ForceBreakSublineCore(plssubl, fFirstSubline, cpTruncate, urColumnMax, pcpBreak, pobjdimSubline, pbkpos); plssubl->plsc->lsstate = lsstateOld; return lserr; } /* ---------------------------------------------------------------------- */ /* L S S E T B R E A K S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsSetBreakSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context brkkind, - (IN) Prev/Next/Force/Imposed breakrecMaxCurrent - (IN) size of array pbreakrecCurrent - (OUT) array of break records pbreakrecMacCurrent - (OUT) number of used elements of the array ----------------------------------------------------------------------------*/ LSERR WINAPI LsSetBreakSubline(PLSSUBL plssubl, BRKKIND brkkind, DWORD breakrecMaxCurrent, BREAKREC* pbreakrecCurrent, DWORD* pbreakrecMacCurrent) { LSERR lserr; LSSTATE lsstateOld; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; /* we must to set state to breaking and later retore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateBreaking; lserr = SetBreakSublineCore(plssubl, brkkind, breakrecMaxCurrent, pbreakrecCurrent, pbreakrecMacCurrent); plssubl->plsc->lsstate = lsstateOld; return lserr; } /* ---------------------------------------------------------------------- */ /* L S D E S T R O Y S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsDestroySubline %%Contact: igorzv Parameters: plssubl - (IN) subline context ----------------------------------------------------------------------------*/ LSERR WINAPI LsDestroySubline(PLSSUBL plssubl) { PLSC plsc; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; plsc = plssubl->plsc; Assert(FIsLSC(plsc)); return DestroySublineCore(plssubl,&plsc->lscbk, plsc->pols, &plsc->lsiobjcontext, plsc->fDontReleaseRuns); } /* ---------------------------------------------------------------------- */ /* L S M A T C H P R E S S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsMatchPresSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context ----------------------------------------------------------------------------*/ LSERR WINAPI LsMatchPresSubline(PLSSUBL plssubl) { if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; return MatchPresSubline(plssubl); } /* ---------------------------------------------------------------------- */ /* L S E X P A N D S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsExpandSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context lskjust - (IN) justification type dup - (IN) amount to expand ----------------------------------------------------------------------------*/ LSERR WINAPI LsExpandSubline(PLSSUBL plssubl, LSKJUST lskjust, long dup) { if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; return AdjustSubline(plssubl, lskjust, dup, DO_EXPANSION); } /* ---------------------------------------------------------------------- */ /* L S C O M P R E S S S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsCompressSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context lskjust - (IN) justification type dup - (IN) amount to compress ----------------------------------------------------------------------------*/ LSERR WINAPI LsCompressSubline(PLSSUBL plssubl, LSKJUST lskjust, long dup) { if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; return AdjustSubline(plssubl, lskjust, dup, DO_COMPRESSION); } /* ---------------------------------------------------------------------- */ /* L S G E T S P E C I A L E F F E C T S S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsGetSpecialEffectsSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context pfSpecialEffects - (OUT)special effects ----------------------------------------------------------------------------*/ LSERR WINAPI LsGetSpecialEffectsSubline(PLSSUBL plssubl, UINT* pfSpecialEffects) { if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; return GetSpecialEffectsSublineCore(plssubl, &(plssubl->plsc->lsiobjcontext), pfSpecialEffects); } /* ---------------------------------------------------------------------- */ /* L S S Q U E E Z E S U B L I N E*/ /*---------------------------------------------------------------------------- %%Function: LsSqueezeSubline %%Contact: igorzv Parameters: plssubl - (IN) subline context durTarget - (IN) target width of subline pfSuccessful - (OUT)do we achieve the goal pdurExtra - (OUT)if nof successful, extra dur we have from the goal ----------------------------------------------------------------------------*/ LSERR WINAPI LsSqueezeSubline( PLSSUBL plssubl, /* IN: subline context */ long durTarget, /* IN: durTarget */ BOOL* pfSuccessful, /* OUT: fSuccessful? */ long* pdurExtra) /* OUT: if nof successful, extra dur */ { LSERR lserr; LSSTATE lsstateOld; if (!FIsLSSUBL(plssubl)) return lserrInvalidParameter; /* we must to set state to breaking and later retore the old one */ lsstateOld = plssubl->plsc->lsstate; plssubl->plsc->lsstate = LsStateBreaking; lserr = SqueezeSublineCore(plssubl, durTarget, pfSuccessful, pdurExtra); plssubl->plsc->lsstate = lsstateOld; return lserr; }