[Midnightbsd-cvs] mports [19567] trunk/graphics: add silgraphite port

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Thu Jul 9 17:09:09 EDT 2015


Revision: 19567
          http://svnweb.midnightbsd.org/mports/?rev=19567
Author:   laffer1
Date:     2015-07-09 17:09:08 -0400 (Thu, 09 Jul 2015)
Log Message:
-----------
add silgraphite port

Modified Paths:
--------------
    trunk/graphics/Makefile

Added Paths:
-----------
    trunk/graphics/silgraphite/
    trunk/graphics/silgraphite/Makefile
    trunk/graphics/silgraphite/distinfo
    trunk/graphics/silgraphite/files/
    trunk/graphics/silgraphite/files/patch-openoffice-silgraphite
    trunk/graphics/silgraphite/pkg-descr
    trunk/graphics/silgraphite/pkg-plist

Modified: trunk/graphics/Makefile
===================================================================
--- trunk/graphics/Makefile	2015-07-09 21:07:26 UTC (rev 19566)
+++ trunk/graphics/Makefile	2015-07-09 21:09:08 UTC (rev 19567)
@@ -147,6 +147,7 @@
 SUBDIR += sdl_gfx
 SUBDIR += sdl_image
 SUBDIR += sdl_ttf
+SUBDIR += silgraphite
 SUBDIR += svgalib
 SUBDIR += svgviewer
 SUBDIR += tiff

Added: trunk/graphics/silgraphite/Makefile
===================================================================
--- trunk/graphics/silgraphite/Makefile	                        (rev 0)
+++ trunk/graphics/silgraphite/Makefile	2015-07-09 21:09:08 UTC (rev 19567)
@@ -0,0 +1,29 @@
+# Created by: Dennis Herrmann <adox at mcx2.org>
+# $FreeBSD: head/graphics/silgraphite/Makefile 389370 2015-06-13 13:52:03Z sunpoet $
+# $MidnightBSD$
+
+PORTNAME=	silgraphite
+PORTVERSION=	2.3.1
+CATEGORIES=	graphics devel
+MASTER_SITES=	SF
+
+MAINTAINER=	ports at MidnightBSD.org
+COMMENT=	Font engine for complex non-Roman writing systems
+
+LICENSE=	lgpl2.1
+
+OPTIONS_DEFINE=	FREETYPE
+OPTIONS_DEFAULT=FREETYPE
+OPTIONS_SUB=	yes
+
+CONFIGURE_ARGS=	--without-xft --without-pangographite
+GNU_CONFIGURE=	yes
+INSTALL_TARGET=	install-strip
+USE_LDCONFIG=	yes
+USES=		libtool pathfix pkgconfig
+
+FREETYPE_CONFIGURE_WITH=freetype
+FREETYPE_LIB_DEPENDS=	libfreetype.so:${PORTSDIR}/print/freetype2
+FREETYPE_USES=		iconv
+
+.include <bsd.port.mk>


Property changes on: trunk/graphics/silgraphite/Makefile
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:keywords
## -0,0 +1 ##
+MidnightBSD=%H
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/graphics/silgraphite/distinfo
===================================================================
--- trunk/graphics/silgraphite/distinfo	                        (rev 0)
+++ trunk/graphics/silgraphite/distinfo	2015-07-09 21:09:08 UTC (rev 19567)
@@ -0,0 +1,2 @@
+SHA256 (silgraphite-2.3.1.tar.gz) = 9b07c6e91108b1fa87411af4a57e25522784cfea0deb79b34ced608444f2ed65
+SIZE (silgraphite-2.3.1.tar.gz) = 3239482


