/************************************************************/
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
/************************************************************/
/* doprm.c -- MW Property modifying routines */
#define NOCLIPBOARD
#define NOGDICAPMASKS
#define NOCTLMGR
#define NOVIRTUALKEYCODES
#define NOWINMESSAGES
#define NOWINSTYLES
#define NOSYSMETRICS
#define NOMENUS
#define NOICON
#define NOKEYSTATE
#define NORASTEROPS
#define NOSHOWWINDOW
#define NOSYSCOMMANDS
#define NOCREATESTRUCT
#define NOATOM
#define NOMETAFILE
#define NOGDI
#define NOFONT
#define NOBRUSH
#define NOPEN
#define NOBITMAP
#define NOCOLOR
#define NODRAWTEXT
#define NOWNDCLASS
#define NOSOUND
#define NOCOMM
#define NOMB
#define NOMSG
#define NOOPENFILE
#define NORESOURCE
#define NOPOINT
#define NORECT
#define NOREGION
#define NOSCROLL
#define NOTEXTMETRIC
#define NOWH
#define NOWINOFFSETS
#include <windows.h>
#include "mw.h"
#include "cmddefs.h"
#include "filedefs.h"
#include "propdefs.h"
#include "prmdefs.h"
#include "fkpdefs.h"
#include "docdefs.h"
#include "macro.h"
#include "dispdefs.h"
#include "fontdefs.h"
/* E X T E R N A L S */
extern int rgxaRulerSprm[];
extern struct PAP *vppapNormal;
extern struct CHP vchpNormal;
extern CHAR dnsprm[];
extern struct CHP vchpNormal;
extern struct SEP vsepStd;
extern struct SEP vsepNormal;
#ifdef CASHMERE
extern struct TBD rgtbdRulerSprm[];
#endif
/* List of approved font sizes, in half points */
#ifdef INTL
int rghps[csizeApprovedMax] = {8, 12, 16, 20, 24, 28, 36, 48, 60, 72, 96, 144, 254};
#else
int rghps[csizeApprovedMax] = {8, 12, 16, 20, 24, 32, 40, 48, 60, 72, 96, 144, 254};
#endif /* if-else-def INTL */
CHAR *PchFromFc();
/* D O P R M */
DoPrm(struct CHP *pchp, struct PAP *ppap, struct PRM prm)
{ /* Apply prm to char and para properties */
if (bPRMNIL(prm))
return;
if (((struct PRM *) &prm)->fComplex)
{
int cch;
CHAR *pfsprm;
struct FPRM *pfprm = (struct FPRM *) PchFromFc(fnScratch,
fcSCRATCHPRM(prm), &cch);
cch = pfprm->cch;
pfsprm = pfprm->grpfsprm;
while (cch > 0)
{
int cchT;
int sprm;
DoSprm(pchp, ppap, sprm = *pfsprm, pfsprm + 1);
if ((cchT = (dnsprm[sprm] & ESPRM_cch)) == 0)
cchT = CchPsprm(pfsprm);
cch -= cchT;
pfsprm += cchT;
}
}
else
/* Simple prm; single sprm */
DoSprm(pchp, ppap, ((struct PRM *) &prm)->sprm,
&((struct PRM *) &prm)->val);
}
/* D O S P R M */
/* Apply a single property modifier to para/char prop */
DoSprm(pchp, ppap, sprm, pval)
struct CHP *pchp;
struct PAP *ppap;
int sprm;
CHAR *pval;
{
int *pvalTo;
int val = *pval;
#ifdef DEBUG
Assert(sprm > 0 && sprm < sprmMax);
#endif
if ((dnsprm[sprm] & ESPRM_sgc) != sgcChar)
{
if (ppap != 0)
{
struct TBD *ptbd;
int rhc;
int fGraphics;
ppap->fStyled = fFalse;
switch (sprm)
{
case sprmPLMarg:
pvalTo = &ppap->dxaLeft;
break;
case sprmPRMarg:
pvalTo = &ppap->dxaRight;
break;
case sprmPFIndent:
pvalTo = &ppap->dxaLeft1;
break;
case sprmPJc:
ppap->jc = val;
return;
#ifdef CASHMERE
case sprmPRuler:
/* Ruler and Ruler1 rely on the fact that rgxaRulerSprm and PAP both
align R, L, L1 in that order.
Ruler: apply the current state of the ruler */
blt(&rgxaRulerSprm[0], &ppap->dxaRight, 3);
blt(&rgtbdRulerSprm[0], ppap->rgtbd, itbdMax * cwTBD);
return;
case sprmPRuler1:
/* as Ruler, except information is at pval+1 and pval+"7" */
bltbyte((CHAR *)(pval + 1), &ppap->dxaRight, 3 * cchINT);
/* append terminating 0 word to tab table */
bltc(bltbyte((CHAR *)(pval + 1 + (3 * cchINT)), ppap->rgtbd,
val - (3 * cchINT)), 0, cchINT);
return;
case sprmPRgtbd:
bltc(bltbyte(pval + 1, ppap->rgtbd,
val), 0, cchINT);
return;
case sprmPKeep:
ppap->fKeep = val;
return;
case sprmPKeepFollow:
ppap->fKeepFollow = val;
return;
#endif
case sprmPDyaLine:
pvalTo = &ppap->dyaLine;
break;
#ifdef CASHMERE
case sprmPDyaBefore:
pvalTo = &ppap->dyaBefore;
break;
case sprmPDyaAfter:
pvalTo = &ppap->dyaAfter;
break;
#endif
case sprmPRhc:
ppap->rhc = val;
return;
case sprmPRhcNorm:
/* (int) dxaLeftAdj + (int) dxaRightAdj */
Assert(*pval == 4);
pval++; /* skip over cch */
ppap->dxaLeft = imax( 0,
ppap->dxaLeft - *(int *) pval);
ppap->dxaRight = imax( 0,
ppap->dxaRight - *((int *) pval + 1));
return;
case sprmPNormal:
rhc = ppap->rhc;
fGraphics = ppap->fGraphics;
blt(vppapNormal, ppap, cwPAPBase);
goto LSame;
case sprmPSame:
rhc = ppap->rhc;
fGraphics = ppap->fGraphics;
/* note: tab terminating 0 MUST be part of value if tab table is to be changed */
bltbyte(pval + 1, ppap, val - 1);
LSame: ppap->rhc = rhc;
ppap->fGraphics = fGraphics;
return;
#ifdef CASHMERE
case sprmPNest:
if (ppap->rgtbd[0].dxa != 0 &&
ppap->rgtbd[0].dxa == ppap->dxaLeft &&
ppap->rgtbd[1].dxa == 0)
ppap->rgtbd[0].dxa += dxaNest;
ppap->dxaLeft += dxaNest;
return;
case sprmPUnNest:
if (ppap->rgtbd[0].dxa != 0 &&
ppap->rgtbd[0].dxa == ppap->dxaLeft &&
ppap->rgtbd[1].dxa == 0)
ppap->rgtbd[0].dxa -= dxaNest;
ppap->dxaLeft = max(0, (int)(ppap->dxaLeft - dxaNest));
return;
case sprmPHang:
ppap->dxaLeft = umin(ppap->dxaLeft + cxaInch, xaRightMax - cxaInch);
ppap->dxaLeft1 = -cxaInch;
ptbd = &ppap->rgtbd[0];
SetWords(ptbd, 0, cwTBD * 2);
ptbd->dxa = ppap->dxaLeft;
/* Inefficient:
ptbd->tlc = tlcWhite;
ptbd->jc = jcLeft;
++ptbd->dxa = 0 */
return;
#endif
default:
Assert(FALSE);
return;
}
/* common portion for those transferring a single word */
bltbyte(pval, pvalTo, cchINT);
}
return;
}
else
{
if (pchp != 0)
{
int fSpecial;
int ftc, hps;
pchp->fStyled = fFalse;
switch (sprm)
{
/* CHARACTER sprm's */
case sprmCBold:
pchp->fBold = val;
return;
case sprmCItalic:
pchp->fItalic = val;
return;
case sprmCUline:
pchp->fUline = val;
return;
#ifdef CASHMERE
case sprmCOutline:
pchp->fOutline = val;
return;
case sprmCShadow:
pchp->fShadow = val;
return;
case sprmCCsm:
pchp->csm = val;
return;
#endif
case sprmCPos:
/* If going in or out of sub/superscript, alter font size */
if (pchp->hpsPos == 0 && val != 0)
pchp->hps = HpsAlter(pchp->hps, -1);
else if (pchp->hpsPos != 0 && val == 0)
pchp->hps = HpsAlter(pchp->hps, 1);
pchp->hpsPos = val;
return;
case sprmCFtc:
case sprmCChgFtc:
pchp->ftc = val & 0x003f;
pchp->ftcXtra = (val & 0x00c0) >> 6;
return;
case sprmCHps:
pchp->hps = val;
return;
case sprmCChgHps:
pchp->hps = HpsAlter(pchp->hps,
val >= 128 ? val - 256 : val); /* sign extend from char to int */
return;
case sprmCSame:
fSpecial = pchp->fSpecial;
bltbyte(pval, pchp, cchCHP);
pchp->fSpecial = fSpecial;
return;
case sprmCPlain:
fSpecial = pchp->fSpecial;
ftc = FtcFromPchp(pchp);
hps = pchp->hps;
/* If we used to be sub/superscript, increase font size */
if (pchp->hpsPos != 0)
hps = HpsAlter(hps, 1);
blt(&vchpNormal, pchp, cwCHP);
pchp->fSpecial = fSpecial;
pchp->ftc = ftc & 0x003f;
pchp->ftcXtra = (ftc & 0x00c0) >> 6;
pchp->hps = hps;
return;
case sprmCMapFtc:
/* val is ftcMac for mapping */
/* pval+1 points to ftcMac mapping bytes */
ftc = pchp->ftc + (pchp->ftcXtra << 6);
Assert(ftc < val);
ftc = *(pval + 1 + ftc);
pchp->ftc = ftc & 0x003f;
pchp->ftcXtra = (ftc & 0x00c0) >> 6;
return;
case sprmCOldFtc:
ftc = pchp->ftc + (pchp->ftcXtra << 6);
ftc = FtcMapOldFtc(ftc, pval);
pchp->ftc = ftc & 0x003f;
pchp->ftcXtra = (ftc & 0x00c0) >> 6;
return;
default:
Assert(FALSE);
return;
}
}
}
}
/* C C H P S P R M */
/* returns length of sprm's that are of variable or large size.
(cch = (esprm & ESPRM_cch)) == 0 must be checked before calling.*/
CchPsprm(psprm)
CHAR *psprm;
{
return (*psprm == sprmCSame ? cchCHP + 1 :
/* PSame, PRgtbd, PRuler1, CMapFtc, COldFtc: */
*(psprm + 1) + 2);
}
int HpsAlter(hps, ialter)
int hps, ialter;
{ /* Return the hps of the approved font size that is ialter steps
away from the given size. I.e.: if ialter is -1, then return
the next smaller size. If alter is 0, return hps. */
/* return 0 if request exceeds limits (11.15.91) v-dougk */
int isize;
if (ialter == 0)
return hps;
/* Find the size just larger than the given size. */
if (ialter > 0)
{
for (isize = 0; isize < csizeApprovedMax - 1; ++isize)
if (rghps[isize] > hps) break;
isize = min(csizeApprovedMax - 1, isize + ialter - 1);
return max(hps, rghps[isize]);
}
else
{
for (isize = 0; isize < csizeApprovedMax; ++isize)
if (rghps[isize] >= hps) break;
isize = max(0, isize + ialter);
return min(hps, rghps[isize]);
}
}
BOOL CanChangeFont(int howmuch)
{
extern struct CHP vchpSel;
extern struct SEL selCur;
int hps;
if (selCur.cpFirst != selCur.cpLim)
return TRUE;
hps = HpsAlter(vchpSel.hps, howmuch);
return ((hps <= rghps[csizeApprovedMax-1]) &&
(hps >= rghps[0]));
}
FtcMapOldFtc(ftc, ftctb)
/* maps an old word font code into one of our selection */
int ftc;
CHAR *ftctb;
{
#ifdef WIN30
int iftc = iftcSwiss; /* Default to SOMEthing! ..pault */
#else
int iftc ;
#endif
if (ftc == 8)
/* helvetica */
iftc = iftcSwiss;
else if (ftc < 16)
iftc = iftcModern;
else if (ftc < 32)
iftc = iftcRoman;
else if (ftc < 40)
iftc = iftcScript;
else if (ftc < 48)
iftc = iftcDecorative;
Assert(iftc < *ftctb);
return(*(ftctb + 1 + iftc));
}