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;
|
|||
|
}
|
|||
|
|