--- misc/silgraphite-2.3.1/engine/include/graphite/GrCommon.h	Thu Jan 22 00:36:40 2009
+++ misc/build/silgraphite-2.3.1/engine/include/graphite/GrCommon.h	Sat Aug 22 19:36:32 2009
@@ -18,6 +18,8 @@
 #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 @@
 #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 @@
 // 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"
--- misc/silgraphite-2.3.1/engine/include/graphite/GrMstypes.h	Thu Jan 22 00:36:40 2009
+++ misc/build/silgraphite-2.3.1/engine/include/graphite/GrMstypes.h	Sat Aug 22 19:36:32 2009
@@ -24,11 +24,11 @@
 
 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;
 }
 
--- misc/silgraphite-2.3.1/engine/makefile.vc7	Thu Aug 21 16:24:32 2008
+++ misc/build/silgraphite-2.3.1/engine/makefile.vc7	Sat Aug 22 19:36:32 2009
@@ -48,11 +48,7 @@
 CPP_DEBUG=/D "TRACING" $(CPP_DEBUG)
 !ENDIF
 
-!IF "$(OS)" == "Windows_NT"
 NULL=
-!ELSE 
-NULL=nul
-!ENDIF
 
 clean :
     @- rd /s/q .\release_temp
--- misc/silgraphite-2.3.1/engine/makefile.vc8	Sat Aug 22 21:58:25 2009
+++ misc/build/silgraphite-2.3.1/engine/makefile.vc8	Sat Aug 22 21:57:42 2009
@@ -2,11 +2,16 @@
 TARGET=graphite
 
 CPP=cl.exe
-CPPFLAGS=/Zc:wchar_t- /nologo /W4 /GR /EHsc /I "./src/font" /I "./src/painter" /I "./src/segment" /I "./src/textsource" /I "./src/generic" /I "./include/graphite" /I "../wrappers/win32" /D "GR_NAMESPACE" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "TRACING"  /Fp"$(INTDIR)\graphite.pch" /Fd"$(INTDIR)\\" /FD /c
+### HDU: disabled building with the normal compile flags
+###CPPFLAGS= /Zc:wchar_t- /nologo /W4 /GR /EHsc /I "./src/font" /I "./src/painter" /I "./src/segment" /I "./src/textsource" /I "./src/generic" /I "./include/graphite" /I "../wrappers/win32" /D "GR_NAMESPACE" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "TRACING"  /Fp"$(INTDIR)\graphite.pch" /Fd"$(INTDIR)\\" /FD /c
+### HDU: because for full binary compatibility with the rest of OOo all compile flags must match exactly
+###       which is especially true for template-heavy C++ code with non-default config (e.g. _STLP_DEBUG enabled)
+CPPFLAGS= $(CFLAGS4MSC) /nologo /W4 /I "./src/font" /I "./src/painter" /I "./src/segment" /I "./src/textsource" /I "./src/generic" /I "./include/graphite" /I "../wrappers/win32" /D "GR_NAMESPACE" /D "WIN32" /D "_WINDOWS" /D "_UNICODE" /D "UNICODE" /D "TRACING"  /Fp"$(INTDIR)\graphite.pch" /FD /c
+
 # /Wp62
 
 LINK=link.exe
-LINK_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /dll /pdb:"$(OUTDIR)\\graphite.pdb" /machine:I386 /out:"$(OUTDIR)\\$(TARGET).dll" /implib:"$(OUTDIR)\\$(TARGET).lib"
+LINK_FLAGS=$(ADDLIBS) kernel32.lib user32.lib gdi32.lib winspool.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib /nologo /dll /pdb:"$(OUTDIR)\\graphite.pdb" /machine:I386 /out:"$(OUTDIR)\\$(TARGET).dll" /implib:"$(OUTDIR)\\$(TARGET).lib"
 
 BSC32=bscmake.exe
 BSC32_FLAGS=/nologo /o"$(OUTDIR)\\$(TARGET).bsc" 
@@ -24,21 +29,21 @@
 SBREXT = .sbr
 
 !IF "$(CFG)" == "DEBUG"
