[Date Prev][Date Next][Thread Prev][Thread Next][Thread Index]
[XaraXtreme-commits] Commit Complete
Commit by : luke
Repository : xara
Revision : 853
Date : Fri Apr 21 13:32:47 BST 2006
Changed paths:
M /Trunk/XaraLX/Kernel/filters.h
M /Trunk/XaraLX/Kernel/fontman.cpp
M /Trunk/XaraLX/wxOil/fontbase.cpp
M /Trunk/XaraLX/wxOil/fontbase.h
A /Trunk/XaraLX/wxOil/fontclass.h
A /Trunk/XaraLX/wxOil/fontimpl.h
Martins patch to add kerning caching
Diff:
Index: Trunk/XaraLX/Kernel/fontman.cpp
===================================================================
--- Trunk/XaraLX/Kernel/fontman.cpp (revision 852)
+++ Trunk/XaraLX/Kernel/fontman.cpp (revision 853)
@@ -1306,7 +1306,6 @@
BOOL FontManager::FindClosestFontFullTry(FontClass Class, String_64 *pTypeFaceName, ENUMLOGFONT *pEnumLogFont)
{
- PORTNOTETRACE("text","FontManager::FindClosestFontFullTry - do nothing");
ERROR2IF(pEnumLogFont==NULL, FALSE, "FindClosestTry called with pEnumLogFont==NULL.");
OUTLINETEXTMETRIC *pOutlineTextMetric;
@@ -1346,7 +1345,7 @@
void FontManager::InvalidateCharMetrics()
{
- FontMetricsCache::InvalidateCharMetrics();
+ OILFontMan::InvalidateCharMetrics();
}
/********************************************************************************************
@@ -1365,7 +1364,7 @@
BOOL FontManager::GetCharMetrics(CNativeDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics)
{
- return FontMetricsCache::GetCharMetrics(pDC, ch, FontDesc, pCharMetrics);
+ return OILFontMan::GetCharMetrics(pDC, ch, FontDesc, pCharMetrics);
}
/********************************************************************************************
@@ -1384,7 +1383,7 @@
MILLIPOINT FontManager::GetCharsKerning(CNativeDC* pDC, WCHAR chLeft, WCHAR chRight, CharDescription& FontDesc)
{
// TRACEUSER("wuerthne", _T("FontManager::GetCharsKerning called
") );
- return FontKerningPairsCache::GetCharsKerning(pDC, chLeft, chRight, FontDesc);
+ return OILFontMan::GetCharsKerning(pDC, chLeft, chRight, FontDesc);
}
/********************************************************************************************
Index: Trunk/XaraLX/Kernel/filters.h
===================================================================
--- Trunk/XaraLX/Kernel/filters.h (revision 852)
+++ Trunk/XaraLX/Kernel/filters.h (revision 853)
@@ -105,7 +105,7 @@
#include "attr.h"
#include "attrmgr.h"
#include "txtattr.h"
-#include "fontbase.h"
+#include "fontclass.h"
#include <limits.h>
#include "oilfltrs.h"
Index: Trunk/XaraLX/wxOil/fontclass.h
===================================================================
--- Trunk/XaraLX/wxOil/fontclass.h (revision 0)
+++ Trunk/XaraLX/wxOil/fontclass.h (revision 853)
@@ -0,0 +1,138 @@
+// $Id$
+// $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============================
+ */
+// Declares the known font classes
+
+/*
+*/
+
+#ifndef INC_FONTCLASS
+#define INC_FONTCLASS
+
+/********************************************************************************************
+ The types of fonts the OIL font manager recognises so far
+********************************************************************************************/
+
+typedef enum FontClass {
+ FC_UNDEFINED = 0,
+ FC_RASTER,
+ 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
+
+#if !defined(__WXMSW__)
+struct LOGFONT
+{
+ String_64 FaceName;
+};
+typedef LOGFONT *PLOGFONT, *LPLOGFONT;
+
+struct ENUMLOGFONT
+{
+ LOGFONT elfLogFont;
+};
+#endif
+
+#endif
Property changes on: Trunk/XaraLX/wxOil/fontclass.h
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Index: Trunk/XaraLX/wxOil/fontbase.cpp
===================================================================
--- Trunk/XaraLX/wxOil/fontbase.cpp (revision 852)
+++ Trunk/XaraLX/wxOil/fontbase.cpp (revision 853)
@@ -112,6 +112,8 @@
#include "pathtype.h"
#include "txtattr.h"
#include "app.h"
+
+#include "fontimpl.h" // private definitions
//#include "mike.h"
DECLARE_SOURCE( "$Revision$" );
@@ -139,7 +141,7 @@
// define some font metrics/kerning pairs cache statics
FontMetricsCacheEntry FontMetricsCache::mpFontMetricsData[FontMetricsCache::NUMENTRIES];
-FontKerningPairsCacheEntry FontKerningPairsCache::mpFontKerningPairsCacheData[FontKerningPairsCache::NUMENTRIES];
+FontKerningPairsCacheEntry FontKerningPairsCache::m_FontKerningPairsCacheData[FontKerningPairsCache::NUMENTRIES];
/********************************************************************************************
@@ -539,7 +541,46 @@
}
/********************************************************************************************
+> OILFontMan::InvalidateCharMetrics()
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
+ Purpose: Facade routine for FontMetricsCache::InvalidateCharMetrics
+
+********************************************************************************************/
+void OILFontMan::InvalidateCharMetrics()
+{
+ FontMetricsCache::InvalidateCharMetrics();
+}
+
+/********************************************************************************************
+> BOOL GetCharMetrics(wxDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics)
+
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
+ Purpose: Facade routine for FontMetricsCache::GetCharMetrics
+
+********************************************************************************************/
+BOOL OILFontMan::GetCharMetrics(wxDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics)
+{
+ return FontMetricsCache::GetCharMetrics(pDC, ch, FontDesc, pCharMetrics);
+}
+
+/********************************************************************************************
+> MILLIPOINT GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight, CharDescription& FontDesc)
+
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
+ Purpose: Facade routine for FontKerningPairsCache::GetCharsKerning
+
+********************************************************************************************/
+MILLIPOINT OILFontMan::GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight, CharDescription& FontDesc)
+{
+ return FontKerningPairsCache::GetCharsKerning(pDC, chLeft, chRight, FontDesc);
+}
+
+/********************************************************************************************
+
> static UINT32 OILFontMan::GetOutlineCache(DocCoord** pCoords, PathVerb** pVerbs);
Author: Mike_Kenny (Xara Group Ltd) <camelotdev@xxxxxxxx>
@@ -1126,87 +1167,36 @@
FontDesc = a font description
Returns: Kern in millipoints (or zero if no kern or error)
Purpose: Get the kern between two chars of a font
- Note: So far, the kerning values are not cached
+ Note: The kern pairs are cached (see FontKerningPairsCacheEntry::GetCharsKerning)
********************************************************************************************/
MILLIPOINT FontKerningPairsCache::GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight,
- CharDescription& FontDesc)
+ CharDescription& FontDesc)
{
- PORTNOTE("text", "caching of kern pairs removed");
-#ifndef EXCLUDE_FROM_XARALX
- ERROR2IF( pDC==NULL,FALSE,"FontKerningPairsCache::GetCharsKerning() - pDC==NULL");
- ERROR2IF(FontDesc.GetCharCode()!=FONTEMCHAR,FALSE,
- "FontKerningPairsCache::GetCharsKerning() - FontDesc char should be 'FONTEMCHAR'");
-
- // find if font is in cache (and if so which entry)
+ // TRACEUSER("wuerthne", _T("GetCharsKerning %04x %04x"), chLeft, chRight);
+ ERROR2IF(pDC==NULL, 0, "FontKerningPairsCache::GetCharsKerning() - pDC==NULL");
+ ERROR2IF(FontDesc.GetCharCode() != FONTEMCHAR, FALSE,
+ "FontKerningPairsCache::GetCharsKerning() - FontDesc char should be 'FONTEMCHAR'");
+#ifndef DISABLE_TEXT_RENDERING
+ // find out whether the font is in the cache (and if so which entry)
INT32 CacheEntry = 0;
- while (CacheEntry<NUMENTRIES && mpFontKerningPairsCacheData[CacheEntry].GetFontDesc()!=FontDesc)
- CacheEntry +=1;
+ while (CacheEntry < NUMENTRIES && m_FontKerningPairsCacheData[CacheEntry].GetFontDesc() != FontDesc)
+ CacheEntry++;
- // if font not in cache, recache it (requires the DC to be prepared, then either/both is
- // done before restoring the DC)
- if (CacheEntry>=NUMENTRIES)
+ if (CacheEntry >= NUMENTRIES)
{
- // get design size of font, and default heigh
- INT32 DesignSize = TextManager::GetDesignSize(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();
-
- // get a LogFont, create a font and select it into the DC
- LOGFONT CharLogFont;
- if (TextManager::GetLogFontFromCharDescriptor(pDC, FontDesc, &CharLogFont, DesignSize) == false)
- return 0;
- wxFont font;
- font.CreateFontIndirect(&CharLogFont);
- wxFont* pOldFont = pDC->SelectObject(&font);
- ERROR2IF(pOldFont==NULL,FALSE,"FontKerningPairsCache::GetCharsKerning() - SelectObject() failed");
-
- // if font not in cache, cache its kerns throwing out a random entry
+ // TRACEUSER("wuerthne", _T("did not find cache entry, so allocate new one"));
+ // the font is not in the cache, so throw out a random cache entry and prepare
+ // the cache entry so we can start caching the kerning data for the new font
CacheEntry = rand() % NUMENTRIES;
- if (mpFontKerningPairsCacheData[CacheEntry].CacheFontKerns(pDC, FontDesc, DefaultHeight, DesignSize) == false)
- return 0;
-
- // restore old font
- pDC->SelectObject(pOldFont);
+ m_FontKerningPairsCacheData[CacheEntry].Reinitialise(FontDesc);
}
-
-#ifdef _DEBUG
-// TRACE( _T("State of kerning cache after update...
"));
-// Dump();
-#endif /*_DEBUG */
-
- return mpFontKerningPairsCacheData[CacheEntry].GetCharsKerning(chLeft, chRight);
+ return m_FontKerningPairsCacheData[CacheEntry].GetCharsKerning(chLeft, chRight);
#else
-#ifndef DISABLE_TEXT_RENDERING
- return FTFontMan::GetCharsKerning(FontDesc, chLeft, chRight);
-#else
return 0;
#endif
-#endif
}
-
-/********************************************************************************************
-> static void FontKerningPairsCache::InvalidateCharMetrics()
-
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
- Purpose: Invalidate the FontKerningPairsCache
-********************************************************************************************/
-void FontKerningPairsCache::InvalidateKerningPairsCache()
-{
- CharDescription emptyCharDesc(0, 0, 0, 0);
- for (INT32 i=0; i<NUMENTRIES; ++i)
- mpFontKerningPairsCacheData[i].SetFontDesc( emptyCharDesc );
-}
-
#ifdef _DEBUG
/********************************************************************************************
@@ -1223,7 +1213,7 @@
for (INT32 i=0; i<NUMENTRIES; ++i)
{
TRACE( _T("Entry %d:
"), i);
- mpFontKerningPairsCacheData[i].Dump();
+ m_FontKerningPairsCacheData[i].Dump();
}
TRACE( _T("<<< Font kerning data end <<<
"));
}
@@ -1235,8 +1225,8 @@
/********************************************************************************************
> FontKerningPairsCacheEntry::FontKerningPairsCacheEntry()
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
Purpose: Default constructor
********************************************************************************************/
@@ -1244,142 +1234,80 @@
{
CharDescription emptyCharDesc(0, 0, 0, 0);
FontDesc = emptyCharDesc;
- KernCount = 0;
- pKernPairs = 0;
+ m_pPairsCacheMap = NULL;
}
/********************************************************************************************
> FontKerningPairsCacheEntry::FontKerningPairsCacheEntry()
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
- Purpose: Default destructor
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
+ Purpose: Destructor
********************************************************************************************/
FontKerningPairsCacheEntry::~FontKerningPairsCacheEntry()
{
- delete[] pKernPairs;
+ if (m_pPairsCacheMap) delete m_pPairsCacheMap;
}
/********************************************************************************************
+> FontKerningPairsCacheEntry::Reinitialise(CharDescription& NewFontDesc)
-> INT32 CompareKernsForSort( const void *arg1, const void *arg2 )
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
+ Inputs: NewFontDesc = a font descriptor specifying the font to which this cache
+ entry should refer from now on
+ Purpose: Clears the cache entry and initialises it for a new font
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 25/10/2000
- Purpose: Compare function for FontKerningPairsChaceEntry::CacheFontKerns
-
********************************************************************************************/
-INT32 CompareKernsFunc( const void *arg1, const void *arg2 )
+void FontKerningPairsCacheEntry::Reinitialise(CharDescription& NewFontDesc)
{
- MillipointKerningPair *p1, *p2;
- p1 = (MillipointKerningPair *)arg1;
- p2 = (MillipointKerningPair *)arg2;
-
- if ((p1->wFirst < p2->wFirst) || (p1->wFirst == p2->wFirst && p1->wSecond < p2->wSecond))
- return -1; // arg1 less than arg2
- else if (p1->wFirst == p2->wFirst && p1->wSecond == p2->wSecond)
- return 0; // arg1 equivalent to arg2
- else
- return 1; // arg1 greater than arg2
+ FontDesc = NewFontDesc;
+ if (m_pPairsCacheMap) delete m_pPairsCacheMap;
+ m_pPairsCacheMap = new std::map<UINT32,INT32>;
+ // we do not check whether the new has succeeded - in case it has not,
+ // we will not fall over later but caching will be disabled for this entry
}
/********************************************************************************************
-> bool FontKerningPairsCacheEntry::CacheFontKerns(wxDC* pDC, CharDescription FontDesc,
- MILLIPOINT DefaultHeight, INT32 DesignSize)
+> FontKerningPairsCacheEntry::GetCharsKerning(WCHAR chLeft, WCHAR chRight)
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
- 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)
- Returns: false if fails
- Purpose: Refill the font cache entry
-********************************************************************************************/
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 20/04/2006
+ Inputs: chLeft = a character code of the left char of a kerning pair
+ chRight = a character code of the right char of a kerning pair
+ Returns: Kern in millipoints (or zero if no kern or error)
+ Purpose: Gets the kerning for a character pair (and caches it if not cached yet)
+ Note: The cache uses an STL map, which means logarithmic access time. Maybe
+ a hash_map could do better.
-bool FontKerningPairsCacheEntry::CacheFontKerns(wxDC* pDC, CharDescription FontDesc,
- MILLIPOINT DefaultHeight, INT32 DesignSize)
-{
- delete[] pKernPairs; // remove any old kern data
-
-#ifndef EXCLUDE_FROM_XARALX
- KernCount = TextManager::GetKernCount(pDC);
-
- // update cache tag
- SetFontDesc(FontDesc);
-
- if (KernCount)
- {
- pKernPairs = new MillipointKerningPair[KernCount];
- if (!pKernPairs) return false;
- if (TextManager::FillKernArray(pDC, pKernPairs, KernCount))
- {
- for (INT32 c = 0; c < KernCount; ++c)
- pKernPairs[c].iKernAmount = MulDiv(pKernPairs[c].iKernAmount, DefaultHeight, DesignSize);
-
- // Sort array (this allows us to do a binary search on the array
- // when finding kerns). Note: The kern data from windows appears to
- // be sorted already but I am not sure that this is always the case
- // so I am sorting it again to make sure (not too bad as qsort
- // does not do too much harm to a sorted array).
- qsort(pKernPairs, KernCount, sizeof(pKernPairs[0]), CompareKernsFunc);
-
- return true;
- }
- else
- {
- KernCount = 0;
- return false;
- }
- }
-#endif
- pKernPairs = 0;
- return true; // No kern data so kern cache is valid
-}
-
-/********************************************************************************************
-> MILLIPOINT FontKerningPairsCacheEntry::GetCharsKerning(WCHAR chLeft, WCHAR chRight)
-
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
- Inputs: chLeft - The left char of a kern pair
- chRight - The right char of a kern pair
- Returns: The kern in millipoints (or zero if none)
- Purpose: Performs a binary search of the sorted kern data and returns the kern
- for a given pair a chars (or zero if there is no kern)
-
- Algorithm from Knuth Vol III section 6.2.1 algorithm B
********************************************************************************************/
MILLIPOINT FontKerningPairsCacheEntry::GetCharsKerning(WCHAR chLeft, WCHAR chRight)
{
- MillipointKerningPair K; // The key we are looking for
-
- K.wFirst = chLeft;
- K.wSecond = chRight;
- K.iKernAmount = 0; // Not used
-
- INT32 i, t;
-
- INT32 l = 0; // B1
- INT32 u = KernCount - 1;
-
- while (u >= l)
+ UINT32 key;
+ // we cache the kerning for characters in the range 0x0 - 0xFFFF only
+ // we also need the map set up - if it could not be allocated, we simply bypass the cache
+ if (chLeft > 0x10000 || chRight > 0x10000 || m_pPairsCacheMap == NULL)
{
- /* At this point, if the kern is in the table, Kl <= K <= Ku */
-
- i = (l + u) / 2; // B2
+ // TRACEUSER("wuerthne", _T("Bypass cache"));
+ return FTFontMan::GetCharsKerning(FontDesc, chLeft, chRight);
+ }
- t = CompareKernsFunc(&K, &(pKernPairs[i])); // B3
-
- if (t < 0)
- u = i - 1; // B4
- else if (t > 0)
- l = i + 1; // B5
- else if (t == 0)
- return pKernPairs[i].iKernAmount;
+ key = (chLeft << 16) | chRight;
+ std::map<UINT32,INT32>::iterator it = m_pPairsCacheMap->find(key);
+ if (it != m_pPairsCacheMap->end()) {
+ // we found a cached entry
+ // TRACEUSER("wuerthne", _T("kern pair found"));
+ return it->second;
}
- return 0;
+ else {
+ // we did not find an entry, so get the kerning from the underlying font system
+ INT32 kerning = FTFontMan::GetCharsKerning(FontDesc, chLeft, chRight);
+ // and cache it
+ // TRACEUSER("wuerthne", _T("cache kern pair"));
+ (*m_pPairsCacheMap)[key] = kerning;
+ return kerning;
+ }
}
#if _DEBUG
@@ -1388,21 +1316,20 @@
> void FontKerningPairsCacheEntry::Dump()
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
+ Author: Martin Wuerthner <xara@xxxxxxxxxxxxxxx>
+ Created: 21/04/2006
Purpose: Dumps the class data
- See also: FontKerningPairs::Dump()
********************************************************************************************/
void FontKerningPairsCacheEntry::Dump()
{
- for (INT32 c = 0; c < KernCount; ++c)
- {
- TRACE( _T("%3d: %c %c %d
"),
- c,
- pKernPairs[c].wFirst,
- pKernPairs[c].wSecond,
- pKernPairs[c].iKernAmount);
+ // dump the map
+ if (m_pPairsCacheMap != NULL) {
+ for (std::map<UINT32,INT32>::iterator it = m_pPairsCacheMap->begin(); it != m_pPairsCacheMap->end(); ++it)
+ {
+ UINT32 key = (*it).first;
+ TRACE(_T("cached kern pair %04x/%04x = %d"), key >> 16, key & 0xffff, (*it).second);
+ }
}
}
Index: Trunk/XaraLX/wxOil/fontbase.h
===================================================================
--- Trunk/XaraLX/wxOil/fontbase.h (revision 852)
+++ Trunk/XaraLX/wxOil/fontbase.h (revision 853)
@@ -107,6 +107,7 @@
#ifndef INC_FONTBASE
#define INC_FONTBASE
+#include "fontclass.h"
#include "pathtype.h"
#include "txtattr.h"
#include "ccpanose.h"
@@ -124,38 +125,7 @@
#endif
/********************************************************************************************
- The types of fonts the OIL font manager recognises so far
-********************************************************************************************/
-typedef enum FontClass {
- FC_UNDEFINED = 0,
- FC_RASTER,
- 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
-
-#if !defined(__WXMSW__)
-struct LOGFONT
-{
- String_64 FaceName;
-};
-typedef LOGFONT *PLOGFONT, *LPLOGFONT;
-
-struct ENUMLOGFONT
-{
- LOGFONT elfLogFont;
-};
-#endif
-
-/********************************************************************************************
-
> class FontBase : public CCObject
Author: Mike_Kenny (Xara Group Ltd) <camelotdev@xxxxxxxx>
@@ -185,172 +155,7 @@
};
/********************************************************************************************
-> class FontMetricsCacheEntry : public CC_CLASS_MEMDUMP
-
- Author: Ed_Cornes (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 14/1/96
- Purpose: Holds a cache of char widths, ascent, descent and em for a particular font.
-********************************************************************************************/
-class FontMetricsCacheEntry: public CC_CLASS_MEMDUMP
-{
- CC_DECLARE_MEMDUMP(FontMetricsCacheEntry);
-
-public:
- FontMetricsCacheEntry();
-
- BOOL CacheFontMetrics(wxDC* pDC, CharDescription FontDesc, MILLIPOINT DefaultHeight, INT32 DesignSize);
-
- void CheckCharWidthsSameAsABCWidths(wxDC* pDC, CharDescription FontDesc); // debug test
-
- inline static BOOL CharInCacheRange(WCHAR ch) { return (ch>=FIRSTCHAR && ch<=LASTCHAR); }
-
- inline INT32 GetCharWidthFromCache(WCHAR ch) { return pCharWidths[ch-FIRSTCHAR]; }
-
- inline MILLIPOINT GetFontEmWidth() { return FontEmWidth; }
- inline MILLIPOINT GetFontAscent() { return FontAscent; }
- inline MILLIPOINT GetFontDescent() { return FontDescent; }
- inline CharDescription GetFontDesc() { return FontDesc; }
-
- inline void SetFontEmWidth(MILLIPOINT NewFontEmWidth) { FontEmWidth = NewFontEmWidth; }
- inline void SetFontAscent( MILLIPOINT NewFontAscent) { FontAscent = NewFontAscent; }
- inline void SetFontDescent(MILLIPOINT NewFontDescent) { FontDescent = NewFontDescent; }
- inline void SetFontDesc(CharDescription NewFontDesc) { FontDesc = NewFontDesc; }
-
-protected:
- // this seems the only way to define constants in a class assigning values
- enum CharRange { FIRSTCHAR=32, LASTCHAR=127, NUMCHARS=(LASTCHAR-FIRSTCHAR+1) };
-
- MILLIPOINT pCharWidths[NUMCHARS];
- MILLIPOINT FontEmWidth;
- MILLIPOINT FontAscent;
- MILLIPOINT FontDescent;
- CharDescription FontDesc;
-};
-
-/********************************************************************************************
-> class FontMetricsCache : public CC_CLASS_MEMDUMP
-
- Author: Ed_Cornes (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 14/1/96
- Purpose: Holds a cache of char widths, ascent, descent and em for a particular font.
-********************************************************************************************/
-
-class FontMetricsCache: public CC_CLASS_MEMDUMP
-{
- CC_DECLARE_MEMDUMP(FontMetricsCache);
-
-public:
- static void InvalidateCharMetrics();
- static BOOL GetCharMetrics(wxDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics);
-
-protected:
- // this seems the only way to define constants in a class assigning values
- enum CacheInfo { NUMENTRIES=3 };
-
- static FontMetricsCacheEntry mpFontMetricsData[NUMENTRIES];
-};
-
-
-/********************************************************************************************
-
-> class CharOutlineCache : public CC_CLASS_MEMDUMP
-
- Author: Mike_Kenny (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 14/9/95
- Purpose: A cache for a character outline. This cache can only be accessed via the
- OILFontMan character outline calls
-
-********************************************************************************************/
-
-class CharOutlineCache : public CC_CLASS_MEMDUMP
-{
- CC_DECLARE_MEMDUMP(CharOutlineCache);
-
- friend class OILFontMan;
-
- private:
- #if _DEBUG
- static void Dump();
- #endif
-
- static DocCoord CacheCoords[OILFONTLIMIT];
- static PathVerb CacheVerbs[OILFONTLIMIT];
- static UINT32 CacheSize;
- static DocCoord LastMoveTo;
-};
-
-// Forward decleration
-struct MillipointKerningPair;
-
-/********************************************************************************************
-> class FontKerningPairsCacheEntry : public CC_CLASS_MEMDUMP
-
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
- Purpose: Holds a cache of kerning pairs for a font
-********************************************************************************************/
-
-class FontKerningPairsCacheEntry : public CC_CLASS_MEMDUMP
-{
- CC_DECLARE_MEMDUMP(FontKerningPairsCacheEntry);
-
-public:
- FontKerningPairsCacheEntry(); // constructor
- ~FontKerningPairsCacheEntry(); // destructor
-
- bool CacheFontKerns(wxDC* pDC, CharDescription FontDesc, MILLIPOINT DefaultHeight, INT32 DesignSize);
- MILLIPOINT GetCharsKerning(WCHAR chLeft, WCHAR chRight);
- inline CharDescription GetFontDesc() { return FontDesc; }
- inline void SetFontDesc(CharDescription NewFontDesc) { FontDesc = NewFontDesc; }
-
-#ifdef _DEBUG
-public:
- void Dump();
-#endif//_DEBUG
-
-protected:
- CharDescription FontDesc;
-
-protected: // Kerning data
- MillipointKerningPair* pKernPairs;
- INT32 KernCount;
-};
-
-
-/********************************************************************************************
-
-> class FontKerningPairsCache : public CC_CLASS_MEMDUMP
-
- Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
- Created: 16/10/2000
- Purpose: A cache for the kerning pairs for a font
-
-********************************************************************************************/
-
-class FontKerningPairsCache : public CC_CLASS_MEMDUMP
-{
- CC_DECLARE_MEMDUMP(FontKerningPairsCache);
-
-public:
- static void InvalidateKerningPairsCache();
- static MILLIPOINT GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight,
- CharDescription& FontDesc);
-
-#ifdef _DEBUG
-public:
- static void Dump();
-#endif//_DEBUG
-
-protected:
- // this seems the only way to define constants in a class assigning values
- enum CacheInfo { NUMENTRIES=3 };
-
- static FontKerningPairsCacheEntry mpFontKerningPairsCacheData[NUMENTRIES];
-};
-
-/********************************************************************************************
-
> class OILFontMan : public CCObject
Author: Mike_Kenny (Xara Group Ltd) <camelotdev@xxxxxxxx>
@@ -375,6 +180,10 @@
static void FindClosestFont();
static FontBase* CreateNewFont(FontClass Class, String_64* pFontName);
static OUTLINETEXTMETRIC *GetOutlineTextMetric(FontClass Class, LOGFONT *pLogFont);
+ static void InvalidateCharMetrics();
+ static BOOL GetCharMetrics(wxDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics);
+ static MILLIPOINT GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight,
+ CharDescription& FontDesc);
public:
// Character cache related functions - other font manglers can use this
Index: Trunk/XaraLX/wxOil/fontimpl.h
===================================================================
--- Trunk/XaraLX/wxOil/fontimpl.h (revision 0)
+++ Trunk/XaraLX/wxOil/fontimpl.h (revision 853)
@@ -0,0 +1,275 @@
+// $Id$
+// $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============================
+ */
+
+// Implementation-specific definitions for fontbase.cpp. Not meant to
+// included by any other file.
+
+#include "fontbase.h"
+#include <map>
+
+/********************************************************************************************
+> class FontMetricsCacheEntry : public CC_CLASS_MEMDUMP
+
+ Author: Ed_Cornes (Xara Group Ltd) <camelotdev@xxxxxxxx>
+ Created: 14/1/96
+ Purpose: Holds a cache of char widths, ascent, descent and em for a particular font.
+********************************************************************************************/
+
+class FontMetricsCacheEntry: public CC_CLASS_MEMDUMP
+{
+ CC_DECLARE_MEMDUMP(FontMetricsCacheEntry);
+
+public:
+ FontMetricsCacheEntry();
+
+ BOOL CacheFontMetrics(wxDC* pDC, CharDescription FontDesc, MILLIPOINT DefaultHeight, INT32 DesignSize);
+
+ void CheckCharWidthsSameAsABCWidths(wxDC* pDC, CharDescription FontDesc); // debug test
+
+ inline static BOOL CharInCacheRange(WCHAR ch) { return (ch>=FIRSTCHAR && ch<=LASTCHAR); }
+
+ inline INT32 GetCharWidthFromCache(WCHAR ch) { return pCharWidths[ch-FIRSTCHAR]; }
+
+ inline MILLIPOINT GetFontEmWidth() { return FontEmWidth; }
+ inline MILLIPOINT GetFontAscent() { return FontAscent; }
+ inline MILLIPOINT GetFontDescent() { return FontDescent; }
+ inline CharDescription GetFontDesc() { return FontDesc; }
+
+ inline void SetFontEmWidth(MILLIPOINT NewFontEmWidth) { FontEmWidth = NewFontEmWidth; }
+ inline void SetFontAscent( MILLIPOINT NewFontAscent) { FontAscent = NewFontAscent; }
+ inline void SetFontDescent(MILLIPOINT NewFontDescent) { FontDescent = NewFontDescent; }
+ inline void SetFontDesc(CharDescription NewFontDesc) { FontDesc = NewFontDesc; }
+
+protected:
+ // this seems the only way to define constants in a class assigning values
+ enum CharRange { FIRSTCHAR=32, LASTCHAR=127, NUMCHARS=(LASTCHAR-FIRSTCHAR+1) };
+
+ MILLIPOINT pCharWidths[NUMCHARS];
+ MILLIPOINT FontEmWidth;
+ MILLIPOINT FontAscent;
+ MILLIPOINT FontDescent;
+ CharDescription FontDesc;
+};
+
+/********************************************************************************************
+> class FontMetricsCache : public CC_CLASS_MEMDUMP
+
+ Author: Ed_Cornes (Xara Group Ltd) <camelotdev@xxxxxxxx>
+ Created: 14/1/96
+ Purpose: Holds a cache of char widths, ascent, descent and em for a particular font.
+********************************************************************************************/
+
+class FontMetricsCache: public CC_CLASS_MEMDUMP
+{
+ CC_DECLARE_MEMDUMP(FontMetricsCache);
+
+public:
+ static void InvalidateCharMetrics();
+ static BOOL GetCharMetrics(wxDC* pDC, WCHAR ch, CharDescription& FontDesc, CharMetrics* pCharMetrics);
+
+protected:
+ // this seems the only way to define constants in a class assigning values
+ enum CacheInfo { NUMENTRIES=3 };
+
+ static FontMetricsCacheEntry mpFontMetricsData[NUMENTRIES];
+};
+
+
+/********************************************************************************************
+
+> class CharOutlineCache : public CC_CLASS_MEMDUMP
+
+ Author: Mike_Kenny (Xara Group Ltd) <camelotdev@xxxxxxxx>
+ Created: 14/9/95
+ Purpose: A cache for a character outline. This cache can only be accessed via the
+ OILFontMan character outline calls
+
+********************************************************************************************/
+
+class CharOutlineCache : public CC_CLASS_MEMDUMP
+{
+ CC_DECLARE_MEMDUMP(CharOutlineCache);
+
+ friend class OILFontMan;
+
+ private:
+ #if _DEBUG
+ static void Dump();
+ #endif
+
+ static DocCoord CacheCoords[OILFONTLIMIT];
+ static PathVerb CacheVerbs[OILFONTLIMIT];
+ static UINT32 CacheSize;
+ static DocCoord LastMoveTo;
+};
+
+// Forward decleration
+struct MillipointKerningPair;
+
+/********************************************************************************************
+> class FontKerningPairsCacheEntry : public CC_CLASS_MEMDUMP
+
+ Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
+ Created: 16/10/2000
+ Purpose: Holds a cache of kerning pairs for a font
+********************************************************************************************/
+
+class FontKerningPairsCacheEntry : public CC_CLASS_MEMDUMP
+{
+ CC_DECLARE_MEMDUMP(FontKerningPairsCacheEntry);
+
+public:
+ FontKerningPairsCacheEntry(); // constructor
+ ~FontKerningPairsCacheEntry(); // destructor
+
+ void Reinitialise(CharDescription& NewFontDesc);
+
+ MILLIPOINT GetCharsKerning(WCHAR chLeft, WCHAR chRight);
+ inline CharDescription GetFontDesc() { return FontDesc; }
+ inline void SetFontDesc(CharDescription NewFontDesc) { FontDesc = NewFontDesc; }
+
+#ifdef _DEBUG
+public:
+ void Dump();
+#endif //_DEBUG
+
+protected:
+ CharDescription FontDesc;
+
+protected: // Kerning data
+ std::map<UINT32,INT32>* m_pPairsCacheMap;
+
+private:
+ // declare private copy constructor and assignment operator to prevent
+ // copy/assignment operations - the methods are not implemented
+ FontKerningPairsCacheEntry(const FontKerningPairsCacheEntry&);
+ FontKerningPairsCacheEntry& operator=(const FontKerningPairsCacheEntry&);
+};
+
+
+/********************************************************************************************
+
+> class FontKerningPairsCache : public CC_CLASS_MEMDUMP
+
+ Author: Jonathan_Payne (Xara Group Ltd) <camelotdev@xxxxxxxx>
+ Created: 16/10/2000
+ Purpose: A cache for the kerning pairs for a font
+
+********************************************************************************************/
+
+class FontKerningPairsCache : public CC_CLASS_MEMDUMP
+{
+ CC_DECLARE_MEMDUMP(FontKerningPairsCache);
+
+public:
+ static MILLIPOINT GetCharsKerning(wxDC* pDC, WCHAR chLeft, WCHAR chRight,
+ CharDescription& FontDesc);
+
+#ifdef _DEBUG
+public:
+ static void Dump();
+#endif//_DEBUG
+
+protected:
+ // this seems the only way to define constants in a class assigning values
+ enum CacheInfo { NUMENTRIES=3 };
+
+ static FontKerningPairsCacheEntry m_FontKerningPairsCacheData[NUMENTRIES];
+};
+
Property changes on: Trunk/XaraLX/wxOil/fontimpl.h
___________________________________________________________________
Name: svn:keywords
+ Id Revision
Name: svn:eol-style
+ LF
Xara