[Date Prev][Date Next][Thread Prev][Thread Next][Thread Index]

Re: [XaraXtreme-dev] font patches



Hi Martin,

I've just checked your font patches into SVN. Sorry for the delay - we were sorting out internal systems and responsibilities.

Phil

Martin Wuerthner wrote:

Find attached below more font patches.

compatdef.h:
Removed ENUMLOGFONT and LOGFONT definitions (moved to fontbase.h), added struct CDC used by kernel

fontbase.h:
Added new font type FC_FREETYPE and fontbase-specific
definitions of LOGFONT and ENUMLOGFONT

fontbase.cpp (not yet included for compilation in Makefile.am)
Uses the FreeType font manager FTFontMan instead of the TrueType or
ATM font managers.

New file wxOil/ftfonts.h
The FreeType font manager header file

I hope I got the header and svn macros right for the new file.

Martin
------------------------------------------------------------------------

Index: wxOil/compatdef.h
===================================================================
--- wxOil/compatdef.h	(Revision 720)
+++ wxOil/compatdef.h	(Arbeitskopie)
@@ -538,15 +538,10 @@
{
};

-struct LOGFONT
+struct CDC
{
};
-typedef LOGFONT		   *PLOGFONT, *LPLOGFONT;

-struct ENUMLOGFONT
-{
-};
-
struct ABC
{
};
Index: wxOil/fontbase.h
===================================================================
--- wxOil/fontbase.h	(Revision 720)
+++ wxOil/fontbase.h	(Arbeitskopie)
@@ -109,6 +109,7 @@

#include "pathtype.h"
#include "txtattr.h"
+#include "ccpanose.h"

class  DocCoord;
class CharMetrics;
@@ -125,11 +126,24 @@
	FC_DEVICE,
	FC_TRUETYPE,
	FC_ATM,
+	FC_FREETYPE,

	// Add further font classes before this
	FC_ILLEGAL
};

+// The kernel likes dealing with LOGFONT and ENUMLOGFONT structures, so we do it this favour
+struct LOGFONT
+{
+	String_64 FaceName;
+};
+typedef LOGFONT		   *PLOGFONT, *LPLOGFONT;
+
+struct ENUMLOGFONT
+{
+	LOGFONT elfLogFont;
+};
+
/********************************************************************************************

>	class FontBase : public CCObject
@@ -325,9 +339,6 @@
	static FontKerningPairsCacheEntry mpFontKerningPairsCacheData[NUMENTRIES];
};

-PORTNOTE("text","Removed OILFont* defn.")
-#ifndef EXCLUDE_FROM_XARALX
-
/********************************************************************************************

>	class OILFontMan : public CCObject
@@ -388,8 +399,6 @@
};


-#endif
-
/********************************************************************************************

>	class EnumFonts : public CCObject
Index: wxOil/fontbase.cpp
===================================================================
--- wxOil/fontbase.cpp	(Revision 720)
+++ wxOil/fontbase.cpp	(Arbeitskopie)
@@ -102,8 +102,9 @@
*/

#include "camtypes.h"
-#include "ttfonts.h"
-//#include "atmfonts.h"
+#ifdef __WXGTK__
+#include "ftfonts.h"
+#endif
#include "textfuns.h"
#include "fontman.h"		// includes fontbase.h
#include "errors.h"
@@ -126,6 +127,9 @@

#define new CAM_DEBUG_NEW

+// a macro to ignore a parameter without causing a warning
+#define IGNORE(x) x = x
+
/////////////////////////////////////////
// Some outline cache constants
UINT32 CharOutlineCache::CacheSize = 0;
@@ -203,8 +207,19 @@
#endif
			break;
		case FC_TRUETYPE:
+#ifndef EXCLUDE_FROM_XARALX
			return TTFontMan::IsOkToCall();
+#else
+			return FALSE;
+#endif
			break;
+		case FC_FREETYPE:
+#ifdef __WXGTK__
+			return FTFontMan::IsOkToCall();
+#else
+			return FALSE;
+#endif
+			break;
	}
	ERROR3("Unknown font class passed to OILFontMan::IsOkToCall()");
	return FALSE;