-CPP_DEBUG=/D "DEBUG" /Gm /GR /ZI /Od /RTC1 /FR"$(INTDIR)\\" /$(MLIB)d
+CPP_DEBUG=/D "DEBUG" /Gm /GR /Od /RTC1 /FR"$(INTDIR)\\"
 # CPP_DEBUG=/D "DEBUG" /Gm /GR /ZI /Od /RTC1 /FR"$(INTDIR)\\" /MDd
 
 OUTDIR=.\debug
 INTDIR=.\debug_temp
-LINK_DEBUG= MSVCRTD.lib /debug /incremental:yes #/pdbtype:sept
+LINK_DEBUG= /debug 
 
 all : lib lib_dll bsc
 
 !ELSE
-CPP_DEBUG=/D "NDEBUG" /O2 /$(MLIB)
+CPP_DEBUG=/D "NDEBUG" /O2
 # CPP_DEBUG=/D "NDEBUG" /O2 /MD
 OUTDIR=.\release
 INTDIR=.\release_temp
-LINK_DEBUG= MSVCRT.lib /incremental:no /NODEFAULTLIB:libc
+LINK_DEBUG= /incremental:no /NODEFAULTLIB:libc
 
 all : lib lib_dll
 
@@ -48,11 +53,7 @@
 CPP_DEBUG=/D "TRACING" $(CPP_DEBUG)
 !ENDIF
 
-!IF "$(OS)" == "Windows_NT"
 NULL=
-!ELSE 
-NULL=nul
-!ENDIF
 
 clean :
     @- rd /s/q .\release_temp
@@ -779,7 +780,7 @@
 	@- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\FileFont$(OBJEXT)" $?
 	
 "$(INTDIR)\FileFont_dll$(OBJEXT)" : "src/font/FileFont.cpp"
-	@- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\FileFont_dll$(OBJEXT)" $?
+	$(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\FileFont_dll$(OBJEXT)" $?
 	
 !ENDIF
 
--- misc/silgraphite-2.3.1/engine/src/font/FileFont.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/font/FileFont.cpp	Sat Aug 22 19:36:32 2009
@@ -207,11 +207,11 @@
 				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 @@
 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 @@
 	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 @@
 	
 	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;
 	}
--- misc/silgraphite-2.3.1/engine/src/font/Font.cpp	Tue May 20 08:04:16 2008
+++ misc/build/silgraphite-2.3.1/engine/src/font/Font.cpp	Sat Aug 22 19:36:33 2009
@@ -626,7 +626,7 @@
 		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 @@
 		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 @@
 		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 @@
 		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);
--- misc/silgraphite-2.3.1/engine/src/font/TtfUtil.cpp	Thu Jan 29 10:33:19 2009
+++ misc/build/silgraphite-2.3.1/engine/src/font/TtfUtil.cpp	Sat Aug 22 19:36:33 2009
@@ -492,7 +492,7 @@
 	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 @@
 	{ // 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 @@
 	{ // 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 @@
 
 	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 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);
--- misc/silgraphite-2.3.1/engine/src/painter/SegmentPainter.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/painter/SegmentPainter.cpp	Sat Aug 22 19:36:33 2009
@@ -353,7 +353,7 @@
 	@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 @@
 								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 @@
 							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(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 @@
 			}
 			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 @@
 	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 @@
 	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 @@
 	{
 		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 @@
 /*----------------------------------------------------------------------------------------------
 	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;
 }
--- misc/silgraphite-2.3.1/engine/src/segment/FileInput.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/FileInput.cpp	Sat Aug 22 19:36:33 2009
@@ -80,7 +80,7 @@
 #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
--- misc/silgraphite-2.3.1/engine/src/segment/GrCharStream.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrCharStream.cpp	Sat Aug 22 19:36:33 2009
@@ -417,8 +417,11 @@
 	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);
--- misc/silgraphite-2.3.1/engine/src/segment/GrClassTable.h	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrClassTable.h	Sat Aug 22 19:36:33 2009
@@ -54,7 +54,11 @@
 	/*------------------------------------------------------------------------------------------
 		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];
--- misc/silgraphite-2.3.1/engine/src/segment/GrEngine.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrEngine.cpp	Sat Aug 22 19:36:33 2009
@@ -159,12 +159,12 @@
 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 @@
 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 @@
 	@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 @@
 	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 @@
 /*----------------------------------------------------------------------------------------------
 	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 @@
 	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 @@
 		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 @@
 
 	//	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
--- misc/silgraphite-2.3.1/engine/src/segment/GrFSM.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrFSM.cpp	Sat Aug 22 19:36:33 2009
@@ -46,7 +46,7 @@
 	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 @@
 	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];
--- misc/silgraphite-2.3.1/engine/src/segment/GrFeature.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrFeature.cpp	Sat Aug 22 19:36:33 2009
@@ -186,7 +186,7 @@
 /*----------------------------------------------------------------------------------------------
 	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 @@
 
 	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;
 }
--- misc/silgraphite-2.3.1/engine/src/segment/GrPass.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrPass.cpp	Sat Aug 22 19:36:34 2009
@@ -279,9 +279,10 @@
 	@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 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::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 @@
 	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 @@
 	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 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 GrBidiPass::Unwind(GrTableManager * ptman,
 	int islotChanged, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut,
-	bool fFirst)
+	bool /*fFirst*/)
 {
 	int islotIn;
 	int islotOut;
@@ -1901,8 +1906,8 @@
 	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
--- misc/silgraphite-2.3.1/engine/src/segment/GrPass.h	Thu Aug 21 16:24:32 2008
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrPass.h	Sat Aug 22 19:36:34 2009
@@ -197,7 +197,7 @@
 	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 @@
 		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 @@
 	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 @@
 
 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);
 	}
