263 lines
5.4 KiB
C
263 lines
5.4 KiB
C
/************************************************************/
|
||
/* 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 <windows.h>
|
||
|
||
#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;
|
||
}
|
||
|