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