@@ -244,9 +259,15 @@
			{
				case FC_UNDEFINED:
				{
+#ifdef __WXGTK__
+					if (FTFontMan::CacheNamedFont(pFontName))
+						return TRUE;
+#endif
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
					if (TTFontMan::CacheNamedFont(pFontName))
						return TRUE;
-
+#endif
PORTNOTE("text","Never cache ATM font")
#ifndef EXCLUDE_FROM_XARALX
					return ATMFontMan::CacheNamedFont(pFontName);
@@ -258,7 +279,12 @@

				case FC_TRUETYPE:
				{
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
					return TTFontMan::CacheNamedFont(pFontName);
+#else
+					return FALSE;
+#endif
					break;
				}

@@ -273,6 +299,16 @@
					break;
				}

+				case FC_FREETYPE:
+				{
+#ifdef __WXGTK__
+					return FTFontMan::CacheNamedFont(pFontName);
+#else
+					return FALSE;
+#endif
+					break;
+				}
+
				default:
					ERROR3("Unknown font class passed to OILFontMan::CacheNamedFont()");
			}
@@ -286,9 +322,16 @@
			{
				case FC_UNDEFINED:
				{
+#ifdef __WXGTK__
+					if (FTFontMan::CacheCompatibleFont(pFontName))
+						return TRUE;
+#endif
+
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
					if (TTFontMan::CacheCompatibleFont(pFontName))
						return TRUE;
-
+#endif
PORTNOTE("text","Never cache ATM font")
#ifndef EXCLUDE_FROM_XARALX
					return ATMFontMan::CacheCompatibleFont(pFontName);
@@ -300,7 +343,12 @@

				case FC_TRUETYPE:
				{
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
					return TTFontMan::CacheCompatibleFont(pFontName);
+#else
+					return FALSE;
+#endif
					break;
				}

@@ -313,7 +361,17 @@
					return FALSE;
#endif					
				}
-		
+
+				case FC_FREETYPE:
+				{
+#ifdef __WXGTK__
+					return FTFontMan::CacheCompatibleFont(pFontName);
+#else
+					return FALSE;
+#endif
+					break;
+				}
+
				default:
					ERROR3("Unknown font class passed to OILFontMan::CacheNamedFont()");

@@ -340,7 +398,13 @@

void OILFontMan::ValidateCache()
{
+#ifdef __WXGTK__
+	FTFontMan::ValidateCache();
+#endif
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
	TTFontMan::ValidateCache();
+#endif
PORTNOTE("text","ATM deactivated")
#ifndef EXCLUDE_FROM_XARALX
	ATMFontMan::ValidateCache();
@@ -361,7 +425,13 @@

void OILFontMan::FindClosestFont()
{
+#ifdef __WXGTK__
+	FTFontMan::FindClosestFont();
+#endif
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
	TTFontMan::FindClosestFont();
+#endif
PORTNOTE("text","ATM deactivated")
#ifndef EXCLUDE_FROM_XARALX
	ATMFontMan::FindClosestFont();
@@ -386,15 +456,28 @@
{
	switch (Class)
	{
+		case FC_FREETYPE:
+#ifdef __WXGTK__
+		case FC_UNDEFINED:
+			return FTFontMan::CreateNewFont(pFontName);
+#else
+			return NULL;
+#endif
+			break;
		case FC_TRUETYPE:
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
			return TTFontMan::CreateNewFont(pFontName);
+#else
+			return NULL;
+#endif
			break;
		case FC_ATM:
PORTNOTE("text","ATM deactivated")
#ifndef EXCLUDE_FROM_XARALX
			return ATMFontMan::CreateNewFont(pFontName);
#else
-			return NULL
+			return NULL;
#endif
			break;
	}
@@ -421,15 +504,27 @@
{
	switch (Class)
	{
+		case FC_FREETYPE:
+#ifdef __WXGTK__
+			return FTFontMan::GetOutlineTextMetric(pLogFont);
+#else
+			return NULL;
+#endif
+			break;
		case FC_TRUETYPE:
+PORTNOTE("text","ATM deactivated")
+#ifndef EXCLUDE_FROM_XARALX
			return TTFontMan::GetOutlineTextMetric(pLogFont);
+#else
+			return NULL;
+#endif
			break;
		case FC_ATM:
-PORTNOTE("other","ATM deactivated")
+PORTNOTE("text","ATM deactivated")
#ifndef EXCLUDE_FROM_XARALX
			return ATMFontMan::GetOutlineTextMetric(pLogFont);
#else
-			return NULL
+			return NULL;
#endif
			break;
	}
@@ -704,21 +799,35 @@
							 UINT32* pNumCoords,
							 wxDC *pDC)
{
+	TRACEUSER("wuerthne",_T("OILFontMan::GetCharPath"));
	BOOL Success=FALSE;
	switch (fclass)
	{
		case FC_TRUETYPE:
+PORTNOTE("text","TrueType deactivated")
+#ifndef EXCLUDE_FROM_XARALX
			Success = TextManager::GetTTCharPath(ChDesc, ppCoords, ppVerbs, pNumCoords, pDC);
+#endif
			ERROR1IF(Success==FALSE, FALSE, _R(IDE_FONTMAN_NOTTOUTLINE));
			break;

		case FC_ATM:
-PORTNOTE("other","ATM deactivated")
+PORTNOTE("text","ATM deactivated")
#ifndef EXCLUDE_FROM_XARALX
			Success = ATMFontMan::GetCharOutline(ChDesc, ppCoords, ppVerbs, pNumCoords, pDC);
#endif
			ERROR1IF(Success==FALSE, FALSE, _R(IDE_FONTMAN_NOATMOUTLINE));
			break;
+
+		case FC_FREETYPE:
+#ifdef __WXGTK__
+			Success = FTFontMan::GetCharOutline(ChDesc, ppCoords, ppVerbs, pNumCoords, pDC);
+#else
+			Success = FALSE;
+#endif
+			ERROR1IF(Success==FALSE, FALSE, _R(IDE_FONTMAN_NOFTOUTLINE));
+			break;
+
	}
	ERROR3IF(Success==FALSE,"Unknown font class in OILFontMan::GetCharPath");
	return Success;
@@ -745,7 +854,8 @@
	FontEmWidth = 0;
	FontAscent  = 0;
	FontDescent = 0;
-	FontDesc    = CharDescription(0,0,0,0);
+	CharDescription emptyCharDesc(0, 0, 0, 0);
+	FontDesc    = emptyCharDesc;
}


@@ -755,10 +865,10 @@

	Author:		Ed_Cornes (Xara Group Ltd) <camelotdev@xxxxxxxx>
	Created:	15/1/96
-	Inputs:		pDC          - DC with design size font selected
-				FontDesc     - descriptor of font which is being cached
-				DefaultHeght - default height of char (ie size of font for which char widths are cached)
-				DesignSize   - size of font selected in DC (in Logical units - pixels)
+	Inputs:		pDC           - DC with design size font selected
+				FontDesc      - descriptor of font which is being cached
+				DefaultHeight - default height of char (ie size of font for which char widths are cached)
+				DesignSize    - size of font selected in DC (in Logical units - pixels)
	Returns:	FALSE if fails
	Purpose:	Refill the font cache entry
********************************************************************************************/
@@ -767,15 +877,17 @@
												MILLIPOINT DefaultHeight, INT32 DesignSize )
{
	// get font metrics and convert from design size in pixels to default height in millipoints
-	TEXTMETRIC TextMetrics;
-	if (pDC->GetTextMetrics(&TextMetrics)==0)
-		ERROR2(FALSE,"FontMetricsCache::GetCharMetrics() - GetTextMetrics() failed");
-	SetFontAscent( MulDiv( TextMetrics.tmAscent, DefaultHeight, DesignSize) );
-	SetFontDescent(MulDiv(-TextMetrics.tmDescent,DefaultHeight, DesignSize) );
+	INT32 Ascent;
+	INT32 Descent;

+#ifdef __WXGTK__
+	if (FTFontMan::GetAscentDescent(FontDesc, &Ascent, &Descent) == FALSE) return FALSE;
+	SetFontAscent( MulDiv( Ascent, DefaultHeight, DesignSize) );
+	SetFontDescent(MulDiv(-Descent,DefaultHeight, DesignSize) );
+
	// get char widths and convert form design size in pixels to default height in millipoints
	static INT32 pTempCharWidthBuf[NUMCHARS];
-	if (TextManager::GetCharWidth(pDC, FIRSTCHAR, LASTCHAR, pTempCharWidthBuf)==FALSE)
+	if (FTFontMan::GetCharWidth(FontDesc, FIRSTCHAR, LASTCHAR, pTempCharWidthBuf)==FALSE)
		return FALSE;
	for (INT32 i=0; i<NUMCHARS; i++)
		pCharWidths[i] = MulDiv(pTempCharWidthBuf[i], DefaultHeight, DesignSize);
@@ -787,17 +899,21 @@
	{
		ERROR3("FontMetricsCache::GetCharMetrics() - 'FONTEMCHAR' not in cache!");
		INT32 TempCharWidth = 0;
-		if (TextManager::GetCharWidth(pDC, FONTEMCHAR, FONTEMCHAR, &TempCharWidth)==FALSE)
+		if (FTFontMan::GetCharWidth(FontDesc, FONTEMCHAR, FONTEMCHAR, &TempCharWidth)==FALSE)
			return FALSE;
		SetFontEmWidth( MulDiv(TempCharWidth, DefaultHeight, DesignSize) );
	}

	// update cache tag
	SetFontDesc(FontDesc);
+#else // !wxGTK
+	return FALSE;
+#endif

+#ifndef EXCLUDE_FROM_XARALX
	// debug test
	CheckCharWidthsSameAsABCWidths(pDC,FontDesc);
-
+#endif
	return TRUE;
}

@@ -815,6 +931,7 @@
void FontMetricsCacheEntry::CheckCharWidthsSameAsABCWidths(wxDC* pDC, CharDescription FontDesc)
{
#ifdef _DEBUG
+#ifndef EXCLUDE_FROM_XARALX
	// ensure that the char widths are the same as the sum of the ABC widths

	// do nothing if its an ATM font (or an error)
@@ -874,7 +991,8 @@
		}
		TRACEUSER( "Ed", _T("Sum of CharWidths (%5dMP): new=%8.0f (e=%6.2f), old=%8.0f (e=%6.2f), accrutate=%8.2f\n"), FontSizeInMP, SumNewMetrics, SumNewMetrics-SumAccurateMetrics, SumOldMetrics, SumOldMetrics-SumAccurateMetrics, SumAccurateMetrics);
	}
-#endif
+#endif // EXCLUDE_FROM_XARALX
+#endif // _DEBUG
}


@@ -898,7 +1016,8 @@

BOOL FontMetricsCache::GetCharMetrics(wxDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics)
{
-	ERROR2IF(         pDC==NULL,FALSE,"FontMetricsCache::GetCharMetrics() - pDC==NULL");
+	TRACEUSER("wuerthne", _T("FontMetricsCache::GetCharMetrics %04x"), ch);
+	IGNORE(pDC);
	ERROR2IF(pCharMetrics==NULL,FALSE,"FontMetricsCache::GetCharMetrics() - pCharMetrics==NULL");
	ERROR2IF(FontDesc.GetCharCode()!=FONTEMCHAR,FALSE,"FontMetricsCache::GetCharMetrics() - FontDesc char should be 'FONTEMCHAR'");

@@ -907,34 +1026,23 @@
	while (CacheEntry<NUMENTRIES && mpFontMetricsData[CacheEntry].GetFontDesc()!=FontDesc)
		CacheEntry +=1;

-	// if font not in cache, recache it, or if char not in cached ranged, get it explcitally
-	// both of these situations require the DC to be prepared, then either/both is done before restoring the DC
+	// if font not in cache, recache it, or if char not in cached range, get it explicitly
	MILLIPOINT CharWidth  = 0;
	BOOL CharInCacheRange = FontMetricsCacheEntry::CharInCacheRange(ch);
	if (CacheEntry>=NUMENTRIES || !CharInCacheRange)
	{
		// get design size of font, and default heigh
-		INT32 DesignSize    = TextManager::GetDesignSize(pDC);
+		INT32 DesignSize    = TextManager::GetDesignSize(pDC);  // ignores pDC
		INT32 DefaultHeight = TextManager::GetDefaultHeight();

-		// first, if ATM fonts, ensure accurate widths returned
-		// this should be a virtual function - but class structure does not facilitate such things!
		CachedFontItem* pItem = FONTMANAGER->GetFont(FontDesc.GetTypefaceHandle());
		if (pItem==NULL || pItem->IsCorrupt())
			return FALSE;
-		if (pItem->GetFontClass()==FC_ATM)
-			ATMFontMan::ForceExactWidth();
-//			if (ATMFontMan::ForceExactWidth()==FALSE)
-//				pItem->SetIsCorrupt(TRUE);

		// get a LogFont, create a font and select it into the DC
		LOGFONT	CharLogFont;
		if (TextManager::GetLogFontFromCharDescriptor(pDC, FontDesc, &CharLogFont, DesignSize)==FALSE)
			return FALSE;
-		wxFont font;
-		font.CreateFontIndirect(&CharLogFont);
-		wxFont* pOldFont = pDC->SelectObject(&font);
-		ERROR2IF(pOldFont==NULL,FALSE,"FontMetricsCache::GetCharMetrics() - SelectObject() failed");

		// if font not in cache, cache its metrics throwing out a random entry
		if (CacheEntry>=NUMENTRIES)
@@ -957,9 +1065,6 @@
				CharWidth = MulDiv(TempCharWidth, DefaultHeight, DesignSize);
			}
		}
-
-		// restore old font
-		pDC->SelectObject(pOldFont);
	}

	if (CharInCacheRange)
