|
|
/************************************************************/ /* 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)); }
|