--- misc/silgraphite-2.3.1/engine/src/segment/GrPassActionCode.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrPassActionCode.cpp	Sat Aug 22 19:36:34 2009
@@ -632,8 +632,13 @@
 /*----------------------------------------------------------------------------------------------
 	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 @@
 		psstrmOut->SetSegMinToWritePos(false);
 	if (fSetSegLim)
 		psstrmOut->SetSegLimToWritePos(false);
+	//gid16 chw; chw = pslotNew->GlyphID();
 	psstrmOut->NextPut(pslotNew);
 }
 
@@ -729,6 +735,7 @@
 		psstrmOut->SetSegMinToWritePos(false);
 	if (fSetSegLim)
 		psstrmOut->SetSegLimToWritePos(false);
+	//gid16 chw; chw = pslotNew->GlyphID();
 	psstrmOut->NextPut(pslotNew);
 }
 
@@ -825,7 +832,7 @@
 	@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 @@
 	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 @@
 		psstrmOut->SetSegMinToWritePos(false);
 	if (fSetSegLim)
 		psstrmOut->SetSegLimToWritePos(false);
+	//gid16 chw; chw = pslotNew->GlyphID();
 	psstrmOut->NextPut(pslotNew);
 }
 
@@ -924,7 +932,7 @@
 	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 @@
 		psstrmOut->SetSegLimToWritePos();
 
 	GrSlotState * pslot = psstrmIn->NextGet();
+	//gid16 chw; chw = pslotNew->GlyphID();
 	pslot->MarkDeleted();
 
 	if (ptman->LoggingTransduction())
@@ -957,7 +966,7 @@
 	@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 @@
 	@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 @@
 	@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 @@
 
 	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 @@
 	@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 @@
 	@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 @@
 	@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 @@
 	@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 @@
 	}
 	else
 	{
-		pslot->CalcCompositeMetrics(ptman, psstrmIn, nAttLevel, true);
+		pslot->CalcCompositeMetrics(ptman, psstrmIn, NULL, nAttLevel, true);
 
 		float xy;
 		switch (gmet)
@@ -1435,7 +1448,11 @@
 	@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);
--- misc/silgraphite-2.3.1/engine/src/segment/GrSlotState.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrSlotState.cpp	Sat Aug 22 19:36:34 2009
@@ -261,7 +261,7 @@
 	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 @@
 		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 @@
 	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 @@
 
 	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 @@
 {
 	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 @@
 	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 @@
 	{
 		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 @@
 /*----------------------------------------------------------------------------------------------
 	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 @@
 /*----------------------------------------------------------------------------------------------
 	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;
 }
--- misc/silgraphite-2.3.1/engine/src/segment/GrSlotState.h	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrSlotState.h	Sat Aug 22 19:36:34 2009
@@ -308,7 +308,11 @@
 	{
 		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 @@
 		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 @@
 		return m_mAttachAtX;
 	}
 
-	int AttachWithX(GrTableManager * ptman, GrSlotStream * psstrm)
+	int AttachWithX(GrTableManager * /*ptman*/, GrSlotStream * /*psstrm*/)
 	{
 		if (m_mAttachAtX == kNotYetSet)
 		{
@@ -615,7 +619,7 @@
 		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 @@
 	{
 		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 @@
 	{
 		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 @@
 	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,
--- misc/silgraphite-2.3.1/engine/src/segment/GrSlotStream.cpp	Wed Feb 04 07:53:26 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrSlotStream.cpp	Sat Aug 22 19:36:34 2009
@@ -189,12 +189,16 @@
 	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 @@
 	case kdircRLO:
 	case kdircRLE:
 	case kdircPdfR:
+	case kdircRlb:
 		return true;
 
 	case kdircNeutral:
@@ -1212,7 +1217,7 @@
 			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 @@
 	@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 @@
 	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 @@
 	@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 @@
 	@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 @@
 	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 +1924,11 @@
 	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 +1948,11 @@
 	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 +2016,11 @@
 	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 +2212,21 @@
 }
 
 /*----------------------------------------------------------------------------------------------
+	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 +2238,6 @@
 	@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 +2267,10 @@
 
 			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 +2278,7 @@
 			{
 				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 +2367,10 @@
 			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;
 		}
--- misc/silgraphite-2.3.1/engine/src/segment/GrSlotStream.h	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrSlotStream.h	Sat Aug 22 19:36:34 2009
@@ -107,7 +107,7 @@
 		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 @@
 		return Peek(islot - ReadPosForNextGet());
 	}
 
+	//	Return the functional read position, taking into account the reprocess buffer.
 	int ReadPosForNextGet()
 	{
 		return ReadPos() - SlotsToReprocess();
@@ -260,12 +261,16 @@
 
 	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 @@
 		}
 	}
 
+	GrSlotState * MidPassSlotAt(int islot, GrSlotStream * psstrmNext = NULL);
 	GrSlotState * RuleInputSlot(int dislot = 0, GrSlotStream * psstrmOut = NULL,
 		bool fNullOkay = false);
 	GrSlotState * RuleOutputSlot(int dislot = 0);
--- misc/silgraphite-2.3.1/engine/src/segment/GrTableManager.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrTableManager.cpp	Sat Aug 22 19:36:34 2009
@@ -25,8 +25,8 @@
 DEFINE_THIS_FILE
 #ifndef _WIN32
 #include <stdlib.h>
-#include <math.h>
 #endif
+#include <math.h>
 
 //:>********************************************************************************************
 //:>	Forward declarations
@@ -572,7 +572,7 @@
 		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 @@
 	@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 @@
 	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 @@
 #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 @@
 	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 @@
 								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 @@
 	//	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 @@
 	}
 
 	std::vector<GrSlotState *> vpslotAttached;
+	std::vector<GrSlotStream *> vpsstrmAttached;
 
 	bool fRtl = RightToLeft();
 
@@ -2435,13 +2440,24 @@
 	{
 		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 @@
 			}
 
 			//	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 @@
 
 	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 @@
 		}
 		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
--- misc/silgraphite-2.3.1/engine/src/segment/GrTableManager.h	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrTableManager.h	Sat Aug 22 19:36:35 2009
@@ -442,7 +442,7 @@
 	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()
--- misc/silgraphite-2.3.1/engine/src/segment/Platform.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/Platform.cpp	Sat Aug 22 19:36:35 2009
@@ -103,7 +103,7 @@
 {
 	// assumes NULL terminated strings
 	const utf16 *start = s;
-	for (; *s; ++s);
+	for (; *s; ++s) {};
 	
 	return s - start;
 }
--- misc/silgraphite-2.3.1/engine/src/segment/Segment.cpp	Thu Aug 21 16:24:32 2008
+++ misc/build/silgraphite-2.3.1/engine/src/segment/Segment.cpp	Sat Aug 22 19:36:35 2009
@@ -1178,7 +1178,7 @@
 	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 +1549,11 @@
 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 +1729,7 @@
 	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 +1755,7 @@
 
 	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 +2164,7 @@
 	@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 +2178,7 @@
 	@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 +2355,7 @@
 	@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 +2533,31 @@
 	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 +2752,11 @@
 	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++)
--- misc/silgraphite-2.3.1/engine/src/segment/TransductionLog.cpp	Wed Jan 28 04:01:29 2009
+++ misc/build/silgraphite-2.3.1/engine/src/segment/TransductionLog.cpp	Sat Aug 22 19:36:35 2009
@@ -175,7 +175,7 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 	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 @@
 
 	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 @@
 		}
 		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 @@
 
 	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 @@
 		}
 		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 @@
 		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;
--- misc/silgraphite-2.3.1/engine/test/ProfileHarness/GrUtfTextSrc.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/ProfileHarness/GrUtfTextSrc.cpp	Sat Aug 22 19:36:35 2009
@@ -210,12 +210,12 @@
 }
 
 
-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 @@
 	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 @@
 
 // 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 @@
 }
 
 bool
-GrUtfTextSrc::getItalic(gr::toffset ich)
+GrUtfTextSrc::getItalic(gr::toffset /*ich*/)
 {
 	assert(mFont);
 	//NS_ASSERTION(false, "unexpected call to getItalic");
@@ -301,7 +301,7 @@
 	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');
--- misc/silgraphite-2.3.1/engine/test/ProfileHarness/GrUtfTextSrc.h	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/ProfileHarness/GrUtfTextSrc.h	Sat Aug 22 19:36:35 2009
@@ -79,7 +79,7 @@
   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 @@
   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 @@
   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; };
 
 };
 
--- misc/silgraphite-2.3.1/engine/test/ProfileHarness/ProfileHarness.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/ProfileHarness/ProfileHarness.cpp	Sat Aug 22 19:36:35 2009
@@ -39,14 +39,14 @@
 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);
 }