@@ -969,7 +1074,6 @@
	pCharMetrics->FontAscent  = mpFontMetricsData[CacheEntry].GetFontAscent();
	pCharMetrics->FontEmWidth = mpFontMetricsData[CacheEntry].GetFontEmWidth();
	pCharMetrics->FontDescent = mpFontMetricsData[CacheEntry].GetFontDescent();
-
	return TRUE;
}

@@ -984,8 +1088,9 @@

void FontMetricsCache::InvalidateCharMetrics()
{
+	CharDescription emptyCharDesc(0, 0, 0, 0);
	for (INT32 i=0; i<NUMENTRIES; i++)
-		mpFontMetricsData[i].SetFontDesc( CharDescription(0,0,0,0) );
+		mpFontMetricsData[i].SetFontDesc( emptyCharDesc );
}

/////////////////////////////////////////////////////////////////////////////////////////////
@@ -1009,6 +1114,7 @@
MILLIPOINT FontKerningPairsCache::GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight,
																	CharDescription& FontDesc)
{
+#ifndef EXCLUDE_FROM_XARALX
	ERROR2IF(         pDC==NULL,FALSE,"FontKerningPairsCache::GetCharsKerning() - pDC==NULL");
	ERROR2IF(FontDesc.GetCharCode()!=FONTEMCHAR,FALSE,
			"FontKerningPairsCache::GetCharsKerning() - FontDesc char should be 'FONTEMCHAR'");
@@ -1058,6 +1164,9 @@
#endif _DEBUG

	return mpFontKerningPairsCacheData[CacheEntry].GetCharsKerning(chLeft, chRight);
+#else
+	return 0;
+#endif
}