Property changes on: trunk/graphics/silgraphite/distinfo
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/graphics/silgraphite/files/patch-openoffice-silgraphite
===================================================================
--- trunk/graphics/silgraphite/files/patch-openoffice-silgraphite	                        (rev 0)
+++ trunk/graphics/silgraphite/files/patch-openoffice-silgraphite	2015-07-09 21:09:08 UTC (rev 19567)
@@ -0,0 +1,2285 @@
+--- engine/include/graphite/GrCommon.h.orig	2009-01-21 22:36:40 UTC
++++ engine/include/graphite/GrCommon.h
+@@ -18,6 +18,8 @@ Last reviewed:
+ #ifndef GRCOMMON_INCLUDED
+ #define GRCOMMON_INCLUDED
+ 
++#define _SECURE_SCL 0	// to allow GlyphSetIterator to work, which points off the end of a vector
++#define _HAS_ITERATOR_DEBUGGING 0
+ 
+ // Standard Headers.
+ 
+@@ -33,6 +35,7 @@ Last reviewed:
+ #include <vector>
+ #include <algorithm>
+ #include <string>
++///#include <stdexcept> -- possibly needed for std::string Xran and Xlen functions??
+ 
+ // Uncomment this to allow multiple versions of gr to coexist
+ // in the same program e.g. pangographite with gtk uses namespace gr
+@@ -41,7 +44,7 @@ Last reviewed:
+ // Provided the client includes GrClient.h first this #define is
+ // picked up by all files.
+ 
+-//#define gr gr2
++#define gr gr3ooo
+ 
+ // Project headers
+ #include "GrPlatform.h"
+--- engine/include/graphite/GrMstypes.h.orig	2009-01-21 22:36:40 UTC
++++ engine/include/graphite/GrMstypes.h
+@@ -24,11 +24,11 @@ typedef wchar_t  OLECHAR;
+ 
+ typedef signed long	    HRESULT;
+ 
+-inline const long InterlockedIncrement(long *const intr_lck) {
++inline long InterlockedIncrement(long *const intr_lck) {
+ 	return ++*intr_lck;
+ }
+ 
+-inline const long InterlockedDecrement(long *const intr_lck) {
++inline long InterlockedDecrement(long *const intr_lck) {
+ 	return --*intr_lck;
+ }
+ 
+--- engine/makefile.vc7.orig	2008-08-21 14:24:32 UTC
++++ engine/makefile.vc7
+@@ -48,11 +48,7 @@ all : lib lib_dll
+ CPP_DEBUG=/D "TRACING" $(CPP_DEBUG)
+ !ENDIF
+ 
+-!IF "$(OS)" == "Windows_NT"
+ NULL=
+-!ELSE 
+-NULL=nul
+-!ENDIF
+ 
+ clean :
+     @- rd /s/q .\release_temp
+--- engine/src/font/FileFont.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/font/FileFont.cpp
+@@ -207,11 +207,11 @@ FileFont::initializeFromFace()
+ 				cch16 += cch16Used;
+ 			}
+ //		}
+-#else
++#elif 1
+ 		m_stuFaceName.assign(rgchwFace);
+-		// VS 2005 needs this:
+-		//for (int cch16 = 0; cch16 < cchw; cch16++)
+-		//	m_stuFaceName.push_back(rgchwFace[cch16]);
++#else	// VS 2005 needs this:
++		for (int cch16 = 0; cch16 < cchw; cch16++)
++			m_stuFaceName.push_back(rgchwFace[cch16]);
+ #endif
+ 		pTable = readTable(ktiHead, lSize);
+ 		if (!m_fIsValid || !pTable) 
+@@ -233,7 +233,7 @@ byte * 
+ FileFont::readTable(int /*TableId*/ tid, size_t & size)
+ {
+ 	const TableId tableId = TableId(tid);
+-	bool isValid = true;
++	bool isTableValid = true;
+ 	size_t lOffset = 0, lSize = 0;
+ 	if (!m_pTableCache)
+ 	{
+@@ -245,9 +245,9 @@ FileFont::readTable(int /*TableId*/ tid,
+ 	size = m_pTableCache->getTableSize(tableId);
+ 	// check whether it is already in the cache
+ 	if (pTable) return pTable;
+-	isValid &= TtfUtil::GetTableInfo(tableId, m_pHeader, m_pTableDir, 
++	isTableValid &= TtfUtil::GetTableInfo(tableId, m_pHeader, m_pTableDir, 
+ 			lOffset, lSize);
+-	if (!isValid) 
++	if (!isTableValid) 
+ 		return NULL;
+ 	fseek(m_pfile, lOffset, SEEK_SET);
+ 	// only allocate if needed
+@@ -255,16 +255,16 @@ FileFont::readTable(int /*TableId*/ tid,
+ 	
+ 	if (!pTable) 
+ 	{
+-		isValid = false;
++		isTableValid = false;
+ 		return NULL;
+ 	}
+ 	size_t bytesRead = fread(pTable, 1, lSize, m_pfile);
+-	isValid = bytesRead == lSize;
+-	if (isValid)
++	isTableValid = bytesRead == lSize;
++	if (isTableValid)
+ 	{
+-		isValid &= TtfUtil::CheckTable(tableId, pTable, lSize);
++		isTableValid &= TtfUtil::CheckTable(tableId, pTable, lSize);
+ 	}
+-	if (!isValid) 
++	if (!isTableValid) 
+ 	{
+ 		return 0;
+ 	}
+--- engine/src/font/Font.cpp.orig	2008-05-20 06:04:16 UTC
++++ engine/src/font/Font.cpp
+@@ -626,7 +626,7 @@ FeatureIterator FeatureIterator::operato
+ 		Assert(false);
+ 		m_ifeat = m_cfeat;
+ 	}
+-	else if (m_ifeat + n < 0)
++	else if (static_cast<int>(m_ifeat) + n < 0)
+ 	{
+ 		// Can't decrement.
+ 		Assert(false);
+@@ -727,7 +727,7 @@ FeatureSettingIterator FeatureSettingIte
+ 		Assert(false);
+ 		m_ifset = m_cfset;
+ 	}
+-	if (m_ifset + n < 0)
++	if (static_cast<int>(m_ifset) + n < 0)
+ 	{
+ 		// Can't decrement.
+ 		Assert(false);
+@@ -820,7 +820,7 @@ FeatLabelLangIterator FeatLabelLangItera
+ 		Assert(false);
+ 		m_ilang = m_clang;
+ 	}
+-	else if (m_ilang + n < 0)
++	else if (static_cast<int>(m_ilang) + n < 0)
+ 	{
+ 		// Can't decrement.
+ 		Assert(false);
+@@ -906,7 +906,7 @@ LanguageIterator LanguageIterator::opera
+ 		Assert(false);
+ 		m_ilang = m_clang;
+ 	}
+-	else if (m_ilang + n < 0)
++	else if (static_cast<int>(m_ilang) + n < 0)
+ 	{
+ 		// Can't decrement.
+ 		Assert(false);
+--- engine/src/font/TtfUtil.cpp.orig	2009-01-29 08:33:19 UTC
++++ engine/src/font/TtfUtil.cpp
+@@ -492,7 +492,7 @@ bool IsItalic(const void * pHead)
+ 	const Sfnt::FontHeader * pTable = 
+ 			reinterpret_cast<const Sfnt::FontHeader *>(pHead);
+ 	
+-	return read(((pTable->mac_style) & 0x00000002) != 0);
++	return ((read(pTable->mac_style) & 0x00000002) != 0);
+ }
+ 
+ /*----------------------------------------------------------------------------------------------
+@@ -1108,8 +1108,8 @@ size_t LocaLookup(gr::gid16 nGlyphId, 
+ 	{ // loca entries are two bytes and have been divided by two
+ 		if (nGlyphId <= (lLocaSize >> 1) - 1) // allow sentinel value to be accessed
+ 		{
+-			const uint16 * pTable = reinterpret_cast<const uint16 *>(pLoca);
+-			return (read(pTable[nGlyphId]) << 1);
++			const uint16 * pTableLoca = reinterpret_cast<const uint16 *>(pLoca);
++			return (read(pTableLoca[nGlyphId]) << 1);
+ 		}
+ 	}
+ 	
+@@ -1117,8 +1117,8 @@ size_t LocaLookup(gr::gid16 nGlyphId, 
+ 	{ // loca entries are four bytes
+ 		if (nGlyphId <= (lLocaSize >> 2) - 1)
+ 		{
+-			const uint32 * pTable = reinterpret_cast<const uint32 *>(pLoca);
+-			return read(pTable[nGlyphId]);
++			const uint32 * pTableLoca = reinterpret_cast<const uint32 *>(pLoca);
++			return read(pTableLoca[nGlyphId]);
+ 		}
+ 	}
+ 
+@@ -1586,7 +1586,7 @@ bool IsDeepComposite(gr::gid16 nGlyphId,
+ 
+ 	for (size_t i = 0; i < cCompId; i++)
+ 	{
+-		void * pSimpleGlyf = GlyfLookup(static_cast<gr::gid16>(rgnCompId[i]), 
++		pSimpleGlyf = GlyfLookup(static_cast<gr::gid16>(rgnCompId[i]), 
+ 										pGlyf, pLoca, lLocaSize, pHead);
+ 		if (pSimpleGlyf == NULL) {return false;}
+ 
+@@ -1748,7 +1748,7 @@ bool GlyfContourEndPoints(gr::gid16 nGly
+ ----------------------------------------------------------------------------------------------*/
+ bool GlyfPoints(gr::gid16 nGlyphId, const void * pGlyf, 
+ 		const void * pLoca, size_t lLocaSize, const void * pHead, 
+-		const int * prgnContourEndPoint, size_t cnEndPoints, 
++		const int * /*prgnContourEndPoint*/, size_t /*cnEndPoints*/, 
+ 		int * prgnX, int * prgnY, bool * prgfOnCurve, size_t cnPoints)
+ {
+ 	std::fill_n(prgnX, cnPoints, INT_MAX);
+--- engine/src/painter/SegmentPainter.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/painter/SegmentPainter.cpp
+@@ -353,7 +353,7 @@ void SegmentPainter::positionsOfIP(
+ 	@param bOn				- true if we are turning on (ignored in this implementation)
+ ----------------------------------------------------------------------------------------------*/
+ bool SegmentPainter::drawSelectionRange(int ichwAnchor, int ichwEnd,
+-	float ydLineTop, float ydLineBottom, bool bOn)
++	float ydLineTop, float ydLineBottom, bool /*bOn*/)
+ {
+ 	if (g_fDrawing)
+ 		return true;
+@@ -993,7 +993,7 @@ size_t SegmentPainter::getUnderlinePlace
+ 								an I-beam (std selection)
+ ----------------------------------------------------------------------------------------------*/
+ void SegmentPainter::CalcOrDrawInsertionPoint(
+-	int ichwIP, bool fAssocPrev, bool bOn, bool fForceSplit,
++	int ichwIP, bool fAssocPrev, bool /*bOn*/, bool fForceSplit,
+ 	Rect * prdPrimary, Rect * prdSecondary)
+ {
+ 	GrResult res = kresOk;
+@@ -1277,7 +1277,7 @@ void SegmentPainter::CalcOrDrawInsertion
+ 							if NULL, do the drawing
+ ----------------------------------------------------------------------------------------------*/
+ void SegmentPainter::InvertIBeam(float xs, float ysTop, float ysBottom,
+-	bool fAssocPrev, Rect * prdRet)
++	bool /*fAssocPrev*/, Rect * prdRet)
+ {
+ 	float xd = ScaleXToDest(xs);
+ 	float ydTop = ScaleYToDest(ysTop);
+@@ -1675,7 +1675,7 @@ bool SegmentPainter::AtEdgeOfCluster(GrS
+ }
+ 
+ bool SegmentPainter::AtEdgeOfCluster(GrSlotOutput * psloutBase, int isloutBase,
+-	GrSlotOutput * pslout, int islout, bool fBefore)
++	GrSlotOutput * /*pslout*/, int islout, bool fBefore)
+ {
+ 	//	Compare pslout to all the members of the cluster. If it is the minimum or maximum, it
+ 	//	is at an edge.
+@@ -1778,12 +1778,12 @@ void SegmentPainter::CalcPartialLigature
+ 			}
+ 			for (icomp = 0; icomp < pslout->NumberOfComponents(); icomp++)
+ 			{
+-				for (int ichw = pslout->FirstUnderlyingComponent(icomp) ; 
+-					ichw <= pslout->LastUnderlyingComponent(icomp) ;
+-					ichw++)
++				for (int ichwTemp = pslout->FirstUnderlyingComponent(icomp) ; 
++					ichwTemp <= pslout->LastUnderlyingComponent(icomp) ;
++					ichwTemp++)
+ 				{
+-					if (m_pseg->m_prgiComponent[ichw - m_pseg->m_ichwAssocsMin] == icomp)
+-						prgfAllSelected[ichw] = fAll;
++					if (m_pseg->m_prgiComponent[ichwTemp - m_pseg->m_ichwAssocsMin] == icomp)
++						prgfAllSelected[ichwTemp] = fAll;
+ 				}
+ 			}
+ 		}
+@@ -2304,7 +2304,11 @@ bool SegmentPainter::AdjustRectsToNotOve
+ 	Assert that there are no overlaps among all the rectangles in the array, which should
+ 	be the case if AdjustRectsToNotOverlap is working properly.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void SegmentPainter::AssertNoOverlaps(std::vector<Rect> & vrect)
++#else
++void SegmentPainter::AssertNoOverlaps(std::vector<Rect> & /*vrect*/)
++#endif
+ {
+ #ifdef _DEBUG
+ 	for (int irect1 = 0; irect1 < signed(vrect.size() - 1); irect1++)
+@@ -2452,7 +2456,11 @@ bool SegmentPainter::AdjustLineSegsToNot
+ 	Assert that there are no overlaps among all the rectangles in the array, which should
+ 	be the case if AdjustRectsToNotOverlap is working properly.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void SegmentPainter::AssertNoOverlaps(std::vector<LineSeg> & vls)
++#else
++void SegmentPainter::AssertNoOverlaps(std::vector<LineSeg> & /*vls*/)
++#endif
+ {
+ #ifdef _DEBUG
+ 	for (int ils1 = 0; ils1 < (int)vls.size() - 1; ils1++)
+@@ -2884,7 +2892,7 @@ bool SegmentPainter::AdjacentLigComponen
+ 	{
+ 		if (icompNext != icompCurr)
+ 		{
+-			float xsHorizNext = (fIPOnRight) ? vxsRights[icompNext] : vxsLefts[icompNext];
++			xsHorizNext = (fIPOnRight) ? vxsRights[icompNext] : vxsLefts[icompNext];
+ 			if (fMovingRight && xsHorizNext > xsHorizCurr)
+ 				break;
+ 			else if (!fMovingRight && xsHorizNext < xsHorizCurr)
+@@ -2996,7 +3004,7 @@ float SegmentPainter::ScaleY(float ys, R
+ /*----------------------------------------------------------------------------------------------
+ 	Make sure the font is set to use the character properties required by this segment.
+ ----------------------------------------------------------------------------------------------*/
+-void SegmentPainter::SetFontProps(unsigned long clrFore, unsigned long clrBack)
++void SegmentPainter::SetFontProps(unsigned long /*clrFore*/, unsigned long /*clrBack*/)
+ {
+ 	return;
+ }
+--- engine/src/segment/FileInput.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/FileInput.cpp
+@@ -80,7 +80,7 @@ GrBufferIStream::~GrBufferIStream()
+ #ifdef GR_FW
+ bool GrBufferIStream::Open(std::wstring stuFileName, int kMode)
+ #else
+-bool GrBufferIStream::Open(const char * pcFileName, std::ios::openmode kMode)
++bool GrBufferIStream::Open(const char * /*pcFileName*/, std::ios::openmode /*kMode*/)
+ #endif
+ {
+ 	Assert(false); // use OpenBuffer
+--- engine/src/segment/GrCharStream.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/GrCharStream.cpp
+@@ -417,8 +417,11 @@ bool GrCharStream::AtUnicodeCharBoundary
+ 	return true;
+ */
+ }
+-
++#ifdef NDEBUG
++bool GrCharStream::AtUnicodeCharBoundary(utf8 * prgchs, int cchs, int ichs, UtfType /*utf*/)
++#else
+ bool GrCharStream::AtUnicodeCharBoundary(utf8 * prgchs, int cchs, int ichs, UtfType utf)
++#endif
+ {
+ 	Assert(ichs >= 0);
+ 	Assert(ichs <= cchs);
+--- engine/src/segment/GrClassTable.h.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/GrClassTable.h
+@@ -54,7 +54,11 @@ protected:
+ 	/*------------------------------------------------------------------------------------------
+ 		Copy the raw memory into the instance.
+ 	------------------------------------------------------------------------------------------*/
++#ifdef NDEBUG
++	void CopyFrom(data16 * pchwStart, int /*cchw*/)
++#else
+ 	void CopyFrom(data16 * pchwStart, int cchw)
++#endif
+ 	{
+ 		m_cgixBIG = pchwStart[0];
+ 		m_digixBIGInit = pchwStart[1];
+--- engine/src/segment/GrEngine.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrEngine.cpp
+@@ -159,12 +159,12 @@ void GrEngine::BasicInit()
+ GrEngine::~GrEngine()
+ {
+ 	DestroyEverything();
+-	#ifdef _MSC_VER
+-	if (!_CrtCheckMemory())
+-	{
+-		OutputDebugString(L"bad memory");
+-	}
+-	#endif
++//	#ifdef _MSC_VER
++//	if (!_CrtCheckMemory())
++//	{
++//		OutputDebugString(L"bad memory");
++//	}
++//	#endif
+ }
+ 
+ /*----------------------------------------------------------------------------------------------
+@@ -173,12 +173,12 @@ GrEngine::~GrEngine()
+ void GrEngine::DestroyEverything()
+ {
+ 	DestroyContents();
+-	#ifdef _MSC_VER
+-	if (!_CrtCheckMemory())
+-	{
+-		OutputDebugString(L"bad memory");
+-	}
+-	#endif
++//	#ifdef _MSC_VER
++//	if (!_CrtCheckMemory())
++//	{
++//		OutputDebugString(L"bad memory");
++//	}
++//	#endif
+ 
+ 	m_strCtrlFileReg.erase();
+ 	m_strCtrlFileBold.erase();
+@@ -417,7 +417,11 @@ GrResult GrEngine::get_SegDatMaxLength(i
+ 	@return The supported script direction(s). If more than one, the application is
+ 	responsible for choosing the most appropriate.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef NDEBUG
++GrResult GrEngine::get_ScriptDirection(unsigned int * pgrfsdc, OLECHAR * /*prgchwErrMsg*/, int /*cchMaxErrMsg*/)
++#else
+ GrResult GrEngine::get_ScriptDirection(unsigned int * pgrfsdc, OLECHAR * prgchwErrMsg, int cchMaxErrMsg)
++#endif
+ {
+ 	ChkGrOutPtr(pgrfsdc);
+ 	ChkGrArrayArg(prgchwErrMsg, cchMaxErrMsg);
+@@ -789,7 +793,7 @@ void GrEngine::RecordFontLoadError(OLECH
+ 	Record a system error indicating a bad error in rendering using a supposedly valid font.
+ 	OBSOLETE
+ ----------------------------------------------------------------------------------------------*/
+-void GrEngine::RecordFontRunError(OLECHAR * prgchwErrMsg, int cchMax, GrResult res)
++void GrEngine::RecordFontRunError(OLECHAR * prgchwErrMsg, int cchMax, GrResult /*res*/)
+ {
+ 	if (prgchwErrMsg == NULL || cchMax == 0)
+ 		return;
+@@ -970,7 +974,7 @@ void GrEngine::InitFromControlFileTest()
+ /*----------------------------------------------------------------------------------------------
+ 	Return whether the text is asking for bold and/or italic text.
+ ----------------------------------------------------------------------------------------------*/
+-void GrEngine::GetStyles(Font * pfont, int ichwMin, bool * pfBold, bool * pfItalic)
++void GrEngine::GetStyles(Font * pfont, int /*ichwMin*/, bool * pfBold, bool * pfItalic)
+ {
+ 	*pfBold = pfont->bold();
+ 	*pfItalic = pfont->italic();
+@@ -981,7 +985,11 @@ void GrEngine::GetStyles(Font * pfont, i
+ 	Should only be called when we know we are using a base font, or when we are reading
+ 	the base font to see if it is valid.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef NDEBUG
++void GrEngine::SwitchGraphicsFont(bool /*fBase*/)
++#else
+ void GrEngine::SwitchGraphicsFont(bool fBase)
++#endif
+ {
+ 	Assert(!fBase || m_stuBaseFaceName.size() > 0);
+ 
+@@ -1135,7 +1143,7 @@ bool GrEngine::ReadSilfTable(GrIStream &
+ 		m_chwJShrink0 = 0xffff;
+ 		m_chwJStep0 = 0xffff;
+ 		m_chwJWeight0 = 0xffff;
+-		for (int i = 0; i < m_cJLevels; i++)
++		for (i = 0; i < m_cJLevels; i++)
+ 		{
+ 			//	justification glyph attribute IDs
+ 			bTmp = grstrm.ReadByteFromFont();
+@@ -1210,10 +1218,12 @@ bool GrEngine::ReadSilfTable(GrIStream &
+ 
+ 	//	rendering behaviors--ignore for now
+ 	byte cBehaviors = grstrm.ReadByteFromFont();
+-	unsigned int nBehaviors[kMaxRenderingBehavior];
++	int nTmp;
++	//unsigned int nBehaviors[kMaxRenderingBehavior]; -- this big buffer causes a stack overflow in Multiscribe; rework eventually
+ 	for (i = 0; i < cBehaviors; i++)
+ 	{
+-		nBehaviors[i] = unsigned(grstrm.ReadIntFromFont());
++		//nBehaviors[i] = unsigned(grstrm.ReadIntFromFont());
++		nTmp = unsigned(grstrm.ReadIntFromFont());
+ 	}
+ 
+ 	//	linebreak glyph ID
+--- engine/src/segment/GrFSM.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/GrFSM.cpp
+@@ -46,7 +46,7 @@ namespace gr
+ 	Fill in the FSM by reading from the font stream.
+ 	Assumes the stream is in the correct position.
+ ----------------------------------------------------------------------------------------------*/
+-bool GrFSM::ReadFromFont(GrIStream & grstrm, int fxdVersion)
++bool GrFSM::ReadFromFont(GrIStream & grstrm, int /*fxdVersion*/)
+ {
+ 	short snTmp;
+ 	
+@@ -138,7 +138,7 @@ bool GrFSM::ReadFromFont(GrIStream & grs
+ 	Fill in the FSM's state table by reading from the font stream.
+ 	Assumes the stream is in the correct position.
+ ----------------------------------------------------------------------------------------------*/
+-bool GrFSM::ReadStateTableFromFont(GrIStream & grstrm, int fxdVersion)
++bool GrFSM::ReadStateTableFromFont(GrIStream & grstrm, int /*fxdVersion*/)
+ {
+ 	int cCells = ((m_crow - m_crowFinal) * m_ccol);
+ 	m_prgrowTransitions = new short[cCells];
+--- engine/src/segment/GrFeature.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/GrFeature.cpp
+@@ -186,7 +186,7 @@ std::wstring GrFeature::NthSettingLabel(
+ /*----------------------------------------------------------------------------------------------
+ 	Read the languages from the font.
+ ----------------------------------------------------------------------------------------------*/
+-bool GrLangTable::ReadFromFont(GrIStream * pgrstrm, int fxdVersion)
++bool GrLangTable::ReadFromFont(GrIStream * pgrstrm, int /*fxdVersion*/)
+ {
+ 	GrIStream & grstrm = *pgrstrm;
+ 	
+@@ -206,13 +206,22 @@ bool GrLangTable::ReadFromFont(GrIStream
+ 
+ 	m_cbOffset0 = (lsbf)(m_prglang[0].cbOffsetBIG);
+ 
+-	Assert((lsbf)(m_prglang[m_clang].cFeaturesBIG) == 0); // bogus entry has no settings
++	if ((lsbf)(m_prglang[m_clang].cFeaturesBIG) == 0) // bogus entry has no settings
++	{
+ 	cb = (lsbf)(m_prglang[m_clang].cbOffsetBIG) - m_cbOffset0;
+-	Assert(cb % sizeof(FeatSet) == 0); // # of bytes fits nicely into FeatSet class
++		if (cb % sizeof(FeatSet) == 0) // # of bytes fits nicely into FeatSet class
++		{
+ 	int cfset = cb / sizeof(FeatSet);
+ 	m_prgfset = new FeatSet[cfset];
+ 	m_cfset = cfset;
+ 	grstrm.ReadBlockFromFont(m_prgfset, cb);
++		}
++		else return false;
++	}
++	else
++	{
++		return false;
++	}
+ 
+ 	return true;
+ }
+--- engine/src/segment/GrPass.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrPass.cpp
+@@ -279,9 +279,10 @@ void GrPass::InitializeWithNoRules()
+ 	@param twsh					- how we are handling trailing white-space
+ 	@param pnRet				- return value
+ 	@param pcslotGot			- return the number of slots gotten
+-	@param pislotFinalBreak		- return the index of the final slot, when we are removing
+-									the trailing white-space and so the end of the segment
+-									will be before the any actual line-break slot
++	@param pislotFinalBreak		- index of the final slot (LB or actual glyph), or -1;
++									adjusted when we are removing the trailing white-space and
++									so the end of the segment will be before the any actual
++									line-break slot
+ 
+ 	@return kNextPass if we were able to generated the number requested, or processing is
+ 		complete; otherwise return the number of slots needed from the previous pass.
+@@ -465,7 +466,7 @@ void GrPass::ExtendOutput(GrTableManager
+ void GrBidiPass::ExtendOutput(GrTableManager * ptman,
+ 	GrSlotStream* psstrmIn, GrSlotStream* psstrmOut,
+ 	int cslotNeededByNext, TrWsHandling twsh,
+-	int * pnRet, int * pcslotGot, int * pislotFinalBreak)
++	int * pnRet, int * pcslotGot, int * /*pislotFinalBreak*/)
+ {
+ 	Assert(psstrmIn->SlotsToReprocess() == 0);
+ 
+@@ -776,7 +777,7 @@ int GrPass::ExtendGlyphIDOutput(GrTableM
+ int GrPass::ExtendFinalOutput(GrTableManager * ptman,
+ 	GrSlotStream * psstrmInput, GrSlotStream * psstrmOutput,
+ 	float xsSpaceAllotted, bool fWidthIsCharCount, bool fInfiniteWidth,
+-	bool fHaveLineBreak, bool fMustBacktrack, LineBrk lbMax, TrWsHandling twsh,
++	bool fHaveLineBreak, bool fMustBacktrack, LineBrk /*lbMax*/, TrWsHandling twsh,
+ 	int * pislotLB, float * pxsWidth)
+ {
+ 	EngineState * pengst = ptman->State();
+@@ -897,7 +898,11 @@ int GrPass::ExtendFinalOutput(GrTableMan
+ 	Remove undesirable trailing white-space.
+ ----------------------------------------------------------------------------------------------*/
+ int GrPass::RemoveTrailingWhiteSpace(GrTableManager * ptman, GrSlotStream * psstrmOut,
++#ifdef NDEBUG
++	TrWsHandling /*twsh*/, int * pislotFinalBreak)
++#else
+ 	TrWsHandling twsh, int * pislotFinalBreak)
++#endif
+ {
+ 	EngineState * pengst = ptman->State();
+ 
+@@ -944,7 +949,7 @@ int GrPass::RemoveTrailingWhiteSpace(GrT
+ 	should never be necessary if they've set up their tables right.
+ ----------------------------------------------------------------------------------------------*/
+ void GrPass::CheckInputProgress(GrSlotStream * psstrmInput, GrSlotStream * psstrmOutput,
+-	int islotOrigInput)
++	int /*islotOrigInput*/)
+ {
+ 	int islotInput = psstrmInput->ReadPosForNextGet();
+ //	Assert(islotInput >= islotOrigInput); -- no longer true now that we can back up
+@@ -1752,7 +1757,7 @@ int GrBidiPass::Reverse(GrTableManager *
+ ----------------------------------------------------------------------------------------------*/
+ int GrPass::Unwind(GrTableManager * ptman,
+ 	int islotChanged, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut,
+-	bool fFirst)
++	bool /*fFirst*/)
+ {
+ 	//	Back up the number of slots required for the longest rule context,
+ 	//	but if we land in the middle of a chunk, go forward to its boundary.
+@@ -1824,7 +1829,7 @@ int GrPass::Unwind(GrTableManager * ptma
+ ----------------------------------------------------------------------------------------------*/
+ int GrBidiPass::Unwind(GrTableManager * ptman,
+ 	int islotChanged, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut,
+-	bool fFirst)
++	bool /*fFirst*/)
+ {
+ 	int islotIn;
+ 	int islotOut;
+@@ -1901,8 +1906,8 @@ void PassState::UnwindLogInfo(int islotI
+ 	OBSOLETE
+ ----------------------------------------------------------------------------------------------*/
+ //:Ignore
+-void GrPosPass::Unattach(GrSlotStream * psstrmIn, int islotIn,
+-	GrSlotStream * psstrmOut, int islotOut, int islotLB)
++void GrPosPass::Unattach(GrSlotStream * /*psstrmIn*/, int /*islotIn*/,
++	GrSlotStream * /*psstrmOut*/, int /*islotOut*/, int /*islotLB*/)
+ {
+ 	//	Because this is a positioning pass, there is a one-to-one correspondence between
+ 	//	the slots in the input and the slots in the output. Thus we can make simplifying
+--- engine/src/segment/GrPass.h.orig	2008-08-21 14:24:32 UTC
++++ engine/src/segment/GrPass.h
+@@ -197,7 +197,7 @@ public:
+ 	bool ReadFromFont(GrIStream & grstrm, int fxdSilfVersion, int fxdRuleVersion, int nOffset);
+ 	void InitializeWithNoRules();
+ 
+-	virtual void SetTopDirLevel(int n)
++	virtual void SetTopDirLevel(int /*n*/)
+ 	{	// only GrBidiPass does anything interesting
+ 	}
+ 
+@@ -253,13 +253,13 @@ public:
+ 		m_pzpst->SetResyncSkip(n);
+ 	}
+ 
+-	virtual void DoCleanUpSegMin(GrTableManager * ptman,
+-		GrSlotStream * psstrmIn, int islotInitReadPos, GrSlotStream * psstrmOut)
++	virtual void DoCleanUpSegMin(GrTableManager * /*ptman*/,
++		GrSlotStream * /*psstrmIn*/, int /*islotInitReadPos*/, GrSlotStream * /*psstrmOut*/)
+ 	{
+ 	}
+ 
+-	virtual void DoCleanUpSegLim(GrTableManager * ptman, GrSlotStream * psstrmOut,
+-		TrWsHandling twsh)
++	virtual void DoCleanUpSegLim(GrTableManager * /*ptman*/, GrSlotStream * /*psstrmOut*/,
++		TrWsHandling /*twsh*/)
+ 	{
+ 	}
+ 
+@@ -383,8 +383,8 @@ protected:
+ 	void MapChunks(GrSlotStream * psstrmIn, GrSlotStream * psstrmOut,
+ 		int islotChunkI, int islotChunkO, int cslotReprocessed);
+ 
+-	virtual void Unattach(GrSlotStream * psstrmIn, int islotIn,	// GrPosPass overrides
+-		GrSlotStream * psstrmOut, int islotOut, int islotLB)
++	virtual void Unattach(GrSlotStream * /*psstrmIn*/, int /*islotIn*/,	// GrPosPass overrides
++		GrSlotStream * /*psstrmOut*/, int /*islotOut*/, int /*islotLB*/)
+ 	{
+ 	}
+ 
+@@ -500,8 +500,8 @@ public:
+ 
+ protected:
+ 	//	Irrelevant when generating glyphs.
+-	virtual void RunRule(GrTableManager *, int ruln,
+-		GrSlotStream * psstrmInput, GrSlotStream * psstrmOutput)
++	virtual void RunRule(GrTableManager *, int /*ruln*/,
++		GrSlotStream * /*psstrmInput*/, GrSlotStream * /*psstrmOutput*/)
+ 	{
+ 		Assert(false);
+ 	}
+--- engine/src/segment/GrPassActionCode.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrPassActionCode.cpp
+@@ -632,8 +632,13 @@ GrPass::StackMachineFlag GrPass::CheckSt
+ /*----------------------------------------------------------------------------------------------
+ 	We are finished processing a slot; go on to the next slot, or possibly go backwards.
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoNext(GrTableManager * ptman,
+-	int cslot, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
++#ifdef NDEBUG
++void GrPass::DoNext(GrTableManager * /*ptman*/,
++	int /*cslot*/, GrSlotStream * /*psstrmIn*/, GrSlotStream * /*psstrmOut*/)
++#else
++void GrPass::DoNext(GrTableManager * /*ptman*/,
++	int cslot, GrSlotStream * /*psstrmIn*/, GrSlotStream * /*psstrmOut*/)
++#endif
+ {
+ 	gAssert(cslot == 1);	// for now anyway
+ }
+@@ -690,6 +695,7 @@ void GrPass::DoPutGlyph(GrTableManager *
+ 		psstrmOut->SetSegMinToWritePos(false);
+ 	if (fSetSegLim)
+ 		psstrmOut->SetSegLimToWritePos(false);
++	//gid16 chw; chw = pslotNew->GlyphID();
+ 	psstrmOut->NextPut(pslotNew);
+ }
+ 
+@@ -729,6 +735,7 @@ void GrPass::DoPutCopy(GrTableManager * 
+ 		psstrmOut->SetSegMinToWritePos(false);
+ 	if (fSetSegLim)
+ 		psstrmOut->SetSegLimToWritePos(false);
++	//gid16 chw; chw = pslotNew->GlyphID();
+ 	psstrmOut->NextPut(pslotNew);
+ }
+ 
+@@ -825,7 +832,7 @@ void GrPass::DoPutSubs2(GrTableManager *
+ 	@param psstrmIn / Out		- input/output streams
+ ----------------------------------------------------------------------------------------------*/
+ void GrPass::DoPutSubs3(GrTableManager * ptman, bool fInserting,
+-	int cslotSel1, int nSelClass1, int cslotSel2, int nSelClass2, int cslotSel3, int nSelClass3,
++	int cslotSel1, int nSelClass1, int cslotSel2, int nSelClass2, int /*cslotSel3*/, int nSelClass3,
+ 	int nReplacementClass,
+ 	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+@@ -888,7 +895,7 @@ void GrPass::DoPutSubsInit(GrSlotStream 
+ 	Common part of all the DoPutSubs... methods.
+ ----------------------------------------------------------------------------------------------*/
+ void GrPass::DoPutSubsAux(GrTableManager * ptman, bool fInserting, gid16 nGlyphReplacement,
+-	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut, GrSlotState * pslotNextInput,
++	GrSlotStream * /*psstrmIn*/, GrSlotStream * psstrmOut, GrSlotState * pslotNextInput,
+ 	bool fAtSegMin, bool fAtSegLim)
+ {
+ 	EngineState * pengst = ptman->State();
+@@ -915,6 +922,7 @@ void GrPass::DoPutSubsAux(GrTableManager
+ 		psstrmOut->SetSegMinToWritePos(false);
+ 	if (fSetSegLim)
+ 		psstrmOut->SetSegLimToWritePos(false);
++	//gid16 chw; chw = pslotNew->GlyphID();
+ 	psstrmOut->NextPut(pslotNew);
+ }
+ 
+@@ -924,7 +932,7 @@ void GrPass::DoPutSubsAux(GrTableManager
+ 	and its after-assoc to the slot before it. This makes it basically unselectable.
+ 	OBSOLETE - handled by slot initialization code
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::SetNeutralAssocs(GrSlotState * pslotNew, GrSlotStream * psstrmIn)
++void GrPass::SetNeutralAssocs(GrSlotState * pslotNew, GrSlotStream * /*psstrmIn*/)
+ {
+ 	pslotNew->ClearAssocs();
+ }
+@@ -943,6 +951,7 @@ void GrPass::DoDelete(GrTableManager * p
+ 		psstrmOut->SetSegLimToWritePos();
+ 
+ 	GrSlotState * pslot = psstrmIn->NextGet();
++	//gid16 chw; chw = pslotNew->GlyphID();
+ 	pslot->MarkDeleted();
+ 
+ 	if (ptman->LoggingTransduction())
+@@ -957,7 +966,7 @@ void GrPass::DoDelete(GrTableManager * p
+ 	@param fInserting			- whether current slot was inserted
+ 	@param psstrmIn / Out		- input/output streams
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoAssoc(int cnAssocs, std::vector<int> & vnAssocs, bool fInserting,
++void GrPass::DoAssoc(int cnAssocs, std::vector<int> & vnAssocs, bool /*fInserting*/,
+ 	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+ 	gAssert((unsigned)cnAssocs == vnAssocs.size());
+@@ -997,7 +1006,11 @@ void GrPass::DoAssoc(int cnAssocs, std::
+ 	@param vnStack				- stack to read value from
+ 	@param psstrmIn / Out		- input/output streams
+ ----------------------------------------------------------------------------------------------*/
++#ifdef NDEBUG
++void GrPass::DoSetAttr(GrTableManager * ptman, ActionCommand op, bool /*fInserting*/,
++#else
+ void GrPass::DoSetAttr(GrTableManager * ptman, ActionCommand op, bool fInserting,
++#endif
+ 	SlotAttrName slat, int slati, std::vector<int> & vnStack,
+ 	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+@@ -1192,7 +1205,7 @@ void GrPass::DoSetAttr(GrTableManager * 
+ 	@param psstrmIn				- input stream
+ ----------------------------------------------------------------------------------------------*/
+ void GrPass::DoPushSlotAttr(GrTableManager * ptman,
+-	int nSlotRef, bool fInserting,
++	int nSlotRef, bool /*fInserting*/,
+ 	SlotAttrName slat, int slati, std::vector<int> & vnStack,
+ 	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+@@ -1236,16 +1249,16 @@ void GrPass::DoPushSlotAttr(GrTableManag
+ 
+ 	case kslatAttTo:		nVal = pslot->AttachTo();			break;
+ 	case kslatAttLevel:		nVal = pslot->AttachLevel();		break;
+-	case kslatAttAtX:		nVal = pslot->AttachAtX(ptman, psstrmIn); break;
+ 	case kslatAttAtY:		nVal = pslot->AttachAtY();			break;
+ 	case kslatAttAtGpt:		nVal = pslot->AttachAtGpoint();		break;
+ 	case kslatAttAtXoff:	nVal = pslot->AttachAtXOffset();	break;
+ 	case kslatAttAtYoff:	nVal = pslot->AttachAtYOffset();	break;
+-	case kslatAttWithX:		nVal = pslot->AttachWithX(ptman, psstrmIn); break;
+ 	case kslatAttWithY:		nVal = pslot->AttachWithY();		break;
+ 	case kslatAttWithGpt:	nVal = pslot->AttachWithGpoint();	break;
+ 	case kslatAttWithXoff:	nVal = pslot->AttachWithXOffset();	break;
+ 	case kslatAttWithYoff:	nVal = pslot->AttachWithYOffset();	break;
++	case kslatAttAtX:		nVal = pslot->AttachAtX(ptman, psstrmIn);	break;
++	case kslatAttWithX:		nVal = pslot->AttachWithX(ptman, psstrmIn);	break;
+ 
+ 	case kslatMeasureSol:	nVal = pslot->MeasureSol();			break;
+ 	case kslatMeasureEol:	nVal = pslot->MeasureEol();			break;
+@@ -1282,7 +1295,7 @@ void GrPass::DoPushSlotAttr(GrTableManag
+ 	@param vnStack				- stack to push onto
+ 	@param psstrmIn				- input stream
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoPushGlyphAttr(GrTableManager * ptman, int nSlotRef, bool fInserting,
++void GrPass::DoPushGlyphAttr(GrTableManager * ptman, int nSlotRef, bool /*fInserting*/,
+ 	int nGlyphAttr,
+ 	std::vector<int> & vnStack, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+@@ -1307,7 +1320,7 @@ void GrPass::DoPushGlyphAttr(GrTableMana
+ 	@param vnStack				- stack to push onto
+ 	@param psstrmIn				- input stream
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoPushAttToGlyphAttr(GrTableManager * ptman, int nSlotRef, bool fInserting,
++void GrPass::DoPushAttToGlyphAttr(GrTableManager * ptman, int nSlotRef, bool /*fInserting*/,
+ 	int nGlyphAttr, std::vector<int> & vnStack,
+ 	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+@@ -1337,7 +1350,7 @@ void GrPass::DoPushAttToGlyphAttr(GrTabl
+ 	@param vnStack				- stack to push onto
+ 	@param psstrmIn				- input stream
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoPushGlyphMetric(GrTableManager * ptman, int nSlotRef, bool fInserting,
++void GrPass::DoPushGlyphMetric(GrTableManager * ptman, int nSlotRef, bool /*fInserting*/,
+ 	int nGlyphAttr, int nAttLevel,
+ 	std::vector<int> & vnStack, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+@@ -1364,7 +1377,7 @@ void GrPass::DoPushGlyphMetric(GrTableMa
+ 	@param psstrmIn				- input stream
+ 	@param psstrmOut			- output stream
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoPushAttToGlyphMetric(GrTableManager * ptman, int nSlotRef, bool fInserting,
++void GrPass::DoPushAttToGlyphMetric(GrTableManager * ptman, int nSlotRef, bool /*fInserting*/,
+ 	int nGlyphAttr, int nAttLevel,
+ 	std::vector<int> & vnStack,
+ 	GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+@@ -1399,7 +1412,7 @@ void GrPass::DoPushGlyphMetricAux(GrTabl
+ 	}
+ 	else
+ 	{
+-		pslot->CalcCompositeMetrics(ptman, psstrmIn, nAttLevel, true);
++		pslot->CalcCompositeMetrics(ptman, psstrmIn, NULL, nAttLevel, true);
+ 
+ 		float xy;
+ 		switch (gmet)
+@@ -1435,7 +1448,11 @@ void GrPass::DoPushGlyphMetricAux(GrTabl
+ 	@param psstrmIn				- input stream
+ 	@param psstrmOut			- output stream
+ ----------------------------------------------------------------------------------------------*/
+-void GrPass::DoPushFeatValue(GrTableManager * ptman, int nSlotRef, bool fInserting,
++#ifdef NDEBUG
++void GrPass::DoPushFeatValue(GrTableManager * /*ptman*/, int nSlotRef, bool /*fInserting*/,
++#else
++void GrPass::DoPushFeatValue(GrTableManager * /*ptman*/, int nSlotRef, bool fInserting,
++#endif
+ 	int nFeat, std::vector<int> & vnStack, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut)
+ {
+ 	gAssert(!fInserting);
+--- engine/src/segment/GrSlotState.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrSlotState.cpp
+@@ -261,7 +261,7 @@ gid16 GrSlotAbstract::ActualGlyphForOutp
+ 	root or attached leaf slots.
+ 	OBSOLETE
+ ----------------------------------------------------------------------------------------------*/
+-void GrSlotState::FixAttachmentTree(GrSlotState * pslotOld)
++void GrSlotState::FixAttachmentTree(GrSlotState * /*pslotOld*/)
+ {
+ #if 0
+ 	pslotOld->m_vpslotAttLeaves.CopyTo(m_vpslotAttLeaves);
+@@ -524,13 +524,13 @@ void GrSlotState::AllComponentRefs(std::
+ 		GrSlotState * pslot;
+ 		if (HasComponents())
+ 		{
+-			for (int iComponent = 0; iComponent < m_cnCompPerLig; iComponent++)
++			for (int iLigComponent = 0; iLigComponent < m_cnCompPerLig; iLigComponent++)
+ 			{
+-				pslot = CompRefSlot(iComponent);
++				pslot = CompRefSlot(iLigComponent);
+ 				if (pslot)
+ 				{
+ 					Assert(PassModified() >= pslot->PassModified());
+-					pslot->AllComponentRefs(vichw, vicomp, iComponent);
++					pslot->AllComponentRefs(vichw, vicomp, iLigComponent);
+ 				}
+ 			}
+ 		}
+@@ -1024,7 +1024,7 @@ void GrSlotState::EnsureLocalAttachmentT
+ 	NOTE: the caller is responsible to zap the cached positions of following glyphs
+ 	in the stream.
+ ----------------------------------------------------------------------------------------------*/
+-void GrSlotState::AttachToRoot(GrTableManager * ptman, GrSlotStream * psstrm,
++void GrSlotState::AttachToRoot(GrTableManager * /*ptman*/, GrSlotStream * psstrm,
+ 	GrSlotState * pslotNewRoot)
+ {
+ 	GrSlotState * pslotOldRoot = (m_dislotRootFixed == 0) ?
+@@ -1063,7 +1063,7 @@ void GrSlotState::Position(GrTableManage
+ 
+ 	float xsWidth, xsVisWidth;
+ 	if (m_xsPositionX == kNegInfFloat || m_ysPositionY == kNegInfFloat)
+-		ptman->CalcPositionsUpTo(psstrmOut->m_ipass, this, &xsWidth, &xsVisWidth);
++		ptman->CalcPositionsUpTo(psstrmOut->m_ipass, this, true, &xsWidth, &xsVisWidth);
+ 
+ 	*pmXPos = ptman->LogToEmUnits(m_xsPositionX);
+ 	*pmYPos = ptman->LogToEmUnits(m_ysPositionY);
+@@ -1077,7 +1077,7 @@ void GrSlotState::AdjustRootMetrics(GrTa
+ {
+ 	Assert(m_dislotRootFixed == m_srAttachTo);
+ 	GrSlotState * pslotRoot = AttachRoot(psstrm);
+-	CalcRootMetrics(ptman, psstrm, kPosInfinity);
++	CalcRootMetrics(ptman, psstrm, NULL, kPosInfinity);
+ 	if (pslotRoot)
+ 		pslotRoot->AdjustRootMetrics(ptman, psstrm);
+ }
+@@ -1086,13 +1086,15 @@ void GrSlotState::AdjustRootMetrics(GrTa
+ 	Calculate the composite metrics for this slot.
+ 
+ 	@param psstrm			- stream for which we are calculating it
++	@param psstrmNext		- because when processing in the middle of a pass, we may need to
++								get the slot from the following (output) stream
+ 	@param nLevel			- attachment level we are asking for; kPosInifinity means all levels
+ 	@param fThorough		- true: do a thorough recalculation; false: don't recalculate
+ 								metrics for leaves (are they assumed to be accurate???)
+ 								--currently not used
+ ----------------------------------------------------------------------------------------------*/
+ void GrSlotState::CalcCompositeMetrics(GrTableManager * ptman, GrSlotStream * psstrm,
+-	int nLevel, bool fThorough)
++	GrSlotStream * psstrmNext, int nLevel, bool fThorough)
+ {
+ 	if (m_nCompositeLevel == nLevel)
+ 		return;
+@@ -1101,19 +1103,38 @@ void GrSlotState::CalcCompositeMetrics(G
+ 	{
+ 		Assert(m_dislotRootFixed == m_srAttachTo);
+ 		GrSlotState * pslotRoot = AttachRoot(psstrm);
++		// Kludge to handle the fact that we might have gotten the root from the wrong stream.
++		// Calling MidPassSlotAt finds the right one.
++		if (psstrmNext && pslotRoot)
++		{
++			int islotRoot = pslotRoot->PosPassIndex();
++			pslotRoot = psstrm->MidPassSlotAt(islotRoot, psstrmNext);
++		}
+ 
+ 		InitMetrics(ptman, pslotRoot);
+ 
+ 		for (size_t islot = 0; islot < m_vdislotAttLeaves.size(); islot++)
+ 		{
+-			GrSlotState * pslotLeaf = SlotAtOffset(psstrm, m_vdislotAttLeaves[islot]);
++			GrSlotState * pslotLeaf;
++			if (psstrmNext)
++			{
++				// Calculating a position in the middle of processing a pass.
++				pslotLeaf = psstrm->MidPassSlotAt(PosPassIndex() + m_vdislotAttLeaves[islot],
++					psstrmNext);
++			}
++			else
++			{
++				// Calculating the final position.
++				pslotLeaf = SlotAtOffset(psstrm, m_vdislotAttLeaves[islot]);
++			}
++
+ 			if (pslotLeaf->AttachLevel() <= nLevel)
+-				pslotLeaf->CalcCompositeMetrics(ptman, psstrm, nLevel, fThorough);
++				pslotLeaf->CalcCompositeMetrics(ptman, psstrm, psstrmNext, nLevel, fThorough);
+ 			else
+ 				//	this slot will be ignored in the composite metrics
+ 				pslotLeaf->ZapRootMetrics();
+ 		}
+-		CalcRootMetrics(ptman, psstrm, nLevel);
++		CalcRootMetrics(ptman, psstrm, psstrmNext, nLevel);
+ 
+ 		m_nCompositeLevel = nLevel;
+ 	}
+@@ -1129,25 +1150,33 @@ void GrSlotState::CalcCompositeMetrics(G
+ /*----------------------------------------------------------------------------------------------
+ 	Calculate the metrics for this node and all its leaf nodes.
+ ----------------------------------------------------------------------------------------------*/
+-void GrSlotState::CalcRootMetrics(GrTableManager * ptman, GrSlotStream * psstrm, int nLevel)
++void GrSlotState::CalcRootMetrics(GrTableManager * /*ptman*/, GrSlotStream * psstrm,
++	GrSlotStream * psstrmNext, int nLevel)
+ {
+ 	for (size_t idislot = 0; idislot < m_vdislotAttLeaves.size(); idislot++)
+ 	{
+-		GrSlotState * pslot = SlotAtOffset(psstrm, m_vdislotAttLeaves[idislot]);
+-		if (pslot->AttachLevel() > nLevel)
++		GrSlotState * pslotLeaf = SlotAtOffset(psstrm, m_vdislotAttLeaves[idislot]);
++		// Kludge to handle the fact that we might have gotten the leaf from the wrong stream.
++		// Calling MidPassSlotAt finds the right one.
++		if (psstrmNext)
++		{
++			int islot = pslotLeaf->PosPassIndex();
++			pslotLeaf = psstrm->MidPassSlotAt(islot, psstrmNext);
++		}
++		if (pslotLeaf->AttachLevel() > nLevel)
+ 			continue;
+ 
+-		m_xsClusterXOffset = min(m_xsClusterXOffset, pslot->m_xsClusterXOffset);
+-		if (!pslot->m_fIgnoreAdvance)
++		m_xsClusterXOffset = min(m_xsClusterXOffset, pslotLeaf->m_xsClusterXOffset);
++		if (!pslotLeaf->m_fIgnoreAdvance)
+ 		{
+ 			m_xsClusterAdv = max(
+ 				m_xsClusterAdv,
+-				pslot->m_xsClusterAdv + m_xsRootShiftX);
++				pslotLeaf->m_xsClusterAdv + m_xsRootShiftX);
+ 		}
+-		m_xsClusterBbLeft = min(m_xsClusterBbLeft, pslot->m_xsClusterBbLeft);
+-		m_xsClusterBbRight = max(m_xsClusterBbRight, pslot->m_xsClusterBbRight);
+-		m_ysClusterBbTop = max(m_ysClusterBbTop, pslot->m_ysClusterBbTop);
+-		m_ysClusterBbBottom = min(m_ysClusterBbBottom, pslot->m_ysClusterBbBottom);
++		m_xsClusterBbLeft = min(m_xsClusterBbLeft, pslotLeaf->m_xsClusterBbLeft);
++		m_xsClusterBbRight = max(m_xsClusterBbRight, pslotLeaf->m_xsClusterBbRight);
++		m_ysClusterBbTop = max(m_ysClusterBbTop, pslotLeaf->m_ysClusterBbTop);
++		m_ysClusterBbBottom = min(m_ysClusterBbBottom, pslotLeaf->m_ysClusterBbBottom);
+ 	}
+ }
+ 
+@@ -1263,7 +1292,7 @@ float GrSlotState::GlyphXOffset(GrSlotSt
+ /*----------------------------------------------------------------------------------------------
+ 	Y-offsets of a single glyph relative to the previous advance position.
+ ----------------------------------------------------------------------------------------------*/
+-float GrSlotState::GlyphYOffset(GrSlotStream * psstrm)
++float GrSlotState::GlyphYOffset(GrSlotStream * /*psstrm*/)
+ {
+ 	return m_ysOffsetY;
+ }
+--- engine/src/segment/GrSlotState.h.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrSlotState.h
+@@ -48,7 +48,7 @@ public:
+ 	{
+ 	}
+ 
+-	~GrSlotAbstract()
++	virtual ~GrSlotAbstract()
+ 	{
+ 		// the table manager is responsible for destroying the contents of m_prgnVarLenBuf
+ 	}
+@@ -231,7 +231,7 @@ public:
+ 		ZapCompositeMetrics();
+ 	}
+ 
+-	~GrSlotState()
++	virtual ~GrSlotState()
+ 	{
+ 	}
+ 
+@@ -308,7 +308,11 @@ public:
+ 	{
+ 		return m_islotPosPass;
+ 	}
++#ifdef NDEBUG
++	void SetPosPassIndex(int islot, bool /*fInputToPosPass1*/)
++#else
+ 	void SetPosPassIndex(int islot, bool fInputToPosPass1)
++#endif
+ 	{
+ 		// If we're resetting it, it should be to the same value as before:
+ 		Assert(fInputToPosPass1 || m_islotPosPass == kNotYetSet || m_islotPosPass == islot);
+@@ -386,12 +390,12 @@ public:
+ 		return (IsInitialLineBreak(chwLB) || IsFinalLineBreak(chwLB));
+ 		//return (m_chwGlyphID == chwLB); // TODO: remove
+ 	}
+-	bool IsInitialLineBreak(gid16 chwLB)
++	bool IsInitialLineBreak(gid16 /*chwLB*/)
+ 	{
+ 		return (m_spsl == kspslLbInitial);
+ 		//return (IsLineBreak(chwLB) && m_fInitialLB == true); // TODO: remove
+ 	}
+-	bool IsFinalLineBreak(gid16 chwLB)
++	bool IsFinalLineBreak(gid16 /*chwLB*/)
+ 	{
+ 		return (m_spsl == kspslLbFinal);
+ 		//return (IsLineBreak(chwLB) && m_fInitialLB == false); // TODO: remove
+@@ -475,7 +479,7 @@ public:
+ 		return m_mAttachAtX;
+ 	}
+ 
+-	int AttachWithX(GrTableManager * ptman, GrSlotStream * psstrm)
++	int AttachWithX(GrTableManager * /*ptman*/, GrSlotStream * /*psstrm*/)
+ 	{
+ 		if (m_mAttachAtX == kNotYetSet)
+ 		{
+@@ -615,7 +619,7 @@ public:
+ 		GrSlotStream * psstrmIn, GrSlotStream * psstrmOut, int islotThis);
+ 
+ 	void CalcCompositeMetrics(GrTableManager * ptman, GrSlotStream * psstrm,
+-		int nLevel, bool fThorough = false);
++		GrSlotStream * psstrmNext, int nLevel, bool fThorough = false);
+ 
+ 	void Position(GrTableManager * ptman,
+ 		GrSlotStream * psstrmOut, int * pmXPos, int * pmYPos);
+@@ -646,7 +650,7 @@ public:
+ 	{
+ 		return ClusterBbLeft(psstrm) + xs;
+ 	}
+-	float ClusterRsb(GrSlotStream * psstrm, float xs)
++	float ClusterRsb(GrSlotStream * /*psstrm*/, float xs)
+ 	{
+ 		return ClusterAdvWidthFrom(xs) - ClusterBbRightFrom(xs);
+ 	}
+@@ -668,19 +672,19 @@ public:
+ 	{
+ 		return ClusterBbRightFrom(Base(psstrm)->ClusterRootOffset());
+ 	}
+-	float ClusterBbTop(GrSlotStream * psstrm)
++	float ClusterBbTop(GrSlotStream * /*psstrm*/)
+ 	{
+ 		return m_ysClusterBbTop;
+ 	}
+-	float ClusterBbBottom(GrSlotStream * psstrm)
++	float ClusterBbBottom(GrSlotStream * /*psstrm*/)
+ 	{
+ 		return m_ysClusterBbBottom;
+ 	}
+-	float ClusterBbWidth(GrSlotStream * psstrm)
++	float ClusterBbWidth(GrSlotStream * /*psstrm*/)
+ 	{
+ 		return m_xsClusterBbRight - m_xsClusterBbLeft + 1;
+ 	}
+-	float ClusterBbHeight(GrSlotStream * psstrm)
++	float ClusterBbHeight(GrSlotStream * /*psstrm*/)
+ 	{
+ 		return m_ysClusterBbTop - m_ysClusterBbBottom + 1;
+ 	}
+@@ -990,7 +994,8 @@ protected:
+ 	void InitMetrics(GrTableManager * ptman, GrSlotState * pslotRoot);
+ 	void InitLeafMetrics(GrTableManager * ptman, GrSlotState * pslotRoot);
+ 	void InitRootMetrics(GrTableManager * ptman);
+-	void CalcRootMetrics(GrTableManager * ptman, GrSlotStream *, int nLevel);
++	void CalcRootMetrics(GrTableManager * ptman, GrSlotStream * psstrm,
++		GrSlotStream * psstrmNext, int nLevel);
+ 	void AttachToRoot(GrTableManager * ptman, GrSlotStream *, GrSlotState * pslotNewRoot);
+ 	void AttachLogUnits(GrTableManager * ptman,
+ 		GrSlotState * pslotRoot,
+--- engine/src/segment/GrSlotStream.cpp.orig	2009-02-04 05:53:26 UTC
++++ engine/src/segment/GrSlotStream.cpp
+@@ -189,12 +189,16 @@ GrSlotState * GrSlotStream::Peek(int dis
+ 	stream position when the rule is being run.
+ 
+ 	@param dislot		- how far back to peek before the write position
+-							when the rule started; a negative number
++							WHEN THE RULE STARTED; a negative number
+ 							(NOTE: the current write position is irrelevant)
+ 	@param fNullOkay	- true if it's okay to return NULL in the situation where we're asking
+ 							for something before the beginning of the stream
+ ----------------------------------------------------------------------------------------------*/
++#ifdef NDEBUG
++GrSlotState * GrSlotStream::PeekBack(int dislot, bool /*fNullOkay*/)
++#else
+ GrSlotState * GrSlotStream::PeekBack(int dislot, bool fNullOkay)
++#endif
+ {
+ 	Assert(dislot < 0);
+ 	if (dislot < m_islotRuleStartWrite * -1)
+@@ -1104,6 +1108,7 @@ bool RightToLeftDir(DirCode dirc)
+ 	case kdircRLO:
+ 	case kdircRLE:
+ 	case kdircPdfR:
++	case kdircRlb:
+ 		return true;
+ 
+ 	case kdircNeutral:
+@@ -1212,7 +1217,7 @@ bool GrSlotStream::MoreSpace(GrTableMana
+ 			return true;
+ 
+ 		float xsWidth, xsVisWidth;
+-		ptman->CalcPositionsUpTo(m_ipass, NULL, &xsWidth, &xsVisWidth);
++		ptman->CalcPositionsUpTo(m_ipass, NULL, false, &xsWidth, &xsVisWidth);
+ 
+ 		*pxsWidth = (fIgnoreTrailingWS || twsh == ktwshOnlyWs) ? xsVisWidth : xsWidth;
+         return (*pxsWidth < xsSpaceAllotted);
+@@ -1322,7 +1327,7 @@ int GrSlotStream::InsertLineBreak(GrTabl
+ 	@param islotMin			- first slot that is officially part of the segment (after initial LB)
+ ----------------------------------------------------------------------------------------------*/
+ int GrSlotStream::MakeSegmentBreak(GrTableManager * ptman,
+-	int islotPrevBreak, bool fInsertedLB, int islotStartTry,
++	int /*islotPrevBreak*/, bool /*fInsertedLB*/, int islotStartTry,
+ 	LineBrk lb, TrWsHandling twsh, int islotMin,
+ 	LineBrk * plbNextToTry)
+ {
+@@ -1576,7 +1581,11 @@ int GrSlotStream::MaxClusterSlot(int isl
+ 	Return the break weight of the given slot, which should be a line-break.
+ 	OBSOLETE??
+ ----------------------------------------------------------------------------------------------*/
++#ifdef NDEBUG
++LineBrk GrSlotStream::BreakWeightAt(gid16 /*chwLB*/, int islot)
++#else
+ LineBrk GrSlotStream::BreakWeightAt(gid16 chwLB, int islot)
++#endif
+ {	
+ 	GrSlotState * pslot = GetSlotAt(islot);
+ 	Assert(pslot->IsLineBreak(chwLB));
+@@ -1769,7 +1778,7 @@ void GrSlotStream::UnwindOutput(int islo
+ 	@param fBackingUp		- this chunk results in the stream position moving backwards,
+ 								so clear anything we're backing over
+ ----------------------------------------------------------------------------------------------*/
+-void GrSlotStream::MapInputChunk(int islotInputMin, int islotOutputMin, int islotInputLim,
++void GrSlotStream::MapInputChunk(int islotInputMin, int islotOutputMin, int /*islotInputLim*/,
+ 	bool fSkipChunkStart, bool fBackingUp)
+ {
+ 	Assert(AssertValid());
+@@ -1828,7 +1837,7 @@ int GrSlotStream::LastNextChunkLength()
+ 	@param fBackingUp		- this chunk results in the stream position moving backwards,
+ 								so clear anything we're backing over
+ ----------------------------------------------------------------------------------------------*/
+-void GrSlotStream::MapOutputChunk(int islotOutputMin, int islotInputMin, int islotOutputLim,
++void GrSlotStream::MapOutputChunk(int islotOutputMin, int islotInputMin, int /*islotOutputLim*/,
+ 	bool fSkipChunkStart, int cslotReprocess, bool fBackingUp)
+ {
+ 	Assert(AssertValid());
+@@ -1863,7 +1872,11 @@ void GrSlotStream::MapOutputChunk(int is
+ 	Ensure that the chunk maps for a pair of streams match properly. The recipient is
+ 	the input stream.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void GrSlotStream::AssertChunkMapsValid(GrSlotStream * psstrmOut)
++#else
++void GrSlotStream::AssertChunkMapsValid(GrSlotStream * )
++#endif
+ {
+ #ifdef _DEBUG
+ 	GrSlotStream * psstrmIn = this;
+@@ -1915,7 +1928,11 @@ void GrSlotStream::AssertChunkMapsValid(
+ 	Ensure that corresponding items in the streams of a positioning pass have matching
+ 	stream indices. The recipient is the output stream.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void GrSlotStream::AssertStreamIndicesValid(GrSlotStream * psstrmIn)
++#else
++void GrSlotStream::AssertStreamIndicesValid(GrSlotStream * )
++#endif
+ {
+ #ifdef _DEBUG
+ 	if (!GotIndexOffset())
+@@ -1939,7 +1956,11 @@ void GrSlotStream::AssertStreamIndicesVa
+ 	in the output stream. (Currently the compiler ensures this by making it an error
+ 	to write rules that don't do this.)
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void GrSlotStream::AssertAttachmentsInOutput(int islotMin, int islotLim)
++#else
++void GrSlotStream::AssertAttachmentsInOutput(int , int )
++#endif
+ {
+ #ifdef _DEBUG
+ 	for (int islot = islotMin; islot < islotLim; islot++)
+@@ -2007,7 +2028,11 @@ void GrSlotStream::ResyncSkip(int cslot)
+ 	Record the number of slots in the stream that are previous to the official start of the
+ 	segment.
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void GrSlotStream::CalcIndexOffset(GrTableManager * ptman)
++#else
++void GrSlotStream::CalcIndexOffset(GrTableManager * )
++#endif
+ {
+ 	if (GotIndexOffset())
+ 		return; // already figured it
+@@ -2203,6 +2228,21 @@ GrSlotState * GrSlotStream::GetSlotAt(in
+ }
+ 
+ /*----------------------------------------------------------------------------------------------
++	In the middle of running a pass, return the given slot to use in processing.
++	Read it from the reprocess buffer if appropriate, or for slots previous to the current
++	position, read from the output stream (psstrmNext).
++
++	psstrmNext may be NULL when processing is complete, therefore we only have one stream to
++	deal with.
++----------------------------------------------------------------------------------------------*/
++GrSlotState * GrSlotStream::MidPassSlotAt(int islot, GrSlotStream * psstrmNext)
++{
++	int islotInput = islot - ReadPosForNextGet() + 1; // +1 because RuleInputSlot takes 0 to mean the previously read slot
++	GrSlotState * pslot = RuleInputSlot(islotInput, psstrmNext);
++	return pslot;
++}
++
++/*----------------------------------------------------------------------------------------------
+ 	Return the "current" input item from the rule's perspective, ie, the last slot read.
+ 	So dislotOffset = 0 means not the slot at the read position but one slot earlier.
+ 
+@@ -2214,7 +2254,6 @@ GrSlotState * GrSlotStream::GetSlotAt(in
+ 	@param fNullOkay	- true if it's okay to return NULL in the situation where we're asking
+ 							for something before the beginning of the stream
+ ----------------------------------------------------------------------------------------------*/
+-
+ GrSlotState * GrSlotStream::RuleInputSlot(int dislotOffset, GrSlotStream * psstrmOutput,
+ 	bool fNullOkay)
+ {
+@@ -2244,8 +2283,10 @@ GrSlotState * GrSlotStream::RuleInputSlo
+ 
+ 			if (cslotOffsetBack >= cslotPostReproc + cslotValidReproc)
+ 			{
+-				// Read from the output stream.
+-				int dislotTmp = dislotOffset - 1 + cslotPostReproc + cslotValidReproc;
++				// Read from the output stream. (Remember that PeekBack works relative to
++				// the rule-start write position, not the current write position.)
++				int dislotTmp = dislotOffset - 1 + cslotPostReproc
++					+ cslotValidReproc - SlotsToReprocess();
+ 				Assert(dislotTmp < 0);
+ 				return psstrmOutput->PeekBack(dislotTmp);
+ 			}
+@@ -2253,7 +2294,7 @@ GrSlotState * GrSlotStream::RuleInputSlo
+ 			{
+ 				if (m_islotReprocPos > -1)
+ 				{
+-					//	Current read pos is inside reprocess buffer.
++					//	Current read pos could be inside reprocess buffer.
+ 					Assert(cslotPostReproc == 0);
+ 					int islotStartReadReprocBuf = m_vpslotReproc.size() - cslotValidReproc;
+ 					Assert(islotStartReadReprocBuf >= 0);
+@@ -2342,9 +2383,10 @@ void GrSlotStream::SetNeutralAssociation
+ 			else if (pslotAfter)
+ 				pslot->Associate(pslotAfter);
+ 			else
++			{
+ 				// Weird, but can happen with an empty segment.
+ 				Warn("No assocations");
+-
++			}
+ //			Assert(pslot->m_vpslotAssoc.Size() > 0);
+ 			pslot->m_fNeutralAssocs = true;
+ 		}
+--- engine/src/segment/GrSlotStream.h.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/GrSlotStream.h
+@@ -107,7 +107,7 @@ public:
+ 		ReleaseSlots(0, m_vpslot.size());
+ 	}
+ 
+-	void ReleaseSlots(int islotMin, int islotLim)
++	void ReleaseSlots(int /*islotMin*/, int /*islotLim*/)
+ 	{
+ 		//	A slot stream is responsible for deleting the slot states that it created,
+ 		//	that is, the ones whose modified tag equals this stream's pass index.
+@@ -182,6 +182,7 @@ public:
+ 		return Peek(islot - ReadPosForNextGet());
+ 	}
+ 
++	//	Return the functional read position, taking into account the reprocess buffer.
+ 	int ReadPosForNextGet()
+ 	{
+ 		return ReadPos() - SlotsToReprocess();
+@@ -260,12 +261,16 @@ public:
+ 
+ 	void MarkFullyWritten();
+ 
++#ifdef NDEBUG
++	void SetSegMin(int islot, bool /*fAdjusting*/ = false)
++#else
+ 	void SetSegMin(int islot, bool fAdjusting = false)
++#endif
+ 	{
+ 		Assert(fAdjusting || m_islotSegMin == -1 || m_islotSegMin == islot);
+ 		m_islotSegMin = islot;
+ 	}
+-	void SetSegMinToWritePos(bool fMod = true)
++	void SetSegMinToWritePos(bool /*fMod*/ = true)
+ 	{
+ 		if (m_islotSegMin == -1)
+ 			m_islotSegMin = m_islotWritePos;
+@@ -456,6 +461,7 @@ public:
+ 		}
+ 	}
+ 
++	GrSlotState * MidPassSlotAt(int islot, GrSlotStream * psstrmNext = NULL);
+ 	GrSlotState * RuleInputSlot(int dislot = 0, GrSlotStream * psstrmOut = NULL,
+ 		bool fNullOkay = false);
+ 	GrSlotState * RuleOutputSlot(int dislot = 0);
+--- engine/src/segment/GrTableManager.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrTableManager.cpp
+@@ -25,8 +25,8 @@ Description:
+ DEFINE_THIS_FILE
+ #ifndef _WIN32
+ #include <stdlib.h>
+-#include <math.h>
+ #endif
++#include <math.h>
+ 
+ //:>********************************************************************************************
+ //:>	Forward declarations
+@@ -572,7 +572,7 @@ void GrTableManager::Run(Segment * psegN
+ 		else
+ 		{
+ 			Assert(!m_engst.m_fInsertedLB);
+-			Assert(islotUnderBreak == -1 || m_engst.m_fFinalLB);
++			//Assert(islotUnderBreak == -1 || m_engst.m_fFinalLB); -- no, ExtendGlyphIDOutput clearly sets islotUnderBreak regardless
+ 		}
+ 		int islotTmp = OutputStream(m_cpass - 1)->WritePos();
+ 		GrSlotState * pslotTmp;
+@@ -931,7 +931,7 @@ void GrTableManager::InitSegmentAsEmpty(
+ 	@param plbFound			- kind of line-break created
+ ----------------------------------------------------------------------------------------------*/
+ bool GrTableManager::Backtrack(int * pislotPrevBreak,
+-	LineBrk * plbMin, LineBrk lbMax, TrWsHandling twsh, bool fMoreText,
++	LineBrk * plbMin, LineBrk lbMax, TrWsHandling twsh, bool /*fMoreText*/,
+ 	int ichwCallerBtLim, bool fEndLine,
+ 	LineBrk * plbFound)
+ {
+@@ -1343,7 +1343,7 @@ LBackupPC:
+ 	Calculate the associations, and record the output slots in the segment.
+ ----------------------------------------------------------------------------------------------*/
+ void GrTableManager::RecordAssocsAndOutput(Font * pfont,
+-	Segment * pseg, bool fWidthIsCharCount,
++	Segment * pseg, bool /*fWidthIsCharCount*/,
+ 	TrWsHandling twsh, bool fParaRtl, int nDirDepth)
+ {
+ 	int cchwUnderlying = pseg->stopCharacter() - pseg->startCharacter();
+@@ -1362,7 +1362,7 @@ void GrTableManager::RecordAssocsAndOutp
+ #endif // OLD_TEST_STUFF
+ 
+ 	//	Make sure the final positions are set for every glyph.
+-	CalcPositionsUpTo(m_cpass-1, reinterpret_cast<GrSlotState *>(NULL),
++	CalcPositionsUpTo(m_cpass-1, reinterpret_cast<GrSlotState *>(NULL), false,
+ 		&xsTotalWidth, &xsVisWidth); 
+ 	pseg->SetWidths(xsVisWidth, xsTotalWidth);
+ 
+@@ -1377,7 +1377,7 @@ void GrTableManager::RecordAssocsAndOutp
+ 	Calculate the underlying-to-surface associations and ligature mappings.
+ 	Assumes the arrays have been properly initialized.
+ ----------------------------------------------------------------------------------------------*/
+-void GrTableManager::CalculateAssociations(Segment * pseg, int csloutSurface)
++void GrTableManager::CalculateAssociations(Segment * pseg, int /*csloutSurface*/)
+ {
+ 	GrSlotStream * psstrmFinal = OutputStream(m_cpass-1);
+ 
+@@ -2350,18 +2350,20 @@ bool GrTableManager::LoggingTransduction
+ 								final pass, but it could be another if positions are
+ 								requested by the rules themselves
+ 	@param pslotLast		- last slot that needs to be positioned, or NULL
++	@param fMidPass			- calculating the position of some slot in the middle of the pass
+ 	@param pxsWidth			- return the total width used so far
+ 	@param psxVisibleWidth	- return the visible width so far
+ 
+ 	MOVE to EngineState
+ ----------------------------------------------------------------------------------------------*/
+-void GrTableManager::CalcPositionsUpTo(int ipass, GrSlotState * pslotLast,
++void GrTableManager::CalcPositionsUpTo(int ipass, GrSlotState * pslotLast, bool fMidPass,
+ 	float * pxsWidth, float * pxsVisibleWidth)
+ {
+ 	Assert(ipass >= m_ipassPos1 - 1);
+ 
+ 	int isstrm = ipass;
+ 	GrSlotStream * psstrm = OutputStream(isstrm);
++	GrSlotStream * psstrmNext = (isstrm >= m_cpass - 1) ? NULL : OutputStream(isstrm + 1);
+ 	Assert(psstrm->GotIndexOffset());
+ 	if (psstrm->WritePos() <= psstrm->IndexOffset())
+ 	{
+@@ -2399,7 +2401,9 @@ void GrTableManager::CalcPositionsUpTo(i
+ 	//	to be later in the stream than the last actual slot passed in.
+ 	if (!psstrm->HasSlotAtPosPassIndex(pslotLast->AttachRootPosPassIndex()))
+ 		return;
+-	GrSlotState * pslotLastBase = pslotLast->Base(psstrm);
++	GrSlotState * pslotLastBase = (fMidPass && pslotLast->PosPassIndex() < psstrm->WritePos())
++		? pslotLast->Base(psstrmNext)
++		: pslotLast->Base(psstrm);
+ 
+ 	if (ipass == m_cpass - 1 && m_engst.m_islotPosNext > -1)
+ 	{
+@@ -2428,6 +2432,7 @@ void GrTableManager::CalcPositionsUpTo(i
+ 	}
+ 
+ 	std::vector<GrSlotState *> vpslotAttached;
++	std::vector<GrSlotStream *> vpsstrmAttached;
+ 
+ 	bool fRtl = RightToLeft();
+ 
+@@ -2435,13 +2440,24 @@ void GrTableManager::CalcPositionsUpTo(i
+ 	{
+ 		Assert(islot < psstrm->SlotsPresent());
+ 
+-		pslot = (isstrm == ipass) ?	psstrm->SlotAt(islot) :	psstrm->OutputSlotAt(islot);
++		GrSlotStream * psstrmThis = psstrm;
++		if (fMidPass && islot < psstrm->WritePos())
++		{
++			pslot = psstrm->MidPassSlotAt(islot, psstrmNext);
++			psstrmThis = psstrmNext;
++		}
++		else
++		{
++			//pslot = (isstrm == ipass) ?	psstrm->SlotAt(islot) :	psstrm->OutputSlotAt(islot);
++			pslot = psstrm->SlotAt(islot);
++		}
+ 
+ 		if (!pslot->IsBase())
+ 		{
+ 			//	This slot is attached to another; it will be positioned strictly
+ 			//	relative to that one. This happens in the loop below.
+ 			vpslotAttached.push_back(pslot);
++			vpsstrmAttached.push_back(psstrmThis);
+ 		}
+ 		else
+ 		{
+@@ -2455,7 +2471,7 @@ void GrTableManager::CalcPositionsUpTo(i
+ 			}
+ 
+ 			//	Make sure the metrics are the complete ones.
+-			pslot->CalcCompositeMetrics(this, psstrm, kPosInfinity, true);
++			pslot->CalcCompositeMetrics(this, psstrm, psstrmNext, kPosInfinity, true);
+ 
+ 			float xsInc = pslot->GlyphXOffset(psstrm, fakeItalicRatio);
+ 			float ysInc = pslot->GlyphYOffset(psstrm);
+@@ -2514,8 +2530,9 @@ void GrTableManager::CalcPositionsUpTo(i
+ 
+ 	for (size_t ipslot = 0; ipslot < vpslotAttached.size(); ipslot++)
+ 	{
+-		GrSlotState * pslot = vpslotAttached[ipslot];
+-		GrSlotState * pslotBase = pslot->Base(psstrm);
++		GrSlotState * pslotAtt = vpslotAttached[ipslot];
++		GrSlotStream * psstrmAtt = vpsstrmAttached[ipslot];
++		GrSlotState * pslotBase = pslotAtt->Base(psstrmAtt);
+ 		if (pslotBase->XPosition() == kNegInfinity || pslotBase->YPosition() == kNegInfinity)
+ 		{
+ 			Assert(false);
+@@ -2523,10 +2540,10 @@ void GrTableManager::CalcPositionsUpTo(i
+ 		}
+ 		float xsCluster = pslotBase->XPosition() - pslotBase->GlyphXOffset(psstrm, fakeItalicRatio);
+ 		float ysCluster = pslotBase->YPosition() - pslotBase->GlyphYOffset(psstrm);
+-		float xsInc = pslot->GlyphXOffset(psstrm, fakeItalicRatio);
+-		float ysInc = pslot->GlyphYOffset(psstrm);
+-		pslot->SetXPos(xsCluster + xsInc);
+-		pslot->SetYPos(ysCluster + ysInc);
++		float xsInc = pslotAtt->GlyphXOffset(psstrm, fakeItalicRatio);
++		float ysInc = pslotAtt->GlyphYOffset(psstrm);
++		pslotAtt->SetXPos(xsCluster + xsInc);
++		pslotAtt->SetYPos(ysCluster + ysInc);
+ 
+ 		//	My theory is that we don't need to adjust *pxsWidth here, because the width of
+ 		//	any non-base slots should be factored into the advance width of their cluster
+--- engine/src/segment/GrTableManager.h.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/GrTableManager.h
+@@ -442,7 +442,7 @@ public:
+ 	int LogToEmUnits(float xys);
+ 	bool GPointToXY(gid16 chwGlyphID, int nGPoint, float * xs, float * ys);
+ 
+-	void CalcPositionsUpTo(int ipass, GrSlotState * pslotLast,
++	void CalcPositionsUpTo(int ipass, GrSlotState * pslotLast, bool fMidPass,
+ 		float * pxsWidth, float * pxsVisibleWidth);
+ 
+ 	void InitPosCache()
+--- engine/src/segment/MemoryUsage.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/MemoryUsage.cpp
+@@ -11,10 +11,10 @@ Last reviewed: Not yet.
+ Description:
+     Calculates memory usage for the engine and segments.
+ ----------------------------------------------------------------------------------------------*/
+-
++#ifdef _MSC_VER
+ #pragma warning(disable: 4244)	// conversion from wchar_t to char
+ #pragma warning(disable: 4702)	// unreachable code
+-
++#endif
+ //:>********************************************************************************************
+ //:>	Include files
+ //:>********************************************************************************************
+@@ -54,8 +54,6 @@ Description:
+ #ifdef _MSC_VER
+ #pragma hdrstop
+ #endif
+-#undef THIS_FILE
+-DEFINE_THIS_FILE
+ 
+ //:End Ignore
+ 
+--- engine/src/segment/Platform.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/src/segment/Platform.cpp
+@@ -103,7 +103,7 @@ size_t utf16len(const utf16 *s)
+ {
+ 	// assumes NULL terminated strings
+ 	const utf16 *start = s;
+-	for (; *s; ++s);
++	for (; *s; ++s) {};
+ 	
+ 	return s - start;
+ }
+--- engine/src/segment/Segment.cpp.orig	2008-08-21 14:24:32 UTC
++++ engine/src/segment/Segment.cpp
+@@ -246,6 +246,8 @@ void Segment::Initialize(ITextSource * p
+ 
+ 	m_dxsVisibleWidth = -1;
+ 	m_dxsTotalWidth = -1;
++	m_ichwAssocsMin = 0;
++	m_ichwAssocsLim = 0;
+ 
+ //	m_psstrm = NULL;
+ 	m_prgslout = NULL;
+@@ -1178,7 +1180,7 @@ LineBrk Segment::getBreakWeight(int ich,
+ 	part of the segment.
+ ----------------------------------------------------------------------------------------------*/
+ float Segment::getRangeWidth(int ichMin, int ichLim,
+-	bool fStartLine, bool fEndLine, bool fSkipSpace)
++	bool /*fStartLine*/, bool /*fEndLine*/, bool fSkipSpace)
+ {
+ 	if (m_dxsWidth < 0)
+ 	{
+@@ -1549,7 +1551,11 @@ void Segment::ComputeOverhangs(float * p
+ void Segment::SetUpOutputArrays(Font * pfont, GrTableManager * ptman,
+ 	GrSlotStream * psstrmFinal,
+ 	int cchwInThisSeg, int csloutSurface, gid16 chwLB,
++#ifdef NDEBUG
++	TrWsHandling twsh, bool fParaRtl, int nDirDepth, bool /*fEmpty*/)
++#else
+ 	TrWsHandling twsh, bool fParaRtl, int nDirDepth, bool fEmpty)
++#endif
+ {
+ 	m_mFontEmUnits = EngineImpl()->GetFontEmUnits();
+ 
+@@ -1725,7 +1731,7 @@ void Segment::SetUpOutputArrays(Font * p
+ 	Set up the data structures that represent the actual rendered glyphs for the new segment.
+ ----------------------------------------------------------------------------------------------*/
+ void Segment::SetUpGlyphInfo(GrTableManager * ptman, GrSlotStream * psstrmFinal,
+-	gid16 chwLB, int nDirDepth, int islotMin, int cslot)
++	gid16 chwLB, int /*nDirDepth*/, int islotMin, int cslot)
+ {
+ 	//int paraDirLevel = (ptman->State()->ParaRightToLeft()) ? 1 : 0;
+ 
+@@ -1751,7 +1757,7 @@ void Segment::SetUpGlyphInfo(GrTableMana
+ 
+ 	m_isloutGinf0 = -1;
+ 	int iginf = 0;
+-	for (int islot = islotMin; islot < cslot; islot++)
++	for (islot = islotMin; islot < cslot; islot++)
+ 	{
+ 		GrSlotState * pslot = psstrmFinal->SlotAt(islot);
+ 
+@@ -2160,7 +2166,7 @@ void Segment::RecordLigature(int ichwUnd
+ 	@param ichwUnder		- character index relative to the official beginning of the segment
+ 	@param islot			- processed glyph it maps to
+ ----------------------------------------------------------------------------------------------*/
+-void Segment::MarkSlotInPrevSeg(int ichwUnder, int islot)
++void Segment::MarkSlotInPrevSeg(int ichwUnder, int /*islot*/)
+ {
+ 	if (ichwUnder >= m_ichwAssocsMin)
+ 		m_prgisloutBefore[ichwUnder - m_ichwAssocsMin] = kNegInfinity;
+@@ -2174,7 +2180,7 @@ void Segment::MarkSlotInPrevSeg(int ichw
+ 	@param ichwUnder		- character index relative to the official beginning of the segment
+ 	@param islot			- processed glyph it maps to
+ ----------------------------------------------------------------------------------------------*/
+-void Segment::MarkSlotInNextSeg(int ichwUnder, int islot)
++void Segment::MarkSlotInNextSeg(int ichwUnder, int /*islot*/)
+ {
+ 	if (ichwUnder < m_ichwAssocsLim)
+ 		m_prgisloutAfter[ichwUnder - m_ichwAssocsMin] = kPosInfinity;
+@@ -2351,7 +2357,7 @@ void Segment::SetJustifier(IGrJustifier 
+ 	@param pfAfter			- return true if they clicked on trailing side; possibly NULL
+ ----------------------------------------------------------------------------------------------*/
+ int Segment::LogicalSurfaceToUnderlying(int islout, float xsOffset, float ysClick,
+-	float dxsGlyphWidth, float dysGlyphHeight, bool * pfAfter)
++	float dxsGlyphWidth, float /*dysGlyphHeight*/, bool * pfAfter)
+ {
+ 	Assert(islout >= 0);
+ 	Assert(islout < m_cslout);
+@@ -2529,31 +2535,31 @@ int Segment::UnderlyingToLogicalSurface(
+ 	else if (fBefore)
+ 	{
+ 		int isloutRet;
+-		int ichw = ichwSegOffset;
++		int ichwTemp = ichwSegOffset;
+ 		//	If no association has been made, loop forward to the next slot
+ 		//	we are before. As a last resort, answer kPosInfinity, meaning we
+ 		//	aren't before anything.
+ 		do
+ 		{
+-			isloutRet = m_prgisloutBefore[ichw - m_ichwAssocsMin];
+-			do { ++ichw; }
+-			while (!GrCharStream::AtUnicodeCharBoundary(m_pgts, ichw));
+-		} while (isloutRet == kPosInfinity && ichw < m_ichwAssocsLim);
++			isloutRet = m_prgisloutBefore[ichwTemp - m_ichwAssocsMin];
++			do { ++ichwTemp; }
++			while (!GrCharStream::AtUnicodeCharBoundary(m_pgts, ichwTemp));
++		} while (isloutRet == kPosInfinity && ichwTemp < m_ichwAssocsLim);
+ 		return isloutRet;
+ 	}
+ 	else
+ 	{
+ 		int isloutRet;
+-		int ichw = ichwSegOffset;
++		int ichwTemp = ichwSegOffset;
+ 		//	If no association has been made, loop backward to the previous slot
+ 		//	we are after. As a last resort, answer kNegInfinity, meaning we
+ 		//	aren't after anything.
+ 		do
+ 		{
+-			isloutRet = m_prgisloutAfter[ichw - m_ichwAssocsMin];
+-			do { --ichw; }
+-			while (!GrCharStream::AtUnicodeCharBoundary(m_pgts, ichw));
+-		} while (isloutRet == kNegInfinity && ichw >= 0);
++			isloutRet = m_prgisloutAfter[ichwTemp - m_ichwAssocsMin];
++			do { --ichwTemp; }
++			while (!GrCharStream::AtUnicodeCharBoundary(m_pgts, ichwTemp));
++		} while (isloutRet == kNegInfinity && ichwTemp >= 0);
+ 		return isloutRet;
+ 	}
+ 	Assert(false); // should never reach here
+@@ -2748,7 +2754,11 @@ int Segment::SlotIsRightToLeft(GrSlotOut
+ 	that root glyph as one of its roots.
+ 	OBSOLETE
+ ----------------------------------------------------------------------------------------------*/
++#ifdef _DEBUG
+ void Segment::AssertValidClusters(GrSlotStream * psstrm)
++#else
++void Segment::AssertValidClusters(GrSlotStream * /*psstrm*/)
++#endif
+ {
+ #ifdef _DEBUG
+ 	for (int islot = 0; islot < psstrm->WritePos(); islot++)
+@@ -2980,9 +2990,10 @@ GrResult Segment::getUniscribeClusters(
+ 	return kresOk;
+ }
+ 
+-
++#ifdef __GNUC__
+ // suppress GCC 4.3 warning for optimized min()/max() when called with (ich, ich+1) or similar
+ #pragma GCC diagnostic ignored "-Wstrict-overflow"
++#endif
+ 
+ /*----------------------------------------------------------------------------------------------
+ 	Merge the given characters into the same Uniscribe cluster. This means merging any
+--- engine/src/segment/TransductionLog.cpp.orig	2009-01-28 02:01:29 UTC
++++ engine/src/segment/TransductionLog.cpp
+@@ -175,7 +175,7 @@ bool GrTableManager::WriteAssociationLog
+ 	Output a file showing a log of the transduction process and the resulting segment.
+ ----------------------------------------------------------------------------------------------*/
+ void GrTableManager::WriteXductnLog(std::ostream & strmOut,
+-	GrCharStream * pchstrm, Segment * psegRet,
++	GrCharStream * pchstrm, Segment * /*psegRet*/,
+ 	int cbPrevSegDat, byte * pbPrevSegDat)
+ {
+ 	if (cbPrevSegDat == 0)
+@@ -416,8 +416,8 @@ int GrCharStream::GetLogData(GrTableMana
+ 	the raw (UTF-16 or UTF-8) chars for display. To do this we get the raw characters
+ 	directly from the text source.
+ ----------------------------------------------------------------------------------------------*/
+-void GrCharStream::GetLogDataRaw(GrTableManager * ptman, int cchl, int cchrBackup,
+-	int cchrMaxRaw, int * prgchl,
++void GrCharStream::GetLogDataRaw(GrTableManager * /*ptman*/, int cchl, int cchrBackup,
++	int /*cchrMaxRaw*/, int * prgchl,
+ 	utf16 * prgchw2, utf16 * prgchw3, utf16 * prgchw4, utf16 * prgchw5, utf16 * prgchw6, 
+ 	int * prgcchr)
+ {
+@@ -441,7 +441,7 @@ void GrCharStream::GetLogDataRaw(GrTable
+ 	case kutf8:
+ 		prgchsRunText8 = new utf8[cchrRange];
+ 		m_pgts->fetch(ichrMin, cchrRange, prgchsRunText8);
+-		for (int ichr = 0; ichr < cchrRange; ichr++)
++		for (ichr = 0; ichr < cchrRange; ichr++)
+ 			prgchwRunText[ichr] = (utf16)prgchsRunText8[ichr];	// zero-extend into UTF-16 buffer
+ 		break;
+ 	case kutf16:
+@@ -634,7 +634,7 @@ void GrPass::LogRulesFiredAndFailed(std:
+ 	m_pzpst->LogRulesFiredAndFailed(strmOut, psstrmIn);
+ }
+ 
+-void PassState::LogRulesFiredAndFailed(std::ostream & strmOut, GrSlotStream * psstrmIn)
++void PassState::LogRulesFiredAndFailed(std::ostream & strmOut, GrSlotStream * /*psstrmIn*/)
+ {
+ 
+ 	strmOut << "PASS " << m_ipass << "\n\n" << "Rules matched: ";
+@@ -1193,7 +1193,7 @@ void Segment::LogSurfaceToUnderlying(GrT
+ 	if (fAnyPseudos)
+ 	{
+ 		strmOut << "Actual glyphs: ";
+-		for (int islout = 0; islout < m_cslout; islout++)
++		for (islout = 0; islout < m_cslout; islout++)
+ 		{
+ 			GrSlotOutput * psloutTmp = m_prgslout + islout;
+ 			if (psloutTmp->GlyphID() != psloutTmp->ActualGlyphForOutput(ptman))
+@@ -1319,7 +1319,7 @@ void GrTableManager::LogUnderlyingHeader
+ 	Write out the header lines for the slot contents.
+ ----------------------------------------------------------------------------------------------*/
+ void GrTableManager::LogSlotHeader(std::ostream & strmOut, int islotLim,
+-	int cspPerSlot, int cspLeading, int islotMin)
++	int /*cspPerSlot*/, int cspLeading, int islotMin)
+ {
+ 	islotLim = min(islotLim, MAX_SLOTS);
+ 
+@@ -1721,7 +1721,7 @@ void GrSlotState::LogSlotAttribute(GrTab
+ 
+ 	case kslatAttAtX:	// always do these in pairs
+ 	case kslatAttAtY:
+-		if (m_mAttachAtX != (pslotPrev ? pslotPrev->m_mAttachAtX : kNotYetSet) ||
++		if (m_mAttachAtX != (pslotPrev ? pslotPrev->m_mAttachAtX : static_cast<short>(kNotYetSet)) ||
+ 			m_mAttachAtY != (pslotPrev ? pslotPrev->m_mAttachAtY : 0))
+ 		{
+ 			ptman->LogInTable(strmOut,
+@@ -1730,7 +1730,7 @@ void GrSlotState::LogSlotAttribute(GrTab
+ 		}
+ 		break;
+ 	case kslatAttAtGpt:
+-		if (m_nAttachAtGpoint != (pslotPrev ? pslotPrev->m_nAttachAtGpoint : kNotYetSet))
++		if (m_nAttachAtGpoint != (pslotPrev ? pslotPrev->m_nAttachAtGpoint : static_cast<short>(kNotYetSet)))
+ 		{
+ 			ptman->LogInTable(strmOut,
+ 				((m_nAttachAtGpoint == kGpointZero) ? 0 : m_nAttachAtGpoint));
+@@ -1750,7 +1750,7 @@ void GrSlotState::LogSlotAttribute(GrTab
+ 
+ 	case kslatAttWithX:	// always do these in pairs
+ 	case kslatAttWithY:
+-		if (m_mAttachWithX != (pslotPrev ? pslotPrev->m_mAttachWithX : kNotYetSet) ||
++		if (m_mAttachWithX != (pslotPrev ? pslotPrev->m_mAttachWithX : static_cast<short>(kNotYetSet)) ||
+ 			m_mAttachWithY != (pslotPrev ? pslotPrev->m_mAttachWithY : 0))
+ 		{
+ 			ptman->LogInTable(strmOut,
+@@ -1759,7 +1759,7 @@ void GrSlotState::LogSlotAttribute(GrTab
+ 		}
+ 		break;
+ 	case kslatAttWithGpt:
+-		if (m_nAttachWithGpoint != (pslotPrev ? pslotPrev->m_nAttachWithGpoint : kNotYetSet))
++		if (m_nAttachWithGpoint != (pslotPrev ? pslotPrev->m_nAttachWithGpoint : static_cast<short>(kNotYetSet)))
+ 		{
+ 			ptman->LogInTable(strmOut,
+ 				((m_nAttachWithGpoint == kGpointZero) ? 0 : m_nAttachWithGpoint));
+@@ -1786,14 +1786,14 @@ void GrSlotState::LogSlotAttribute(GrTab
+ 		break;
+ 
+ 	case kslatBreak:
+-		if (m_lb != (pslotPrev ? pslotPrev->m_lb : kNotYetSet8))
++		if (m_lb != (pslotPrev ? pslotPrev->m_lb : static_cast<sdata8>(kNotYetSet8)))
+ 		{
+ 			ptman->LogBreakWeightInTable(strmOut, m_lb);
+ 			return;
+ 		}
+ 		break;
+ 	case kslatDir:
+-		if (m_dirc != (pslotPrev ? pslotPrev->m_dirc : kNotYetSet8))
++		if (m_dirc != (pslotPrev ? pslotPrev->m_dirc : static_cast<sdata8>(kNotYetSet8)))
+ 		{
+ 			ptman->LogDirCodeInTable(strmOut, m_dirc);
+ 			return;
+--- engine/test/ProfileHarness/GrUtfTextSrc.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/test/ProfileHarness/GrUtfTextSrc.cpp
+@@ -210,12 +210,12 @@ size_t GrUtfTextSrc::fetch(gr::toffset i
+ }
+ 
+ 
+-bool GrUtfTextSrc::getRightToLeft(gr::toffset ich)
++bool GrUtfTextSrc::getRightToLeft(gr::toffset /*ich*/)
+ {
+ 	return mRtl; // assumes src only contains one direction
+ }
+ 
+-unsigned int GrUtfTextSrc::getDirectionDepth(gr::toffset ich)
++unsigned int GrUtfTextSrc::getDirectionDepth(gr::toffset /*ich*/)
+ {
+ 	return (mRtl) ? 1 : 0; // TBD
+ }
+@@ -254,7 +254,7 @@ std::pair<gr::toffset, gr::toffset> GrUt
+ 	return range;
+ }
+ 	
+-size_t GrUtfTextSrc::getFontFeatures(gr::toffset ich, gr::FeatureSetting * prgfset)
++size_t GrUtfTextSrc::getFontFeatures(gr::toffset /*ich*/, gr::FeatureSetting * /*prgfset*/)
+ {
+ 	return 0;
+ }
+@@ -277,14 +277,14 @@ void GrUtfTextSrc::getColors(gr::toffset
+ 
+ // these should be called I hope
+ float
+-GrUtfTextSrc::getFontSize(gr::toffset ich)
++GrUtfTextSrc::getFontSize(gr::toffset /*ich*/)
+ {
+ 	assert(mFont);
+ 	return mPointSize;
+ }
+ 
+ bool
+-GrUtfTextSrc::getBold(gr::toffset ich)
++GrUtfTextSrc::getBold(gr::toffset /*ich*/)
+ {
+ 	assert(mFont);
+ //	NS_ASSERTION(false, "unexpected call to getBold");
+@@ -293,7 +293,7 @@ GrUtfTextSrc::getBold(gr::toffset ich)
+ }
+ 
+ bool
+-GrUtfTextSrc::getItalic(gr::toffset ich)
++GrUtfTextSrc::getItalic(gr::toffset /*ich*/)
+ {
+ 	assert(mFont);
+ 	//NS_ASSERTION(false, "unexpected call to getItalic");
+@@ -301,7 +301,7 @@ GrUtfTextSrc::getItalic(gr::toffset ich)
+ 	return mFont->italic();
+ }
+ 
+-gr::isocode GrUtfTextSrc::getLanguage(gr::toffset ich)
++gr::isocode GrUtfTextSrc::getLanguage(gr::toffset /*ich*/)
+ {
+   gr::isocode unknown;
+   std::fill_n(unknown.rgch, 4, '\0');
+--- engine/test/ProfileHarness/GrUtfTextSrc.h.orig	2009-01-21 22:36:42 UTC
++++ engine/test/ProfileHarness/GrUtfTextSrc.h
+@@ -79,7 +79,7 @@ public:
+   virtual size_t fetch(gr::toffset ichMin, size_t cch, gr::utf32 * prgchBuffer);
+   virtual size_t fetch(gr::toffset ichMin, size_t cch, gr::utf16 * prgchwBuffer);
+   virtual size_t fetch(gr::toffset ichMin, size_t cch, gr::utf8  * prgchsBuffer);
+-  virtual gr::GrResult getFaceName(int ich, unsigned int cchMax,
++  virtual gr::GrResult getFaceName(int /*ich*/, unsigned int /*cchMax*/,
+     gr::utf16 * prgchFaceName, unsigned int * pcchLen) 
+   {
+     prgchFaceName[0] = 0;
+@@ -92,12 +92,12 @@ public:
+   virtual bool getItalic(gr::toffset ich);
+   virtual bool getRightToLeft(gr::toffset ich);
+   virtual unsigned int getDirectionDepth(gr::toffset ich);
+-  virtual float getVerticalOffset(gr::toffset ich) { return 0;};
++  virtual float getVerticalOffset(gr::toffset /*ich*/) { return 0;};
+   virtual gr::isocode getLanguage(gr::toffset ich);
+ 
+   virtual std::pair<gr::toffset, gr::toffset> propertyRange(gr::toffset ich);
+   virtual size_t getFontFeatures(gr::toffset ich, gr::FeatureSetting * prgfset);
+-  virtual bool sameSegment(gr::toffset ich1, gr::toffset ich2) { return true; };
++  virtual bool sameSegment(gr::toffset /*ich1*/, gr::toffset /*ich2*/) { return true; };
+ 
+ protected:
+   bool checkBuffer8();
+@@ -129,11 +129,11 @@ public: // methods that will go
+   virtual void getColors(gr::toffset ich, int * pclrFore, int * pclrBack);
+ 
+   // Shouldn't be here!  
+-  virtual gr::GrResult Fetch(int ichMin, int ichLim, gr::utf16 * prgchBuf) { return gr::kresNotImpl; };
+-  virtual gr::GrResult get_Length(int * pcch) { return gr::kresNotImpl; };
+-  virtual gr::GrResult GetFontVariations(int ich,
+-    wchar_t * prgchFontVar, int ichMax, int * pich,
+-    int * pichMin, int * pichLim) { return gr::kresNotImpl; };
++  virtual gr::GrResult Fetch(int /*ichMin*/, int /*ichLim*/, gr::utf16 * /*prgchBuf*/) { return gr::kresNotImpl; };
++  virtual gr::GrResult get_Length(int * /*pcch*/) { return gr::kresNotImpl; };
++  virtual gr::GrResult GetFontVariations(int /*ich*/,
++    wchar_t * /*prgchFontVar*/, int /*ichMax*/, int * /*pich*/,
++    int * /*pichMin*/, int * /*pichLim*/) { return gr::kresNotImpl; };
+ 
+ };
+ 
+--- engine/test/ProfileHarness/ProfileHarness.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/test/ProfileHarness/ProfileHarness.cpp
+@@ -39,14 +39,14 @@ diagnostic log of the segment creation i
+ typedef std::pair< gr::GlyphIterator, gr::GlyphIterator > GlyphRange;
+ 
+ #ifndef HAVE_STRTOF
+-float strtof(char * text, char ** ignore)
++float strtof(char * text, char ** /*ignore*/)
+ {
+   return static_cast<float>(atof(text));
+ }
+ #endif
+ 
+ #ifndef HAVE_STRTOL
+-long strtol(char * text, char ** ignore)
++long strtol(char * text, char ** /*ignore*/)
+ {
+   return atol(text);
+ }
+--- engine/test/RegressionTest/GrJustifier.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/test/RegressionTest/GrJustifier.cpp
+@@ -16,8 +16,9 @@ Description:
+ //:>	Include files
+ //:>********************************************************************************************
+ //#include "main.h" // This is used by clients, so main.h is not available
+-
++#ifdef _MSC_VER
+ #pragma hdrstop
++#endif
+ // any other headers (not precompiled)
+ #include "GrClient.h"
+ #include "ITextSource.h"
+@@ -31,9 +32,6 @@ Description:
+ #include <string>
+ #endif
+ 
+-#undef THIS_FILE
+-DEFINE_THIS_FILE
+-
+ //:>********************************************************************************************
+ //:>	Global constants
+ //:>********************************************************************************************
+@@ -327,9 +325,9 @@ LMainLoop:
+ 					&dxStretchAchieved);
+ 				for (int iiiGlyph = 0; iiiGlyph < cStretchable; iiiGlyph++)
+ 				{
+-					int iiGlyph = viiGlyphsRem[iiiGlyph];
+-					vdxStretchLeft[iiGlyph] = vdxStretchRem[iiiGlyph];
+-					vdxWidth[iiGlyph] = vdxWidthRem[iiiGlyph];
++					int ivGlyph = viiGlyphsRem[iiiGlyph];
++					vdxStretchLeft[ivGlyph] = vdxStretchRem[iiiGlyph];
++					vdxWidth[ivGlyph] = vdxWidthRem[iiiGlyph];
+ 				}
+ 			}
+ 			else
+@@ -366,12 +364,12 @@ LMainLoop:
+ 	{
+ #ifdef WIN32
+ 		wchar_t rgchw[20];
+-		std::fill_n(rgchw, 20, 0);
++		std::fill_n(rgchw, 20, L'\0');
+ 		_itow(dxStretchNeeded - dxStretchAchieved, rgchw, 10);
+ 		std::wstring strTmp(L"justification failed by ");
+ 		strTmp += rgchw;
+ 		strTmp += L" units (width needed = ";
+-		std::fill_n(rgchw, 10, 0);
++		std::fill_n(rgchw, 10, L'\0');
+ 		_itow(dxDesiredWidth, rgchw, 10);
+ 		strTmp += rgchw;
+ 		strTmp += L")\n";
+--- engine/test/RegressionTest/GrJustifier.h.orig	2009-01-21 22:36:42 UTC
++++ engine/test/RegressionTest/GrJustifier.h
+@@ -11,7 +11,9 @@ Last reviewed: Not yet.
+ Description:
+ 	A default justification agent for Graphite.
+ -------------------------------------------------------------------------------*//*:End Ignore*/
++#ifdef _MSC_VER
+ #pragma once
++#endif
+ #ifndef GRJUSTIFIER_INCLUDED
+ #define GRJUSTIFIER_INCLUDED
+ 
+--- engine/test/RegressionTest/RegressionTest.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/test/RegressionTest/RegressionTest.cpp
+@@ -675,7 +675,7 @@ void OutputErrorWithValues(TestCase * pt
+ 	OutputErrorAux(ptcase, strErr, i, true, valueFound, valueExpected);
+ }
+ 
+-void OutputErrorAux(TestCase * ptcase, std::string strErr, int i,
++void OutputErrorAux(TestCase * /*ptcase*/, std::string strErr, int i,
+ 	bool showValues, int valueFound, int valueExpected)
+ {
+ //	if (g_debugMode)
+--- engine/test/RegressionTest/SimpleTextSrc.cpp.orig	2009-01-21 22:36:42 UTC
++++ engine/test/RegressionTest/SimpleTextSrc.cpp
+@@ -15,7 +15,9 @@ Description:
+ //:>********************************************************************************************
+ //:>	Include files
+ //:>********************************************************************************************
++#ifdef _MSC_VER
+ #pragma hdrstop
++#endif
+ // any other headers (not precompiled)
+ 
+ #include "GrClient.h"
+@@ -23,9 +25,6 @@ Description:
+ #include "ITextSource.h"
+ #include "SimpleTextSrc.h"
+ 
+-#undef THIS_FILE
+-DEFINE_THIS_FILE
+-
+ //:>********************************************************************************************
+ //:>	Initialization and destruction
+ //:>********************************************************************************************
+@@ -70,7 +69,7 @@ size_t SimpleTextSrc::fetch(toffset ichM
+ /*----------------------------------------------------------------------------------------------
+ 	Return true if the text uses a right-to-left writing system.
+ ----------------------------------------------------------------------------------------------*/
+-bool SimpleTextSrc::getRightToLeft(toffset ich)
++bool SimpleTextSrc::getRightToLeft(toffset /*ich*/)
+ {
+ 	return false;
+ }
+@@ -78,7 +77,7 @@ bool SimpleTextSrc::getRightToLeft(toffs
+ /*----------------------------------------------------------------------------------------------
+ 	Return the depth of embedding of the writing system.
+ ----------------------------------------------------------------------------------------------*/
+-unsigned int SimpleTextSrc::getDirectionDepth(toffset ich)
++unsigned int SimpleTextSrc::getDirectionDepth(toffset /*ich*/)
+ {
+ 	return 0;
+ }
+@@ -87,7 +86,7 @@ unsigned int SimpleTextSrc::getDirection
+ 	Return the vertical offset of the text. This simple implementation provides no
+ 	vertical offset.
+ ----------------------------------------------------------------------------------------------*/
+-float SimpleTextSrc::getVerticalOffset(toffset ich)
++float SimpleTextSrc::getVerticalOffset(toffset /*ich*/)
+ {
+ 	return 0;
+ }
+--- engine/test/RegressionTest/SimpleTextSrc.h.orig	2009-01-21 22:36:42 UTC
++++ engine/test/RegressionTest/SimpleTextSrc.h
+@@ -11,7 +11,9 @@ Last reviewed: Not yet.
+ Description:
+ 	A simple text source that shows how to use this interface within Graphite.
+ -------------------------------------------------------------------------------*//*:End Ignore*/
++#ifdef _MSC_VER
+ #pragma once
++#endif
+ #ifndef GRTXTSRC_INCLUDED
+ #define GRTXTSRC_INCLUDED
+ 
+@@ -59,12 +61,12 @@ public:
+ 	{
+ 		return m_cchLength;
+ 	}
+-	virtual size_t fetch(toffset ichMin, size_t cch, utf32 * prgchBuffer)
++	virtual size_t fetch(toffset /*ichMin*/, size_t /*cch*/, utf32 * /*prgchBuffer*/)
+ 	{
+ 		throw;
+ 	}
+ 	virtual size_t fetch(toffset ichMin, size_t cch, gr::utf16 * prgchwBuffer);
+-	virtual size_t fetch(toffset ichMin, size_t cch, utf8  * prgchsBuffer)
++	virtual size_t fetch(toffset /*ichMin*/, size_t /*cch*/, utf8  * /*prgchsBuffer*/)
+ 	{
+ 		throw;
+ 	};
+@@ -73,14 +75,14 @@ public:
+ 	virtual unsigned int getDirectionDepth(toffset ich);
+ 	virtual float getVerticalOffset(toffset ich);
+ 
+-	virtual isocode getLanguage(toffset ich)
++	virtual isocode getLanguage(toffset /*ich*/)
+ 	{
+ 		isocode ret;
+ 		ret.rgch[0] = 'e'; ret.rgch[1] = 'n'; ret.rgch[2] = 0; ret.rgch[3] = 0;
+ 		return ret;
+ 	}
+ 
+-	virtual std::pair<toffset, toffset> propertyRange(toffset ich)
++	virtual std::pair<toffset, toffset> propertyRange(toffset /*ich*/)
+ 	{
+ 		std::pair<toffset, toffset> pairRet;
+ 		pairRet.first = 0;
+@@ -88,16 +90,16 @@ public:
+ 		return pairRet;
+ 	}
+ 
+-	virtual size_t getFontFeatures(toffset ich, FeatureSetting * prgfset)
++	virtual size_t getFontFeatures(toffset /*ich*/, FeatureSetting * /*prgfset*/)
+ 	{
+ 		return 0; // no features in this simple implementation
+ 	}
+-	virtual bool sameSegment(toffset ich1, toffset ich2)
++	virtual bool sameSegment(toffset /*ich1*/, toffset /*ich2*/)
+ 	{
+ 		return true;
+ 	}
+ 
+-	virtual void getColors(toffset ich, int * pclrFore, int * pclrBack)
++	virtual void getColors(toffset /*ich*/, int * pclrFore, int * pclrBack)
+ 	{
+ 		*pclrFore = kclrBlack;
+ 		*pclrBack = kclrTransparent;
+--- wrappers/win32/WinFont.cpp.orig	2009-01-29 08:33:19 UTC
++++ wrappers/win32/WinFont.cpp
+@@ -70,6 +70,7 @@ WinFont::WinFont(HDC hdc)
+ 	// But don't store m_hfont, because we don't really "own" it; the client is
+ 	// responsible for releasing it.
+ 	m_hfont = 0;
++    m_pGlyphMetricMap = NULL;
+ 	memset(&m_fpropSet, 0, sizeof(m_fpropSet));
+ 
+ 	m_pbCmapTbl = NULL;
+@@ -196,6 +197,7 @@ WinFont::WinFont(WinFont & font)
+ 	m_hdc = 0;
+ 	m_hfont = 0;
+ 	m_hfontClient = 0;
++    m_pGlyphMetricMap = NULL;
+ 	memset(&m_fpropSet, 0, sizeof(FontProps));
+ 
+ 	m_pbCmapTbl = NULL;
+@@ -408,7 +410,7 @@ void WinFont::getGlyphPoint(gid16 gid, u
+ 					if (pPolyCurve->wType == TT_PRIM_QSPLINE &&
+ 						// test if this is the last curve
+ 						pPolyHdr->cb - (int)((byte *)(&pPolyCurve->apfx[j]) - (byte *)(pPolyHdr))
+-							== sizeof POINTFX &&
++							== sizeof (POINTFX) &&
+ 						// and the two points are identical
+ 						CompareFixed(pPolyCurve->apfx[j].x, pPolyHdr->pfxStart.x) &&
+ 						CompareFixed(pPolyCurve->apfx[j].y, pPolyHdr->pfxStart.y))
+@@ -457,6 +459,16 @@ void WinFont::getGlyphPoint(gid16 gid, u
+ ----------------------------------------------------------------------------------------------*/
+ void WinFont::getGlyphMetrics(gid16 chw, gr::Rect & boundingBox, gr::Point & advances)
+ {
++    if (m_pGlyphMetricMap)
++    {
++        GlyphMetricMap::iterator i = m_pGlyphMetricMap->find(chw);
++        if (i != m_pGlyphMetricMap->end())
++        {
++            boundingBox = i->second.first;
++            advances = i->second.second;
++            return;
++        }
++    }
+ 	GLYPHMETRICS gm;
+ 	const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}};
+ 	if (GDI_ERROR == ::GetGlyphOutline(m_hdc, chw, GGO_GLYPH_INDEX | GGO_METRICS,
+@@ -474,6 +486,10 @@ void WinFont::getGlyphMetrics(gid16 chw,
+ 	boundingBox.bottom = (float)gm.gmptGlyphOrigin.y - gm.gmBlackBoxY;
+ 	advances.x = gm.gmCellIncX;
+ 	advances.y = gm.gmCellIncY;
++    if (m_pGlyphMetricMap)
++    {
++        (*m_pGlyphMetricMap)[chw] = std::pair<gr::Rect,gr::Point>(boundingBox, advances);
++    }
+ }
+ 
+ /*----------------------------------------------------------------------------------------------
+@@ -618,7 +634,10 @@ GrResult WinFont::SetInternalFont(unsign
+ 
+ 		static int cCreateFontCalls = 0;
+ 		static int cCreateFontZero = 0;
+-		HFONT hfont = g_fhc.GetFont(lf);
++        FontHandleCache::FontCacheValue cache = g_fhc.GetCache(lf);
++        HFONT hfont = cache.hfont;
++        m_pGlyphMetricMap = cache.pGlyphMetricMap;
++		//HFONT hfont = g_fhc.GetFont(lf);
+ 		//char ch1[200];
+ 		//if (hfont == 0)
+ 		//{
+@@ -731,7 +750,7 @@ WinFont::FontHandleCache::~FontHandleCac
+ 	@param lf LOGFONT value that describes the desired font
+ 	@return Font handle
+ ----------------------------------------------------------------------------------------------*/
+-HFONT WinFont::FontHandleCache::GetFont(LOGFONT & lf)
++WinFont::FontHandleCache::FontCacheValue WinFont::FontHandleCache::GetCache(LOGFONT & lf)
+ {
+ 	FontCacheValue fcv;
+ 	FontHandleHashMap::iterator itFound = m_hmlffcv.find(lf);
+@@ -752,11 +771,12 @@ HFONT WinFont::FontHandleCache::GetFont(
+ 			THROW(kresFail);
+ 
+ 		fcv.nRefs = 1;
++        fcv.pGlyphMetricMap = new GlyphMetricMap();
+ 
+ 		m_hmlffcv.insert(std::pair<LOGFONT, FontCacheValue>(lf, fcv));
+ 	}
+ 
+-	return fcv.hfont;
++	return fcv;
+ }
+ 
+ /*----------------------------------------------------------------------------------------------
+@@ -767,7 +787,7 @@ HFONT WinFont::FontHandleCache::GetFont(
+ ----------------------------------------------------------------------------------------------*/
+ void WinFont::FontHandleCache::DeleteFont(HFONT hfont)
+ {
+-	if (!hfont || !m_bValid)
++	if (!hfont || !m_bValid || m_hmlffcv.size() == 0)
+ 		return;
+ 
+ 	// find the font in the hash map
+@@ -782,6 +802,8 @@ void WinFont::FontHandleCache::DeleteFon
+ 			{
+ 				// delete font
+ 				::DeleteObject(hfont);
++                if (fcv.pGlyphMetricMap)
++                    delete fcv.pGlyphMetricMap;
+ 				m_hmlffcv.erase(it);
+ 			}
+ 			else
+@@ -832,7 +854,8 @@ size_t WinFont::LogFontHashFuncs::operat
+ bool WinFont::LogFontHashFuncs::operator() (const WinFont::LogFontWrapper & key1,
+ 	const WinFont::LogFontWrapper & key2) const
+ {
+-	return (key1 == key2);
++    // return true if key1 should be ordered before key2
++    return (operator()(key1) < operator()(key2));
+ }
+ 
+ /*--------------------------------------------------------------------------------------
+--- wrappers/win32/WinFont.h.orig	2009-01-29 08:33:19 UTC
++++ wrappers/win32/WinFont.h
+@@ -26,9 +26,15 @@ Description:
+ #include "GrDebug.h"
+ #include "GrClient.h"
+ #include "Font.h"
++#include <map>
++
++#ifdef _STLPORT_VERSION
++namespace stdext = _STLP_STD;
++#endif
+ 
+ namespace gr
+ {
++typedef std::map<gid16, std::pair<gr::Rect, gr::Point> > GlyphMetricMap;
+ 
+ class FontFace;
+ 
+@@ -100,6 +106,7 @@ protected:
+ 	HFONT m_hfontClient;	// need to replace this HFONT into the DC when we are finished
+ 							// with it
+ 
++    GlyphMetricMap * m_pGlyphMetricMap;
+ 	// Debugging:
+ 	//OLECHAR m_rgchTemp[32];
+ 
+@@ -185,11 +192,13 @@ protected:
+ 	class FontHandleCache // hungarian: fhc
+ 	{
+ 	public:
+-		struct FontCacheValue
++        struct FontCacheValue
+ 		{
+ 			int nRefs;   // reference count
+ 			HFONT hfont; // font handle
+ 
++            GlyphMetricMap * pGlyphMetricMap; // glyph metrics
++
+ 			bool operator==(const FontCacheValue & val) const
+ 			{
+ 				return (hfont == val.hfont);
+@@ -199,7 +208,8 @@ protected:
+         FontHandleCache() : m_bValid(true) {};
+ 		~FontHandleCache();
+ 
+-		HFONT GetFont(LOGFONT & lf);
++		//HFONT GetFont(LOGFONT & lf);
++        FontCacheValue GetCache(LOGFONT & lf);
+ 		void DeleteFont(HFONT hfont);
+ 
+ 		typedef stdext::hash_map<LogFontWrapper, FontCacheValue, LogFontHashFuncs> FontHandleHashMap;
+--- wrappers/win32/win32_dll.cpp.orig	2008-05-09 11:10:30 UTC
++++ wrappers/win32/win32_dll.cpp
+@@ -14,7 +14,7 @@ HMODULE Win32DllGetModuleHandle()
+ 	DllMain. This is the main DLL entry point for a non-MFC DLL. For an MFC DLL, DllMain is
+ 		in DllModul.cpp. Both DllMains call ModuleEntry::DllMain.
+ ----------------------------------------------------------------------------------------------*/
+-extern "C" BOOL WINAPI DllMain(HMODULE hmod, DWORD dwReason, PVOID pvReserved)
++extern "C" BOOL WINAPI DllMain(HMODULE hmod, DWORD dwReason, PVOID /*pvReserved*/)
+ {
+ 	bool fRet = true;
+ 


Property changes on: trunk/graphics/silgraphite/files/patch-openoffice-silgraphite
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/graphics/silgraphite/pkg-descr
===================================================================
--- trunk/graphics/silgraphite/pkg-descr	                        (rev 0)
+++ trunk/graphics/silgraphite/pkg-descr	2015-07-09 21:09:08 UTC (rev 19567)
@@ -0,0 +1,9 @@
+Graphite is a project under development within SIL'ss Non-Roman Script
+Initiative and Language Software Development groups to provide rendering
+capabilities for complex non-Roman writing systems.  The original goal was a
+system for the Windows platform; the system has also been ported to Linux.
+Graphite can be used to create "smart fonts" capable of displaying writing
+systems with various complex behaviors.  With respect to the Text Encoding
+Model, Graphite handles the "Rendering" aspect of writing system implementation.
+
+WWW: http://silgraphite.sourceforge.net/


Property changes on: trunk/graphics/silgraphite/pkg-descr
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property
Added: trunk/graphics/silgraphite/pkg-plist
===================================================================
--- trunk/graphics/silgraphite/pkg-plist	                        (rev 0)
+++ trunk/graphics/silgraphite/pkg-plist	2015-07-09 21:09:08 UTC (rev 19567)
@@ -0,0 +1,34 @@
+include/graphite/FileFont.h
+include/graphite/Font.h
+%%FREETYPE%%include/graphite/FreetypeFont.h
+include/graphite/GrAppData.h
+include/graphite/GrClient.h
+include/graphite/GrCommon.h
+include/graphite/GrConstants.h
+include/graphite/GrData.h
+include/graphite/GrDebug.h
+include/graphite/GrExt.h
+include/graphite/GrFeature.h
+include/graphite/GrMstypes.h
+include/graphite/GrPlatform.h
+include/graphite/GrResult.h
+include/graphite/GrStructs.h
+include/graphite/GrWrappers.h
+include/graphite/GraphiteProcess.h
+include/graphite/IGrEngine.h
+include/graphite/IGrJustifier.h
+include/graphite/IGraphiteProcess.h
+include/graphite/ITextSource.h
+include/graphite/MemoryUsage.h
+include/graphite/Segment.h
+include/graphite/SegmentAux.h
+include/graphite/SegmentPainter.h
+lib/libgraphite.a
+lib/libgraphite.so
+lib/libgraphite.so.3
+lib/libgraphite.so.3.0.0
+%%FREETYPE%%lib/libgraphite-ft.a
+%%FREETYPE%%lib/libgraphite-ft.so
+%%FREETYPE%%lib/libgraphite-ft.so.0
+%%FREETYPE%%lib/libgraphite-ft.so.0.0.0
+libdata/pkgconfig/silgraphite.pc


Property changes on: trunk/graphics/silgraphite/pkg-plist
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+text/plain
\ No newline at end of property


More information about the Midnightbsd-cvs mailing list