--- misc/silgraphite-2.3.1/engine/test/RegressionTest/GrJustifier.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/GrJustifier.cpp	Sat Aug 22 19:36:35 2009
@@ -327,7 +327,7 @@
 					&dxStretchAchieved);
 				for (int iiiGlyph = 0; iiiGlyph < cStretchable; iiiGlyph++)
 				{
-					int iiGlyph = viiGlyphsRem[iiiGlyph];
+					iiGlyph = viiGlyphsRem[iiiGlyph];
 					vdxStretchLeft[iiGlyph] = vdxStretchRem[iiiGlyph];
 					vdxWidth[iiGlyph] = vdxWidthRem[iiiGlyph];
 				}
--- misc/silgraphite-2.3.1/engine/test/RegressionTest/RegressionTest.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/RegressionTest.cpp	Sat Aug 22 19:36:35 2009
@@ -675,7 +675,7 @@
 	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)
--- misc/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.cpp	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.cpp	Sat Aug 22 19:36:36 2009
@@ -70,7 +70,7 @@
 /*----------------------------------------------------------------------------------------------
 	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 +78,7 @@
 /*----------------------------------------------------------------------------------------------
 	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 +87,7 @@
 	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;
 }
--- misc/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.h	Thu Jan 22 00:36:42 2009
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.h	Sat Aug 22 19:36:36 2009
@@ -59,12 +59,12 @@
 	{
 		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 +73,14 @@
 	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 +88,16 @@
 		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;
--- misc/silgraphite-2.3.1/wrappers/win32/WinFont.cpp	Thu Jan 29 10:33:19 2009
+++ misc/build/silgraphite-2.3.1/wrappers/win32/WinFont.cpp	Sat Aug 22 19:36:36 2009
@@ -70,6 +72,7 @@
 	// 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 +198,7 @@
 	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 @@
 					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::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 +476,10 @@
 	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 +620,10 @@
 
 		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 +733,7 @@
 	@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 +754,12 @@
 			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 +767,7 @@
 ----------------------------------------------------------------------------------------------*/
 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 +784,8 @@
 			{
 				// delete font
 				::DeleteObject(hfont);
+                if (fcv.pGlyphMetricMap)
+                    delete fcv.pGlyphMetricMap;
 				m_hmlffcv.erase(it);
 			}
 			else