@@ -1070,8 +1179,9 @@
********************************************************************************************/
void FontKerningPairsCache::InvalidateKerningPairsCache()
{
+	CharDescription emptyCharDesc(0, 0, 0, 0);
	for (INT32 i=0; i<NUMENTRIES; ++i)
-		mpFontKerningPairsCacheData[i].SetFontDesc( CharDescription(0,0,0,0) );
+		mpFontKerningPairsCacheData[i].SetFontDesc( emptyCharDesc );
}

#ifdef _DEBUG
@@ -1094,7 +1204,7 @@
	}
	TRACE( _T("<<< Font kerning data end <<<\n"));
}
-#endif _DEBUG
+#endif // _DEBUG

/////////////////////////////////////////////////////////////////////////////////////////////
// FontKerningPairsCacheEntry
@@ -1109,7 +1219,8 @@
********************************************************************************************/
FontKerningPairsCacheEntry::FontKerningPairsCacheEntry()
{
-	FontDesc = CharDescription(0,0,0,0);
+	CharDescription emptyCharDesc(0, 0, 0, 0);
+	FontDesc = emptyCharDesc;
	KernCount = 0;
	pKernPairs = 0;
}
@@ -1169,6 +1280,7 @@
{
	delete[] pKernPairs;	// remove any old kern data

+#ifndef EXCLUDE_FROM_XARALX
	KernCount = TextManager::GetKernCount(pDC);

	// update cache tag
@@ -1198,6 +1310,7 @@
			return false;
		}
	}
