849 lines
22 KiB
C++
849 lines
22 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* The contents of this file are subject to the Netscape Public License
|
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
|
* http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
|
* for the specific language governing rights and limitations under the
|
|
* NPL.
|
|
*
|
|
* The Initial Developer of this code under the NPL is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
|
* Reserved.
|
|
*/
|
|
/*
|
|
*
|
|
* Implements a link between the (cfb) CFontBroker Interface implementation
|
|
* and its C++ implementation viz (fb) FontBrokerObject.
|
|
*
|
|
* dp Suresh <dp@netscape.com>
|
|
*/
|
|
|
|
|
|
#include "libfont.h"
|
|
|
|
#include "nf.h"
|
|
#include "Mcfb.h"
|
|
#include "Pcfb.h"
|
|
#include "fb.h"
|
|
|
|
#include "wfList.h"
|
|
|
|
/* Hack: libnet defines this locally. We need to move it out into a public
|
|
* header like net.h
|
|
*/
|
|
extern "C" int NET_FindURLInCache(URL_Struct *URL_s, MWContext *ctxt);
|
|
|
|
int wf_trace_flag = 0;
|
|
|
|
#ifdef MOZILLA_CLIENT
|
|
#define WF_PREF_ENABLE_WEBFONTS "browser.use_document_fonts"
|
|
PR_STATIC_CALLBACK(int)
|
|
/*ARGSUSED*/
|
|
wf_PrefHandler(const char *pref, void *data)
|
|
{
|
|
int32 value = 2;
|
|
struct nffbc *fbc = (struct nffbc *)data;
|
|
struct nffbu *fbu = (struct nffbu *)nffbc_getInterface(fbc, &nffbu_ID, NULL);
|
|
#ifndef NO_PREF_CHANGE
|
|
PREF_GetIntPref(WF_PREF_ENABLE_WEBFONTS, &value);
|
|
#endif /* NO_PREF_CHANGE */
|
|
if (value == 0 || value == 1)
|
|
{
|
|
nffbu_DisableWebfonts(fbu, NULL);
|
|
}
|
|
else
|
|
{
|
|
nffbu_EnableWebfonts(fbu, NULL);
|
|
}
|
|
return (0);
|
|
}
|
|
#endif /* MOZILLA_CLIENT */
|
|
|
|
/*
|
|
* Broker initialization. I would like to put this in libfont.c but
|
|
* since that defines JMC_INITID to define objects, adding this which means
|
|
* adding Mcfb.h would interfere. Hence I am putting this with the cfb stuff.
|
|
*/
|
|
NF_PUBLIC_API_IMPLEMENT(struct nffbc *)
|
|
NF_FontBrokerInitialize()
|
|
{
|
|
/* Create the broker */
|
|
struct nffbc *fbc = (struct nffbc *)cfbFactory_Create(NULL);
|
|
|
|
/* Register the converters for font streaming */
|
|
NF_RegisterConverters();
|
|
|
|
#ifdef DEBUG
|
|
const char *WF_TRACE = getenv("WF_TRACE");
|
|
if (WF_TRACE)
|
|
{
|
|
wf_trace_flag = atoi(WF_TRACE);
|
|
}
|
|
#endif
|
|
|
|
#ifdef MOZILLA_CLIENT
|
|
#ifndef NO_PREF_CHANGE
|
|
// Register for preference changes
|
|
PREF_RegisterCallback(WF_PREF_ENABLE_WEBFONTS, wf_PrefHandler, fbc);
|
|
#endif /* NO_PREF_CHANGE */
|
|
|
|
// Initialize the pref by faking a prefchange
|
|
wf_PrefHandler(WF_PREF_ENABLE_WEBFONTS, fbc);
|
|
#endif /* MOZILLA_CLIENT */
|
|
|
|
return (fbc);
|
|
}
|
|
|
|
|
|
/****************************************************************************
|
|
* Implementation of common interface methods *
|
|
****************************************************************************/
|
|
|
|
#ifdef OVERRIDE_cfb_getInterface
|
|
#include "Mnffbc.h"
|
|
#include "Mnffbp.h"
|
|
#include "Mnffbu.h"
|
|
|
|
extern "C" JMC_PUBLIC_API(void*)
|
|
/* ARGSUSED */
|
|
_cfb_getInterface(struct cfb* self, jint op, const JMCInterfaceID* iid, JMCException* *exc)
|
|
{
|
|
if (memcmp(iid, &nffbc_ID, sizeof(JMCInterfaceID)) == 0)
|
|
return cfbImpl2cfb(cfb2cfbImpl(self));
|
|
if (memcmp(iid, &nffbp_ID, sizeof(JMCInterfaceID)) == 0)
|
|
return cfbImpl2nffbp(cfb2cfbImpl(self));
|
|
if (memcmp(iid, &nffbu_ID, sizeof(JMCInterfaceID)) == 0)
|
|
return cfbImpl2nffbu(cfb2cfbImpl(self));
|
|
return _cfb_getBackwardCompatibleInterface(self, iid, exc);
|
|
}
|
|
#endif /* OVERRIDE_cfb_getInterface */
|
|
|
|
extern "C" JMC_PUBLIC_API(void*)
|
|
/*ARGSUSED*/
|
|
_cfb_getBackwardCompatibleInterface(struct cfb* self,
|
|
const JMCInterfaceID* iid,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
return(NULL);
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(void)
|
|
/*ARGSUSED*/
|
|
_cfb_init(struct cfb* self, struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
|
|
// Populate our global interface variables before creating
|
|
// FontBrokerObject as the constructor uses them.
|
|
WF_fbc = (struct nffbc *) self;
|
|
WF_fbp = cfbImpl2nffbp(cfb2cfbImpl(self));
|
|
WF_fbu = cfbImpl2nffbu(cfb2cfbImpl(self));
|
|
|
|
FontBrokerObject *fbobj = new FontBrokerObject();
|
|
if (fbobj == NULL)
|
|
{
|
|
WF_fbc = NULL;
|
|
WF_fbp = NULL;
|
|
WF_fbu = NULL;
|
|
JMC_EXCEPTION(exceptionThrown, JMCEXCEPTION_OUT_OF_MEMORY);
|
|
}
|
|
else
|
|
{
|
|
oimpl->object = fbobj;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
#ifdef OVERRIDE_cfb_finalize
|
|
extern "C" JMC_PUBLIC_API(void)
|
|
/*ARGSUSED*/
|
|
_cfb_finalize(struct cfb* self, jint op, JMCException* *exception)
|
|
{
|
|
struct cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
delete fbobj;
|
|
|
|
/* Finally, free the memory for the object containter. */
|
|
XP_FREEIF(self);
|
|
}
|
|
#endif /* OVERRIDE_cfb_finalize */
|
|
|
|
|
|
|
|
|
|
/****************************************************************************
|
|
* Implementation of Object specific methods *
|
|
****************************************************************************/
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nff*)
|
|
/*ARGSUSED*/
|
|
_cfb_LookupFont(struct cfb* self, jint op, struct nfrc* rc, struct nffmi* fmi,
|
|
const char *accessor, struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->LookupFont(rc, fmi, accessor));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nff*)
|
|
/*ARGSUSED*/
|
|
_cfb_CreateFontFromUrl(struct cfb* self, jint op, struct nfrc* rc,
|
|
const char* url_of_font, const char *url_of_page,
|
|
jint faux, struct nfdoer* completion_callback,
|
|
MWContext* context,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->CreateFontFromUrl(rc, url_of_font, url_of_page, faux, completion_callback, context));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nff*)
|
|
/*ARGSUSED*/
|
|
_cfb_CreateFontFromFile(struct cfb* self, jint op, struct nfrc *rc,
|
|
const char *mimetype, const char* fontfilename,
|
|
const char *url_of_page,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->CreateFontFromFile(rc, mimetype, fontfilename, url_of_page));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(void*)
|
|
/*ARGSUSED*/
|
|
_cfb_ListFonts(struct cfb* self, jint op, struct nfrc* rc, struct nffmi* fmi,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return fbobj->ListFonts(rc, fmi);
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(void*)
|
|
/*ARGSUSED*/
|
|
_cfb_ListSizes(struct cfb* self, jint op, struct nfrc* rc, struct nffmi* fmi,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return fbobj->ListSizes(rc, fmi);
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nff*)
|
|
/*ARGSUSED*/
|
|
_cfb_GetBaseFont(struct cfb* self, jint op, struct nfrf* rf,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = cfb2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->GetBaseFont(rf));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbp_RegisterFontDisplayer(struct nffbp* self, jint op,
|
|
struct nffp* fp,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbp2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->RegisterFontDisplayer(fp));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbp_CreateFontDisplayerFromDLM(struct nffbp* self, jint op,
|
|
const char* dlm_name,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbp2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->CreateFontDisplayerFromDLM(dlm_name));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbp_ScanForFontDisplayers(struct nffbp* self, jint op,
|
|
const char* dlm_dir,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbp2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->ScanForFontDisplayers(dlm_dir));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(void)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbp_RfDone(struct nffbp* self, jint op, struct nfrf *rf,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbp2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
fbobj->RfDone(rf);
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nffmi*)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_CreateFontMatchInfo(struct nffbu* self, jint op, const char* name,
|
|
const char* charset, const char* encoding,
|
|
jint weight, jint pitch, jint style,
|
|
jint underline, jint strikeOut,
|
|
jint resX, jint resY,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->CreateFontMatchInfo(name, charset, encoding, weight,
|
|
pitch, style, underline, strikeOut,
|
|
resX, resY));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nfrc*)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_CreateRenderingContext(struct nffbu* self, jint op,
|
|
jint majorType, jint minorType,
|
|
void ** args, jsize nargs,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->CreateRenderingContext(majorType, minorType, args, nargs));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(struct nfdoer*)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_CreateFontObserver(struct nffbu* self, jint op,
|
|
nfFontObserverCallback callback,
|
|
void *client_data,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->CreateFontObserver(callback, client_data));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(void *)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_malloc(struct nffbu* self, jint op, jint size,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
return (WF_ALLOC(size));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(void)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_free(struct nffbu* self, jint op, void *mem,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
if (mem)
|
|
{
|
|
WF_FREE(mem);
|
|
}
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(void *)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_realloc(struct nffbu* self, jint op, void *mem, jint size,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
return (WF_REALLOC(mem, size));
|
|
}
|
|
|
|
//
|
|
// Font Broker Preferences
|
|
//
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_IsWebfontsEnabled(struct nffbu* self, jint op,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->IsWebfontsEnabled());
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_EnableWebfonts(struct nffbu* self, jint op,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->EnableWebfonts());
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_DisableWebfonts(struct nffbu* self, jint op,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->DisableWebfonts());
|
|
}
|
|
|
|
// The following are font preference related queries
|
|
|
|
extern "C" JMC_PUBLIC_API(void *)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_ListFontDisplayers(struct nffbu* self, jint op,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return ((void *)fbobj->ListFontDisplayers());
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_IsFontDisplayerEnabled(struct nffbu* self, jint op,
|
|
const char *displayer,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->IsFontDisplayerEnabled(displayer));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(void *)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_ListFontDisplayersForMimetype(struct nffbu* self, jint op,
|
|
const char *mimetype,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return ((void *)fbobj->ListFontDisplayersForMimetype(mimetype));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(const char *)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_FontDisplayerForMimetype(struct nffbu* self, jint op,
|
|
const char *mimetype,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->FontDisplayerForMimetype(mimetype));
|
|
}
|
|
|
|
// The following are used to change state
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_EnableFontDisplayer(struct nffbu* self, jint op,
|
|
const char *displayer,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->EnableFontDisplayer(displayer));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_DisableFontDisplayer(struct nffbu* self, jint op,
|
|
const char *displayer,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->DisableFontDisplayer(displayer));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_EnableMimetype(struct nffbu* self, jint op,
|
|
const char *displayer, const char *mimetype,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->EnableMimetype(displayer, mimetype));
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_DisableMimetype(struct nffbu* self, jint op,
|
|
const char *displayer, const char *mimetype,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->DisableMimetype(displayer, mimetype));
|
|
}
|
|
|
|
|
|
//
|
|
// Font Broker Catalog
|
|
//
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_LoadCatalog(struct nffbu* self, jint op,
|
|
const char *catalogFilename,
|
|
struct JMCException* *exceptionThrown)
|
|
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->LoadCatalog(catalogFilename));
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_SaveCatalog(struct nffbu* self, jint op,
|
|
const char *catalogFilename,
|
|
struct JMCException* *exceptionThrown)
|
|
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
FontBrokerObject *fbobj = (FontBrokerObject *)oimpl->object;
|
|
return (fbobj->SaveCatalog(catalogFilename));
|
|
}
|
|
|
|
//
|
|
// Webfonts & MWContext specific
|
|
//
|
|
|
|
#ifndef XP_OS2
|
|
extern "C"
|
|
#endif
|
|
void
|
|
/*ARGSUSED*/
|
|
release_webfonts(wfList *list, void *item)
|
|
{
|
|
struct nff *f = (struct nff *)item;
|
|
nff_release(f, NULL);
|
|
}
|
|
|
|
extern "C" void wf_ObserverCallback(struct nff *ff, void *data)
|
|
{
|
|
MWContext *context = (MWContext *) data;
|
|
|
|
// fprintf(stderr, "fontObserverCallback: State of font is %d.", nff_GetState(f, NULL));
|
|
switch (nff_GetState(ff, NULL))
|
|
{
|
|
case NF_FONT_COMPLETE:
|
|
{
|
|
wfList *webfontsList = (wfList *)context->webfontsList;
|
|
if (!webfontsList)
|
|
{
|
|
webfontsList = new wfList(release_webfonts);
|
|
context->webfontsList = webfontsList;
|
|
}
|
|
webfontsList->add(ff);
|
|
context->WebFontDownLoadCount++;
|
|
nff_addRef(ff, NULL);
|
|
break;
|
|
}
|
|
case NF_FONT_ERROR:
|
|
case NF_FONT_INCOMPLETE: // This should not happen.
|
|
default :
|
|
break;
|
|
}
|
|
return;
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_LoadWebfont(struct nffbu* self, jint op,
|
|
MWContext *context, const char *url, jint force,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
cfbImpl *oimpl = nffbu2cfbImpl(self);
|
|
XP_ASSERT(oimpl->header.refcount);
|
|
|
|
int ret = 0;
|
|
struct nff *f;
|
|
struct nfdoer *observer;
|
|
struct nfrc *rc;
|
|
void *rcbuf[2];
|
|
int url_type;
|
|
URL_Struct *url_s = NULL;
|
|
char *fullFilePath = NULL;
|
|
NET_ReloadMethod reloadMethod = (NET_ReloadMethod) force;
|
|
History_entry *he = NULL;
|
|
const char *accessing_url_str = NULL;
|
|
|
|
if (reloadMethod == NET_RESIZE_RELOAD)
|
|
{
|
|
return (ret);
|
|
}
|
|
|
|
rcbuf[0] = (void *)NULL;
|
|
rcbuf[1] = 0;
|
|
rc = nffbu_CreateRenderingContext(self, NF_RC_DIRECT, 0, rcbuf, 1, NULL);
|
|
|
|
url_type = NET_URL_Type(url);
|
|
|
|
/* Do cache checking only if this isn't NET_SUPER_RELOAD and
|
|
* this isn't a mail/news url.
|
|
*/
|
|
if (reloadMethod != NET_SUPER_RELOAD &&
|
|
url_type != MAILBOX_TYPE_URL && url_type != NEWS_TYPE_URL)
|
|
{
|
|
url_s = NET_CreateURLStruct(url, NET_NORMAL_RELOAD);
|
|
if (url_s)
|
|
{
|
|
NET_FindURLInCache(url_s, context);
|
|
}
|
|
if (url_s && url_s->cache_file && *url_s->cache_file)
|
|
{
|
|
fullFilePath = WH_FileName(url_s->cache_file, xpCache);
|
|
}
|
|
|
|
// See if this a local file url
|
|
if (!fullFilePath && url_s && url_s->address &&
|
|
// NET_IsLocalFile() says Yes to mailbox: urls too. Yuck.
|
|
!wf_strncasecmp(url_s->address, "file:", 5) &&
|
|
NET_IsLocalFileURL(url_s->address))
|
|
{
|
|
fullFilePath = NET_ParseURL(url_s->address, GET_PATH_PART);
|
|
if (fullFilePath && *fullFilePath)
|
|
{
|
|
fullFilePath = NET_UnEscape(fullFilePath);
|
|
char *s = WH_FileName(fullFilePath, xpTemporary);
|
|
XP_FREE(fullFilePath);
|
|
fullFilePath = s;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Find the url that is loading this font
|
|
he = SHIST_GetCurrent(&context->hist);
|
|
if (he)
|
|
{
|
|
accessing_url_str = he->address;
|
|
}
|
|
|
|
if (fullFilePath && *fullFilePath)
|
|
{
|
|
// The url was cached.
|
|
struct nffbc *fbc =
|
|
(struct nffbc *)nffbu_getInterface(self, &nffbc_ID, NULL);
|
|
|
|
f = nffbc_CreateFontFromFile(fbc, rc, url_s->content_type,
|
|
fullFilePath, accessing_url_str, NULL);
|
|
|
|
// Add the font to the list of created webfonts
|
|
if (f)
|
|
{
|
|
wfList *webfontsList = (wfList *)context->webfontsList;
|
|
if (!webfontsList)
|
|
{
|
|
webfontsList = new wfList(release_webfonts);
|
|
context->webfontsList = webfontsList;
|
|
}
|
|
|
|
// Add the font to the list of created webfonts
|
|
// and increment its refcount
|
|
webfontsList->add(f);
|
|
nff_addRef(f, NULL);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Create the font observer
|
|
observer = nffbu_CreateFontObserver(self, wf_ObserverCallback, context,
|
|
NULL);
|
|
|
|
if (!observer)
|
|
{
|
|
return (-2);
|
|
}
|
|
|
|
f = nffbc_CreateFontFromUrl(
|
|
(struct nffbc *)nffbu_getInterface(self, &nffbc_ID, NULL),
|
|
rc, url, accessing_url_str, 0, observer, context, NULL);
|
|
}
|
|
|
|
if (url_s)
|
|
{
|
|
NET_FreeURLStruct(url_s);
|
|
}
|
|
if (fullFilePath)
|
|
{
|
|
XP_FREE(fullFilePath);
|
|
}
|
|
|
|
if (!f)
|
|
{
|
|
// Coudn't create font
|
|
ret = -1;
|
|
}
|
|
else
|
|
{
|
|
// Release the current 'f' that we are holding
|
|
nff_release(f, NULL);
|
|
}
|
|
return (ret);
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_ReleaseWebfonts(struct nffbu* self, jint op,
|
|
MWContext *context,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
wfList *webfontsList = (wfList *) context->webfontsList;
|
|
if (!webfontsList)
|
|
{
|
|
// No webfonts were ever loaded
|
|
return (-1);
|
|
}
|
|
|
|
delete webfontsList;
|
|
context->webfontsList = NULL;
|
|
context->WebFontDownLoadCount = 0;
|
|
context->MissedFontFace = 0;
|
|
return (0);
|
|
}
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_WebfontsNeedReload(struct nffbu* self, jint op,
|
|
MWContext *context,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
if (!context)
|
|
{
|
|
return (-1);
|
|
}
|
|
|
|
if (context->WebFontDownLoadCount <= 0)
|
|
{
|
|
// No webfonts downloaded by this document
|
|
return (0);
|
|
}
|
|
|
|
/* A reload should happen iff
|
|
* 1. There were successful downloads of webfonts.
|
|
* Creating webfonts from cache doesn't count
|
|
* 2. If the current document was a NET_RESIZE_RELOAD
|
|
*
|
|
* Even if FE didn't fail to load a font we have to download
|
|
* because webfonts always override system fonts and we could
|
|
* have a request that was earlier satisfied by a system font be
|
|
* satisfied with a webfont.
|
|
*/
|
|
NET_ReloadMethod reloadMethod = LO_GetReloadMethod(context);
|
|
|
|
/* Before returning reset context->MissedFontFace */
|
|
context->MissedFontFace = 0; /* Not used for now */
|
|
return (reloadMethod != NET_RESIZE_RELOAD);
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_LookupFailed(struct nffbu* self, jint op,
|
|
MWContext *context, struct nfrc *rc,
|
|
struct nffmi *fmi,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
// The simplest implementation is to set a flag and use it
|
|
// when deciding to reload.
|
|
//
|
|
// More complicated schemes where we keep this list of fmi
|
|
// and enable reload only if these fmis will be satisfied by
|
|
// the downloaded fonts.
|
|
if (!context)
|
|
{
|
|
return (-1);
|
|
}
|
|
|
|
context->MissedFontFace = 1;
|
|
return (0);
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_ToUnicode(struct nffbu* self, jint op,
|
|
const char* encoding,
|
|
jbyte* src, jsize src_length,
|
|
jshort* dest, jsize dest_length,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
jint ret = 0;
|
|
|
|
if (src_length)
|
|
{
|
|
INTL_Encoding_ID encoding_ID = INTL_CharSetNameToID((char *)encoding);
|
|
ret = INTL_TextToUnicode(encoding_ID,
|
|
(unsigned char *)src, (uint32)src_length,
|
|
(INTL_Unicode *)dest, (uint32)dest_length);
|
|
}
|
|
return (ret);
|
|
}
|
|
|
|
|
|
extern "C" JMC_PUBLIC_API(jint)
|
|
/*ARGSUSED*/
|
|
_cfb_nffbu_UnicodeLen(struct nffbu* self, jint op,
|
|
const char* encoding,
|
|
jbyte* src, jsize src_length,
|
|
struct JMCException* *exceptionThrown)
|
|
{
|
|
jint ret = 0;
|
|
|
|
if (src_length)
|
|
{
|
|
INTL_Encoding_ID encoding_ID = INTL_CharSetNameToID((char *)encoding);
|
|
ret = INTL_TextToUnicodeLen(encoding_ID,
|
|
(unsigned char *)src, (uint32) src_length);
|
|
}
|
|
return (ret);
|
|
}
|