@@ -832,7 +832,8 @@
 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));
 }
 
 /*--------------------------------------------------------------------------------------
--- misc/silgraphite-2.3.1/wrappers/win32/WinFont.h	Thu Jan 29 10:33:19 2009
+++ misc/build/silgraphite-2.3.1/wrappers/win32/WinFont.h	Sat Aug 22 19:36:36 2009
@@ -27,7 +27,13 @@
 #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 +110,7 @@
 	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 +196,13 @@
 	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 +212,8 @@
         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;
--- misc/build/silgraphite-2.3.1/engine/test/RegressionTest/RtTextSrc.h~	2009-01-22 05:06:42.000000000 +0630
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/RtTextSrc.h	2010-04-30 23:14:49.000000000 +0630
@@ -44,18 +44,18 @@
 		}
 	}
 
-	virtual size_t getFontFeatures(toffset ich, FeatureSetting * prgfset)
+	virtual size_t getFontFeatures(toffset /*ich*/, FeatureSetting * prgfset)
 	{
 		// Note: size of prgfset buffer = gr::kMaxFeatures = 64
 		std::copy(m_fset, m_fset + MAXFEAT, prgfset);
 		return m_cFeats;
 	}
 
-	virtual bool getRightToLeft(toffset ich)
+	virtual bool getRightToLeft(toffset /*ich*/)
 	{
 		return m_fRtl;
 	}