+#endif
	pKernPairs = 0;
	return true; // No kern data so kern cache is valid
}
@@ -1270,7 +1383,7 @@
	}
}

-#endif _DEBUG
+#endif // _DEBUG

/////////////////////////////////////////////////////////////////////////////////////////////
// some debug stuff
@@ -1345,8 +1458,10 @@
	{
		TRACE( _T(" ---------------- \n"));
		TRACE( _T("Enum Log font structure:\n"));
+#ifndef EXCLUDE_FROM_XARALX
		TRACE( _T(" Full name = %s\n"), lpelf->elfFullName);
		TRACE( _T(" Style     = %s\n"), lpelf->elfStyle);
+#endif
		DumpLogFont(&(lpelf->elfLogFont));
		TRACE( _T(" ---------------- \n"));
	}
@@ -1357,6 +1472,7 @@
	if (lplf!=NULL)
	{
		TRACE( _T("Log font structure:\n"));
+#ifndef EXCLUDE_FROM_XARALX
		TRACE( _T(" Height 			= %d\n"), lplf->lfHeight);
		TRACE( _T(" Width			= %d\n"), lplf->lfWidth);
		TRACE( _T(" Escapement		= %d\n"), lplf->lfEscapement);
@@ -1371,6 +1487,7 @@
		TRACE( _T(" Quality			= %d\n"), lplf->lfQuality);
		TRACE( _T(" PitchAndFamily	= %d\n"), lplf->lfPitchAndFamily);
		TRACE( _T(" FaceName		= %s\n"), lplf->lfFaceName);
+#endif
	}
}

