/************************************************************/ /* Windows Write, Copyright 1985-1992 Microsoft Corporation */ /************************************************************/ /* FontUtil.c -- font table management routines */ #define NOVIRTUALKEYCODES #define NOCTLMGR #define NOWINMESSAGES #define NOWINSTYLES #define NOCLIPBOARD #define NOGDICAPMASKS #define NOSYSMETRICS #define NOMENUS #define NOKEYSTATE #define NORASTEROPS #define NOSYSCOMMANDS #define NOSHOWWINDOW #define NOCOLOR #define NOATOM #define NOBITMAP #define NOICON #define NOBRUSH #define NOCREATESTRUCT #define NOMB #define NOMSG #define NOOPENFILE #define NOPEN #define NOPOINT #define NOREGION #define NOSCROLL #define NOSOUND #define NOWH #define NOWINOFFSETS #define NOWNDCLASS #define NOCOMM #include #include "mw.h" #include "cmddefs.h" #include "docdefs.h" #include "filedefs.h" #include "propdefs.h" #include "fkpdefs.h" #include "debug.h" #include "wwdefs.h" #include "dispdefs.h" #include "editdefs.h" #include "str.h" #include "prmdefs.h" #include "printdef.h" #include "fontdefs.h" extern struct DOD (**hpdocdod)[]; struct FFNTB **HffntbAlloc() /* returns empty ffntb */ { struct FFNTB **hffntb; int cwAlc; cwAlc = CwFromCch(sizeof(struct FFNTB) - cffnMin * sizeof(struct FFN **)); if (!FNoHeap(hffntb = (struct FFNTB **)HAllocate(cwAlc))) { (*hffntb)->iffnMac = 0; (*hffntb)->fFontMenuValid = FALSE; } return(hffntb); } FtcAddDocFfn(doc, pffn) /* adds the described ffn to the ffntb for this doc - returns ftcNil if the allocation failed */ int doc; struct FFN *pffn; { struct FFNTB **hffntb; hffntb = HffntbGet(doc); if (hffntb == 0) { hffntb = HffntbAlloc(); if (FNoHeap(hffntb)) return(ftcNil); (**hpdocdod)[doc].hffntb = hffntb; } return(FtcAddFfn(hffntb, pffn)); } int FtcAddFfn(hffntb, pffn) /* adds the described ffn to hffntb. returns ftcNil if it fails */ struct FFNTB **hffntb; struct FFN *pffn; { unsigned cb; int cwAlloc, iffnMac, ftc; FFID ffid; struct FFN **hffn; (*hffntb)->fFontMenuValid = FALSE; /* so fonts on char dropdown get updated */ ftc = ftcNil; ffid = pffn->ffid; cb = CchSz( pffn->szFfn ); if (cb > LF_FACESIZE) { Assert( FALSE ); /* If we get here, the doc's font tables are prob. bad */ cb = LF_FACESIZE; } Assert( cb > 0 ); cwAlloc = CwFromCch( CbFfn( cb ) ); if (!FNoHeap(hffn = (struct FFN **)HAllocate(cwAlloc))) { blt(pffn, *hffn, cwAlloc); (*hffn)->szFfn[ cb - 1 ] = '\0'; /* In case of font name too big */ iffnMac = (*hffntb)->iffnMac + 1; cwAlloc = CwFromCch(sizeof(struct FFNTB) + (iffnMac - cffnMin) * sizeof(struct FFN **)); if (FChngSizeH(hffntb, cwAlloc, FALSE)) { ftc = iffnMac - 1; /* ?! pault */ (*hffntb)->mpftchffn[ftc] = hffn; (*hffntb)->iffnMac = iffnMac; } else { FreeH(hffn); } } return(ftc); } FEnsurePffn(hffntb, pffn) /* return TRUE if we were able to add the described font to the table - this routine is just a convenience, the other pieces aren't that complex to call. */ struct FFNTB **hffntb; struct FFN *pffn; { if (FtcScanFfn(hffntb, pffn) != ftcNil || FtcAddFfn(hffntb, pffn) != ftcNil) return(TRUE); return(FALSE); } FtcScanDocFfn(doc, pffn) /* looks for described font in docs ffntb - returns ftcNil if not found */ int doc; struct FFN *pffn; { int ftc; struct FFNTB **hffntb; ftc = ftcNil; hffntb = HffntbGet(doc); if (hffntb != 0) ftc = FtcScanFfn(hffntb, pffn); return(ftc); } FtcScanFfn(hffntb, pffn) struct FFNTB **hffntb; struct FFN *pffn; { int iffn, iffnMac; struct FFN ***mpftchffn; mpftchffn = (*hffntb)->mpftchffn; iffnMac = (*hffntb)->iffnMac; for (iffn = 0; iffn < iffnMac; iffn++) { if (WCompSz(pffn->szFfn, (*mpftchffn[iffn])->szFfn) == 0) { /* found it */ if (pffn->ffid != FF_DONTCARE) { /* maybe we discovered a family for this font? */ (*mpftchffn[iffn])->ffid = pffn->ffid; (*mpftchffn[iffn])->chs = pffn->chs; } return(iffn); } } return(ftcNil); } FtcChkDocFfn(doc, pffn) /* Adds described font to doc's ffntb if it's not already there - ftcNil is returned if it wasn't there and couldn't be added */ int doc; struct FFN *pffn; { int ftc; ftc = FtcScanDocFfn(doc, pffn); if (ftc == ftcNil) ftc = FtcAddDocFfn(doc, pffn); return(ftc); } FreeFfntb(hffntb) struct FFNTB **hffntb; { int iffn, iffnMac; if ((hffntb == 0) || FNoHeap(hffntb)) /* nothing to do */ return; iffnMac = (*hffntb)->iffnMac; for (iffn = 0; iffn < iffnMac; iffn++) FreeH((*hffntb)->mpftchffn[iffn]); FreeH(hffntb); } SmashDocFce(doc) /* the font table for this doc has scrambled, so we need to disassociate the corresponding cache entries from the doc */ int doc; { extern int vifceMac; extern union FCID vfcidScreen; extern union FCID vfcidPrint; extern struct FCE rgfce[ifceMax]; int ifce; for (ifce = 0; ifce < vifceMac; ifce++) if (rgfce[ifce].fcidRequest.strFcid.doc == doc) rgfce[ifce].fcidRequest.strFcid.ftc = ftcNil; vfcidScreen.strFcid.ftc = ftcNil; vfcidPrint.strFcid.ftc = ftcNil; }