r=mkaply, a=brendan
nsFontServices is not used
This commit is contained in:
mkaply%us.ibm.com 2000-08-07 20:53:28 +00:00
Родитель 428b8d9862
Коммит 94bededfa0
2 изменённых файлов: 0 добавлений и 402 удалений

Просмотреть файл

@ -1,353 +0,0 @@
/*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is the Mozilla OS/2 libraries.
*
* The Initial Developer of the Original Code is John Fairhurst,
* <john_fairhurst@iname.com>. Portions created by John Fairhurst are
* Copyright (C) 1999 John Fairhurst. All Rights Reserved.
*
* Contributor(s):
* Pierre Phaneuf <pp@ludusdesign.com>
*/
#include "nsWidgetDefs.h"
#include "nsFontServices.h"
#include "nsIFontNameIterator.h"
#include "nsIFontSizeIterator.h"
#include "nsString.h"
#include <stdlib.h>
// FONTMETRICS are obtained and stored in a datastructure which is optimized
// towards the enumeration-style purpose for which they are required in this
// toolkit (primarily to populate combobox widgets, I guess)
class FaceInstance
{
PFONTMETRICS mFontMetrics;
FaceInstance *mNext;
public:
FaceInstance( PFONTMETRICS aMetrics) : mFontMetrics(aMetrics), mNext(0)
{}
~FaceInstance()
{
delete mNext;
}
PRBool IsScalable()
{
return mFontMetrics->fsDefn & FM_DEFN_OUTLINE;
}
double GetPointSize()
{
return ((double)mFontMetrics->sNominalPointSize) / 10.0;
}
void Append( FaceInstance *aInstance)
{
if( IsScalable() || GetPointSize() == aInstance->GetPointSize())
delete aInstance;
else
{
if( !mNext) mNext = aInstance;
else mNext->Append( aInstance);
}
}
FaceInstance *GetNext() { return mNext; }
};
class FontFamily
{
char *mFamName;
FaceInstance *mInstances;
FontFamily *mNext;
public:
FontFamily( PFONTMETRICS aMetrics) : mFamName(0), mInstances(0), mNext(0)
{
mFamName = strdup( aMetrics->szFamilyname);
mInstances = new FaceInstance( aMetrics);
}
~FontFamily()
{
if( mFamName) free( mFamName);
delete mInstances;
delete mNext;
}
void Append( FontFamily *aFamily)
{
if( !mNext) mNext = aFamily;
else mNext->Append( aFamily);
}
FontFamily *GetNext() { return mNext; }
FaceInstance *GetInstances() { return mInstances; }
const char *GetName() const { return mFamName; }
// XXX maybe have a method here to do the system atom-table thing
// ("good grief", I know...)
};
class FontLister
{
FontFamily *mFamilies;
FontFamily *mCache;
PFONTMETRICS mMetrics;
public:
// XXX ought to take a DC or PS or something...
FontLister() : mFamilies(0), mCache(0), mMetrics(0)
{
HPS hps = WinGetScreenPS( HWND_DESKTOP);
// Get fontmetrics for the display
LONG lWant = 0, lFonts;
lFonts = GpiQueryFonts( hps, QF_PUBLIC | QF_PRIVATE,
0, &lWant, 0, 0);
mMetrics = new FONTMETRICS [ lFonts ];
GpiQueryFonts( hps, QF_PUBLIC | QF_PRIVATE, 0, &lFonts,
sizeof( FONTMETRICS), mMetrics);
// now stick 'em in our datastructures
for( LONG l = 0; l < lFonts; l++)
{
FontFamily *pFamily = FindFamily( mMetrics[l].szFamilyname);
if( pFamily)
{
FaceInstance *pInstance = new FaceInstance( mMetrics + l);
pFamily->GetInstances()->Append( pInstance);
}
else
{
pFamily = new FontFamily( mMetrics + l);
if( !mFamilies) mFamilies = pFamily;
else mFamilies->Append( pFamily);
}
}
WinReleasePS( hps);
}
~FontLister()
{
delete mFamilies;
delete [] mMetrics;
}
FontFamily *FindFamily( const char *aName)
{
if( !mCache || stricmp( mCache->GetName(), aName))
{
FontFamily *pFamily = mFamilies;
while( pFamily)
{
if( !stricmp( pFamily->GetName(), aName))
break;
pFamily = pFamily->GetNext();
}
mCache = pFamily;
}
return mCache;
}
FontFamily *GetFamilies() { return mFamilies; }
};
// Now declare a couple of iterators for font size and name.
// Could maybe share code somehow (base template class?)
// Font-size iterator (xpcom)
class nsFontSizeIterator : public nsIFontSizeIterator
{
FaceInstance *mFirst;
FaceInstance *mCurrent;
public:
nsFontSizeIterator( FaceInstance *aFace)
: mFirst(aFace), mCurrent(aFace)
{
NS_INIT_REFCNT();
}
virtual ~nsFontSizeIterator() {}
// nsISupports
NS_DECL_ISUPPORTS
// nsIFontSizeIterator
NS_IMETHOD Reset()
{
mCurrent = mFirst;
return NS_OK;
}
NS_IMETHOD Get( double *aFontSize)
{
nsresult rc = NS_ERROR_FAILURE;
if( mCurrent)
{
*aFontSize = mCurrent->GetPointSize();
rc = NS_OK;
}
return rc;
}
NS_IMETHOD Advance()
{
nsresult rc = NS_ERROR_FAILURE;
if( mCurrent)
{
mCurrent = mCurrent->GetNext();
if( mCurrent) rc = NS_OK;
}
return rc;
}
};
NS_IMPL_ISUPPORTS(nsFontSizeIterator, NS_GET_IID(nsIFontSizeIterator))
// Font-name iterator (xpcom)
class nsFontNameIterator : public nsIFontNameIterator
{
FontFamily *mFirst;
FontFamily *mCurrent;
public:
nsFontNameIterator( FontFamily *aFamily)
: mFirst(aFamily), mCurrent(aFamily)
{
NS_INIT_REFCNT();
}
// nsISupports
NS_DECL_ISUPPORTS
// nsIFontNameIterator
NS_IMETHOD Reset()
{
mCurrent = mFirst;
return NS_OK;
}
NS_IMETHOD Get( nsString *aString)
{
nsresult rc = NS_ERROR_FAILURE;
if( mCurrent)
{
aString->AssignWithConversion( mCurrent->GetName());
rc = NS_OK;
}
return rc;
}
NS_IMETHOD Advance()
{
nsresult rc = NS_ERROR_FAILURE;
if( mCurrent)
{
mCurrent = mCurrent->GetNext();
if( mCurrent) rc = NS_OK;
}
return rc;
}
};
NS_IMPL_ISUPPORTS(nsFontNameIterator, NS_GET_IID(nsIFontNameIterator))
// font retriever service
NS_IMPL_ISUPPORTS(nsFontRetrieverService, NS_GET_IID(nsIFontRetrieverService))
nsFontRetrieverService::nsFontRetrieverService()
{
NS_INIT_REFCNT();
mFontLister = new FontLister;
}
nsFontRetrieverService::~nsFontRetrieverService()
{
delete mFontLister;
}
nsresult
nsFontRetrieverService::CreateFontNameIterator( nsIFontNameIterator **aIterator)
{
if( !aIterator)
return NS_ERROR_NULL_POINTER;
*aIterator = new nsFontNameIterator( mFontLister->GetFamilies());
NS_ADDREF(*aIterator);
return NS_OK;
}
nsresult
nsFontRetrieverService::CreateFontSizeIterator( const nsString &aFontName,
nsIFontSizeIterator **aIterator)
{
if( !aIterator)
return NS_ERROR_NULL_POINTER;
char buffer[100];
gModuleData.ConvertFromUcs( aFontName, buffer, 100);
FontFamily *pFamily = mFontLister->FindFamily( buffer);
if( !pFamily)
return NS_ERROR_FAILURE;
*aIterator = new nsFontSizeIterator( pFamily->GetInstances());
NS_ADDREF(*aIterator);
return NS_OK;
}
nsresult
nsFontRetrieverService::IsFontScalable( const nsString &aFontName,
PRBool *aResult)
{
if( !aResult)
return NS_ERROR_NULL_POINTER;
char buffer[100];
gModuleData.ConvertFromUcs( aFontName, buffer, 100);
FontFamily *pFamily = mFontLister->FindFamily( buffer);
if( !pFamily)
return NS_ERROR_FAILURE;
*aResult = pFamily->GetInstances()->IsScalable();
return NS_OK;
}
// singleton behaviour -- don't trust xpcom so do it ourselves
nsresult NS_GetFontService( nsISupports **aResult)
{
if( !aResult)
return NS_ERROR_NULL_POINTER;
if( !gModuleData.fontService)
{
gModuleData.fontService = new nsFontRetrieverService;
NS_ADDREF(gModuleData.fontService);
}
*aResult = gModuleData.fontService;
return NS_OK;
}

Просмотреть файл

@ -1,49 +0,0 @@
/*
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations
* under the License.
*
* The Original Code is the Mozilla OS/2 libraries.
*
* The Initial Developer of the Original Code is John Fairhurst,
* <john_fairhurst@iname.com>. Portions created by John Fairhurst are
* Copyright (C) 1999 John Fairhurst. All Rights Reserved.
*
* Contributor(s):
*
*/
#ifndef _nsfontservices_h
#define _nsfontservices_h
#include "nsIFontRetrieverService.h"
class FontLister;
class nsFontRetrieverService : public nsIFontRetrieverService
{
FontLister *mFontLister;
public:
nsFontRetrieverService();
virtual ~nsFontRetrieverService();
// nsISupports
NS_DECL_ISUPPORTS
// nsIFontRetrieverService
NS_IMETHOD CreateFontNameIterator( nsIFontNameIterator **aIterator);
NS_IMETHOD CreateFontSizeIterator( const nsString &aFontName,
nsIFontSizeIterator **aIterator);
NS_IMETHOD IsFontScalable( const nsString &aFontName, PRBool *aResult);
};
nsresult NS_GetFontService( nsISupports **aResult);
#endif