@@ -1487,8 +1604,17 @@

void OILEnumFonts::Execute()
{
+PORTNOTE("text","We do not use TTFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
	TTFontMan::EnumAllFonts(this);
+#endif
+PORTNOTE("text","We do not use ATMFontMan in wxOil")
+#ifndef EXCLUDE_FROM_XARALX
	ATMFontMan::EnumAllFonts(this);
+#endif
+#ifdef __WXGTK__
+	FTFontMan::EnumAllFonts(this);
+#endif
	// Add any further OIL Level font managers here
}

------------------------------------------------------------------------

// $Id$
/* @@tag:xara-cn@@ DO NOT MODIFY THIS LINE
================================XARAHEADERSTART===========================

              Xara LX, a vector drawing and manipulation program.
                   Copyright (C) 1993-2006 Xara Group Ltd.
      Copyright on certain contributions may be held in joint with their
             respective authors. See AUTHORS file for details.

LICENSE TO USE AND MODIFY SOFTWARE
----------------------------------

This file is part of Xara LX.

Xara LX is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License version 2 as published
by the Free Software Foundation.

Xara LX and its component source files are distributed in the hope
that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with Xara LX (see the file GPL in the root directory of the
distribution); if not, write to the Free Software Foundation, Inc., 51
Franklin St, Fifth Floor, Boston, MA  02110-1301 USA


ADDITIONAL RIGHTS
-----------------

Conditional upon your continuing compliance with the GNU General Public
License described above, Xara Group Ltd grants to you certain additional
rights.
The additional rights are to use, modify, and distribute the software
together with the wxWidgets library, the wxXtra library, and the "CDraw"
library and any other such library that any version of Xara LX relased
by Xara Group Ltd requires in order to compile and execute, including
the static linking of that library to XaraLX. In the case of the
"CDraw" library, you may satisfy obligation under the GNU General Public
License to provide source code by providing a binary copy of the library
concerned and a copy of the license accompanying it.

Nothing in this section restricts any of the rights you have under
the GNU General Public License.


SCOPE OF LICENSE
----------------

This license applies to this program (XaraLX) and its constituent source
files only, and does not necessarily apply to other Xara products which may
in part share the same code base, and are subject to their own licensing
terms.

This license does not apply to files in the wxXtra directory, which
are built into a separate library, and are subject to the wxWindows
license contained within that directory in the file "WXXTRA-LICENSE".

This license does not apply to the binary libraries (if any) within
the "libs" directory, which are subject to a separate license contained
within that directory in the file "LIBS-LICENSE".


ARRANGEMENTS FOR CONTRIBUTION OF MODIFICATIONS
----------------------------------------------

Subject to the terms of the GNU Public License (see above), you are
free to do whatever you like with your modifications. However, you may
(at your option) wish contribute them to Xara's source tree. You can
find details of how to do this at:
 http://www.xaraxtreme.org/developers/

Prior to contributing your modifications, you will need to complete our
contributor agreement. This can be found at:
 http://www.xaraxtreme.org/developers/contribute/

Please note that Xara will not accept modifications which modify any of
the text between the start and end of this header (marked
XARAHEADERSTART and XARAHEADEREND).


MARKS
-----

Xara, Xara LX, Xara X, Xara X/Xtreme, Xara Xtreme, the Xtreme and Xara
designs are registered or unregistered trademarks, design-marks, and/or
service marks of Xara Group Ltd. All rights in these marks are reserved.


     Xara Group Ltd, Gaddesden Place, Hemel Hempstead, HP2 6EX, UK.
                       http://www.xara.com/

=================================XARAHEADEREND============================
*/
// Header file for FreeType Font manager. This font manager provides access to
// scalable fonts supported by FreeType (via Pango, fontconfig and FreeType)

/*
*/

#ifndef INC_FTFONTS
#define INC_FTFONTS

#include "fontbase.h"

// Forward definitions
class OILEnumFonts;

/********************************************************************************************
	class FTFont : public FontBase
	   		
	Author:		Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
	Created:	22/02/06
	Purpose:	A class description of a font managed by FreeType.
********************************************************************************************/

class FTFont : public FontBase
{
	CC_DECLARE_DYNCREATE(FTFont)

public:
	 FTFont();
	~FTFont();

	virtual FontClass GetFontClass() { return FC_FREETYPE; };
	virtual void Dump();
};


/********************************************************************************************

	class FTFontMan : public CCObject
	   		
	Author:		Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
	Created:	22/02/06
	Purpose:	A static class to allow access to fonts managed by FreeType.

********************************************************************************************/

class FTFontMan : public CCObject
{
	CC_DECLARE_DYNCREATE(FTFontMan)

	friend class OILFontMan;

// constructor
public:
	FTFontMan();

	static BOOL     GetAscentDescent(CharDescription& ChDesc, INT32* pAscent, INT32* pDescent);
	static BOOL     GetCharWidth(CharDescription& ChDesc, TCHAR FirstChar, TCHAR LastChar, INT32* pCharWidthsBuf);

// the support interface (functions in class OILFontMan will use these)
private:
	static BOOL		IsOkToCall();
	static BOOL		CacheNamedFont(String_64* pFont);
	static BOOL		CacheCompatibleFont(String_64* pFont);
	static void		ValidateCache();
	static void		FindClosestFont();
	static FTFont*	CreateNewFont(String_64* pFontName);

	// as in ATMFontMan, we cannot extract the relevant information, so do nothing
	static OUTLINETEXTMETRIC* GetOutlineTextMetric(LOGFONT *pLogFont) { return NULL; }

	// get a vector representation of a glyph
static BOOL GetCharOutline(CharDescription& ChDesc, DocCoord** ppCoords,
								   PathVerb** ppVerbs,
								   UINT32* pNumCoords,
								   wxDC* pDC);

// utterly private
private:
	static BOOL CacheFontCore(String_64* pFont, BOOL compatible);

// function called by class EnumFonts as a method for the kernel to enumerate all the installed fonts
public:
	static void		EnumAllFonts(OILEnumFonts* pClass);
};

#endif