windows-nt/Source/XPSP1/NT/base/mvdm/wow16/write/loadfnt2.c
2020-09-26 16:20:57 +08:00

156 lines
3 KiB
C
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************/
/* Windows Write, Copyright 1985-1992 Microsoft Corporation */
/************************************************************/
/* loadfnt2.c - MW font support code */
#define NOWINMESSAGES
#define NOVIRTUALKEYCODES
#define NOSYSMETRICS
#define NOMENUS
#define NOWINSTYLES
#define NOCTLMGR
#define NOCLIPBOARD
#include <windows.h>
#include "mw.h"
#include "macro.h"
#define NOUAC
#include "cmddefs.h"
#include "fontdefs.h"
#include "docdefs.h"
extern int vifceMac;
extern union FCID vfcidScreen;
extern union FCID vfcidPrint;
extern struct FCE rgfce[ifceMax];
extern struct FCE *vpfceMru;
extern struct FCE *vpfceScreen;
extern struct FCE *vpfcePrint;
extern struct DOD (**hpdocdod)[];
struct FCE * (PfceLruGet(void));
struct FCE * (PfceFcidScan(union FCID *));
struct FCE * (PfceLruGet())
/* tosses out the LRU cache entry's information */
{
struct FCE *pfce;
pfce = vpfceMru->pfcePrev;
FreePfce(pfce);
return(pfce);
}
FreePfce(pfce)
/* frees the font objects for this cache entry */
struct FCE *pfce;
{
int ifce;
HFONT hfont;
if (pfce->fcidRequest.lFcid != fcidNil)
{
hfont = pfce->hfont;
/* see if we're about to toss the screen or printer's current font */
if (pfce == vpfceScreen)
{
ResetFont(FALSE);
}
else if (pfce == vpfcePrint)
{
ResetFont(TRUE);
}
#ifdef DFONT
CommSzNum("Deleting font: ", hfont);
#endif /* DFONT */
if (hfont != NULL)
{
DeleteObject(hfont);
pfce->hfont = NULL;
}
if (pfce->hffn != 0)
{
FreeH(pfce->hffn);
}
pfce->fcidRequest.lFcid = fcidNil;
}
}
FreeFonts(fScreen, fPrinter)
/* frees up the font objects for the screen, and the printer */
int fScreen, fPrinter;
{
int ifce, bit;
for (ifce = 0; ifce < vifceMac; ifce++)
{
bit = (rgfce[ifce].fcidRequest.strFcid.wFcid & bitPrintFcid) != 0;
if (bit && fPrinter || !bit && fScreen)
FreePfce(&rgfce[ifce]);
}
}
struct FCE * (PfceFcidScan(pfcid))
union FCID *pfcid;
/* look for this font the "hard way" in the LRU list */
{
struct FFN **hffn, **hffnT;
register struct FCE *pfce;
struct FFN **MpFcidHffn();
hffn = MpFcidHffn(pfcid);
pfce = vpfceMru;
do
{
hffnT = pfce->hffn;
if (hffnT != NULL)
if (WCompSz((*hffn)->szFfn, (*hffnT)->szFfn) == 0 &&
pfcid->strFcid.hps == pfce->fcidRequest.strFcid.hps &&
pfcid->strFcid.wFcid == pfce->fcidRequest.strFcid.wFcid)
{
pfce->fcidRequest.strFcid.doc = pfcid->strFcid.doc;
pfce->fcidRequest.strFcid.ftc = pfcid->strFcid.ftc;
return(pfce);
}
pfce = pfce->pfceNext;
}
while (pfce != vpfceMru);
return(NULL);
}
struct FFN **MpFcidHffn(pfcid)
/* makes sure we use a font code that exists in the table - this is insurance
against out of memory problems */
union FCID *pfcid;
{
int ftc;
struct FFNTB **hffntb;
ftc = pfcid->strFcid.ftc;
hffntb = HffntbGet(pfcid->strFcid.doc);
if (ftc >= (*hffntb)->iffnMac)
ftc = 0;
return((*hffntb)->mpftchffn[ftc]);
}