-	virtual unsigned int getDirectionDepth(toffset ich)
+	virtual unsigned int getDirectionDepth(toffset /*ich*/)
 	{
 		return ((m_fRtl == 1) ? 1 : 0);
 	}

--- misc/build/silgraphite-2.3.1/engine/test/RegressionTest/GrJustifier.cpp	2010-06-21 12:55:34.000000000 +0630
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/GrJustifier.cpp	2010-06-21 13:16:59.000000000 +0630
@@ -16,8 +16,9 @@
 //:>	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 @@
 #include <string>
 #endif
 
-#undef THIS_FILE
-DEFINE_THIS_FILE
-
 //:>********************************************************************************************
 //:>	Global constants
 //:>********************************************************************************************
@@ -327,9 +325,9 @@
 					&dxStretchAchieved);
 				for (int iiiGlyph = 0; iiiGlyph < cStretchable; iiiGlyph++)
 				{
-					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 @@
 	{
 #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";
--- misc/build/silgraphite-2.3.1/engine/test/RegressionTest/GrJustifier.h	2009-01-22 05:06:42.000000000 +0630
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/GrJustifier.h	2010-06-21 13:16:49.000000000 +0630
@@ -11,7 +11,9 @@
 Description:
 	A default justification agent for Graphite.
 -------------------------------------------------------------------------------*//*:End Ignore*/
+#ifdef _MSC_VER
 #pragma once
+#endif
 #ifndef GRJUSTIFIER_INCLUDED
 #define GRJUSTIFIER_INCLUDED
 
--- misc/build/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.h	2010-06-21 12:55:34.000000000 +0630
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.h	2010-06-21 13:18:12.000000000 +0630
@@ -11,7 +11,9 @@
 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
 

--- misc/build/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.cpp	2010-06-21 12:55:34.000000000 +0630
+++ misc/build/silgraphite-2.3.1/engine/test/RegressionTest/SimpleTextSrc.cpp	2010-06-21 13:18:24.000000000 +0630
@@ -15,7 +15,9 @@
 //:>********************************************************************************************
 //:>	Include files
 //:>********************************************************************************************
+#ifdef _MSC_VER
 #pragma hdrstop
+#endif
 // any other headers (not precompiled)
 
 #include "GrClient.h"
@@ -23,9 +25,6 @@
 #include "ITextSource.h"
 #include "SimpleTextSrc.h"
 
-#undef THIS_FILE
-DEFINE_THIS_FILE
-
 //:>********************************************************************************************
 //:>	Initialization and destruction
 //:>********************************************************************************************
--- misc/build/silgraphite-2.3.1/engine/src/segment/MemoryUsage.cpp	2009-01-22 05:06:42.000000000 +0630
+++ misc/build/silgraphite-2.3.1/engine/src/segment/MemoryUsage.cpp	2010-06-21 13:36:36.000000000 +0630
@@ -11,10 +11,10 @@
 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 @@
 #ifdef _MSC_VER
 #pragma hdrstop
 #endif
-#undef THIS_FILE
-DEFINE_THIS_FILE
 
 //:End Ignore
 
--- misc/build/silgraphite-2.3.1/engine/src/segment/GrSlotState.h	2010-06-23 19:52:56.429060400 +0700
+++ misc/build/silgraphite-2.3.1/engine/src/segment/GrSlotState.h	2010-05-25 11:51:15.195066300 +0700
@@ -48,7 +48,7 @@
 	{
 	}
 
-	~GrSlotAbstract()
+	virtual ~GrSlotAbstract()
 	{
 		// the table manager is responsible for destroying the contents of m_prgnVarLenBuf
 	}
@@ -231,7 +231,7 @@
 		ZapCompositeMetrics();
 	}
 
-	~GrSlotState()
+	virtual ~GrSlotState()
 	{
 	}
 
--- misc/silgraphite-2.3.1/engine/include/graphite/Segment.h	2009-01-29 09:33:19.000000000 +0100
+++ misc/build/silgraphite-2.3.1/engine/include/graphite/Segment.h	2013-08-14 15:10:53.363864046 +0200
@@ -64,7 +64,7 @@
 	virtual ~Segment();
 
 	// Basic copy constructor:
-	Segment(Segment & seg);
+	Segment( const Segment&);
 
 	// For making modified copies of segments:
 	static Segment * LineContextSegment(Segment & seg, bool fStartLine, bool fEndLine);
--- misc/build/silgraphite-2.3.1/engine/src/segment/Segment.cpp.bak	2010-06-23 19:59:54.611660400 +0700
+++ misc/build/silgraphite-2.3.1/engine/src/segment/Segment.cpp	2010-06-23 21:30:16.335460400 +0700
@@ -246,6 +246,8 @@
 
 	m_dxsVisibleWidth = -1;
 	m_dxsTotalWidth = -1;
+	m_ichwAssocsMin = 0;
+	m_ichwAssocsLim = 0;
 
 //	m_psstrm = NULL;
 	m_prgslout = NULL;
@@ -435,7 +435,7 @@
 /*----------------------------------------------------------------------------------------------
 	Basic copy method.
 ----------------------------------------------------------------------------------------------*/
-Segment::Segment(Segment & seg)
+Segment::Segment( const Segment& seg)
 {
 	int islout;

@@ -2988,9 +2988,10 @@
 	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
--- misc/build/silgraphite-2.3.1/wrappers/win32/win32_dll.cpp.bak	2008-05-09 18:10:30.000000000 +0700
+++ misc/build/silgraphite-2.3.1/wrappers/win32/win32_dll.cpp	2010-05-10 15:46:54.291818000 +0700
@@ -14,7 +14,7 @@
 	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;
 
--- misc/silgraphite-2.3.1/engine/include/graphite/GrFeature.h		2009-01-21 17:36:40.000000000 -0500
+++ misc/build/silgraphite-2.3.1/engine/include/graphite/GrFeature.h	2013-01-15 15:38:54.000000000 -0500
@@ -21,6 +21,10 @@
 
 //:End Ignore
 
+#ifdef __FreeBSD__
+#define wstring basic_string<wchar_t> //quick dirty hack for not finding _STL::wstring
+#endif
+
 #include "GrAppData.h"
 
 namespace gr
--- misc/silgraphite-2.3.1/engine/include/graphite/SegmentAux.h	Thu Jan 22 00:36:40 2009
+++ misc/build/silgraphite-2.3.1/engine/include/graphite/SegmentAux.h	Sat Aug 22 19:36:32 2009
@@ -232,8 +232,12 @@
 protected:
 	// Constructor that includes output-slot mapping list, used for non-contiguous lists:
 	GlyphSetIterator(Segment & seg, size_t islout, RcVector * qvislout)
-		: m_pseg(&seg), m_vit(qvislout->Vector().begin() + islout)
+		: m_pseg(&seg), m_vit(qvislout->Vector().begin())
 	{
+		if( islout < qvislout->Vector().size())
+			m_vit += islout;
+		else
+			m_vit = qvislout->Vector().end();
 		m_qvislout = qvislout;
 		m_qvislout->IncRefCount();
 	}
@@ -289,7 +293,7 @@
  
 	// Relational operators.
   	// Forward iterator requirements
-	bool operator==(const GlyphSetIterator & rhs) const throw()	{ return m_vit == rhs.m_vit; }
+	bool operator==(const GlyphSetIterator & rhs) const throw()	{ return (m_qvislout == NULL) || (m_vit == rhs.m_vit); }
 	bool operator!=(const GlyphSetIterator & rhs) const throw()	{ return !(*this == rhs); }
 
 	// Random access iterator requirements