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

344 lines
9.2 KiB
C

#include "iobj.h"
#include "lsidefs.h"
#include "lssetdoc.h"
#include "lsc.h"
#include "lstext.h"
#include "prepdisp.h"
#include "zqfromza.h"
static LSERR SetDocForFormaters(PLSC plsc, LSDOCINF* plsdocinf);
/* L S S E T D O C */
/*----------------------------------------------------------------------------
%%Function: LsSetDoc
%%Contact: igorzv
Parameters:
plsc - (IN) ptr to line services context
fDisplay - (IN) Intend to display?
fPresEqualRef - (IN) Ref & Pres Devices are equal?
pclsdevres - (IN) device resolutions
Fill in a part of a Line Services context.
Can be called more frequently then LsCreateContext.
----------------------------------------------------------------------------*/
LSERR WINAPI LsSetDoc(PLSC plsc,
BOOL fDisplay,
BOOL fPresEqualRef,
const LSDEVRES* pclsdevres)
{
LSDOCINF* plsdocinf = &(plsc->lsdocinf);
LSERR lserr;
if (!FIsLSC(plsc)) /* check that context is valid and not busy (for example in formating) */
return lserrInvalidContext;
if (FIsLSCBusy(plsc))
return lserrSetDocDisabled;
if (!fDisplay && !fPresEqualRef)
{
plsc->lsstate = LsStateNotReady;
return lserrInvalidParameter;
}
/* if nothing is changed: return right away */
if (((BYTE) fDisplay == plsdocinf->fDisplay) &&
((BYTE) fPresEqualRef == plsdocinf->fPresEqualRef ) &&
(pclsdevres->dxrInch == plsdocinf->lsdevres.dxrInch) &&
(pclsdevres->dyrInch == plsdocinf->lsdevres.dyrInch) &&
(fPresEqualRef ||
((pclsdevres->dxpInch == plsdocinf->lsdevres.dxpInch) &&
(pclsdevres->dypInch == plsdocinf->lsdevres.dypInch))))
return lserrNone;
/* if we have current line we must prepare it for display before changing context */
if (plsc->plslineCur != NULL)
{
lserr = PrepareLineForDisplayProc(plsc->plslineCur);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->plslineCur = NULL;
}
plsc->lsstate = LsStateSettingDoc; /* this assignment should be after PrepareForDisplay */
plsdocinf->fDisplay = (BYTE) fDisplay;
plsdocinf->fPresEqualRef = (BYTE) fPresEqualRef;
plsdocinf->lsdevres = *pclsdevres;
if (fPresEqualRef)
{
plsdocinf->lsdevres.dxpInch = plsdocinf->lsdevres.dxrInch;
plsdocinf->lsdevres.dypInch = plsdocinf->lsdevres.dyrInch;
}
if (!FBetween(plsdocinf->lsdevres.dxpInch, 0, zqLim-1) ||
!FBetween(plsdocinf->lsdevres.dypInch, 0, zqLim-1) ||
!FBetween(plsdocinf->lsdevres.dxrInch, 0, zqLim-1) ||
!FBetween(plsdocinf->lsdevres.dyrInch, 0, zqLim-1))
{
plsc->lsstate = LsStateNotReady;
return lserrInvalidParameter;
}
lserr = SetDocForFormaters(plsc, plsdocinf);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->lsstate = LsStateFree;
return lserrNone;
}
LSERR WINAPI LsSetModWidthPairs(
PLSC plsc, /* IN: ptr to line services context */
DWORD clspairact, /* IN: Number of mod pairs info units*/
const LSPAIRACT* rglspairact, /* IN: Mod pairs info units array */
DWORD cModWidthClasses, /* IN: Number of Mod Width classes */
const BYTE* rgilspairact) /* IN: Mod width information(square):
indexes in the LSPAIRACT array */
{
LSERR lserr;
DWORD iobjText;
PILSOBJ pilsobjText;
if (!FIsLSC(plsc)) /* check that context is valid and not busy (for example in formating) */
return lserrInvalidContext;
if (FIsLSCBusy(plsc))
return lserrSetDocDisabled;
/* if we have current line we must prepare it for display before changing context */
if (plsc->plslineCur != NULL)
{
lserr = PrepareLineForDisplayProc(plsc->plslineCur);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->plslineCur = NULL;
}
plsc->lsstate = LsStateSettingDoc; /* this assignment should be after PrepareForDisplay */
iobjText = IobjTextFromLsc(&plsc->lsiobjcontext);
pilsobjText = PilsobjFromLsc(&plsc->lsiobjcontext, iobjText);
lserr = SetTextModWidthPairs(pilsobjText, clspairact,
rglspairact, cModWidthClasses, rgilspairact);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->lsstate = LsStateFree;
return lserrNone;
}
LSERR WINAPI LsSetCompression(
PLSC plsc, /* IN: ptr to line services context */
DWORD cPriorities, /* IN: Number of compression priorities*/
DWORD clspract, /* IN: Number of compression info units*/
const LSPRACT* rglspract, /* IN: Compession info units array */
DWORD cModWidthClasses, /* IN: Number of Mod Width classes */
const BYTE* rgilspract) /* IN: Compression information:
indexes in the LSPRACT array */
{
LSERR lserr;
DWORD iobjText;
PILSOBJ pilsobjText;
if (!FIsLSC(plsc)) /* check that context is valid and not busy (for example in formating) */
return lserrInvalidContext;
if (FIsLSCBusy(plsc))
return lserrSetDocDisabled;
/* if we have current line we must prepare it for display before changing context */
if (plsc->plslineCur != NULL)
{
lserr = PrepareLineForDisplayProc(plsc->plslineCur);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->plslineCur = NULL;
}
plsc->lsstate = LsStateSettingDoc; /* this assignment should be after PrepareForDisplay */
iobjText = IobjTextFromLsc(&plsc->lsiobjcontext);
pilsobjText = PilsobjFromLsc(&plsc->lsiobjcontext, iobjText);
lserr = SetTextCompression(pilsobjText, cPriorities, clspract,
rglspract, cModWidthClasses, rgilspract);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->lsstate = LsStateFree;
return lserrNone;
}
LSERR WINAPI LsSetExpansion(
PLSC plsc, /* IN: ptr to line services context */
DWORD cExpansionClasses, /* IN: Number of expansion info units*/
const LSEXPAN* rglsexpan, /* IN: Expansion info units array */
DWORD cModWidthClasses, /* IN: Number of Mod Width classes */
const BYTE* rgilsexpan) /* IN: Expansion information(square):
indexes in the LSEXPAN array */
{
LSERR lserr;
DWORD iobjText;
PILSOBJ pilsobjText;
if (!FIsLSC(plsc)) /* check that context is valid and not busy (for example in formating) */
return lserrInvalidContext;
if (FIsLSCBusy(plsc))
return lserrSetDocDisabled;
/* if we have current line we must prepare it for display before changing context */
if (plsc->plslineCur != NULL)
{
lserr = PrepareLineForDisplayProc(plsc->plslineCur);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->plslineCur = NULL;
}
plsc->lsstate = LsStateSettingDoc; /* this assignment should be after PrepareForDisplay */
iobjText = IobjTextFromLsc(&plsc->lsiobjcontext);
pilsobjText = PilsobjFromLsc(&plsc->lsiobjcontext, iobjText);
lserr = SetTextExpansion(pilsobjText, cExpansionClasses,
rglsexpan, cModWidthClasses, rgilsexpan);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->lsstate = LsStateFree;
return lserrNone;
}
LSERR WINAPI LsSetBreaking(
PLSC plsc, /* IN: ptr to line services context */
DWORD clsbrk, /* IN: Number of breaking info units*/
const LSBRK* rglsbrk, /* IN: Breaking info units array */
DWORD cBreakingClasses, /* IN: Number of breaking classes */
const BYTE* rgilsbrk) /* IN: Breaking information(square):
indexes in the LSBRK array */
{
LSERR lserr;
DWORD iobjText;
PILSOBJ pilsobjText;
if (!FIsLSC(plsc)) /* check that context is valid and not busy (for example in formating) */
return lserrInvalidContext;
if (FIsLSCBusy(plsc))
return lserrSetDocDisabled;
/* if we have current line we must prepare it for display before changing context */
if (plsc->plslineCur != NULL)
{
lserr = PrepareLineForDisplayProc(plsc->plslineCur);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->plslineCur = NULL;
}
plsc->lsstate = LsStateSettingDoc; /* this assignment should be after PrepareForDisplay */
iobjText = IobjTextFromLsc(&plsc->lsiobjcontext);
pilsobjText = PilsobjFromLsc(&plsc->lsiobjcontext, iobjText);
lserr = SetTextBreaking(pilsobjText, clsbrk,
rglsbrk, cBreakingClasses, rgilsbrk);
if (lserr != lserrNone)
{
plsc->lsstate = LsStateNotReady;
return lserr;
}
plsc->lsstate = LsStateFree;
return lserrNone;
}
/* S E T D O C F O R F O R M A T E R S */
/*----------------------------------------------------------------------------
%%Function: SetDocForFormaters
%%Contact: igorzv
Parameter:
plsc - (IN) ptr to line services context
plsdocinf - (IN) ptr to set doc input
Invokes SetDoc methods for all formaters
----------------------------------------------------------------------------*/
LSERR SetDocForFormaters(PLSC plsc, LSDOCINF* plsdocinf)
{
DWORD iobjMac;
DWORD iobj;
PILSOBJ pilsobj;
LSERR lserr;
Assert(FIsLSC(plsc));
Assert(plsc->lsstate == LsStateSettingDoc);
Assert(plsdocinf != NULL);
iobjMac = plsc->lsiobjcontext.iobjMac;
for (iobj = 0; iobj < iobjMac; iobj++)
{
pilsobj = plsc->lsiobjcontext.rgobj[iobj].pilsobj;
lserr = plsc->lsiobjcontext.rgobj[iobj].lsim.pfnSetDoc(pilsobj,plsdocinf);
if (lserr != lserrNone)
return lserr;
}
return lserrNone;
}