You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(20) |
Feb
(14) |
Mar
(17) |
Apr
(60) |
May
(15) |
Jun
(51) |
Jul
(88) |
Aug
(21) |
Sep
(24) |
Oct
(1) |
Nov
(33) |
Dec
(16) |
2004 |
Jan
(27) |
Feb
(5) |
Mar
(6) |
Apr
(50) |
May
(6) |
Jun
(12) |
Jul
(14) |
Aug
(12) |
Sep
(21) |
Oct
(46) |
Nov
(1) |
Dec
(4) |
2005 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
(8) |
Jun
(23) |
Jul
|
Aug
(23) |
Sep
(1) |
Oct
(3) |
Nov
|
Dec
|
From: <sil...@li...> - 2003-02-03 07:27:56
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv3036 Modified Files: UtilRect.h Log Message: wrap the c++ code inside #ifdef __cplusplus so c file could include it Index: UtilRect.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/UtilRect.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- UtilRect.h 11 Nov 2002 23:43:57 -0000 1.3 +++ UtilRect.h 3 Feb 2003 07:27:53 -0000 1.4 @@ -16,7 +16,6 @@ #ifndef UtilRect_H #define UtilRect_H 1 -//#include "UtilInt.h" #if !defined(_WINDEF_) && !defined(_WINDEF_H) @@ -36,6 +35,8 @@ #endif +#ifdef __cplusplus + /*---------------------------------------------------------------------------------------------- Point class. This derives from POINT so it can be used in Win32 calls. ----------------------------------------------------------------------------------------------*/ @@ -569,6 +570,7 @@ } }; +#endif /* _cplusplus */ -#endif // !UtilRect_H +#endif /* !UtilRect_H */ |
From: <sil...@li...> - 2003-02-03 07:25:37
|
Update of /cvsroot/silgraphite/silgraphite/c/include In directory sc8-pr-cvs1:/tmp/cvs-serv2372 Modified Files: graphite.h Log Message: it should really be __cplusplus Index: graphite.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/c/include/graphite.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- graphite.h 3 Feb 2003 07:18:14 -0000 1.2 +++ graphite.h 3 Feb 2003 07:25:34 -0000 1.3 @@ -29,7 +29,7 @@ typedef enum grres { }; -#ifdef __cpluscplus +#ifdef __cplusplus extern "C" { #endif @@ -300,7 +300,7 @@ /*-----------------------------------------------------------*/ -#ifdef __cpluscplus +#ifdef __cplusplus }; #endif |
From: <sil...@li...> - 2003-02-03 07:18:17
|
Update of /cvsroot/silgraphite/silgraphite/c/include In directory sc8-pr-cvs1:/tmp/cvs-serv32392 Modified Files: graphite.h Log Message: fix __cpluscplus from __cpluspplus Index: graphite.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/c/include/graphite.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- graphite.h 31 Jan 2003 00:23:10 -0000 1.1 +++ graphite.h 3 Feb 2003 07:18:14 -0000 1.2 @@ -29,7 +29,7 @@ typedef enum grres { }; -#ifdef __cpluspplus +#ifdef __cpluscplus extern "C" { #endif @@ -300,7 +300,7 @@ /*-----------------------------------------------------------*/ -#ifdef __cpluspplus +#ifdef __cpluscplus }; #endif |
From: <sil...@li...> - 2003-02-03 06:10:42
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv13988/include Modified Files: GrData.h GrResult.h Log Message: remove C++ style comments Index: GrData.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrData.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrData.h 5 Nov 2002 23:42:10 -0000 1.2 +++ GrData.h 3 Feb 2003 06:10:40 -0000 1.3 @@ -11,6 +11,10 @@ Description: Data structures needed by the Graphite engine, particularly for argument passing. NOT to be used within FieldWorks +Special Note: + This .h file need to be used by C compiler. Please keep using C style comment . + Please do NOT use C++ style comment in this file. + ----------------------------------------------------------------------------------------------*/ #ifdef _MSC_VER #pragma once @@ -18,7 +22,9 @@ #ifndef GRDATA_INCLUDED #define GRDATA_INCLUDED +/* //:End Ignore + */ typedef struct tagLgCharRenderProps { @@ -93,12 +99,14 @@ typedef enum tagFwTextColor { kclrWhite = 0xffffff, kclrBlack = 0, +/* // kclrRed = 0xff, // kclrGreen = 0xff00, // kclrBlue = 0xff0000, // kclrYellow = 0xffff, // kclrMagenta = 0xff00ff, // kclrCyan = 0xffff00, + */ kclrReserved1 = 0x80000000, kclrReserved2 = 0x80000001, kclrTransparent = 0xc0000000 @@ -131,4 +139,4 @@ DEFINE_COM_PTR(cls); *****/ -#endif // !GRDATA_INCLUDED +#endif /* !GRDATA_INCLUDED */ Index: GrResult.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrResult.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrResult.h 2 Jan 2003 21:18:42 -0000 1.3 +++ GrResult.h 3 Feb 2003 06:10:40 -0000 1.4 @@ -11,6 +11,9 @@ Description: Support for the GrResult and error handling in the Graphite engine. Also argument checking. Much of this is set up to parallel standard COM behavior. +Special Note: + This file need to be used by C file. Please do not use C++ style comment but use + ONLY C style commen in this file to make C compiler happy. ----------------------------------------------------------------------------------------------*/ #ifdef _MSC_VER #pragma once @@ -18,36 +21,38 @@ #ifndef GRRESULT_INCLUDED #define GRRESULT_INCLUDED +/* //:End Ignore + */ -//:>******************************************************************************************** -//:> Result flags -//:>******************************************************************************************** +/*:>********************************************************************************************/ +/*:> Result flags */ +/*:>********************************************************************************************/ -// These are return values for the main interface methods to indicate various kinds of -// error conditions. To facilitate COM compatibiliy, they match the standard COM HRESULT codes. +/* These are return values for the main interface methods to indicate various kinds of */ +/* error conditions. To facilitate COM compatibiliy, they match the standard COM HRESULT codes. */ typedef enum GrResult { - kresOk = 0, // S_OK - kresFalse = 1, // S_FALSE - kresFail = 0x80004005L, // E_FAIL - kresOutOfMemory = 0x8007000EL, // E_OUTOFMEMORY - kresInvalidArg = 0x80000002L, // E_INVALIDARG - kresReadFault = 0x80000001L, // STG_E_READFAULT - kresUnexpected = 0x80000003L, // E_UNEXPECTED - kresNotImpl = 0x80000004L, // E_NOTIMPL -// kresPointer = 0x80004003, // E_POINTER + kresOk = 0, /* S_OK */ + kresFalse = 1, /* S_FALSE */ + kresFail = 0x80004005L, /* E_FAIL */ + kresOutOfMemory = 0x8007000EL, /* E_OUTOFMEMORY */ + kresInvalidArg = 0x80000002L, /* E_INVALIDARG */ + kresReadFault = 0x80000001L, /* STG_E_READFAULT */ + kresUnexpected = 0x80000003L, /* E_UNEXPECTED */ + kresNotImpl = 0x80000004L, /* E_NOTIMPL */ +/* kresPointer = 0x80004003, /* E_POINTER */ }; -#define ResultFailed(res) (res != kresOk) // && res != kresFalse +#define ResultFailed(res) (res != kresOk) /* && res != kresFalse */ -#define ResultSucceeded(res) (res == kresOk) // || res == kresFalse +#define ResultSucceeded(res) (res == kresOk) /* || res == kresFalse */ -//:>******************************************************************************************** -//:> Error handling -//:>******************************************************************************************** -// These are set up as #defines so we can easily adjust them once we know how errors should -// be handled. +/*:>********************************************************************************************/ +/*:> Error handling */ +/*:>********************************************************************************************/ +/* These are set up as #defines so we can easily adjust them once we know how errors should */ +/* be handled. */ #define ReturnResult(res) return res @@ -55,14 +60,14 @@ #define THROW(res) ThrowInternalError(res) #else #define THROW(res) throw res -#endif // GR_FW +#endif /* GR_FW */ #define WARN(res) res -//:>******************************************************************************************** -//:> Argument checking -//:>******************************************************************************************** +/*:>********************************************************************************************/ +/*:> Argument checking */ +/*:>********************************************************************************************/ #define ChkGrArgPtr(p) \ { \ @@ -96,4 +101,4 @@ AssertBstrN(bstr); \ -#endif // !GRRESULT_INCLUDED +#endif /* !GRRESULT_INCLUDED */ |
From: <sil...@li...> - 2003-01-31 01:35:43
|
Update of /cvsroot/silgraphite/silgraphite/c/src In directory sc8-pr-cvs1:/tmp/cvs-serv29644/src Added Files: Makefile.am Log Message: add Makefile.am for both c/include and c/src --- NEW FILE: Makefile.am --- grcsrcdir = $(top_srcdir)/c/src/ libgrengine_a_SOURCES += $(grcsrcdir)/greng.cpp libgrengine_a_SOURCES += $(grcsrcdir)/grseg.cpp libgrengine_a_SOURCES += $(grcsrcdir)/grgfx.cpp libgrengine_a_SOURCES += $(grcsrcdir)/grtxt.cpp |
From: <sil...@li...> - 2003-01-31 01:35:43
|
Update of /cvsroot/silgraphite/silgraphite/c/include In directory sc8-pr-cvs1:/tmp/cvs-serv29644/include Added Files: Makefile.am Log Message: add Makefile.am for both c/include and c/src --- NEW FILE: Makefile.am --- grcincludedir = $(top_srcdir)/c/include pkginclude_HEADERS += $(grcincludedir)/graphite.h |
From: <sil...@li...> - 2003-01-31 00:23:17
|
Update of /cvsroot/silgraphite/silgraphite/c/src In directory sc8-pr-cvs1:/tmp/cvs-serv7241/c/src Added Files: graphitepriv.h greng.cpp grgfx.cpp grseg.cpp grtxt.cpp Log Message: add c wraper --- NEW FILE: graphitepriv.h --- /************************************************************** Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: graphitepriv.h Description: header file to help C interface wrapper Author: Frank Yung-Fong Tang <ft...@ne...> *************************************************************/ #ifndef graphitepriv_h__ #define graphitepriv_h__ #define GRRES_C_TO_CPP(res) ((GrResult)(res)) #define GRRES_CPP_TO_C(result) ((grres)(result)) #define GRENG_C_TO_CPP(eng) ((GrEngine*)(eng)) #define GRENG_CPP_TO_C(engine) ((greng)(engine)) #define GRSEG_C_TO_CPP(seg) ((GrSegment*)(seg)) #define GRSEG_CPP_TO_C(segment) ((grseg)(segment)) #define GRSEGP_C_TO_CPP(segp) ((GrSegment**)(segp)) #define GRGFX_C_TO_CPP(gfx) ((IGrGraphics*)(gfx)) #define GRGFX_CPP_TO_C(graphics) ((grgfx)(graphics)) #define GRTXT_C_TO_CPP(txt) ((IGrTextSource*)(txt)) #define GRTXT_CPP_TO_C(txtsrc) ((grtxt)(txtsrc)) #define GRTXTP_CPP_TO_C(txtsrcp) ((grtxt*)(txtsrcp)) #endif /* graphitepriv_h__ */ --- NEW FILE: greng.cpp --- /************************************************************** Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: greng.cpp Description: Wrapper file for greng C interface Author: Frank Yung-Fong Tang <ft...@ne...> *************************************************************/ #include "main.h" #include "graphite.h" #include "graphitepriv.h" #include "GrEngine.h" class GrSegment; // forward declaration greng grengNew() { return GRENG_CPP_TO_C( new GrEngine() ); } void grengDone(greng aEng) { delete GRENG_C_TO_CPP(aEng); } grres grengFontIsValid(greng aEng, OLECHAR * prgchwErrMsg, int cchMaxErrMsg) { return GRRES_CPP_TO_C( GRENG_C_TO_CPP(aEng)->FontIsValid(prgchwErrMsg, cchMaxErrMsg) ); } grres grengGetSegDatMaxLength(greng aEng, int * pcb) { return GRRES_CPP_TO_C( GRENG_C_TO_CPP(aEng)->get_SegDatMaxLength(pcb) ); } grres grengFindBreakPoint(greng aEng, grgfx pgg, grtxt pgts, int ichMin, int ichLim, int ichLimBacktrack, bool fNeedFinalBreak, bool fStartLine, int dxMaxWidth, LgLineBreak lbPref, LgLineBreak lbMax, LgTrailingWsHandling twsh, bool fParaRtoL, grseg * ppsegRet, int * pdichwLimSeg, int * pdxWidth, LgEndSegmentType * pest, int cbPrev, byte * pbPrevSegDat, int cbNextMax, byte * pbNextSegDat, int * pcbNextSegDat, int * pdichwContext, OLECHAR * prgchwErrMsg, int cchMaxErrMsg) { return GRRES_CPP_TO_C( GRENG_C_TO_CPP(aEng)->FindBreakPoint( GRGFX_C_TO_CPP(pgg), GRTXT_C_TO_CPP(pgts), ichMin, ichLim, ichLimBacktrack, fNeedFinalBreak, fStartLine, dxMaxWidth, lbPref, lbMax, twsh, fParaRtoL, GRSEGP_C_TO_CPP(ppsegRet), pdichwLimSeg, pdxWidth, pest, cbPrev, pbPrevSegDat, cbNextMax, pbNextSegDat, pcbNextSegDat, pdichwContext, prgchwErrMsg, cchMaxErrMsg ) ); } grres grengGetScriptDirection(greng aEng, int * pgrfsdc, OLECHAR * prgchwErrMsg, int cchMaxErrMsg) { return GRRES_CPP_TO_C( GRENG_C_TO_CPP(aEng)->get_ScriptDirection(pgrfsdc, prgchwErrMsg, cchMaxErrMsg) ); } grres grengInterpretChrp(greng aEng, LgCharRenderProps * pchrp) { return GRRES_CPP_TO_C( GRENG_C_TO_CPP(aEng)->InterpretChrp(pchrp) ); } grres grengIsGraphiteFont(greng aEng, grgfx pgg) { return GRRES_CPP_TO_C( GRENG_C_TO_CPP(aEng)->IsGraphiteFont( GRGFX_C_TO_CPP(pgg)) ); } int grengGetFontEmUnits(greng aEng ) { return GRENG_C_TO_CPP(aEng)->GetFontEmUnits(); } int grengGetExtraAscent(greng aEng ) { return GRENG_C_TO_CPP(aEng)->ExtraAscent(); } int grengGetExtraDescent(greng aEng ) { return GRENG_C_TO_CPP(aEng)->ExtraDescent(); } --- NEW FILE: grgfx.cpp --- /************************************************************** Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: graphite.h Description: Wrapper file for grgfx C interface Author: Frank Yung-Fong Tang <ft...@ne...> *************************************************************/ #include "main.h" #include "IGrGraphics.h" #include "graphite.h" #include "graphitepriv.h" class cwGrGraphics : public IGrGraphics { public: cwGrGraphics(grgfx_funcs aFuncs, grgfx_data aData) : mFuncs(aFuncs) , mData(aData) { InitData(); }; virtual ~cwGrGraphics() { ReleaseData(); }; void InitData() { (*(mFuncs->mInitData))(mFuncs, mData); } void ReleaseData() { (*(mFuncs->mReleaseData))(mFuncs, mData); }; GrResult InvertRect(int twLeft, int twTop, int twRight, int twBottom) { return GRRES_C_TO_CPP((*(mFuncs->mInvertRect)) (mFuncs, mData, twLeft, twTop, twRight, twBottom)); }; GrResult DrawTextExt(int x, int y, int cch, const OLECHAR __RPC_FAR * prgchw, UINT uOptions, const RECT __RPC_FAR * pRect, int __RPC_FAR * prgdx) { return GRRES_C_TO_CPP((*(mFuncs->mDrawTextExt)) (mFuncs, mData, x, y, cch, prgchw, uOptions, pRect, prgdx)); }; GrResult GetFontEmSquare(int * pxyFontEmSquare) { return GRRES_C_TO_CPP((*(mFuncs->mGetFontEmSquare)) (mFuncs, mData, pxyFontEmSquare )); }; GrResult GetGlyphMetrics(int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) { return GRRES_C_TO_CPP((*(mFuncs->mGetGlyphMetrics)) (mFuncs, mData, chw, psBoundingWidth, pyBoundingHeight, pxBoundingX, pyBoundingY, pxAdvanceX, pyAdvanceY)); }; GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) { return GRRES_C_TO_CPP((*(mFuncs->mGetFontData)) (mFuncs, mData, nTableId, pcbTableSz, prgb, cbMax)); }; GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) { return GRRES_C_TO_CPP((*(mFuncs->mXYFromGlyphPoint)) (mFuncs, mData, chw, nPoint, pxRet, pyRet)); }; GrResult get_FontAscent(int* pdy) { return GRRES_C_TO_CPP((*(mFuncs->mGetFontAscent)) (mFuncs, mData, pdy)); }; GrResult get_FontDescent(int* pdy) { return GRRES_C_TO_CPP((*(mFuncs->mGetFontDescent)) (mFuncs, mData, pdy)); }; GrResult get_YUnitsPerInch(int * pyInch) { return GRRES_C_TO_CPP((*(mFuncs->mGetYUnitsPerInch)) (mFuncs, mData, pyInch)); }; GrResult SetupGraphics(LgCharRenderProps * pchrp) { return GRRES_C_TO_CPP((*(mFuncs->mSetupGraphics)) (mFuncs, mData, pchrp)); }; private: grgfx_funcs mFuncs; grgfx_data mData; }; grgfx grgfxNew(grgfx_funcs aFuns, grgfx_data aData) { return GRGFX_CPP_TO_C( new cwGrGraphics(aFuns, aData) ); } void grgfxDone(grgfx aGra) { delete GRGFX_C_TO_CPP(aGra); } --- NEW FILE: grseg.cpp --- /************************************************************** Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: graphite.h Description: Wrapper file for grseg C interface Author: Frank Yung-Fong Tang <ft...@ne...> *************************************************************/ #include "main.h" #include "GrSegment.h" #include "graphite.h" #include "graphitepriv.h" void grsegDone(grseg aSeg) { delete GRSEG_C_TO_CPP(aSeg); } grres grsegDrawText(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, int * pdxdWidth) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->DrawText( ichwBase, GRGFX_C_TO_CPP(pgg), rcSrc, rcDst, pdxdWidth)); } grres grsegRecompute(grseg aSeg, int ichwBase, grgfx pgg) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->Recompute( ichwBase, GRGFX_C_TO_CPP(pgg))); } #define IMPL_GRSEG_INT_GETTER(a) \ grres grsegGet ##a (grseg aSeg, int ichwBase, grgfx pgg, int * pxs) \ { \ return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_ ##a ( ichwBase, \ GRGFX_C_TO_CPP(pgg), pxs)); \ } IMPL_GRSEG_INT_GETTER(Width) IMPL_GRSEG_INT_GETTER(RightOverhang) IMPL_GRSEG_INT_GETTER(LeftOverhang) IMPL_GRSEG_INT_GETTER(Height) IMPL_GRSEG_INT_GETTER(Ascent) IMPL_GRSEG_INT_GETTER(AscentOverhang) IMPL_GRSEG_INT_GETTER(DescentOverhang) grres grsegExtent(grseg aSeg, int ichwBase, grgfx pgg, int * pdxsWidth, int * pdysHt) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->Extent( ichwBase, GRGFX_C_TO_CPP(pgg), pdxsWidth, pdysHt)); } grres grsegBoundingRect(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, RECT * prcBounds) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->BoundingRect( ichwBase, GRGFX_C_TO_CPP(pgg), rcSrc, rcDst, prcBounds)); } grres grsegGetActualWidth(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, int * pdxdWidth) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->GetActualWidth( ichwBase, GRGFX_C_TO_CPP(pgg), rcSrc, rcDst, pdxdWidth)); } grres grsegGetRightToLeft(grseg aSeg, int ichwBase, bool * pfResult) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_RightToLeft( ichwBase, pfResult)); } grres grsegGetDirectionDepth(grseg aSeg, int ichwBase, int * pnDepth, bool * pfWeak) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_DirectionDepth( ichwBase, pnDepth, pfWeak)); } grres grsegSetDirectionDepth(grseg aSeg, int ichwBase, int nNewDepth) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->SetDirectionDepth( ichwBase, nNewDepth)); } grres grsegGetWritingSystem(grseg aSeg, int ichwBase, int * penc, int * pws) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_WritingSystem( ichwBase, penc, pws)); } grres grsegGetLim(grseg aSeg, int ichwBase, int * pdichw) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_Lim( ichwBase, pdichw)); } grres grsegGetLimInterest(grseg aSeg, int ichwBase, int * pdichw) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_LimInterest( ichwBase, pdichw)); } grres grsegPutEndLine(grseg aSeg, int ichwBase, grgfx pgg, bool fNewVal) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->put_EndLine( ichwBase, GRGFX_C_TO_CPP(pgg), fNewVal)); } grres grsegPutStartLine(grseg aSeg, int ichwBase, grgfx pgg, bool fNewVal) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->put_StartLine( ichwBase, GRGFX_C_TO_CPP(pgg), fNewVal)); } grres grsegGetStartBreakWeight(grseg aSeg, int ichwBase, grgfx pgg, LgLineBreak * plb) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_StartBreakWeight(ichwBase, GRGFX_C_TO_CPP(pgg), plb)); } grres grsegGetEndBreakWeight(grseg aSeg, int ichwBase, grgfx pgg, LgLineBreak * plb) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_EndBreakWeight(ichwBase, GRGFX_C_TO_CPP(pgg), plb)); } grres grsegGetStretch(grseg aSeg, int ichwBase, int * pxs) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->get_Stretch( ichwBase, pxs)); } grres grsegPutStretch(grseg aSeg, int ichwBase, int xs) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->put_Stretch( ichwBase, xs)); } grres grsegIsValidInsertionPoint(grseg aSeg, int ichwBase, grgfx pgg, int ichwIP, LgIpValidResult * pipvr) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->IsValidInsertionPoint( ichwBase, GRGFX_C_TO_CPP(pgg), ichwIP, pipvr)); } grres grsegDoBoundariesCoincide(grseg aSeg, int ichwBase, grgfx pgg, bool fBoundaryEnd, bool fBoundaryRight, bool * pfResult) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->DoBoundariesCoincide(ichwBase, GRGFX_C_TO_CPP(pgg), fBoundaryEnd, fBoundaryRight, pfResult)); } grres grsegDrawInsertionPoint(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, int ichwIP, bool fAssocPrev, bool bOn, LgIPDrawMode dm) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->DrawInsertionPoint(ichwBase, GRGFX_C_TO_CPP(pgg), rcSrc, rcDst, ichwIP, fAssocPrev, bOn, dm)); } grres grsegPositionsOfIP(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, int ichwIP, bool fAssocPrev, LgIPDrawMode dm, RECT * prdPrimary, RECT * prdSecondary, bool * pfPrimaryHere, bool * pfSecHere) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->PositionsOfIP(ichwBase, GRGFX_C_TO_CPP(pgg), rs, rd, ichwIP, fAssocPrev, dm, prdPrimary, prdSecondary, pfPrimaryHere, pfSecHere)); } grres grsegDrawRange(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, int ichwMin, int ichwLim, int ydTop, int ydBottom, bool bOn) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->DrawRange(ichwBase, GRGFX_C_TO_CPP(pgg), rs, rd, ichwMin, ichwLim, ydTop, ydBottom, bOn)); } grres grsegPositionOfRange(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, int ichwMin, int ichwLim, int ydTop, int ydBottom, RECT * prsBounds, bool * pfAnythingToDraw) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->PositionOfRange(ichwBase, GRGFX_C_TO_CPP(pgg), rs, rd, ichwMin, ichwLim, ydTop, ydBottom, prsBounds, pfAnythingToDraw)); } grres grsegPointToChar(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, POINT zptdClickPosition, int * pichw, bool * pfAssocPrev) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->PointToChar(ichwBase, GRGFX_C_TO_CPP(pgg), rs, rd, zptdClickPosition, pichw, pfAssocPrev)); } grres grsegArrowKeyPosition(grseg aSeg, int ichwBase, grgfx pgg, int * pichwIP, bool * pfAssocPrev, bool fRight, bool fMovingIn, bool * pfResult) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->ArrowKeyPosition(ichwBase, GRGFX_C_TO_CPP(pgg), pichwIP, pfAssocPrev, fRight, fMovingIn, pfResult)); } grres grsegExtendSelectionPosition(grseg aSeg, int ichwBase, grgfx pgg, int * pichw, bool fAssocPrevMatch, bool fAssocPrevNeeded, int ichAnchor, bool fRight, bool fMovingIn, bool* pfRet) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->ExtendSelectionPosition( ichwBase, GRGFX_C_TO_CPP(pgg), pichw, fAssocPrevMatch, fAssocPrevNeeded, ichAnchor, fRight, fMovingIn, pfRet)); } grres grsegGetCharPlacement(grseg aSeg, int ichwBase, grgfx pgg, int ichwMin, int ichwLim, RECT rs, RECT rd, bool fSkipSpace, int crgMax, int * pcxd, int * prgxdLefts, int * prgxdRights, int * prgydTops) { return GRRES_CPP_TO_C( GRSEG_C_TO_CPP(aSeg)->GetCharPlacement( ichwBase, GRGFX_C_TO_CPP(pgg), ichwMin, ichwLim, rs, rd, fSkipSpace, crgMax, pcxd, prgxdLefts, prgxdRights, prgydTops)); } --- NEW FILE: grtxt.cpp --- /************************************************************** Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: grtxt.cpp Description: Wrapper file for grtxt C interface Author: Frank Yung-Fong Tang <ft...@ne...> *************************************************************/ #include "main.h" #include "IGrTextSource.h" #include "graphite.h" #include "graphitepriv.h" /* Functions for grtxt */ class cwTextSource : public IGrTextSource { public: cwTextSource(grtxt_funcs aFuncs, grtxt_data aData) : mFuncs(aFuncs) , mData(aData) { InitData(); }; virtual ~cwTextSource() { ReleaseData(); }; void InitData() { (*(mFuncs->mInitData))(mFuncs, mData); } void ReleaseData() { (*(mFuncs->mReleaseData))(mFuncs, mData); }; GrResult Fetch(int ichMin, int ichLim, OLECHAR * prgchBuf) { return GRRES_C_TO_CPP((*(mFuncs->mFetch)) (mFuncs, mData, ichMin, ichLim, prgchBuf)); }; GrResult get_Length(int* pcch) { return GRRES_C_TO_CPP((*(mFuncs->mGetLength)) (mFuncs, mData, pcch)); }; GrResult GetCharProps( int ich, LgCharRenderProps * pchrp, int * pichMin, int * pichLim) { return GRRES_C_TO_CPP((*(mFuncs->mGetCharProps)) (mFuncs, mData, ich, pchrp, pichMin, pichLim)); }; GrResult GetParaProps( int ich, LgParaRenderProps * pchrp, int * pichMin, int * pichLim) { return GRRES_C_TO_CPP((*(mFuncs->mGetParaProps)) (mFuncs, mData, ich, pchrp, pichMin, pichLim)); }; GrResult GetFontVariations( int ich, OLECHAR * prgchFontVar, int ichMax, int * pich, int * pichMin, int * pichLim) { return GRRES_C_TO_CPP((*(mFuncs->mGetFontVariations)) (mFuncs, mData, ich, prgchFontVar, ichMax, pich, pichMin, pichLim)); }; void TextSrcObject( IGrTextSource** ppgts) { (*(mFuncs->mTextSrcObject)) (mFuncs, mData, GRTXTP_CPP_TO_C(ppgts)); }; void DeleteTextSrcPtr() { (*(mFuncs->mDeleteTextSrcPtr))(mFuncs, mData); }; private: grtxt_funcs mFuncs; grtxt_data mData; }; grtxt grtxtNew(grtxt_funcs aFuns, grtxt_data aData) { return GRTXT_CPP_TO_C( new cwTextSource(aFuns, aData) ); } void grtxtDone(grtxt aTxt) { delete GRTXT_C_TO_CPP(aTxt); } |
From: <sil...@li...> - 2003-01-31 00:23:14
|
Update of /cvsroot/silgraphite/silgraphite/c/include In directory sc8-pr-cvs1:/tmp/cvs-serv7241/c/include Added Files: graphite.h Log Message: add c wraper --- NEW FILE: graphite.h --- /************************************************************** Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: graphite.h Description: Header file for Graphite C interface Author: Frank Yung-Fong Tang <ft...@ne...> *************************************************************/ #ifndef graphite_h__ #define graphite_h__ typedef void* greng; typedef void* grseg; typedef void* grgfx; typedef struct _grgfx_funcs *grgfx_funcs; typedef void* grgfx_data; typedef void* grtxt; typedef struct _grtxt_funcs *grtxt_funcs; typedef void* grtxt_data; /* we probably should move the grres to here. */ typedef enum grres { }; #ifdef __cpluspplus extern "C" { #endif /*-----------------------------------------------------------*/ /* Functions for greng */ greng grengNew(); void grengDone(greng aEng); grres grengFontIsValid(greng aEng, OLECHAR * prgchwErrMsg, int cchMaxErrMsg); grres grengGetSegDatMaxLength(greng aEng, int * pcb); grres grengFindBreakPoint(greng aEng, grgfx pgg, grtxt pgts, int ichMin, int ichLim, int ichLimBacktrack, bool fNeedFinalBreak, bool fStartLine, int dxMaxWidth, LgLineBreak lbPref, LgLineBreak lbMax, LgTrailingWsHandling twsh, bool fParaRtoL, grseg * ppsegRet, int * pdichwLimSeg, int * pdxWidth, LgEndSegmentType * pest, int cbPrev, byte * pbPrevSegDat, int cbNextMax, byte * pbNextSegDat, int * pcbNextSegDat, int * pdichwContext, OLECHAR * prgchwErrMsg, int cchMaxErrMsg); grres grengGetScriptDirection(greng aEng, int * pgrfsdc, OLECHAR * prgchwErrMsg, int cchMaxErrMsg); grres grengInterpretChrp(greng aEng, LgCharRenderProps * pchrp); grres grengIsGraphiteFont(greng aEng, grgfx pgg); int grengGetFontEmUnits(greng aEng ); int grengGetExtraAscent(greng aEng ); int grengGetExtraDescent(greng aEng ); /* Note: We may need to put more GrEngine methods here. I currently only put those I think which is necessary. This list need to be reviewed by Graphite experts. */ /* Functions for grseg */ /* grseg is returned by grres grengFindBreakPoint() */ void grsegDone(grseg aSeg); grres grsegDrawText(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, int * pdxdWidth); grres grsegRecompute(grseg aSeg, int ichwBase, grgfx pgg); grres grsegGetWidth(grseg aSeg, int ichwBase, grgfx pgg, int * pxs); grres grsegGetRightOverhang(grseg aSeg, int ichwBase, grgfx pgg, int * pxs); grres grsegGetLeftOverhang(grseg aSeg, int ichwBase, grgfx pgg, int * pxs); grres grsegGetHeight(grseg aSeg, int ichwBase, grgfx pgg, int * pys); grres grsegGetAscent(grseg aSeg, int ichwBase, grgfx pgg, int * pys); grres grsegExtent(grseg aSeg, int ichwBase, grgfx pgg, int * pdxsWidth, int * pdysHt); grres grsegBoundingRect(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, RECT * prcBounds); grres grsegGetActualWidth(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, int * pdxdWidth); grres grsegGetAscentOverhang(grseg aSeg, int ichwBase, grgfx pgg, int * pys); grres grsegGetDescentOverhang(grseg aSeg, int ichwBase, grgfx pgg, int * pys); grres grsegGetRightToLeft(grseg aSeg, int ichwBase, bool * pfResult); grres grsegGetDirectionDepth(grseg aSeg, int ichwBase, int * pnDepth, bool * pfWeak); grres grsegSetDirectionDepth(grseg aSeg, int ichwBase, int nNewDepth); grres grsegGetWritingSystem(grseg aSeg, int ichwBase, int * penc, int * pws); grres grsegGetLim(grseg aSeg, int ichwBase, int * pdichw); grres grsegGetLimInterest(grseg aSeg, int ichwBase, int * pdichw); grres grsegPutEndLine(grseg aSeg, int ichwBase, grgfx pgg, bool fNewVal); grres grsegPutStartLine(grseg aSeg, int ichwBase, grgfx pgg, bool fNewVal); grres grsegGetStartBreakWeight(grseg aSeg, int ichwBase, grgfx pgg, LgLineBreak * plb); grres grsegGetEndBreakWeight(grseg aSeg, int ichwBase, grgfx pgg, LgLineBreak * plb); grres grsegGetStretch(grseg aSeg, int ichwBase, int * pxs); grres grsegPutStretch(grseg aSeg, int ichwBase, int xs); grres grsegIsValidInsertionPoint(grseg aSeg, int ichwBase, grgfx pgg, int ichwIP, LgIpValidResult * pipvr); grres grsegDoBoundariesCoincide(grseg aSeg, int ichwBase, grgfx pgg, bool fBoundaryEnd, bool fBoundaryRight, bool * pfResult); grres grsegDrawInsertionPoint(grseg aSeg, int ichwBase, grgfx pgg, RECT rcSrc, RECT rcDst, int ichwIP, bool fAssocPrev, bool bOn, LgIPDrawMode dm); grres grsegPositionsOfIP(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, int ichwIP, bool fAssocPrev, LgIPDrawMode dm, RECT * prdPrimary, RECT * prdSecondary, bool * pfPrimaryHere, bool * pfSecHere); grres grsegDrawRange(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, int ichwMin, int ichwLim, int ydTop, int ydBottom, bool bOn); grres grsegPositionOfRange(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, int ichwMin, int ichwLim, int ydTop, int ydBottom, RECT * prsBounds, bool * pfAnythingToDraw); grres grsegPointToChar(grseg aSeg, int ichwBase, grgfx pgg, RECT rs, RECT rd, POINT zptdClickPosition, int * pichw, bool * pfAssocPrev); grres grsegArrowKeyPosition(grseg aSeg, int ichwBase, grgfx pgg, int * pichwIP, bool * pfAssocPrev, bool fRight, bool fMovingIn, bool * pfResult); grres grsegExtendSelectionPosition(grseg aSeg, int ichwBase, grgfx pgg, int * pichw, bool fAssocPrevMatch, bool fAssocPrevNeeded, int ichAnchor, bool fRight, bool fMovingIn, bool* pfRet); grres grsegGetCharPlacement(grseg aSeg, int ichwBase, grgfx pgg, int ichwMin, int ichwLim, RECT rs, RECT rd, bool fSkipSpace, int crgMax, int * pcxd, int * prgxdLefts, int * prgxdRights, int * prgydTops); /* Note: We may need to put more GrSegment methods here. I currently only put those I think which is necessary. This list need to be reviewed by Graphite experts. */ /*-----------------------------------------------------------*/ /* Function prototype for grgfx_funcs */ /* grgfx_funcs hold the function pointer of the class grgfx_data hold ther instance's data member */ /* The grgfxReleaseData function will be called by grgfxDone() to release aData */ typedef grres (*grgfxInitDataFunc) (grgfx_funcs aFunc, grgfx_data aData); typedef grres (*grgfxReleaseDataFunc) (grgfx_funcs aFunc, grgfx_data aData); typedef grres (*grgfxInvertRectFunc) (grgfx_funcs aFunc, grgfx_data aData, int twLeft, int twTop, int twRight, int twBottom); typedef grres (*grgfxDrawTextExtFunc) ( grgfx_funcs aFunc, grgfx_data aData, int x, int y, int cch, const OLECHAR __RPC_FAR * prgchw, UINT uOptions, const RECT __RPC_FAR * pRect, int __RPC_FAR * prgdx); typedef grres (*grgfxGetFontEmSquareFunc) ( grgfx_funcs aFunc, grgfx_data aData, int * pxyFontEmSquare); typedef grres (*grgfxGetGlyphMetricsFunc) ( grgfx_funcs aFunc, grgfx_data aData, int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY); typedef grres (*grgfxGetFontDataFunc) ( grgfx_funcs aFunc, grgfx_data aData, int nTableId, int * pcbTableSz, byte * prgb, int cbMax); typedef grres (*grgfxXYFromGlyphPointFunc) ( grgfx_funcs aFunc, grgfx_data aData, int chw, int nPoint, int * pxRet, int * pyRet); typedef grres (*grgfxGetFontAscentFunc) ( grgfx_funcs aFunc, grgfx_data aData, int* pdy); typedef grres (*grgfxGetFontDescentFunc) ( grgfx_funcs aFunc, grgfx_data aData, int* pdy); typedef grres (*grgfxGetYUnitsPerInchFunc) ( grgfx_funcs aFunc, grgfx_data aData, int * pyInch); typedef grres (*grgfxSetupGraphicsFunc) ( grgfx_funcs aFunc, grgfx_data aData, LgCharRenderProps * pchrp); struct _grgfx_funcs { grgfxInitDataFunc mInitData; grgfxReleaseDataFunc mReleaseData; grgfxInvertRectFunc mInvertRect; grgfxDrawTextExtFunc mDrawTextExt; grgfxGetFontEmSquareFunc mGetFontEmSquare; grgfxGetGlyphMetricsFunc mGetGlyphMetrics; grgfxGetFontDataFunc mGetFontData; grgfxXYFromGlyphPointFunc mXYFromGlyphPoint; grgfxGetFontAscentFunc mGetFontAscent; grgfxGetFontDescentFunc mGetFontDescent; grgfxGetYUnitsPerInchFunc mGetYUnitsPerInch; grgfxSetupGraphicsFunc mSetupGraphics; } ; /* Functions for grgfx */ grgfx grgfxNew(grgfx_funcs aFuns, grgfx_data aData); void grgfxDone(grgfx aGra); /*-----------------------------------------------------------*/ /* Function prototype for grtxt_funcs */ /* grtxt_funcs hold the function pointer of the class grtxt_data hold ther instance's data member */ /* The grtxtReleaseData function will be called by grtxtDone() to release aData */ typedef grres (*grtxtInitDataFunc) (grtxt_funcs aFunc, grtxt_data aData); typedef grres (*grtxtReleaseDataFunc) (grtxt_funcs aFunc, grtxt_data aData); typedef grres (*grtxtFetchFunc) (grtxt_funcs aFunc, grtxt_data aData, int ichMin, int ichLim, OLECHAR * prgchBuf); typedef grres (*grtxtGetLengthFunc) (grtxt_funcs aFunc, grtxt_data aData, int * pcch); typedef grres (*grtxtGetCharPropsFunc) (grtxt_funcs aFunc, grtxt_data aData, int ich, LgCharRenderProps * pchrp, int * pichMin, int * pichLim); typedef grres (*grtxtGetParaPropsFunc) (grtxt_funcs aFunc, grtxt_data aData, int ich, LgParaRenderProps * pchrp, int * pichMin, int * pichLim); typedef grres (*grtxtGetFontVariationsFunc) (grtxt_funcs aFunc, grtxt_data aData, int ich, OLECHAR * prgchFontVar, int ichMax, int * pich, int * pichMin, int * pichLim); typedef void (*grtxtTextSrcObjectFunc) (grtxt_funcs aFunc, grtxt_data aData, grtxt* ppgts); typedef void (*grtxtDeleteTextSrcPtrFunc) (grtxt_funcs aFunc, grtxt_data aData); struct _grtxt_funcs { grtxtInitDataFunc mInitData; grtxtReleaseDataFunc mReleaseData; grtxtFetchFunc mFetch; grtxtGetLengthFunc mGetLength; grtxtGetCharPropsFunc mGetCharProps; grtxtGetParaPropsFunc mGetParaProps; grtxtGetFontVariationsFunc mGetFontVariations; grtxtTextSrcObjectFunc mTextSrcObject; grtxtDeleteTextSrcPtrFunc mDeleteTextSrcPtr; } ; /* Functions for grtxt */ grtxt grtxtNew(grtxt_funcs aFuns, grtxt_data aData); void grtxtDone(grtxt aTxt); /*-----------------------------------------------------------*/ #ifdef __cpluspplus }; #endif #endif /* graphite_h__ */ |
From: <sil...@li...> - 2003-01-31 00:22:12
|
Update of /cvsroot/silgraphite/silgraphite/c/src In directory sc8-pr-cvs1:/tmp/cvs-serv6913/src Log Message: Directory /cvsroot/silgraphite/silgraphite/c/src added to the repository |
From: <sil...@li...> - 2003-01-31 00:22:12
|
Update of /cvsroot/silgraphite/silgraphite/c/include In directory sc8-pr-cvs1:/tmp/cvs-serv6913/include Log Message: Directory /cvsroot/silgraphite/silgraphite/c/include added to the repository |
From: <sil...@li...> - 2003-01-31 00:21:45
|
Update of /cvsroot/silgraphite/silgraphite/c In directory sc8-pr-cvs1:/tmp/cvs-serv6724/c Log Message: Directory /cvsroot/silgraphite/silgraphite/c added to the repository |
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1:/tmp/cvs-serv1801/src/GrEngine Modified Files: GrEngine.cpp GrPassActionCode.cpp GrSegment.cpp GrSlotStream.cpp GrTableManager.cpp TransductionLog.cpp Log Message: Synchronized with FW, 30 Jan 2003, changelist #06024 Index: GrEngine.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrEngine.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrEngine.cpp 2 Jan 2003 21:18:44 -0000 1.4 +++ GrEngine.cpp 30 Jan 2003 20:17:28 -0000 1.5 @@ -802,6 +802,7 @@ #ifdef GR_FW if (pgg == NULL || m_stuFaceName.Length()) + // TODO: Convert more carefully from StrUni to StrApp for second argument. m_resFontValid = InitFromControlFile(pgg, m_stuFaceName, fBold, fItalic); else #endif // GR_FW Index: GrPassActionCode.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPassActionCode.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- GrPassActionCode.cpp 5 Nov 2002 21:29:17 -0000 1.1.1.1 +++ GrPassActionCode.cpp 30 Jan 2003 20:17:28 -0000 1.2 @@ -137,7 +137,7 @@ byte * pbNext = *ppbArg; - int nRet; + int nRet = 0; switch (op) { @@ -727,6 +727,11 @@ ----------------------------------------------------------------------------------------------*/ void GrPass::DoDelete(GrTableManager * ptman, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut) { + if (psstrmIn->AtSegMin()) + psstrmOut->SetSegMinToWritePos(); + if (psstrmIn->AtSegLim()) + psstrmOut->SetSegLimToWritePos(); + GrSlotState * pslot = psstrmIn->NextGet(); pslot->MarkDeleted(); Index: GrSegment.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSegment.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrSegment.cpp 2 Jan 2003 21:18:45 -0000 1.3 +++ GrSegment.cpp 30 Jan 2003 20:17:28 -0000 1.4 @@ -1573,7 +1573,7 @@ ignore this @param crgMax - number of ranges allowed @param pcxd - number of ranges made - @param prgxdLefts/Rights/Tops + @param prgxdLefts/Rights/UnderTops - arrays of corresponding values indicating where an underline should be drawn, in logical order ----------------------------------------------------------------------------------------------*/ @@ -1582,13 +1582,13 @@ RECT rsArg, RECT rdArg, bool fSkipSpace, int cxdMax, - int * pcxd, int * prgxdLefts, int * prgxdRights, int * prgydTops) + int * pcxd, int * prgxdLefts, int * prgxdRights, int * prgydUnderTops) { ChkGrArgPtr(pgg); ChkGrArrayArg(pcxd, cxdMax); ChkGrArrayArg(prgxdLefts, cxdMax); ChkGrArrayArg(prgxdRights, cxdMax); - ChkGrArrayArg(prgydTops, cxdMax); + ChkGrArrayArg(prgydUnderTops, cxdMax); GrResult res = kresOk; @@ -1668,7 +1668,7 @@ { prgxdLefts[ils] = vlsdNoOverlaps[ils].left; prgxdRights[ils] = vlsdNoOverlaps[ils].right; - prgydTops[ils] = ydBottom; + prgydUnderTops[ils] = ydBottom; } delete[] prgfAllCompsSelected; Index: GrSlotStream.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotStream.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrSlotStream.cpp 2 Jan 2003 21:18:47 -0000 1.3 +++ GrSlotStream.cpp 30 Jan 2003 20:17:28 -0000 1.4 @@ -1665,6 +1665,11 @@ else { // Reprocessing. + + // Save corresponding positions before doing the back-up. + int islotReadPosInSave = psstrmIn->ReadPosForNextGet(); + int islotWritePosOutSave = this->WritePos(); + Vector<GrSlotState*> vpslotTmp; int islot; if (psstrmIn->SlotsToReprocess() > 0) @@ -1695,14 +1700,16 @@ psstrmIn->m_vpslotReproc[islot]->ZapPosPassIndex(); } + // If either the min or lim is in the middle of the reprocess buffer, + // adjust as necessary to match where it is in the output stream. int islotSegMinIn = psstrmIn->SegMin(); if (islotSegMinIn > -1 && psstrmIn->ReadPosForNextGet() <= islotSegMinIn && - islotSegMinIn < psstrmIn->ReprocLim()) + islotSegMinIn < islotReadPosInSave) { Assert(this->SegMin() > -1); - int dislotIn = psstrmIn->ReprocLim() - islotSegMinIn; - int dislotOut = WritePos() - SegMin(); + int dislotIn = islotReadPosInSave - islotSegMinIn; + int dislotOut = islotWritePosOutSave - SegMin(); psstrmIn->SetSegMin(islotSegMinIn + dislotIn - dislotOut, true); if (psstrmIn->m_cslotPreSeg > psstrmIn->SegMin()) psstrmIn->m_cslotPreSeg = -1; @@ -1710,11 +1717,12 @@ int islotSegLimIn = psstrmIn->SegLimIfKnown(); if (islotSegLimIn > -1 && psstrmIn->ReadPosForNextGet() <= islotSegLimIn && - islotSegLimIn < psstrmIn->ReprocLim()) + islotSegLimIn < islotReadPosInSave) { - Assert(this->SegLimIfKnown() > -1); - int dislotIn = psstrmIn->ReprocLim() - islotSegLimIn; - int dislotOut = WritePos() - SegLimIfKnown(); + int islotSegLimOut = this->SegLimIfKnown(); + Assert(islotSegLimOut > -1); + int dislotIn = islotReadPosInSave - islotSegLimIn; + int dislotOut = islotWritePosOutSave - islotSegLimOut; psstrmIn->SetSegLim(islotSegLimIn + dislotIn - dislotOut); } Index: GrTableManager.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrTableManager.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrTableManager.cpp 2 Jan 2003 21:18:47 -0000 1.3 +++ GrTableManager.cpp 30 Jan 2003 20:17:29 -0000 1.4 @@ -348,9 +348,9 @@ // Rendered to the end of the original requested range. *pest = kestNoMore; - else if (!m_fExceededSpace && !fNextIsSameWs && fMoreText) - // Writing system break; may be more room on the line. But see tweak below. - *pest = kestWsBreak; +// else if (!m_fExceededSpace && !fNextIsSameWs && fMoreText) +// // Writing system break; may be more room on the line. But see tweak below. +// *pest = kestWsBreak; else if (m_fExceededSpace) { @@ -362,7 +362,7 @@ } else if (twsh == ktwshOnlyWs) - *pest = kestOkayBreak; + *pest = kestOkayBreak; // but see tweak below else { @@ -372,7 +372,7 @@ // TODO SharonC: handle the situation where it is legal to break BEFORE the first // character of the following segment. Assert(fMoreText); - Assert(fNextIsSameWs); + //Assert(fNextIsSameWs); if (ichwCallerBtLim > -1) Assert(m_fInsertedLB); else @@ -400,6 +400,9 @@ } else *pest = kestOkayBreak; + + if (*pest == kestBadBreak && m_fExceededSpace && !fNextIsSameWs && fMoreText) + *pest = kestWsBreak; } // Make a segment out of it and return it. @@ -616,11 +619,14 @@ // on where the final stream choked. GrSlotStream * psstrmFinal = OutputStream(m_cpass-1); if ((islotStartTry = TraceStreamZeroPos(psstrmFinal->WritePos()-1)) == -1) - islotStartTry = OutputStream(0)->ReadPos() - 1; + { + // Just start looking at the end of what's been generated. + islotStartTry = OutputStream(m_cpassLB)->ReadPos() - 1; + } } else { - // Otherwise start just before previous line break. + // Start just before previous line break. if (m_fInsertedLB || m_fFinalLB) islotStartTry = *pislotPrevBreak - 2; // skip inserted LB and previous slot else @@ -1233,6 +1239,9 @@ (RightToLeft() ? kdircRlb : kdircLlb), cslotBackup, true, -1); SetInitialLB(); m_cslotPreSeg++; + if (m_cpassLB > 0 && *pislotFinalBreak > -1) + // See corresponding kludge in GrPass::ExtendGlyphIDOutput. + *pislotFinalBreak += 1; } else { @@ -1268,9 +1277,9 @@ } /*---------------------------------------------------------------------------------------------- - Calculate the position in stream 0 of the given slot in the final stream, based on the - associations. (This will be the same as the position at the end of the line-break passes, - which is really what we want.) + Calculate the position in stream zero of the given slot in the final stream, + based on the associations. (This will be the same as the position at the end of the + line-break passes, which is really what we want.) @param islotFinal - index of the final slot in the final stream ----------------------------------------------------------------------------------------------*/ @@ -1286,7 +1295,10 @@ if (pslot->DirLevel() > TopDirectionLevel()) return -1; - return pslot->BeforeAssoc() + m_cslotPreSeg; + int islot = pslot->BeforeAssoc(); + if (islot == kPosInfinity || islot < 0) + return -1; + return islot + m_cslotPreSeg; } /*---------------------------------------------------------------------------------------------- Index: TransductionLog.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/TransductionLog.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- TransductionLog.cpp 2 Jan 2003 21:18:47 -0000 1.2 +++ TransductionLog.cpp 30 Jan 2003 20:17:29 -0000 1.3 @@ -137,21 +137,31 @@ cchwBackup, &cchwMax16bitChars); cnUnicode = min(cnUnicode, MAX_SLOTS); + int ichw; + wchar rgchwChars2[MAX_SLOTS]; - int rgichw16bit[MAX_SLOTS]; + int rgcchw16bit[MAX_SLOTS]; if (cchwMax16bitChars > 1) { cchwMax16bitChars = min(cchwMax16bitChars, 2); // max of 2 16-bit chars per slot pchstrm->GetLogDataSurrogates(this, cnUnicode, cchwBackup, cchwMax16bitChars, rgnChars, - rgchwChars2, rgichw16bit); + rgchwChars2, rgcchw16bit); + } + else + { + for (ichw = 0; ichw < cnUnicode; ichw++) + { + rgcchw16bit[ichw] = 1; + rgchwChars2[ichw] = 0; + } } LogUnderlyingHeader(strmOut, pchstrm->Min(), (pchstrm->Min() + cnUnicode - cchwBackup), - cchwBackup, rgichw16bit); + cchwBackup, rgcchw16bit); // Text strmOut << "Text: "; // 15 spaces - for (int ichw = 0; ichw < cnUnicode; ichw++) + for (ichw = 0; ichw < cnUnicode; ichw++) { if (rgnChars[ichw] < 0x0100 && rgchwChars2[ichw] == 0) // ANSI strmOut << (char)rgnChars[ichw] << " "; // 6 spaces @@ -227,7 +237,7 @@ if (fFirst) strmOut << "all features=0"; - StrAppBuf strbFore; + StrAnsiBuf stabFore; switch (clrFore) { case kclrBlack: @@ -244,12 +254,12 @@ strmOut << "; foregnd=green"; break; default: - strbFore.Format(_T("; foregnd=%x"), clrFore); - strmOut << strbFore.Chars(); + stabFore.Format("; foregnd=%x", clrFore); + strmOut << stabFore.Chars(); break; } - StrAppBuf strbBack; + StrAnsiBuf stabBack; switch (clrBack) { case kclrWhite: @@ -266,8 +276,8 @@ strmOut << "; backgnd=green"; break; default: - strbBack.Format(_T("; backgnd=%x"), clrBack); - strmOut << strbBack.Chars(); + stabBack.Format("; backgnd=%x", clrBack); + strmOut << stabBack.Chars(); break; } @@ -332,7 +342,7 @@ text source. ----------------------------------------------------------------------------------------------*/ void GrCharStream::GetLogDataSurrogates(GrTableManager * ptman, int cn32bit, int cchwBackup, - int cchwMax16bit, int * prgnChars, wchar * prgchw2, int * prgichw16bit) + int cchwMax16bit, int * prgnChars, wchar * prgchw2, int * prgcchw16bit) { for (int i = 0; i < cn32bit; i++) { @@ -353,13 +363,13 @@ { // Replace 32-bit char with (first) 16-bit char. prgnChars[inUnicode] = (int)prgchwRunText[ichw - ichwMin]; - prgichw16bit[ichw] = 1; + prgcchw16bit[ichw] = 1; ichw++; if (!AtUnicodeCharBoundary(prgchwRunText, cchw, ichw - ichwMin)) { prgchw2[inUnicode] = prgchwRunText[ichw - ichwMin]; - prgichw16bit[ichw] = 2; + prgcchw16bit[ichw] = 2; ichw++; } inUnicode++; @@ -734,12 +744,20 @@ cchw = min(cchw, MAX_SLOTS); wchar rgchwChars2[MAX_SLOTS]; - int rgichw16bit[MAX_SLOTS]; + int rgcchw16bit[MAX_SLOTS]; if (cchwMax16bitChars > 1) { - cchwMax16bitChars = min(cchwMax16bitChars, 4); // we show up to 4 16-bit chars per slot + cchwMax16bitChars = min(cchwMax16bitChars, 2); pchstrm->GetLogDataSurrogates(ptman, cchw, -m_ichwAssocsMin, cchwMax16bitChars, - rgnChars, rgchwChars2, rgichw16bit); + rgnChars, rgchwChars2, rgcchw16bit); + } + else + { + for (ichw = 0 ; ichw <(m_ichwAssocsLim - m_ichwAssocsMin); ichw++) + { + rgcchw16bit[ichw] = 1; + rgchwChars2[ichw] = 0; + } } // Text @@ -748,16 +766,16 @@ for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { wchar chw, chwNext; - switch (rgichw16bit[ichw]) + switch (rgcchw16bit[ichw]) { default: case 1: chw = rgnChars[inUnicode]; chwNext = rgchwChars2[inUnicode]; break; case 2: chw = rgchwChars2[inUnicode]; chwNext = 0; break; } - if (rgichw16bit[ichw] == 1 && chwNext == 0 && chw < 0x0100) // ANSI + if (rgcchw16bit[ichw] == 1 && chwNext == 0 && chw < 0x0100) // ANSI strmOut << (char)chw << " "; // 6 spaces else - strmOut << " "; + strmOut << " "; // 7 spaces if (chwNext == 0) inUnicode++; } @@ -769,7 +787,7 @@ for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { wchar chw, chwNext; - switch (rgichw16bit[ichw]) + switch (rgcchw16bit[ichw]) { default: case 1: chw = rgnChars[inUnicode]; chwNext = rgchwChars2[inUnicode]; break; @@ -784,7 +802,7 @@ strmOut << "before "; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { - if (rgichw16bit[ichw] > 1) + if (rgcchw16bit[ichw] > 1) // continuation of Unicode codepoint strmOut << " "; else if (m_prgisloutBefore[ichw] == kNegInfinity) @@ -814,7 +832,7 @@ strmOut << "after "; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { - if (rgichw16bit[ichw] > 1) + if (rgcchw16bit[ichw] > 1) // continuation of Unicode codepoint strmOut << " "; else if (m_prgisloutAfter[ichw] == kNegInfinity) @@ -831,7 +849,7 @@ strmOut << "ligature "; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { - if (rgichw16bit[ichw] > 1) + if (rgcchw16bit[ichw] > 1) // continuation of Unicode codepoint strmOut << " "; else if (m_prgisloutLigature[ichw] != kNegInfinity) @@ -844,7 +862,7 @@ strmOut << "component "; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { - if (rgichw16bit[ichw] > 1) + if (rgcchw16bit[ichw] > 1) // continuation of Unicode codepoint strmOut << " "; else if (m_prgisloutLigature[ichw] != kNegInfinity) |
From: <sil...@li...> - 2003-01-30 20:17:32
|
Update of /cvsroot/silgraphite/silgraphite/contrib/fwviews In directory sc8-pr-cvs1:/tmp/cvs-serv1801/contrib/fwviews Modified Files: GrGraphics.cpp GrTxtSrc.cpp Log Message: Synchronized with FW, 30 Jan 2003, changelist #06024 Index: GrGraphics.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/fwviews/GrGraphics.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrGraphics.cpp 2 Jan 2003 21:18:41 -0000 1.2 +++ GrGraphics.cpp 30 Jan 2003 20:17:27 -0000 1.3 @@ -58,7 +58,14 @@ Assert(m_hdc == NULL); Assert(m_hfont == NULL); Assert(m_hfontOld == NULL); - // m_chrp should contain zeros too; don't bother checking + // m_chrp should contain zeros too; don't bother checking. + + // Initialize the clip rectangle to be as big as possible: + // TODO: decide if we want to do this. +// m_rcClip.top = 0; +// m_rcClip.left = 0; +// m_rcClip.right = INT_MAX; +// m_rcClip.bottom = INT_MAX; } //#ifdef BASELINE Index: GrTxtSrc.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/fwviews/GrTxtSrc.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrTxtSrc.cpp 2 Jan 2003 21:18:42 -0000 1.2 +++ GrTxtSrc.cpp 30 Jan 2003 20:17:28 -0000 1.3 @@ -42,7 +42,7 @@ m_cref = 1; // COM-like behavior m_cchLength = wcslen(pszText); - m_prgchText = NewObj OLECHAR[m_cchLength]; + m_prgchText = NewObj OLECHAR[m_cchLength + 1]; memcpy(m_prgchText, pszText, isizeof(OLECHAR) * m_cchLength); m_prgchText[m_cchLength] = 0; // zero-terminate |
From: <sil...@li...> - 2003-01-30 20:17:32
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv1801/include Modified Files: GrEngine.h GrSegment.h Log Message: Synchronized with FW, 30 Jan 2003, changelist #06024 Index: GrEngine.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrEngine.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrEngine.h 2 Jan 2003 21:18:42 -0000 1.4 +++ GrEngine.h 30 Jan 2003 20:17:28 -0000 1.5 @@ -354,7 +354,7 @@ bool * pfNextIsSameWs, int * pnDirDepth); #ifdef GR_FW - GrResult InitFromControlFile(IGrGraphics * pgg, StrAnsi staFontFile, + GrResult InitFromControlFile(IGrGraphics * pgg, StrApp strFontFile, bool fBold, bool fItalic); GrResult ReadFromControlFile(StrUni stuFontFile); // GrResult GetFallBackFont(StrUni * pstu); Index: GrSegment.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrSegment.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrSegment.h 2 Jan 2003 21:18:43 -0000 1.3 +++ GrSegment.h 30 Jan 2003 20:17:28 -0000 1.4 @@ -131,7 +131,7 @@ bool fSkipSpace, int crgMax, // number of ranges allowed int * pcxd, // number actually made - int * prgxdLefts, int * prgxdRights, int * prgydTops); + int * prgxdLefts, int * prgxdRights, int * prgydUnderline); GrResult GetInitialization(int cbDat, byte * prgbDat, int * pcbDatRet); // Not part of FW interface: |
From: <sil...@li...> - 2003-01-13 22:45:09
|
Update of /cvsroot/silgraphite/silgraphite/contrib/SimpleEdit In directory sc8-pr-cvs1:/tmp/cvs-serv3104 Added Files: GrGraphics.cpp GrGraphics.h GrTextSrc.cpp GrTextSrc.h SimpleEdit.cpp SimpleEdit.ico SimpleEdit.rc StdAfx.h makefile resource.h small.ico Log Message: Add Simple Edit demo --- NEW FILE: GrGraphics.cpp --- #include "GrClient.h" #include "GrGraphics.h" // handle Windows specific way of returning coordinates for glyph points static int IntFromFixed(FIXED fx) { if (fx.fract >= 0x8000) return fx.value + 1; else return fx.value; } GrGraphics::GrGraphics() { m_hdc = 0; m_hfont = 0; memset (&m_chrp, '\0', sizeof(LgCharRenderProps)); // Vertical and horizontal resolution. Zero indicates not yet initialized. m_yInch = 0; } GrGraphics::~GrGraphics() { DeleteObject(SelectObject(m_hdc, GetStockObject(ANSI_VAR_FONT))); } GrResult GrGraphics::Initialize(HDC hdc) { m_hdc = hdc; if (m_hfont != 0) // Setting a new DC, we should not have any saved font info. return kresUnexpected; SetMapMode(hdc, MM_TEXT); // For the sake of being definite; rarely makes a difference; I think this is default SetPolyFillMode(hdc, ALTERNATE); // Need to set background mode to transparent so Graphite can draw overlapping glyphs SetBkMode(hdc, TRANSPARENT); int i; get_YUnitsPerInch(&i); //initialize m_yInch return kresOk; } GrResult GrGraphics::SetFont(HFONT hfont) { if (hfont == m_hfont) return kresOk; HFONT hfontPrev = (HFONT) SelectObject(m_hdc, hfont); if (!hfontPrev) return kresUnexpected; DeleteObject(hfontPrev); if (m_hfont) { DeleteObject(m_hfont); } m_hfont = hfont; //save the font name which will always be used in this obj int cbOtm = GetOutlineTextMetrics(m_hdc, 0, NULL); OUTLINETEXTMETRIC * pOtm = (OUTLINETEXTMETRIC *)new BYTE[cbOtm]; if (!GetOutlineTextMetrics(m_hdc, cbOtm, pOtm)) return kresUnexpected; strcpy(m_szFaceName, (char *)pOtm + (int)pOtm->otmpFaceName); delete pOtm; return kresOk; } GrResult GrGraphics::SetupGraphics(LgCharRenderProps * pchrp) { memcpy(&m_chrp, pchrp, sizeof(LgCharRenderProps)); // set the font LOGFONT lf; memset(&lf, '\0', sizeof(LOGFONT)); lf.lfItalic = pchrp->ttvItalic == kttvOff ? false : true; lf.lfWeight = pchrp->ttvBold == kttvOff ? 400 : 700; lf.lfHeight = -MulDiv(pchrp->dympHeight, m_yInch, 72000); // convert millipoints to pixels lf.lfUnderline = false; lf.lfWidth = 0; // default width, based on height lf.lfEscapement = 0; // no rotation of text (is this how to do slanted?) lf.lfOrientation = 0; // no rotation of character baselines lf.lfStrikeOut = 0; // not strike-out lf.lfCharSet = DEFAULT_CHARSET; // let name determine it; WS should specify valid lf.lfOutPrecision = OUT_TT_ONLY_PRECIS; // only work with TrueType fonts lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; // ?? lf.lfQuality = DRAFT_QUALITY; // don't think this matters for TrueType fonts. lf.lfPitchAndFamily = 0; // must be zero for EnumFontFamiliesEx strcpy(lf.lfFaceName, m_szFaceName); // ignore pchrp->szFaceName; HFONT hfont; hfont = CreateFontIndirect(&lf); if (!hfont) return kresUnexpected; SetFont(hfont); // set the colors. bool fOK = (SetTextColor(m_hdc, pchrp->clrFore) != CLR_INVALID); if(pchrp->clrBack == kclrTransparent) { // I can't find it documented anywhere, but it seems to be necessary to set // the background color to black to make TRANSPARENT mode work--at least on my // computer. fOK = fOK && (SetBkColor(m_hdc, RGB(0,0,0)) != CLR_INVALID); fOK = fOK && SetBkMode(m_hdc, TRANSPARENT); } else { fOK = fOK && (SetBkColor(m_hdc, pchrp->clrBack)!= CLR_INVALID); fOK = fOK && SetBkMode(m_hdc, OPAQUE); } if (!fOK) return kresFail; else return kresOk; } GrResult GrGraphics::InvertRect(int xLeft, int yTop, int xRight, int yBottom) { RECT rect; rect.left = xLeft; rect.top = yTop; rect.right = xRight; rect.bottom = yBottom; if (!::InvertRect(m_hdc, &rect)) return kresFail; return kresOk; } GrResult GrGraphics::DrawTextExt(int x, int y, int cch, const OLECHAR * prgchw, UINT uOptions, const RECT * pRect, int * prgdx) { if (prgdx == NULL) { if (cch > 1) return kresInvalidArg; } // must explicitly call W API so get wide version on Win 9x if (!ExtTextOutW(m_hdc, x, y, uOptions, pRect, prgchw, cch, prgdx)) return kresUnexpected; return kresOk; } GrResult GrGraphics::GetFontEmSquare(int * pxyFontEmSquare) { TEXTMETRIC tm; if (!GetTextMetrics(m_hdc, &tm)) return kresUnexpected; *pxyFontEmSquare = tm.tmHeight - tm.tmInternalLeading; return kresOk; } GrResult GrGraphics::GetGlyphMetrics(int chw, int * pxBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) { 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, &gm, 0, NULL, &mat2)) { return kresUnexpected; } *pxBoundingWidth = gm.gmBlackBoxX; *pyBoundingHeight = gm.gmBlackBoxY; *pxBoundingX = gm.gmptGlyphOrigin.x; *pyBoundingY = gm.gmptGlyphOrigin.y; *pxAdvanceX = gm.gmCellIncX; *pyAdvanceY = gm.gmCellIncY; return kresOk; } GrResult GrGraphics::GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) { *pcbTableSz = -1; DWORD cbTableSz = ::GetFontData(m_hdc, nTableId, 0, NULL, 0); if (GDI_ERROR == cbTableSz) return kresFail; *pcbTableSz = cbTableSz; if (*pcbTableSz > cbMax) return kresFalse; // not enough room in buffer if (GDI_ERROR == ::GetFontData(m_hdc, nTableId, 0, (void *)prgb, cbTableSz)) { return kresUnexpected; } return kresOk; } GrResult GrGraphics::XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) { GLYPHMETRICS gm; const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; WORD flag = GGO_GLYPH_INDEX | GGO_NATIVE; UINT cbBuf = GetGlyphOutline(m_hdc, chw, flag, &gm, 0, NULL, &mat2); if (cbBuf <= 0) return kresUnexpected; BYTE * pGlyphData = new BYTE[cbBuf]; if (!pGlyphData) return kresOutOfMemory; if (GDI_ERROR == GetGlyphOutline(m_hdc, chw, flag, &gm, cbBuf, pGlyphData,&mat2)) return kresUnexpected; TTPOLYGONHEADER * pPolyHdr; TTPOLYCURVE * pPolyCurve; pPolyHdr = (TTPOLYGONHEADER *)pGlyphData; int nCurPoint; nCurPoint = 0; // If the last curve in the polygon is a spline, the last point in this curve will // repeat the point from the the polygon header. This adds an extra point to the data // returned by Windows that is not in the TTF font file. Test to set nExtraPt is below. int nExtraPt = 0; while ((BYTE *)pPolyHdr < (pGlyphData + cbBuf)) { if (nPoint == nCurPoint) { *pxRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].x); *pyRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].y); delete [] pGlyphData; return kresOk; } nCurPoint++; pPolyCurve = (TTPOLYCURVE *)(pPolyHdr + 1); if (pPolyHdr->dwType == TT_POLYGON_TYPE) { while ((BYTE *)pPolyCurve < (BYTE *)pPolyHdr + pPolyHdr->cb) { if (pPolyCurve->wType == TT_PRIM_LINE || pPolyCurve->wType == TT_PRIM_QSPLINE) { int j = pPolyCurve->cpfx - 1; // index of last point in the curve if (pPolyCurve->wType == TT_PRIM_QSPLINE && // test if this is the last curve pPolyHdr->cb - (int)((BYTE *)(&pPolyCurve->apfx[j]) - (BYTE *)(pPolyHdr)) == sizeof POINTFX && IntFromFixed(pPolyCurve->apfx[j].x) == IntFromFixed(pPolyHdr->pfxStart.x) && IntFromFixed(pPolyCurve->apfx[j].y) == IntFromFixed(pPolyHdr->pfxStart.y)) { nExtraPt = 1; } else nExtraPt = 0; if (nPoint < nCurPoint + pPolyCurve->cpfx - nExtraPt) { *pxRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].x); *pyRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].y); delete [] pGlyphData; return kresOk; } } else { delete [] pGlyphData; return kresUnexpected; } nCurPoint += pPolyCurve->cpfx - nExtraPt; pPolyCurve = (TTPOLYCURVE *)&pPolyCurve->apfx[pPolyCurve->cpfx]; } } else if (pPolyHdr->dwType == 0) { break; } else { delete [] pGlyphData; return kresUnexpected; } pPolyHdr = (TTPOLYGONHEADER *)((BYTE *)pPolyHdr + pPolyHdr->cb); } delete [] pGlyphData; return kresUnexpected; } GrResult GrGraphics::get_FontAscent(int* pdy) { TEXTMETRIC tm; if (!GetTextMetrics(m_hdc, &tm)) return kresUnexpected; *pdy = tm.tmAscent; return kresOk; } GrResult GrGraphics::get_FontDescent(int* pdy) { TEXTMETRIC tm; if (!GetTextMetrics(m_hdc, &tm)) return kresUnexpected; *pdy = tm.tmDescent; return kresOk; } GrResult GrGraphics::get_YUnitsPerInch(int * pyInch) { if (!m_yInch) { m_yInch = GetDeviceCaps(m_hdc, LOGPIXELSY); } *pyInch = m_yInch; return kresOk; } --- NEW FILE: GrGraphics.h --- #ifndef GRGRAPHICS_INCLUDED #define GRGRAPHICS_INCLUDED #include "IGrGraphics.h" class GrGraphics : public IGrGraphics { public: GrGraphics(); ~GrGraphics(); // use pixels for coordinates instead of twips as IGrGraphics wrongly indicates virtual GrResult InvertRect(int xLeft, int yTop, int xRight, int yBottom); virtual GrResult DrawTextExt(int x, int y, int cch, const OLECHAR __RPC_FAR * prgchw, UINT uOptions, const RECT * pRect, int * prgdx); virtual GrResult GetFontEmSquare(int * pxyFontEmSquare); // fix psBoundingWidth inherited from IGrGraphics virtual GrResult GetGlyphMetrics(int chw, int * pxBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY); virtual GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax); virtual GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet); virtual GrResult get_FontAscent(int* pdy); virtual GrResult get_FontDescent(int* pdy); virtual GrResult get_YUnitsPerInch(int * pyInch); //will NOT change font face name regardless of LgCharRenderProps.szFaceName virtual GrResult SetupGraphics(LgCharRenderProps * pchrp); //not inherited from IGrGraphics but needed to set up GrGraphics GrResult Initialize(HDC hdc); //load dc into obj GrResult SetFont(HFONT hfont); //set font initially, call before SetupGraphics protected: // Member variables HDC m_hdc; HFONT m_hfont; // current font selected into DC, if any LgCharRenderProps m_chrp; char m_szFaceName[32]; // Vertical resolution. Zero indicates not yet initialized. int m_yInch; }; #endif --- NEW FILE: GrTextSrc.cpp --- #include "GrClient.h" #include "GrTextSrc.h" GrTextSrc::GrTextSrc(OLECHAR * pszText, LgCharRenderProps & chrp, OLECHAR * prgchFontVar, int ichFontVar) { m_cchLength = wcslen(pszText); m_prgchText = new OLECHAR[m_cchLength + 1]; memcpy(m_prgchText, pszText, isizeof(OLECHAR) * m_cchLength); m_prgchText[m_cchLength] = L'\0'; // zero-terminate memcpy(&m_chrp, &chrp, isizeof(LgCharRenderProps)); memset(m_rgchFontVar, 0, isizeof(m_rgchFontVar)); memcpy(m_rgchFontVar, prgchFontVar, min(ichFontVar, isizeof(m_rgchFontVar))); } GrTextSrc::~GrTextSrc() { delete [] m_prgchText; } GrResult GrTextSrc::Fetch(int ichMin, int ichLim, OLECHAR * prgchBuf) { if (ichLim > m_cchLength) return kresInvalidArg; memcpy(prgchBuf, m_prgchText + ichMin, isizeof(OLECHAR) * (ichLim - ichMin)); return kresOk; } GrResult GrTextSrc::get_Length(int * pcch) { *pcch = m_cchLength; return kresOk; } GrResult GrTextSrc::GetCharProps(int ich, LgCharRenderProps * pchrp, int * pichMin, int * pichLim) { memcpy(pchrp, &m_chrp, isizeof(LgCharRenderProps)); *pichMin = 0; *pichLim = m_cchLength; return kresOk; } GrResult GrTextSrc::GetParaProps(int ich, LgParaRenderProps * pchrp, int * pichMin, int * pichLim) { memset(pchrp, 0, isizeof(LgParaRenderProps)); return kresNotImpl; } GrResult GrTextSrc::GetFontVariations(int ich, OLECHAR * prgchFontVar, int ichMax, int * pich, int * pichMin, int * pichLim) { *pich = isizeof(m_rgchFontVar); if (ichMax < *pich) return kresFalse; memcpy(prgchFontVar, m_rgchFontVar, isizeof(m_rgchFontVar)); *pichMin = 0; *pichLim = m_cchLength; return kresOk; } // Return a Graphite-compatible text source that can be stored in a // Graphite segment. void GrTextSrc::TextSrcObject(IGrTextSource ** ppgts) { *ppgts = this; } // When a segment is being destroyed, there is nothing to do, // since this is a pointer to an object that is allocated elsewhere. void GrTextSrc::DeleteTextSrcPtr() { } --- NEW FILE: GrTextSrc.h --- #ifndef GRTEXTSOURCE_INCLUDED #define GRTEXTSOURCE_INCLUDED #include "IGrTextSource.h" class GrTextSrc : public IGrTextSource { public: GrTextSrc(OLECHAR * pszText, LgCharRenderProps & chrp, OLECHAR * prgchFontVar, int ichFontVar); ~GrTextSrc(); virtual GrResult Fetch(int ichMin, int ichLim, OLECHAR * prgchBuf); virtual GrResult get_Length(int * pcch); virtual GrResult GetCharProps(int ich, LgCharRenderProps * pchrp, int * pichMin, int * pichLim); virtual GrResult GetParaProps(int ich, LgParaRenderProps * pchrp, int * pichMin, int * pichLim); virtual GrResult GetFontVariations(int ich, OLECHAR * prgchFontVar, int ichMax, int * pich, int * pichMin, int * pichLim); virtual void TextSrcObject(IGrTextSource ** ppgts); virtual void DeleteTextSrcPtr(); protected: OLECHAR * m_prgchText; int m_cchLength; OLECHAR m_rgchFontVar[64]; LgCharRenderProps m_chrp; }; #endif --- NEW FILE: SimpleEdit.cpp --- #include "stdafx.h" #include "resource.h" #include "GrClient.h" #include "GrGraphics.h" #include "GrTextSrc.h" #include "GrEngine.h" #include "GrSegment.h" #define MAX_LOADSTRING 100 // Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // The main windows class name GrEngine greng; // keep this data between events // note that dc and GrGraphics should not be kept between events LOGFONT lf; LgCharRenderProps lgchrp; GrTextSrc *pgrtext; RECT rSrc; RECT rDst; GrSegment *pgrseg; int cchSeg; // how many characters fit in the segment int dxWidth; // width of resulting segment LgEndSegmentType est; // why the segment was ended int ichwIp; // insertion point index int ichwRp; // range point index, beginning of range (IP is end of range) bool bAssocPrev; bool bRng; // Foward declarations of functions included in this code module: ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); void GrInitialize(void); void GrfxInit(HDC hdc, GrGraphics &grfx); int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MSG msg; HACCEL hAccelTable; GrInitialize(); // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_SIMPLEEDIT, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_SIMPLEEDIT); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } // FUNCTION: MyRegisterClass() // PURPOSE: Registers the window class. // COMMENTS: // // This function and its usage is only necessary if you want this code // to be compatible with Win32 systems prior to the 'RegisterClassEx' // function that was added to Windows 95. It is important to call this function // so that the application will get 'well formed' small icons associated // with it. // ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_SIMPLEEDIT); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCTSTR)IDC_SIMPLEEDIT; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; WINDOWPLACEMENT wp; hInst = hInstance; // Store instance handle in our global variable hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } // put window in a convenient place on screen wp.length = sizeof(WINDOWPLACEMENT); GetWindowPlacement(hWnd, &wp); // fill in members not expicilty set below wp.rcNormalPosition.left = MulDiv(GetSystemMetrics(SM_CXSCREEN), 1, 4); wp.rcNormalPosition.right = MulDiv(GetSystemMetrics(SM_CXSCREEN), 3, 4); wp.rcNormalPosition.top = MulDiv(GetSystemMetrics(SM_CYSCREEN), 1, 4); wp.rcNormalPosition.bottom = MulDiv(GetSystemMetrics(SM_CYSCREEN), 3, 4); SetWindowPlacement(hWnd, &wp); ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE; } // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // PURPOSE: Processes messages for the main window. // // WM_COMMAND - process the application menu // WM_PAINT - Paint the main window // WM_DESTROY - post a quit message and return // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; TCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message) { case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: { hdc = BeginPaint(hWnd, &ps); GrGraphics grfx; GrfxInit(hdc, grfx); if (pgrseg == NULL) { BYTE rgbNextSeg[256]; int ciNextSeg; OLECHAR errmsg[128]; int dichContext; GrResult res = greng.FindBreakPoint(&grfx, pgrtext, 0, // start at the beginning of the string 100, 100, // try to handle entire string if possible false, // need final break true, // is this the first segment on the line? 60000, // width available klbWordBreak, // preferred kind of line break klbClipBreak, // worst-case line break ktwshAll, // standard handling of trailing white space false, // paragraph is left-to-right &pgrseg, &cchSeg, &dxWidth, &est, 0, NULL, // no preceding segment to handle 256, rgbNextSeg, &ciNextSeg, // info for following segment, exception thrown if this missing &dichContext, // index of first char of interest to following seg errmsg, 128); // for returning an error message if (res != kresOk) MessageBox(hWnd, "Could not create segment", "", MB_OK); } pgrseg->DrawText(0, &grfx, rSrc, rDst, &dxWidth); if (!bRng) { pgrseg->DrawInsertionPoint(0, &grfx, rSrc, rDst, ichwIp, bAssocPrev, true, kdmNormal); } else { int segheight; pgrseg->get_Height(0, &grfx, &segheight); if (ichwIp >= ichwRp) //todo: is this needed? pgrseg->DrawRange(0, &grfx, rSrc, rDst, ichwRp, ichwIp, -rSrc.top, -rSrc.top + segheight, true); else pgrseg->DrawRange(0, &grfx, rSrc, rDst, ichwIp, ichwRp, -rSrc.top, -rSrc.top + segheight, true); } //GrGraphics dtor cleans up font EndPaint(hWnd, &ps); //cleans up dc break; } case WM_KEYDOWN: { GrGraphics grfx; hdc = GetDC(hWnd); GrfxInit(hdc, grfx); SHORT shiftstate; shiftstate = GetKeyState(VK_SHIFT); bool bShift = (bool) (shiftstate & 0x8000); shiftstate = GetKeyState(VK_CONTROL); bool bCtl = (bool) (shiftstate & 0x8000); switch(wParam) { bool bRight; bool bResult; LgIpValidResult IpValid; int oldIp; case VK_LEFT: // left & right arrow keys case VK_RIGHT: if (wParam == VK_RIGHT) bRight = true; else bRight = false; if (!bShift) // no shift key { bRng = false; if (!bCtl) // no control key & no shift key pgrseg->ArrowKeyPosition(0, &grfx, &ichwIp, &bAssocPrev, bRight, false, &bResult); else // yes control key & no shift key { oldIp = ichwIp; bRight ? ++ichwIp : --ichwIp; pgrseg->IsValidInsertionPoint(0, &grfx, ichwIp, &IpValid); // insure IP does not fall off segment end if (IpValid != kipvrOK) ichwIp = oldIp; if (ichwIp == 0) bAssocPrev = false; } } else // yes shift key { if (!bRng) ichwRp = ichwIp; bRng = true; if (!bCtl) // no control key & yes shift key pgrseg->ExtendSelectionPosition(0, &grfx, &ichwIp, true, bAssocPrev, ichwRp, bRight, false, &bResult); else // yes control key & yes shift key { oldIp = ichwIp; bRight ? ++ichwIp : --ichwIp; pgrseg->IsValidInsertionPoint(0, &grfx, ichwIp, &IpValid); if (IpValid != kipvrOK) ichwIp = oldIp; if (ichwIp == 0) bAssocPrev = false; } } InvalidateRect(hWnd, NULL, true); break; default: break; } ReleaseDC(hWnd, hdc); break; } case WM_LBUTTONDOWN: // left mouse button { GrGraphics grfx; hdc = GetDC(hWnd); GrfxInit(hdc, grfx); SHORT shiftstate; shiftstate = GetKeyState(VK_SHIFT); bool bShift = (bool) (shiftstate & 0x8000); POINT pt; pt.x = lParam & 0x0000FFFF; pt.y = lParam >> 16; if (!bShift) // no shift key bRng = false; else // yes shift key { if (!bRng) ichwRp = ichwIp; bRng = true; } pgrseg->PointToChar(0, &grfx, rSrc, rDst, pt, &ichwIp, &bAssocPrev); InvalidateRect(hWnd, NULL, true); ReleaseDC(hWnd, hdc); break; } case WM_DESTROY: delete pgrseg; delete pgrtext; PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } void GrInitialize (void) { memset(&lf, '\0', sizeof(LOGFONT)); lf.lfCharSet = DEFAULT_CHARSET; //strcpy(lf.lfFaceName, "Doulos SIL"); strcpy(lf.lfFaceName, "SILDoulos PigLatinDemo"); memset(&lgchrp, '\0', sizeof(LgCharRenderProps)); lgchrp.dympHeight = 24000; // font size in millipoints //could set szFaceName for consistency but ignored //wcscpy(pchrp->szFaceName, L"SILDoulos PigLatinDemo"); lgchrp.clrBack = RGB(255, 255, 255); //white lgchrp.clrFore = RGB(0, 0, 0); //black //grtext = new GrTextSrc(L"Now i\x0303\x0301s the time to render in Graphite", *pchrp, L"", 0); pgrtext = new GrTextSrc(L"Hello World!", lgchrp, L"", 0); rSrc.top = -30; rSrc.left = -30; rSrc.right = 66; rSrc.bottom = 66; rDst.top = 0; rDst.left = 0; rDst.right = 96; rDst.bottom = 96; pgrseg = NULL; cchSeg = -1; dxWidth = -1; est = kestNoMore; ichwIp = 0; ichwRp = 0; bAssocPrev = false; bRng = false; return; } void GrfxInit(HDC hdc, GrGraphics &grfx) { if (grfx.Initialize(hdc) != kresOk) MessageBox(NULL, "GrGraphics didn't initialize", "", MB_OK); HFONT hFont; lf.lfHeight = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72); hFont = CreateFontIndirect(&lf); grfx.SetFont(hFont); grfx.SetupGraphics(&lgchrp); } // Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; } --- NEW FILE: SimpleEdit.ico --- (This appears to be a binary file; contents omitted.) --- NEW FILE: SimpleEdit.rc --- //Microsoft Developer Studio generated resource script. // #include "resource.h" #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #define APSTUDIO_HIDDEN_SYMBOLS #include "windows.h" #undef APSTUDIO_HIDDEN_SYMBOLS #include "resource.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // English (U.S.) resources #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 ///////////////////////////////////////////////////////////////////////////// // // Icon // // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. IDI_SIMPLEEDIT ICON DISCARDABLE "SimpleEdit.ICO" IDI_SMALL ICON DISCARDABLE "SMALL.ICO" ///////////////////////////////////////////////////////////////////////////// // // Menu // IDC_SIMPLEEDIT MENU DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "E&xit", IDM_EXIT END POPUP "&Help" BEGIN MENUITEM "&About ...", IDM_ABOUT END END ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDC_SIMPLEEDIT ACCELERATORS MOVEABLE PURE BEGIN "?", IDM_ABOUT, ASCII, ALT "/", IDM_ABOUT, ASCII, ALT END ///////////////////////////////////////////////////////////////////////////// // // Dialog // IDD_ABOUTBOX DIALOG DISCARDABLE 22, 17, 230, 75 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "About" FONT 8, "System" BEGIN ICON IDI_SIMPLEEDIT,IDC_MYICON,14,9,16,16 LTEXT "SimpleEdit Version 1.0",IDC_STATIC,49,10,119,8,SS_NOPREFIX LTEXT "Copyright (C) 2002 SIL International",IDC_STATIC,49,20,119,8 DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP END #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE // 2 TEXTINCLUDE DISCARDABLE BEGIN "#define APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""windows.h""\r\n" "#undef APSTUDIO_HIDDEN_SYMBOLS\r\n" "#include ""resource.h""\r\n" "\0" END 3 TEXTINCLUDE DISCARDABLE BEGIN "\r\n" "\0" END 1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h\0" END #endif // APSTUDIO_INVOKED #ifndef _MAC ///////////////////////////////////////////////////////////////////////////// // // Version // VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,1 PRODUCTVERSION 1,0,0,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L #else FILEFLAGS 0x0L #endif FILEOS 0x40004L FILETYPE 0x1L FILESUBTYPE 0x0L BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904b0" BEGIN VALUE "Comments", "\0" VALUE "CompanyName", "SIL International\0" VALUE "FileDescription", "Graphite Simple Edit app\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "SimpleEdit\0" VALUE "LegalCopyright", "Copyright © 2002 SIL International\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "SimpleEdit.exe\0" VALUE "PrivateBuild", "\0" VALUE "ProductName", "Graphite Simple Edit\0" VALUE "ProductVersion", "1, 0, 0, 1\0" VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END #endif // !_MAC ///////////////////////////////////////////////////////////////////////////// // // String Table // STRINGTABLE DISCARDABLE BEGIN IDS_APP_TITLE "Simple Edit" IDS_HELLO "Simple Edit!" IDC_SIMPLEEDIT "SimpleEdit" END #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. // ///////////////////////////////////////////////////////////////////////////// #endif // not APSTUDIO_INVOKED --- NEW FILE: StdAfx.h --- // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__0D349A70_124E_4f03_B3C3_262AD8A63A7E__INCLUDED_) #define AFX_STDAFX_H__0D349A70_124E_4f03_B3C3_262AD8A63A7E__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // Windows Header Files: #include <windows.h> // C RunTime Header Files #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> // Local Header Files // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__0D349A70_124E_4f03_B3C3_262AD8A63A7E__INCLUDED_) --- NEW FILE: makefile --- !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF !IF "$(CFG)" == "" CFG=RELEASE !ENDIF !IF "$(CFG)" == "RELEASE" OUTDIR=.\release INTDIR=.\release_temp all : "$(OUTDIR)\SimpleEdit.exe" clean : @- rd /s/q .\release_temp realclean : clean @- rd /s/q .\release CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /c RSC_PROJ=/l 0x409 /fo"$(INTDIR)\SimpleEdit.res" /d "NDEBUG" LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib grengine.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"$(OUTDIR)\SimpleEdit.exe" /libpath:"..\..\release" BSC32_FLAGS=/nologo /o"$(OUTDIR)\SimpleEdit.bsc" !ELSEIF "$(CFG)" == "DEBUG" OUTDIR=.\debug INTDIR=.\debug_temp all : "$(OUTDIR)\SimpleEdit.exe" "$(OUTDIR)\SimpleEdit.bsc" clean : @- rd /s/q .\debug_temp realclean : clean @- rd /s/q .\debug CPP_PROJ=/nologo /MTd /W3 /Gm /GR /GX /GZ /ZI /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /c RSC_PROJ=/l 0x409 /fo"$(INTDIR)\SimpleEdit.res" /d "_DEBUG" LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib grengine.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\SimpleEdit.pdb" /debug /machine:I386 /out:"$(OUTDIR)\SimpleEdit.exe" /pdbtype:sept /libpath:"..\..\debug" BSC32_FLAGS=/nologo /o"$(OUTDIR)\SimpleEdit.bsc" !ENDIF "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" "$(INTDIR)" : if not exist "$(INTDIR)/$(NULL)" mkdir "$(INTDIR)" .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< << .cpp{$(INTDIR)}.sbr:: $(CPP) @<< $(CPP_PROJ) $< << CPP=cl.exe RSC=rc.exe BSC32=bscmake.exe LINK32=link.exe LINK32_OBJS= \ "$(INTDIR)\GrGraphics.obj" \ "$(INTDIR)\SimpleEdit.obj" \ "$(INTDIR)\GrTextSrc.obj" \ "$(INTDIR)\SimpleEdit.res" "$(OUTDIR)\SimpleEdit.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << BSC32_SBRS= \ "$(INTDIR)\GrGraphics.sbr" \ "$(INTDIR)\GrTextSrc.sbr" \ "$(INTDIR)\SimpleEdit.sbr" \ "$(OUTDIR)\SimpleEdit.bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << "$(INTDIR)\GrGraphics.obj" "$(INTDIR)\GrGraphics.sbr" : ".\GrGraphics.cpp" "$(INTDIR)" "$(INTDIR)\GrTextSrc.obj" "$(INTDIR)\GrTextSrc.sbr" : ".\GrTextSrc.cpp" "$(INTDIR)" "$(INTDIR)\SimpleEdit.obj" "$(INTDIR)\SimpleEdit.sbr" : ".\SimpleEdit.cpp" "$(INTDIR)" "$(INTDIR)\SimpleEdit.res" : ".\SimpleEdit.rc" "$(INTDIR)" $(RSC) $(RSC_PROJ) ".\SimpleEdit.rc" --- NEW FILE: resource.h --- //{{NO_DEPENDENCIES}} // Microsoft Visual C++ generated include file. // Used by SimpleEdit.RC // #define IDR_MAINFRAME 128 #define IDD_SIMPLEEDIT_DIALOG 102 #define IDD_ABOUTBOX 103 #define IDS_APP_TITLE 110 #define IDM_ABOUT 104 #define IDM_EXIT 105 #define IDS_HELLO 106 #define IDI_SIMPLEEDIT 107 #define IDI_SMALL 108 #define IDC_SIMPLEEDIT 109 #define IDC_MYICON 2 #define IDC_STATIC -1 // Next default values for new objects // #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 129 #define _APS_NEXT_COMMAND_VALUE 32771 #define _APS_NEXT_CONTROL_VALUE 1000 #define _APS_NEXT_SYMED_VALUE 110 #endif #endif --- NEW FILE: small.ico --- (This appears to be a binary file; contents omitted.) |
From: <sil...@li...> - 2003-01-13 22:34:48
|
Update of /cvsroot/silgraphite/silgraphite/contrib/SimpleEdit In directory sc8-pr-cvs1:/tmp/cvs-serv647/SimpleEdit Log Message: Directory /cvsroot/silgraphite/silgraphite/contrib/SimpleEdit added to the repository |
From: <sil...@li...> - 2003-01-07 22:35:52
|
Update of /cvsroot/silgraphite/silgraphite/contrib/HelloWorld In directory sc8-pr-cvs1:/tmp/cvs-serv11168 Modified Files: makefile Log Message: Makefile now handles release and debug builds. Use CFG=DEBUG or CFG=RELEASE. Releases is the default. Index: makefile =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/HelloWorld/makefile,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- makefile 11 Nov 2002 15:53:52 -0000 1.1 +++ makefile 7 Jan 2003 22:35:45 -0000 1.2 @@ -4,6 +4,30 @@ NULL=nul !ENDIF +!IF "$(CFG)" == "" +CFG=RELEASE +!ENDIF + +!IF "$(CFG)" == "RELEASE" + +OUTDIR=.\release +INTDIR=.\release_temp + +all : "$(OUTDIR)\HelloWorld.exe" + +clean : + @- rd /s/q .\release_temp + +realclean : clean + @- rd /s/q .\release + +CPP_PROJ=/nologo /MT /W3 /GX /O2 /I "..\..\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /c +RSC_PROJ=/l 0x409 /fo"$(INTDIR)\HelloWorld.res" /d "NDEBUG" +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib grengine.lib /nologo /subsystem:windows /incremental:no /machine:I386 /out:"$(OUTDIR)\HelloWorld.exe" /libpath:"..\..\release" +BSC32_FLAGS=/nologo /o"$(OUTDIR)\HelloWorld.bsc" + +!ELSEIF "$(CFG)" == "DEBUG" + OUTDIR=.\debug INTDIR=.\debug_temp @@ -15,15 +39,19 @@ realclean : clean @- rd /s/q .\debug +CPP_PROJ=/nologo /MTd /W3 /Gm /GR /GX /GZ /ZI /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /c +RSC_PROJ=/l 0x409 /fo"$(INTDIR)\HelloWorld.res" /d "_DEBUG" +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib grengine.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\HelloWorld.pdb" /debug /machine:I386 /out:"$(OUTDIR)\HelloWorld.exe" /pdbtype:sept /libpath:"..\..\debug" +BSC32_FLAGS=/nologo /o"$(OUTDIR)\HelloWorld.bsc" + +!ENDIF + "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" "$(INTDIR)" : if not exist "$(INTDIR)/$(NULL)" mkdir "$(INTDIR)" -CPP=cl.exe -CPP_PROJ=/nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"$(INTDIR)\\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c - .cpp{$(INTDIR)}.obj:: $(CPP) @<< $(CPP_PROJ) $< @@ -35,23 +63,11 @@ << +CPP=cl.exe RSC=rc.exe -RSC_PROJ=/l 0x409 /fo"$(INTDIR)\HelloWorld.res" /d "_DEBUG" - BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\HelloWorld.bsc" -BSC32_SBRS= \ - "$(INTDIR)\GrGraphics.sbr" \ - "$(INTDIR)\GrTextSrc.sbr" \ - "$(INTDIR)\HelloWorld.sbr" \ - -"$(OUTDIR)\HelloWorld.bsc" : "$(OUTDIR)" $(BSC32_SBRS) - $(BSC32) @<< - $(BSC32_FLAGS) $(BSC32_SBRS) -<< - LINK32=link.exe -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib grengine.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\HelloWorld.pdb" /debug /machine:I386 /out:"$(OUTDIR)\HelloWorld.exe" /pdbtype:sept /libpath:"..\..\debug" + LINK32_OBJS= \ "$(INTDIR)\GrGraphics.obj" \ "$(INTDIR)\HelloWorld.obj" \ @@ -63,16 +79,22 @@ $(LINK32_FLAGS) $(LINK32_OBJS) << -SOURCE=.\GrGraphics.cpp -"$(INTDIR)\GrGraphics.obj" "$(INTDIR)\GrGraphics.sbr" : $(SOURCE) "$(INTDIR)" +BSC32_SBRS= \ + "$(INTDIR)\GrGraphics.sbr" \ + "$(INTDIR)\GrTextSrc.sbr" \ + "$(INTDIR)\HelloWorld.sbr" \ -SOURCE=.\GrTextSrc.cpp -"$(INTDIR)\GrTextSrc.obj" "$(INTDIR)\GrTextSrc.sbr" : $(SOURCE) "$(INTDIR)" +"$(OUTDIR)\HelloWorld.bsc" : "$(OUTDIR)" $(BSC32_SBRS) + $(BSC32) @<< + $(BSC32_FLAGS) $(BSC32_SBRS) +<< -SOURCE=.\HelloWorld.cpp -"$(INTDIR)\HelloWorld.obj" "$(INTDIR)\HelloWorld.sbr" : $(SOURCE) "$(INTDIR)" +"$(INTDIR)\GrGraphics.obj" "$(INTDIR)\GrGraphics.sbr" : ".\GrGraphics.cpp" "$(INTDIR)" -SOURCE=.\HelloWorld.rc -"$(INTDIR)\HelloWorld.res" : $(SOURCE) "$(INTDIR)" - $(RSC) $(RSC_PROJ) $(SOURCE) +"$(INTDIR)\GrTextSrc.obj" "$(INTDIR)\GrTextSrc.sbr" : ".\GrTextSrc.cpp" "$(INTDIR)" + +"$(INTDIR)\HelloWorld.obj" "$(INTDIR)\HelloWorld.sbr" : ".\HelloWorld.cpp" "$(INTDIR)" + +"$(INTDIR)\HelloWorld.res" : ".\HelloWorld.rc" "$(INTDIR)" + $(RSC) $(RSC_PROJ) ".\HelloWorld.rc" |
From: <sil...@li...> - 2003-01-03 12:15:57
|
Update of /cvsroot/silgraphite/silgraphite In directory sc8-pr-cvs1:/tmp/cvs-serv3750 Modified Files: Tag: linuxdev_0_9 ChangeLog Log Message: test unified diffs and typo in README Index: ChangeLog =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/Attic/ChangeLog,v retrieving revision 1.1.2.4 retrieving revision 1.1.2.5 diff -u -d -r1.1.2.4 -r1.1.2.5 --- ChangeLog 18 Dec 2002 11:18:02 -0000 1.1.2.4 +++ ChangeLog 3 Jan 2003 12:15:54 -0000 1.1.2.5 @@ -1,5 +1,8 @@ This is the changelog for the SILGraphite project +3rd Jan 2003 Daniel Glassey + test syncmail with unified diff + 18th December 2002 Daniel Glassey test syncmail (3) |
From: <sil...@li...> - 2003-01-03 12:15:57
|
Update of /cvsroot/silgraphite/silgraphite/contrib/QtHelloWorld In directory sc8-pr-cvs1:/tmp/cvs-serv3750/contrib/QtHelloWorld Modified Files: Tag: linuxdev_0_9 README Log Message: test unified diffs and typo in README Index: README =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/QtHelloWorld/Attic/README,v retrieving revision 1.1.2.1 retrieving revision 1.1.2.2 diff -u -d -r1.1.2.1 -r1.1.2.2 --- README 22 Nov 2002 19:45:18 -0000 1.1.2.1 +++ README 3 Jan 2003 12:15:54 -0000 1.1.2.2 @@ -3,4 +3,4 @@ this one - it draws the words "hello world" moving around and in rainbow colors. -So we though we may as well do the same ;) +So we thought we may as well do the same ;) |
From: <sil...@li...> - 2003-01-02 21:19:17
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv14941/include Modified Files: GrEngine.h GrResult.h GrSegment.h IGrGraphics.h IGrTextSource.h common.h Log Message: Synchronized with FW, 20 Dec 2002, changelist #05908 Index: GrEngine.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrEngine.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GrEngine.h 12 Nov 2002 23:23:24 -0000 1.3 --- GrEngine.h 2 Jan 2003 21:18:42 -0000 1.4 *************** *** 117,121 **** OLECHAR * prgchwErrMsg, int cchMaxErrMsg); ! wchar GetGlyphIDFromUnicode(wchar chw); wchar ActualGlyphForOutput(wchar chwGlyphID); --- 117,121 ---- OLECHAR * prgchwErrMsg, int cchMaxErrMsg); ! wchar GetGlyphIDFromUnicode(int nUnicode); wchar ActualGlyphForOutput(wchar chwGlyphID); *************** *** 234,237 **** --- 234,242 ---- } + bool FakeItalic() + { + return m_fFakeItalic; + } + virtual void NewSegment(GrSegment ** ppseg); *************** *** 247,255 **** bool m_fSmartItalic; bool m_fSmartBI; // control files for styled text; empty means not yet determined ! StrAnsi m_staCtrlFileReg; // regular ! StrAnsi m_staCtrlFileBold; // bold ! StrAnsi m_staCtrlFileItalic; // italic ! StrAnsi m_staCtrlFileBI; // bold-italic // StrUni m_stuFontNames; --- 252,265 ---- bool m_fSmartItalic; bool m_fSmartBI; + // are the italics faked using a slant? + bool m_fFakeItalicCache; + bool m_fFakeBICache; // control files for styled text; empty means not yet determined ! StrApp m_strCtrlFileReg; // regular ! StrApp m_strCtrlFileBold; // bold ! StrApp m_strCtrlFileItalic; // italic ! StrApp m_strCtrlFileBI; // bold-italic ! ! bool m_fFakeItalic; // StrUni m_stuFontNames; Index: GrResult.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrResult.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrResult.h 5 Nov 2002 23:42:10 -0000 1.2 --- GrResult.h 2 Jan 2003 21:18:42 -0000 1.3 *************** *** 52,60 **** #define ReturnResult(res) return res ! #ifdef GR_FIELDWORKS #define THROW(res) ThrowInternalError(res) #else #define THROW(res) throw res ! #endif #define WARN(res) res --- 52,60 ---- #define ReturnResult(res) return res ! #ifdef GR_FW #define THROW(res) ThrowInternalError(res) #else #define THROW(res) throw res ! #endif // GR_FW #define WARN(res) res Index: GrSegment.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrSegment.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrSegment.h 5 Nov 2002 23:42:10 -0000 1.2 --- GrSegment.h 2 Jan 2003 21:18:43 -0000 1.3 *************** *** 269,272 **** --- 269,277 ---- } + // TODO: can probably delete this method when we implement GetWidthOfRange to use the same + // code as GetCharPlacement. + // GrResult GetWidthOfRange(int ichwBase, IGrGraphics * pgg, int ichwMin, int ichwLim, + // RECT rs, RECT rd, int * pdxd); + // for transduction logging: #ifdef TRACING *************** *** 530,533 **** --- 535,543 ---- void AssertValidClusters(GrSlotStream * psstrm); + + // TODO: can probably delete this method when we implement GetWidthOfRange to use the same + // code as GetCharPlacement. + // int EndOfDirectionRange(int ichwBase, IGrGraphics * pgg, int ichwMin, int ichwLim, + // int * pnDirDepth); }; Index: IGrGraphics.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/IGrGraphics.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** IGrGraphics.h 5 Nov 2002 23:42:10 -0000 1.2 --- IGrGraphics.h 2 Jan 2003 21:18:43 -0000 1.3 *************** *** 10,14 **** Description: ! -------------------------------------------------------------------------------*//*:End Ignore*/ #ifdef _MSC_VER --- 10,14 ---- Description: ! -------------------------------------------------------------------------------*//*:End Ignore*/ #ifdef _MSC_VER *************** *** 28,35 **** UINT uOptions, const RECT __RPC_FAR * pRect, int __RPC_FAR * prgdx) = 0; virtual GrResult GetFontEmSquare(int * pxyFontEmSquare) = 0; ! virtual GrResult GetGlyphMetrics(int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) = 0; ! virtual GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) = 0; virtual GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) = 0; virtual GrResult get_FontAscent(int* pdy) = 0; --- 28,35 ---- UINT uOptions, const RECT __RPC_FAR * pRect, int __RPC_FAR * prgdx) = 0; virtual GrResult GetFontEmSquare(int * pxyFontEmSquare) = 0; ! virtual GrResult GetGlyphMetrics(int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) = 0; ! virtual GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) = 0; virtual GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) = 0; virtual GrResult get_FontAscent(int* pdy) = 0; Index: IGrTextSource.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/IGrTextSource.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** IGrTextSource.h 5 Nov 2002 23:42:10 -0000 1.2 --- IGrTextSource.h 2 Jan 2003 21:18:43 -0000 1.3 *************** *** 10,14 **** Description: ! An interface for a text source that is used by the Graphite engine. -------------------------------------------------------------------------------*//*:End Ignore*/ #ifdef _MSC_VER --- 10,14 ---- Description: ! An interface for a text source that is used by the Graphite engine. -------------------------------------------------------------------------------*//*:End Ignore*/ #ifdef _MSC_VER *************** *** 22,26 **** This class provides an interface for a text source for the Graphite engine. ----------------------------------------------------------------------------------------------*/ ! class IGrTextSource { public: --- 22,26 ---- This class provides an interface for a text source for the Graphite engine. ----------------------------------------------------------------------------------------------*/ ! class IGrTextSource { public: Index: common.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/common.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** common.h 12 Nov 2002 23:07:09 -0000 1.4 --- common.h 2 Jan 2003 21:18:43 -0000 1.5 *************** *** 64,67 **** --- 64,68 ---- //#include <math.h> #include <limits.h> + #include <tchar.h> //#include <crtdbg.h> |
From: <sil...@li...> - 2003-01-02 21:19:15
|
Update of /cvsroot/silgraphite/silgraphite/contrib/fwviews In directory sc8-pr-cvs1:/tmp/cvs-serv14941/contrib/fwviews Modified Files: GrGraphics.cpp GrGraphics.h GrTxtSrc.cpp Log Message: Synchronized with FW, 20 Dec 2002, changelist #05908 Index: GrGraphics.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/fwviews/GrGraphics.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** GrGraphics.cpp 5 Nov 2002 21:29:08 -0000 1.1.1.1 --- GrGraphics.cpp 2 Jan 2003 21:18:41 -0000 1.2 *************** *** 15,19 **** /*********************************************************************************************** ! Include files ***********************************************************************************************/ #include "main.h" --- 15,19 ---- /*********************************************************************************************** ! Include files ***********************************************************************************************/ #include "main.h" *************** *** 23,46 **** DEFINE_THIS_FILE /*********************************************************************************************** ! Forward declarations ***********************************************************************************************/ /*********************************************************************************************** ! Local Constants and static variables ***********************************************************************************************/ /*********************************************************************************************** ! Two local classes, copied from AfGfx.h. Maybe we should move them to somewhere they can be shared more easily? ***********************************************************************************************/ /*********************************************************************************************** ! Constructors/Destructor ***********************************************************************************************/ GrGraphics::GrGraphics() { m_cref = 1; ! Init(); } --- 23,49 ---- DEFINE_THIS_FILE /*********************************************************************************************** ! Forward declarations ***********************************************************************************************/ /*********************************************************************************************** ! Local Constants and static variables ***********************************************************************************************/ /*********************************************************************************************** ! Two local classes, copied from AfGfx.h. Maybe we should move them to somewhere they can be shared more easily? ***********************************************************************************************/ /*********************************************************************************************** ! Constructors/Destructor ***********************************************************************************************/ GrGraphics::GrGraphics() { + m_hdc = NULL; m_cref = 1; ! Init(); ! m_hfont = NULL; ! m_hfontOld = NULL; } *************** *** 53,58 **** Assert(m_xInch == 0); Assert(m_yInch == 0); ! Assert(m_hfont == 0); ! Assert(m_hdc == 0); // m_chrp should contain zeros too; don't bother checking } --- 56,62 ---- Assert(m_xInch == 0); Assert(m_yInch == 0); ! Assert(m_hdc == NULL); ! Assert(m_hfont == NULL); ! Assert(m_hfontOld == NULL); // m_chrp should contain zeros too; don't bother checking } *************** *** 76,79 **** --- 80,96 ---- ReleaseDC(); } + Assert(!m_hfontOld); + if (m_hfontOld) + { + ::DeleteObject(m_hfontOld); + m_hfontOld = NULL; + } + Assert(!m_hfont); + if (m_hfont) + { + ::DeleteObject(m_hfont); + m_hfont = NULL; + } + ModuleEntry::ModuleRelease(); } *************** *** 81,85 **** /*********************************************************************************************** ! IVwGraphics Interface Methods ***********************************************************************************************/ /*---------------------------------------------------------------------------------------------- --- 98,102 ---- /*********************************************************************************************** ! IVwGraphics Interface Methods ***********************************************************************************************/ /*---------------------------------------------------------------------------------------------- *************** *** 108,112 **** MyGetClipRect(&rectClip); RECT rectIntersect; ! if(!::IntersectRect(&rectIntersect, &rectClip, &rect)) { // no intersection, nothing to do--but we (trivially) succeeded. --- 125,129 ---- MyGetClipRect(&rectClip); RECT rectIntersect; ! if (!::IntersectRect(&rectIntersect, &rectClip, &rect)) { // no intersection, nothing to do--but we (trivially) succeeded. *************** *** 125,130 **** /*---------------------------------------------------------------------------------------------- Set the foreground color used for lines, text ! Arguments: ! nRGB RGB color value ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::put_ForeColor(int nRGB) --- 142,147 ---- /*---------------------------------------------------------------------------------------------- Set the foreground color used for lines, text ! Arguments: ! nRGB RGB color value ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::put_ForeColor(int nRGB) *************** *** 145,150 **** /*---------------------------------------------------------------------------------------------- Background color, used for shape interior, text background ! Arguments: ! nRGB RGB color value or kclrTransparent ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::put_BackColor(int nRGB) --- 162,167 ---- /*---------------------------------------------------------------------------------------------- Background color, used for shape interior, text background ! Arguments: ! nRGB RGB color value or kclrTransparent ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::put_BackColor(int nRGB) *************** *** 256,260 **** If there are multiple dx values, the line is dashed. A segment of length prgdx[0] is first drawn, then a gap of length prgdx[1] is left, then a segment of length prgdx[2], ! and so forth until the specified width is reached (the last segment, if drawn, is truncated to the specified length). If all values in prgdx are used up, we start again at prgdx[0]. An odd number of segments --- 273,277 ---- If there are multiple dx values, the line is dashed. A segment of length prgdx[0] is first drawn, then a gap of length prgdx[1] is left, then a segment of length prgdx[2], ! and so forth until the specified width is reached (the last segment, if drawn, is truncated to the specified length). If all values in prgdx are used up, we start again at prgdx[0]. An odd number of segments *************** *** 285,289 **** stargdx.FormatAppend("%d,", *(prgdx + i)); } ! m_psts->OutputFormat("DrawHorzLine(%d, %d, %d, %d, %d, \"%s\", ptr)\n", xLeft, xRight, y, dyHeight, cdx, stargdx.Chars()); } --- 302,306 ---- stargdx.FormatAppend("%d,", *(prgdx + i)); } ! m_psts->OutputFormat("DrawHorzLine(%d, %d, %d, %d, %d, \"%s\", ptr)\n", xLeft, xRight, y, dyHeight, cdx, stargdx.Chars()); } *************** *** 367,371 **** StrAnsi staChar; staChar.Assign(prgch, cch); ! m_psts->OutputFormat("DrawText(%d, %d, %d, \"%s\", %d)\n", x, y, cch, staChar.Chars(), nStretch); } --- 384,388 ---- StrAnsi staChar; staChar.Assign(prgch, cch); ! m_psts->OutputFormat("DrawText(%d, %d, %d, \"%s\", %d)\n", x, y, cch, staChar.Chars(), nStretch); } *************** *** 404,408 **** cbrk++; } ! if(cbrk) { if (!::SetTextJustification(m_hdc, nStretch, cbrk)) --- 421,425 ---- cbrk++; } ! if (cbrk) { if (!::SetTextJustification(m_hdc, nStretch, cbrk)) *************** *** 483,488 **** rect.bottom = 0; } ! m_psts->OutputFormat("DrawTextExt(%d, %d, %d, \"%s\", %d, {%d, %d, %d, %d}, \"%s\")\n", x, y, cch, ! staChar.Chars(), uOptions, rect.left, rect.top, rect.right, rect.bottom, stargdx.Chars()); } --- 500,505 ---- rect.bottom = 0; } ! m_psts->OutputFormat("DrawTextExt(%d, %d, %d, \"%s\", %d, {%d, %d, %d, %d}, \"%s\")\n", x, y, cch, ! staChar.Chars(), uOptions, rect.left, rect.top, rect.right, rect.bottom, stargdx.Chars()); } *************** *** 492,496 **** CheckDc(); ! // check whether the text is visible, at least vertically RECT rectClip; --- 509,513 ---- CheckDc(); ! // check whether the text is visible, at least vertically RECT rectClip; *************** *** 566,570 **** StrAnsi staChar; staChar.Assign(prgch, cch); ! m_psts->OutputFormat("GetTextLeadWidth(%d, \"%s\", %d, %d, ptr)\n", cch, staChar.Chars(), ich, dxStretch); } --- 583,587 ---- StrAnsi staChar; staChar.Assign(prgch, cch); ! m_psts->OutputFormat("GetTextLeadWidth(%d, \"%s\", %d, %d, ptr)\n", cch, staChar.Chars(), ich, dxStretch); } *************** *** 572,576 **** CheckDc(); ! if (ich > cch) ThrowInternalError(kresInvalidArg, "ich out of range"); if (!ich) --- 589,593 ---- CheckDc(); ! if (ich > cch) ThrowInternalError(kresInvalidArg, "ich out of range"); if (!ich) *************** *** 647,651 **** if (!::GetTextMetrics(m_hdcMeasure, &tm)) ThrowInternalError(kresUnexpected, "GetTextMetrics failed"); ! *pxyFontEmSquare = tm.tmHeight - tm.tmInternalLeading; return kresOk; --- 664,668 ---- if (!::GetTextMetrics(m_hdcMeasure, &tm)) ThrowInternalError(kresUnexpected, "GetTextMetrics failed"); ! *pxyFontEmSquare = tm.tmHeight - tm.tmInternalLeading; return kresOk; *************** *** 655,659 **** Get glyph metrics for a glyph in the currently selected font. chw must be a glyph id. ----------------------------------------------------------------------------------------------*/ ! GrResult GrGraphics::GetGlyphMetrics(int chw, int * pxBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) --- 672,676 ---- Get glyph metrics for a glyph in the currently selected font. chw must be a glyph id. ----------------------------------------------------------------------------------------------*/ ! GrResult GrGraphics::GetGlyphMetrics(int chw, int * pxBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) *************** *** 671,678 **** CheckDc(); ! GLYPHMETRICS gm; const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; ! if (GDI_ERROR == ::GetGlyphOutline(m_hdcMeasure, chw, GGO_GLYPH_INDEX | GGO_METRICS, &gm, 0, NULL, &mat2)) { --- 688,695 ---- CheckDc(); ! GLYPHMETRICS gm; const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; ! if (GDI_ERROR == ::GetGlyphOutline(m_hdcMeasure, chw, GGO_GLYPH_INDEX | GGO_METRICS, &gm, 0, NULL, &mat2)) { *************** *** 698,702 **** /*---------------------------------------------------------------------------------------------- ! Get a table out of the font. ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) --- 715,719 ---- /*---------------------------------------------------------------------------------------------- ! Get a table out of the font. Device independent. ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) *************** *** 706,710 **** *pcbTableSz = -1; ! DWORD cbTableSz = ::GetFontData(m_hdcMeasure, nTableId, 0, NULL, 0); if (GDI_ERROR == cbTableSz) --- 723,727 ---- *pcbTableSz = -1; ! DWORD cbTableSz = ::GetFontData(m_hdcMeasure, nTableId, 0, NULL, 0); if (GDI_ERROR == cbTableSz) *************** *** 717,721 **** THROW(kresUnexpected); } ! return kresOk; } --- 734,738 ---- THROW(kresUnexpected); } ! return kresOk; } *************** *** 725,729 **** ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) ! { ChkGrArgPtr(pxRet); ChkGrOutPtr(pyRet); --- 742,746 ---- ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) ! { ChkGrArgPtr(pxRet); ChkGrOutPtr(pyRet); *************** *** 736,743 **** CheckDc(); ! GLYPHMETRICS gm; const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; ! WORD flag = GGO_GLYPH_INDEX | GGO_NATIVE; ! UINT cbBuf = ::GetGlyphOutline(m_hdcMeasure, chw, flag, &gm, 0, NULL, &mat2); if (cbBuf <= 0) --- 753,760 ---- CheckDc(); ! GLYPHMETRICS gm; const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; ! WORD flag = GGO_GLYPH_INDEX | GGO_NATIVE; ! UINT cbBuf = ::GetGlyphOutline(m_hdcMeasure, chw, flag, &gm, 0, NULL, &mat2); if (cbBuf <= 0) *************** *** 747,751 **** return WarnHr(kresOutOfMemory); if (GDI_ERROR == ::GetGlyphOutline(m_hdcMeasure, chw, flag, &gm, cbBuf, pGlyphData,&mat2)) ! ThrowInternalError(kresUnexpected, "Second GetGlyphOutline in XYFromGlyphPoint failed"); int dxLogPerInch = GetXInch(); --- 764,768 ---- return WarnHr(kresOutOfMemory); if (GDI_ERROR == ::GetGlyphOutline(m_hdcMeasure, chw, flag, &gm, cbBuf, pGlyphData,&mat2)) ! ThrowInternalError(kresUnexpected, "Second GetGlyphOutline in XYFromGlyphPoint failed"); int dxLogPerInch = GetXInch(); *************** *** 757,765 **** TTPOLYCURVE * pPolyCurve; pPolyHdr = (TTPOLYGONHEADER *)pGlyphData; ! int nCurPoint; nCurPoint = 0; // If the last curve in the polygon is a spline, the last point in this curve will ! // repeat the point from the the polygon header. This adds an extra point to the data // returned by Windows that is not in the TTF font file. Test to set nExtraPt is below. int nExtraPt = 0; --- 774,782 ---- TTPOLYCURVE * pPolyCurve; pPolyHdr = (TTPOLYGONHEADER *)pGlyphData; ! int nCurPoint; nCurPoint = 0; // If the last curve in the polygon is a spline, the last point in this curve will ! // repeat the point from the the polygon header. This adds an extra point to the data // returned by Windows that is not in the TTF font file. Test to set nExtraPt is below. int nExtraPt = 0; *************** *** 767,772 **** while ((BYTE *)pPolyHdr < (pGlyphData + cbBuf)) { ! if (nPoint == nCurPoint) ! { *pxRet = ::MulDiv(IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].x), dxLogPerInch, dxPixPerInch); --- 784,789 ---- while ((BYTE *)pPolyHdr < (pGlyphData + cbBuf)) { ! if (nPoint == nCurPoint) ! { *pxRet = ::MulDiv(IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].x), dxLogPerInch, dxPixPerInch); *************** *** 774,780 **** dyLogPerInch, dyPixPerInch); delete [] pGlyphData; ! return kresOk; ! } ! nCurPoint++; pPolyCurve = (TTPOLYCURVE *)(pPolyHdr + 1); if (pPolyHdr->dwType == TT_POLYGON_TYPE) --- 791,797 ---- dyLogPerInch, dyPixPerInch); delete [] pGlyphData; ! return kresOk; ! } ! nCurPoint++; pPolyCurve = (TTPOLYCURVE *)(pPolyHdr + 1); if (pPolyHdr->dwType == TT_POLYGON_TYPE) *************** *** 796,800 **** else nExtraPt = 0; ! if (nPoint < nCurPoint + pPolyCurve->cpfx - nExtraPt) { --- 813,817 ---- else nExtraPt = 0; ! if (nPoint < nCurPoint + pPolyCurve->cpfx - nExtraPt) { *************** *** 803,808 **** *pyRet = ::MulDiv(IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].y), dyLogPerInch, dyPixPerInch); ! delete [] pGlyphData; ! return kresOk; } } --- 820,825 ---- *pyRet = ::MulDiv(IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].y), dyLogPerInch, dyPixPerInch); ! delete [] pGlyphData; ! return kresOk; } } *************** *** 812,816 **** ThrowInternalError(kresUnexpected); } ! nCurPoint += pPolyCurve->cpfx - nExtraPt; pPolyCurve = (TTPOLYCURVE *)&pPolyCurve->apfx[pPolyCurve->cpfx]; --- 829,833 ---- ThrowInternalError(kresUnexpected); } ! nCurPoint += pPolyCurve->cpfx - nExtraPt; pPolyCurve = (TTPOLYCURVE *)&pPolyCurve->apfx[pPolyCurve->cpfx]; *************** *** 827,833 **** } pPolyHdr = (TTPOLYGONHEADER *)((BYTE *)pPolyHdr + pPolyHdr->cb); ! } ! delete [] pGlyphData; ThrowInternalError(kresUnexpected); return kresUnexpected; --- 844,850 ---- } pPolyHdr = (TTPOLYGONHEADER *)((BYTE *)pPolyHdr + pPolyHdr->cb); ! } ! delete [] pGlyphData; ThrowInternalError(kresUnexpected); return kresUnexpected; *************** *** 835,839 **** /*---------------------------------------------------------------------------------------------- ! Get the ascent of the currently selected font ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::get_FontAscent(int* pdy) --- 852,856 ---- /*---------------------------------------------------------------------------------------------- ! Get the ascent of the currently selected font, in logical units. ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::get_FontAscent(int* pdy) *************** *** 871,891 **** if (m_hdc) { ! if (*m_vhfontOld.Top()) ! ::SelectObject(m_hdc, *m_vhfontOld.Top()); ! if (m_hfontOldMeasure) ! ::SelectObject(m_hdcMeasure, m_hfontOldMeasure); ! m_vhfontOld.Pop(); ! ::RestoreDC(m_hdc, -1); // -1 means most recently saved ! if (m_hfont) { ! // NB this must be done after it is selected out of the DC, or we get a hard-to-find ! // GDI memory leak that causes weird drawing failures on W-98. ! ::DeleteObject(m_hfont); m_hfont = 0; } } m_hdc = NULL; m_hdcMeasure = NULL; ! Assert(m_vhfontOld.Size() == 0); // DC pushes equals pops return kresOk; --- 888,913 ---- if (m_hdc) { ! BOOL fSuccess; ! if (m_hfontOld) { ! // We have called SetFont at least once; the most recent font selected ! // is in m_hfont and is also the current one in the DC. Select the ! // original one back into the DC to prevent GDI memory leaks and similar problems. ! HFONT hfontPrev = (HFONT) ::SelectObject(m_hdc, m_hfontOld); ! Assert(hfontPrev == m_hfont); ! Assert(hfontPrev != m_hfontOld); m_hfont = 0; + ::DeleteObject(hfontPrev); + m_hfontOld = 0; } + Assert(m_hfont == 0); + if (m_hfontOldMeasure) + ::SelectObject(m_hdcMeasure, m_hfontOldMeasure); + fSuccess = ::RestoreDC(m_hdc, -1); // -1 means most recently saved + Assert(fSuccess); } m_hdc = NULL; m_hdcMeasure = NULL; ! Assert(m_vhrgnClipStack.Size() == 0); // Make sure pushes and pops match. return kresOk; *************** *** 893,897 **** /*---------------------------------------------------------------------------------------------- ! Get current actual or simulated X resolution ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::get_XUnitsPerInch(int * pxInch) --- 915,919 ---- /*---------------------------------------------------------------------------------------------- ! Get current actual or simulated X resolution. ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::get_XUnitsPerInch(int * pxInch) *************** *** 917,921 **** /*---------------------------------------------------------------------------------------------- ! Get current actual or simulated Y resolution ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::get_YUnitsPerInch(int * pyInch) --- 939,943 ---- /*---------------------------------------------------------------------------------------------- ! Get current actual or simulated Y resolution. ----------------------------------------------------------------------------------------------*/ GrResult GrGraphics::get_YUnitsPerInch(int * pyInch) *************** *** 957,965 **** const int cbFontOffset = offsetof(LgCharRenderProps, ttvBold); // if the info related to choosing HFONT is different, make a new HFONT ! if (!m_hfont || memcmp( ((byte *)pchrp) + cbFontOffset, ((byte *)&m_chrp) + cbFontOffset, isizeof(m_chrp) - cbFontOffset)) ! { // Remember the font we switch to. ! memcpy( ((byte *)&m_chrp) + cbFontOffset, ((byte *)pchrp) + cbFontOffset, isizeof(m_chrp) - cbFontOffset); --- 979,987 ---- const int cbFontOffset = offsetof(LgCharRenderProps, ttvBold); // if the info related to choosing HFONT is different, make a new HFONT ! if (!m_hfont || memcmp(((byte *)pchrp) + cbFontOffset, ((byte *)&m_chrp) + cbFontOffset, isizeof(m_chrp) - cbFontOffset)) ! { // Remember the font we switch to. ! memcpy(((byte *)&m_chrp) + cbFontOffset, ((byte *)pchrp) + cbFontOffset, isizeof(m_chrp) - cbFontOffset); *************** *** 998,1002 **** if (!hfont) ThrowHr(WarnHr(kresFail)); ! SetFont(hfont); } // Always set the colors. --- 1020,1024 ---- if (!hfont) ThrowHr(WarnHr(kresFail)); ! SetFont(hfont); } // Always set the colors. *************** *** 1006,1010 **** bool fOK = (AfGfx::SetTextColor(m_hdc, pchrp->clrFore) != CLR_INVALID); ! if(pchrp->clrBack == kclrTransparent) { // I can't find it documented anywhere, but it seems to be necessary to set --- 1028,1032 ---- bool fOK = (AfGfx::SetTextColor(m_hdc, pchrp->clrFore) != CLR_INVALID); ! if (pchrp->clrBack == kclrTransparent) { // I can't find it documented anywhere, but it seems to be necessary to set *************** *** 1037,1052 **** m_hdcMeasure = hdc; // default unless overridden by SetMeasureDc. Assert(m_hfont == 0); // Setting a new DC, we should not have any saved font info. ! SaveDC(hdc); ! m_vhfontOld.Push(0); ! //::SetMapMode(hdc, MM_TEXT); #if 0 // old code to force it to be twips. May be useful for ActiveX control ::SetWindowExtEx(hdc, 1440, 1440, NULL); // 72*20 twips per inch ! ::SetViewportExtEx(hdc, ::GetDeviceCaps(hdc, LOGPIXELSX), ! ::GetDeviceCaps(hdc, LOGPIXELSY), NULL); #endif // For the sake of being definite; rarely makes a difference; I think this is default ::SetPolyFillMode(hdc, ALTERNATE); ! // Need to set background mode to transparent so Graphite can draw overlapping glyphs ::SetBkMode(hdc, TRANSPARENT); --- 1059,1078 ---- m_hdcMeasure = hdc; // default unless overridden by SetMeasureDc. Assert(m_hfont == 0); // Setting a new DC, we should not have any saved font info. ! ! BOOL fSuccess; ! fSuccess = ::SaveDC(m_hdc); ! Assert(fSuccess); ! ! m_hfontOld = 0; ! //::SetMapMode(hdc, MM_TEXT); #if 0 // old code to force it to be twips. May be useful for ActiveX control ::SetWindowExtEx(hdc, 1440, 1440, NULL); // 72*20 twips per inch ! ::SetViewportExtEx(hdc, ::GetDeviceCaps(hdc, LOGPIXELSX), ! ::GetDeviceCaps(hdc, LOGPIXELSY), NULL); #endif // For the sake of being definite; rarely makes a difference; I think this is default ::SetPolyFillMode(hdc, ALTERNATE); ! // Need to set background mode to transparent so Graphite can draw overlapping glyphs ::SetBkMode(hdc, TRANSPARENT); *************** *** 1071,1076 **** GrResult GrGraphics::PushClipRect(RECT rcClip) { ! ::SaveDC(m_hdc); ! m_vhfontOld.Push(0); ::IntersectClipRect(m_hdc, rcClip.left, rcClip.top, rcClip.right, rcClip.bottom); return kresOk; --- 1097,1126 ---- GrResult GrGraphics::PushClipRect(RECT rcClip) { ! HRGN hrgn; ! HRGN hrgnTemp; ! hrgnTemp = ::CreateRectRgn(0, 0, 0, 0); ! hrgn = hrgnTemp; ! int iResult = ::GetClipRgn(m_hdc, hrgn); ! // ::DeleteObject(hrgnTemp); This DeleteObject is not needed. ! if (iResult == -1) ! { ! // An error occurred. ! ThrowHr(WarnHr(E_FAIL)); ! } ! else if (iResult == 0) ! { ! // No current clip region ! ::DeleteObject(hrgn); // trash the temp one ! ! // The function succeeded and the given device context, has NO clipping region. ! hrgn = 0; ! } ! else ! { ! // The function succeeded and the given device context has a clipping region. ! // hrgn is now set to the previous clipping region. ! } ! ! m_vhrgnClipStack.Push(hrgn); ::IntersectClipRect(m_hdc, rcClip.left, rcClip.top, rcClip.right, rcClip.bottom); return kresOk; *************** *** 1082,1111 **** GrResult GrGraphics::PopClipRect() { ! if (m_vhfontOld.Top()) ! ::SelectObject(m_hdc, m_vhfontOld.Top()); ! m_vhfontOld.Pop(); ! ::RestoreDC(m_hdc, -1); ! if (m_hfont) ! { ! // m_hfont is selected into the DC. Make sure it is current in the restored one, too. ! HFONT hfontPrev = (HFONT) ::SelectObject(m_hdc, m_hfont); ! if (!hfontPrev) ! ThrowHr(WarnHr(kresFail)); ! if (!m_vhfontOld.Top()) ! { ! // This is the first font selection we have made into this level; save the old one ! // to eventually select back into the DC before we RestoreDC. ! *m_vhfontOld.Top() = hfontPrev; ! } ! else ! { ! if (m_hfont != hfontPrev) ! { ! // It is neither the current font nor the one originally in this DC, so we ! // need to get rid of it. ! ::DeleteObject(hfontPrev); ! } ! } ! } return kresOk; } --- 1132,1143 ---- GrResult GrGraphics::PopClipRect() { ! // If *m_vhrgnClipStack.Top() is null, SelectClipRgn() will remove the clipping region. ! int iSuccess = ::SelectClipRgn(m_hdc, *m_vhrgnClipStack.Top()); ! if (!iSuccess || ERROR == iSuccess) ! ThrowHr(WarnHr(E_FAIL)); ! ! if (*m_vhrgnClipStack.Top()) ! ::DeleteObject(*m_vhrgnClipStack.Top()); ! m_vhrgnClipStack.Pop(); return kresOk; } *************** *** 1131,1135 **** /*********************************************************************************************** ! Utility methods ***********************************************************************************************/ --- 1163,1167 ---- /*********************************************************************************************** ! Utility methods ***********************************************************************************************/ *************** *** 1172,1188 **** ThrowHr(WarnHr(kresFail)); ! if (!m_vhfontOld.Top()) ! { ! // This is the first font selection we have made into this level; save the old one ! // to eventually select back into the DC before we RestoreDC. ! *m_vhfontOld.Top() = hfontPrev; ! } ! if (m_hfont) { // We have previously created a font and now need to delete it. // NB this must be done after it is selected out of the DC, or we get a hard-to-find // GDI memory leak that causes weird drawing failures on W-98. ::DeleteObject(m_hfont); } m_hfont = hfont; } --- 1204,1222 ---- ThrowHr(WarnHr(kresFail)); ! if (m_hfontOld) { // We have previously created a font and now need to delete it. // NB this must be done after it is selected out of the DC, or we get a hard-to-find // GDI memory leak that causes weird drawing failures on W-98. + Assert(m_hfont); + Assert(m_hfont == hfontPrev); ::DeleteObject(m_hfont); } + else + { + // This is the first font selection we have made into this level; save the old one + // to eventually select back into the DC before we RestoreDC. + m_hfontOld = hfontPrev; + } m_hfont = hfont; } *************** *** 1194,1198 **** void GrGraphics::CheckDc() { ! if (!m_hdc) { Assert(false); --- 1228,1232 ---- void GrGraphics::CheckDc() { ! if (!m_hdc) { Assert(false); *************** *** 1212,1221 **** return; } ! if(GetClipBox(m_hdc, prc) == ERROR) ThrowInternalError(E_FAIL, L"Could not get clip rectangle"); } - #include <vector_i.cpp> ! template Vector<HFONT>; // VecHfont; --- 1246,1254 ---- return; } ! if (GetClipBox(m_hdc, prc) == ERROR) ThrowInternalError(E_FAIL, L"Could not get clip rectangle"); } #include <vector_i.cpp> ! template Vector<HRGN>; // VecHRgn; Index: GrGraphics.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/fwviews/GrGraphics.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** GrGraphics.h 5 Nov 2002 21:29:08 -0000 1.1.1.1 --- GrGraphics.h 2 Jan 2003 21:18:42 -0000 1.2 *************** *** 58,65 **** virtual GrResult GetClipRect(int * pxLeft, int * pyTop, int * pxRight, int * pyBottom); virtual GrResult GetFontEmSquare(int * pxyFontEmSquare); ! virtual GrResult GetGlyphMetrics(int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY); ! virtual GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax); virtual GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet); virtual GrResult get_FontAscent(int* pdy); --- 58,65 ---- virtual GrResult GetClipRect(int * pxLeft, int * pyTop, int * pxRight, int * pyBottom); virtual GrResult GetFontEmSquare(int * pxyFontEmSquare); ! virtual GrResult GetGlyphMetrics(int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY); ! virtual GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax); virtual GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet); virtual GrResult get_FontAscent(int* pdy); *************** *** 106,116 **** Rect m_rcClip; ! typedef Vector<HFONT> VecHfont; ! // Each time we SaveDC, we push a zero into this. Each time we set a font, ! // if the top item is zero we save the previous font at the end. Each time we ! // RestoreDC, if the end value is non-zero,we select it back into the DC ! // before doing the restore. ! VecHfont m_vhfontOld; // If we have a distinct measure DC, we save its original font here to restore into it. HFONT m_hfontOldMeasure; --- 106,114 ---- Rect m_rcClip; ! typedef Vector<HRGN> VecHRgn; ! // Stack of clip regions used by PushClipRect and PopClipRect. ! VecHRgn m_vhrgnClipStack; ! HFONT m_hfontOld; // original font to restore into the DC. // If we have a distinct measure DC, we save its original font here to restore into it. HFONT m_hfontOldMeasure; *************** *** 128,134 **** int IntFromFixed(FIXED f) { ! if (f.fract >= 0x8000) return(f.value + 1); ! else return(f.value); } --- 126,132 ---- int IntFromFixed(FIXED f) { ! if (f.fract >= 0x8000) return(f.value + 1); ! else return(f.value); } Index: GrTxtSrc.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/fwviews/GrTxtSrc.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** GrTxtSrc.cpp 5 Nov 2002 21:29:08 -0000 1.1.1.1 --- GrTxtSrc.cpp 2 Jan 2003 21:18:42 -0000 1.2 *************** *** 11,19 **** Description: An implementation of ITextSource based on having a VwStringBoxMain for each span in a ! paragraph (or one for the whole paragraph, if no embedded spans), and a list of strings. -------------------------------------------------------------------------------*//*:End Ignore*/ //:>******************************************************************************************** ! //:> Include files //:>******************************************************************************************** #include "main.h" --- 11,19 ---- Description: An implementation of ITextSource based on having a VwStringBoxMain for each span in a ! paragraph (or one for the whole paragraph, if no embedded spans), and a list of strings. -------------------------------------------------------------------------------*//*:End Ignore*/ //:>******************************************************************************************** ! //:> Include files //:>******************************************************************************************** #include "main.h" *************** *** 25,29 **** //:>******************************************************************************************** ! //:> Forward declarations //:>******************************************************************************************** --- 25,29 ---- //:>******************************************************************************************** ! //:> Forward declarations //:>******************************************************************************************** *************** *** 45,49 **** m_prgchText = NewObj OLECHAR[m_cchLength]; memcpy(m_prgchText, pszText, isizeof(OLECHAR) * m_cchLength); ! pszText[m_cchLength] = 0; // zero-terminate memcpy(&m_chrp, &chrp, isizeof(LgCharRenderProps)); --- 45,49 ---- m_prgchText = NewObj OLECHAR[m_cchLength]; memcpy(m_prgchText, pszText, isizeof(OLECHAR) * m_cchLength); ! m_prgchText[m_cchLength] = 0; // zero-terminate memcpy(&m_chrp, &chrp, isizeof(LgCharRenderProps)); *************** *** 88,91 **** --- 88,93 ---- memcpy(pchrp, &m_chrp, isizeof(LgCharRenderProps)); + *pichMin = 0; + *pichLim = m_cchLength; return kresOk; } *************** *** 110,113 **** --- 112,117 ---- { memset(pchrp, 0, isizeof(LgParaRenderProps)); + *pichMin = 0; + *pichLim = m_cchLength; Assert(false); ThrowInternalError(kresNotImpl); |
From: <sil...@li...> - 2003-01-02 21:18:56
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1:/tmp/cvs-serv14941/src/GrEngine Modified Files: GrCharStream.cpp GrCharStream.h GrEngine.cpp GrPass.cpp GrSegment.cpp GrSlotState.cpp GrSlotState.h GrSlotStream.cpp GrTableManager.cpp GrTableManager.h TransductionLog.cpp main.h Log Message: Synchronized with FW, 20 Dec 2002, changelist #05908 Index: GrCharStream.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrCharStream.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** GrCharStream.cpp 5 Nov 2002 21:29:14 -0000 1.1.1.1 --- GrCharStream.cpp 2 Jan 2003 21:18:43 -0000 1.2 *************** *** 47,63 **** m_fEndLine(fEndLine), m_ichwPos(ichwMin), ! m_cchwRunMax(-1), ! m_prgchwRunText(NULL), m_ichwRunMin(0), m_ichwRunLim(0), m_ichwRunOffset(kPosInfinity) { } /*---------------------------------------------------------------------------------------------- Get the next character from the stream. ----------------------------------------------------------------------------------------------*/ ! wchar GrCharStream::NextGet(GrTableManager * ptman, ! GrFeatureValues * pfval, LgCharRenderProps ** ppchrp, int * pichwSegOffset) { GrResult res; --- 47,69 ---- m_fEndLine(fEndLine), m_ichwPos(ichwMin), ! m_cnRunMax(-1), ! m_prgnRunText(NULL), m_ichwRunMin(0), m_ichwRunLim(0), + m_inRunOffset(kPosInfinity), m_ichwRunOffset(kPosInfinity) { + m_vislotNextChunkMap.Clear(); } /*---------------------------------------------------------------------------------------------- Get the next character from the stream. + + @param pichwSegOffset - index of this character from the beginning of the segment + @param pcchw16bit - number of 16-bit chars consumed to get one complete Unicode codepoint. ----------------------------------------------------------------------------------------------*/ ! int GrCharStream::NextGet(GrTableManager * ptman, ! GrFeatureValues * pfval, LgCharRenderProps ** ppchrp, int * pichwSegOffset, ! int * pcchw16bit) { GrResult res; *************** *** 80,97 **** } ! if (m_cchwRunMax != -1 && m_cchwRunMax < m_ichwRunLim - m_ichwRunMin) { // Text buffer is too small: delete it and create a new one. ! delete[] m_prgchwRunText; ! m_cchwRunMax = -1; } ! if (m_cchwRunMax == -1) { ! m_cchwRunMax = m_ichwRunLim - m_ichwRunMin; ! m_prgchwRunText = NewObj wchar[m_cchwRunMax]; } ! res = m_pgts->Fetch(m_ichwRunMin, m_ichwRunLim, m_prgchwRunText); if (ResultFailed(res)) { --- 86,106 ---- } ! if (m_cnRunMax != -1 && m_cnRunMax < m_ichwRunLim - m_ichwRunMin) { // Text buffer is too small: delete it and create a new one. ! delete[] m_prgnRunText; ! m_cnRunMax = -1; } ! if (m_cnRunMax == -1) { ! // Note that combining surrogates will always result in the same or fewer ! // number of characters in m_prgnRunText, so the following is safe: ! m_cnRunMax = m_ichwRunLim - m_ichwRunMin; ! m_prgnRunText = NewObj int[m_cnRunMax]; } ! wchar * prgchwRunText = NewObj wchar[m_ichwRunLim - m_ichwRunMin]; ! res = m_pgts->Fetch(m_ichwRunMin, m_ichwRunLim, prgchwRunText); if (ResultFailed(res)) { *************** *** 99,119 **** return 0; } SetUpFeatureValues(ptman, m_ichwPos); ! m_ichwRunOffset = m_ichwPos - m_ichwRunMin; } ! wchar chwRet = m_prgchwRunText[m_ichwRunOffset]; *pfval = m_fvalRunFeats; *ppchrp = &m_chrpRun; *pichwSegOffset = m_ichwPos - m_ichwMin; // offset from the official start of the segment - ++m_ichwPos; - ++m_ichwRunOffset; Assert(m_ichwPos == (m_ichwRunMin + m_ichwRunOffset)); Assert(m_ichwPos <= m_ichwLim); ! return chwRet; } --- 108,293 ---- return 0; } + int inUni = 0; + for (int ichw = 0; ichw < m_ichwRunLim - m_ichwRunMin; ichw++) + { + if (ichw == m_ichwPos - m_ichwRunMin) + { + m_ichwRunOffset = ichw; + m_inRunOffset = inUni; + } + + int cchwUsed; + m_prgnRunText[inUni] = Utf16ToUtf32(prgchwRunText + ichw, m_ichwRunLim - ichw, + &cchwUsed); + m_vislotNextChunkMap.Push(inUni); + for (int i = 1; i < cchwUsed; i++) + m_vislotNextChunkMap.Push(-1); + ichw += cchwUsed - 1; + inUni++; + } + delete[] prgchwRunText; SetUpFeatureValues(ptman, m_ichwPos); ! Assert(m_ichwRunOffset >= 0); ! Assert(m_ichwRunOffset < m_ichwRunLim - m_ichwRunMin); } ! int nRet = m_prgnRunText[m_inRunOffset]; *pfval = m_fvalRunFeats; *ppchrp = &m_chrpRun; *pichwSegOffset = m_ichwPos - m_ichwMin; // offset from the official start of the segment + // of the first 16-bit char + int ichwPosPrev = m_ichwPos; + ++m_inRunOffset; + do { + ++m_ichwPos; + ++m_ichwRunOffset; + } while (m_ichwPos < m_vislotNextChunkMap.Size() && + m_vislotNextChunkMap[m_ichwPos] == -1); + + *pcchw16bit = m_ichwPos - ichwPosPrev; // number of 16-bit chars consumed + Assert(*pcchw16bit <= 2); Assert(m_ichwPos == (m_ichwRunMin + m_ichwRunOffset)); Assert(m_ichwPos <= m_ichwLim); ! return nRet; ! } ! ! ! /*---------------------------------------------------------------------------------------------- ! Convert UTF-16 to UTF-32--a single character's worth. Return the number of 16-bit ! items consumed. ! ----------------------------------------------------------------------------------------------*/ ! int GrCharStream::Utf16ToUtf32(wchar * prgchw, int cchw, int * pcchwUsed) ! { ! if (cchw <= 0) ! { ! *pcchwUsed = 0; ! return 0; ! } ! ! uint nUtf32; ! bool fSurrogate = FromSurrogatePair(prgchw[0], ((cchw < 2) ? 0 : prgchw[1]), &nUtf32); ! *pcchwUsed = (fSurrogate) ? 2 : 1; ! return (int)nUtf32; ! ! /* ! // For testing: ! int nCharRet; ! if (cchw >= 2 && prgchw[0] == '^' && prgchw[1] == 'a') ! { ! nCharRet = 'A'; ! *pcchwUsed = 2; ! } ! else if (cchw >= 3 && prgchw[0] == '#' && prgchw[1] == '#' && ! prgchw[2] == 'B') ! { ! nCharRet = 'b'; ! *pcchwUsed = 3; ! } ! else if (cchw >= 1) ! { ! nCharRet = prgchw[0]; ! *pcchwUsed = 1; ! } ! else ! { ! nCharRet = 0; ! *pcchwUsed = 0; ! } ! return nCharRet; ! */ ! } ! ! /*---------------------------------------------------------------------------------------------- ! Return true if the given position is at the boundary of a Unicode character; return false ! if it is between two parts of pair of surrogates. ! ----------------------------------------------------------------------------------------------*/ ! bool GrCharStream::AtUnicodeCharBoundary(IGrTextSource * pgts, int ichw) ! { ! int ichwRunMin, ichwRunLim, cchw; ! GrResult res = pgts->get_Length(&cchw); ! if (ichw <= 0 || ichw >= cchw) ! return true; ! ! LgCharRenderProps chrp; ! res = pgts->GetCharProps(ichw, &chrp, &ichwRunMin, &ichwRunLim); ! if (ResultFailed(res)) ! { ! THROW(res); ! return true; ! } ! wchar * prgchwRunText = NewObj wchar[ichwRunLim - ichwRunMin]; ! res = pgts->Fetch(ichwRunMin, ichwRunLim, prgchwRunText); ! if (ResultFailed(res)) ! { ! delete[] prgchwRunText; ! THROW(res); ! return true; ! } ! bool fRet = AtUnicodeCharBoundary(prgchwRunText, ichwRunLim - ichwRunMin, ! ichw - ichwRunMin); ! delete[] prgchwRunText; ! return fRet; ! } ! ! /*---------------------------------------------------------------------------------------------- ! Return true if the given position is at the boundary of a Unicode character; return false ! if it is between two parts of pair of surrogates. ! ----------------------------------------------------------------------------------------------*/ ! bool GrCharStream::AtUnicodeCharBoundary(wchar * prgchw, int cchw, int ichw) ! { ! Assert(ichw >= 0); ! Assert(ichw <= cchw); ! ! if (ichw == 0) ! return true; ! if (ichw >= cchw) ! return true; ! ! uint nUtf32; ! bool fMiddleOfPair = FromSurrogatePair(prgchw[ichw - 1], prgchw[ichw], &nUtf32); ! return !fMiddleOfPair; ! ! /* ! // temp stuff for debugging: ! if (ichw > 0 && cchw >= 1 && prgchw[ichw-1] == '^' && prgchw[ichw] == 'a') ! { ! return false; ! } ! if (ichw > 0 && cchw >= 2 && prgchw[ichw-1] == '#' && prgchw[ichw] == '#' && ! prgchw[ichw+1] == 'B') ! { ! return false; ! } ! if (ichw > 1 && cchw >= 1 && prgchw[ichw-2] == '#' && prgchw[ichw-1] == '#' && ! prgchw[ichw] == 'B') ! { ! return false; ! } ! ! return true; ! */ ! } ! ! /*---------------------------------------------------------------------------------------------- ! Convert the given pair of characters into a single 32-bit Unicode character. Return ! true if they are a legitimate surrogate pair. If not, just return the first of the ! two 16-bit characters. ! ----------------------------------------------------------------------------------------------*/ ! bool GrCharStream::FromSurrogatePair(wchar chIn1, wchar chIn2, uint * pch32Out) ! { ! if ((chIn1 < 0xD800) || (chIn1 > 0xDBFF) || (chIn2 < 0xDC00) || (chIn2 > 0xDFFF)) ! { ! *pch32Out = (uint)chIn1; ! return false; ! } ! else ! { ! *pch32Out = ((chIn1 - 0xD800) << 10) + chIn2 + 0x2400; ! return true; ! } } *************** *** 134,141 **** } int ichwSegOffset; ! wchar chw = NextGet(ptman, pfval, ppchrp, &ichwSegOffset); ! --m_ichwPos; ! --m_ichwRunOffset; } else --- 308,325 ---- } + // Get the settings from the first character. int ichwSegOffset; ! int ichwPosSave = m_ichwPos; ! int ichwRunOffsetSave = m_ichwRunOffset; ! int inRunOffsetSave = m_inRunOffset; ! int cMapSize = m_vislotNextChunkMap.Size(); ! int cchwConsumed; ! int nChar = NextGet(ptman, pfval, ppchrp, &ichwSegOffset, &cchwConsumed); ! // Put the character back. ! m_ichwPos = ichwPosSave; ! m_ichwRunOffset = ichwRunOffsetSave; ! m_inRunOffset = inRunOffsetSave; ! while (m_vislotNextChunkMap.Size() > cMapSize) ! m_vislotNextChunkMap.Pop(); } else Index: GrCharStream.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrCharStream.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GrCharStream.h 11 Nov 2002 23:56:53 -0000 1.3 --- GrCharStream.h 2 Jan 2003 21:18:44 -0000 1.4 *************** *** 34,39 **** ~GrCharStream() { ! if (m_cchwRunMax >= 0) ! delete[] m_prgchwRunText; } --- 34,39 ---- ~GrCharStream() { ! if (m_cnRunMax >= 0) ! delete[] m_prgnRunText; } *************** *** 71,76 **** } ! wchar NextGet(GrTableManager *, GrFeatureValues * pfval, LgCharRenderProps ** ppchrp, ! int * ichwSegOffset); void CurrentFeatures(GrTableManager * ptman, --- 71,76 ---- } ! int NextGet(GrTableManager *, GrFeatureValues * pfval, LgCharRenderProps ** ppchrp, ! int * ichwSegOffset, int * pcchw16bit); void CurrentFeatures(GrTableManager * ptman, *************** *** 78,83 **** // For transduction logging: ! int GetLogData(GrTableManager * ptman, wchar * rgchw, bool * rgfNewRun, ! GrFeatureValues * rgfval, COLORREF * rgclrFore, COLORREF * rgclrBack, int cchwBackup); protected: --- 78,86 ---- // For transduction logging: ! int GetLogData(GrTableManager * ptman, int * rgnChars, bool * rgfNewRun, ! GrFeatureValues * rgfval, COLORREF * rgclrFore, COLORREF * rgclrBack, int cchwBackup, ! int * pcchwMax16bit); ! void GetLogDataSurrogates(GrTableManager * ptman, int cchw, int cchwBackup, ! int cchwMax16bit, int * prgnChars, wchar * prgchw2, int * prgichw16bit); protected: *************** *** 87,90 **** --- 90,98 ---- StrUni stu, bool fSettingDefaults); + static int Utf16ToUtf32(wchar * prgchw16bit, int cchw, int * pcchwUsed); + static bool AtUnicodeCharBoundary(IGrTextSource * pgts, int ichw); + static bool AtUnicodeCharBoundary(wchar * prgch, int cchw, int ichw); + static bool FromSurrogatePair(wchar chIn1, wchar chIn2, uint * pch32Out); + protected: // Instance variables: *************** *** 97,107 **** // We read a run's worth of data at a time and cache it in the following variables: ! int m_cchwRunMax; // size of buffer allocated ! wchar * m_prgchwRunText; int m_ichwRunMin; int m_ichwRunLim; ! int m_ichwRunOffset; // kPosInfinity if nothing set up GrFeatureValues m_fvalRunFeats; LgCharRenderProps m_chrpRun; }; --- 105,118 ---- // We read a run's worth of data at a time and cache it in the following variables: ! int m_cnRunMax; // size of buffer allocated ! int * m_prgnRunText; int m_ichwRunMin; int m_ichwRunLim; ! int m_inRunOffset; // index into m_prgnRunText; kPosInfinity if nothing set up ! int m_ichwRunOffset; // corresponding index into text source GrFeatureValues m_fvalRunFeats; LgCharRenderProps m_chrpRun; + + Vector<int> m_vislotNextChunkMap; // maps from 16-bit chars to 32-bit chars & glyphs }; Index: GrEngine.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrEngine.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GrEngine.cpp 12 Nov 2002 23:23:24 -0000 1.3 --- GrEngine.cpp 2 Jan 2003 21:18:44 -0000 1.4 *************** *** 72,80 **** { DestroyContents(); m_stuInitialize.Clear(); ! m_staCtrlFileReg.Clear(); ! m_staCtrlFileBold.Clear(); ! m_staCtrlFileItalic.Clear(); ! m_staCtrlFileBI.Clear(); m_stuFaceName.Clear(); m_stuFeatures.Clear(); --- 72,88 ---- { DestroyContents(); + m_stuInitialize.Clear(); ! m_strCtrlFileReg.Clear(); ! m_strCtrlFileBold.Clear(); ! m_strCtrlFileItalic.Clear(); ! m_strCtrlFileBI.Clear(); ! m_fSmartReg = false; ! m_fSmartBold = false; ! m_fSmartItalic = false; ! m_fSmartBI = false; ! m_fFakeItalicCache = false; ! m_fFakeBICache = false; ! m_stuFaceName.Clear(); m_stuFeatures.Clear(); *************** *** 133,140 **** m_stuInitialize.Assign((const wchar *)prgb, cb / isizeof(wchar)); ! m_staCtrlFileReg.Clear(); ! m_staCtrlFileBold.Clear(); ! m_staCtrlFileItalic.Clear(); ! m_staCtrlFileBI.Clear(); m_stuFaceName.Clear(); --- 141,148 ---- m_stuInitialize.Assign((const wchar *)prgb, cb / isizeof(wchar)); ! m_strCtrlFileReg.Clear(); ! m_strCtrlFileBold.Clear(); ! m_strCtrlFileItalic.Clear(); ! m_strCtrlFileBI.Clear(); m_stuFaceName.Clear(); *************** *** 827,838 **** { strStyle = (fItalic) ? _T("bolditalic") : _T("bold"); ! strCtrlFileStyle = (fItalic) ? m_staCtrlFileBI : m_staCtrlFileBold; fSmart = (fItalic) ? m_fSmartBI : m_fSmartBold; } else { ! strStyle = (fItalic) ? "italic" : "regular"; ! strCtrlFileStyle = (fItalic) ? m_staCtrlFileItalic : m_staCtrlFileReg; fSmart = (fItalic) ? m_fSmartItalic : m_fSmartReg; } --- 835,848 ---- { strStyle = (fItalic) ? _T("bolditalic") : _T("bold"); ! strCtrlFileStyle = (fItalic) ? m_strCtrlFileBI : m_strCtrlFileBold; fSmart = (fItalic) ? m_fSmartBI : m_fSmartBold; + m_fFakeItalic = (fItalic) ? m_fFakeBICache : false; } else { ! strStyle = (fItalic) ? _T("italic") : _T("regular"); ! strCtrlFileStyle = (fItalic) ? m_strCtrlFileItalic : m_strCtrlFileReg; fSmart = (fItalic) ? m_fSmartItalic : m_fSmartReg; + m_fFakeItalic = (fItalic) ? m_fFakeItalicCache : false; } *************** *** 840,846 **** // if no cache data, find file to use StrApp strFontFile = strCtrlFileStyle; ! if (strCtrlFileStyle == _T("")) { fSmart = GrUtil::GetFontFile(strFontName.Chars(), strStyle.Chars(), strFontFile); // If we were not successful in finding bold/italic versions of the tables, try --- 850,857 ---- // if no cache data, find file to use StrApp strFontFile = strCtrlFileStyle; ! if (strCtrlFileStyle.Length() == 0) { fSmart = GrUtil::GetFontFile(strFontName.Chars(), strStyle.Chars(), strFontFile); + m_fFakeItalic = false; // If we were not successful in finding bold/italic versions of the tables, try *************** *** 855,858 **** --- 866,870 ---- strStyle = _T("bold"); fSmart = GrUtil::GetFontFile(strFontName.Chars(), strStyle.Chars(), strFontFile); + m_fFakeItalic = true; } if (!fSmart && (fBold || fItalic)) *************** *** 860,863 **** --- 872,876 ---- strStyle = _T("regular"); fSmart = GrUtil::GetFontFile(strFontName.Chars(), strStyle.Chars(), strFontFile); + m_fFakeItalic = true; } } *************** *** 980,992 **** LCache: if (fBold) { ! (fItalic) ? m_staCtrlFileBI = strFontFile : m_staCtrlFileBold = strFontFile; ! (fItalic) ? m_fSmartBI = fSmart : m_fSmartBold = fSmart; } else { ! (fItalic) ? m_staCtrlFileItalic = strFontFile : m_staCtrlFileReg = strFontFile; ! (fItalic) ? m_fSmartItalic = fSmart : m_fSmartReg = fSmart; } --- 993,1008 ---- LCache: + bool fBogus; if (fBold) { ! (fItalic) ? m_strCtrlFileBI = strFontFile : m_strCtrlFileBold = strFontFile; ! (fItalic) ? m_fSmartBI = fSmart : m_fSmartBold = fSmart; ! (fItalic) ? m_fFakeBICache = m_fFakeItalic : fBogus = false; } else { ! (fItalic) ? m_strCtrlFileItalic = strFontFile : m_strCtrlFileReg = strFontFile; ! (fItalic) ? m_fSmartItalic = fSmart : m_fSmartReg = fSmart; ! (fItalic) ? m_fFakeItalicCache = m_fFakeItalic : fBogus = false; } *************** *** 1921,1925 **** // flags chwTmp = grstrm.ReadUShortFromFont(); ! Assert(chwTmp == 0x8000); // index into name table of UI label int nNameId = grstrm.ReadShortFromFont(); --- 1937,1941 ---- // flags chwTmp = grstrm.ReadUShortFromFont(); ! Assert(chwTmp == 0x8000); // mutually exclusive // index into name table of UI label int nNameId = grstrm.ReadShortFromFont(); *************** *** 1958,1964 **** Return the glyph ID for the given Unicode value. ----------------------------------------------------------------------------------------------*/ ! wchar GrEngine::GetGlyphIDFromUnicode(wchar chwUnicode) { ! wchar chwGlyphID = MapToPseudo(chwUnicode); if (chwGlyphID != 0) return chwGlyphID; // return a pseudo-glyph --- 1974,1980 ---- Return the glyph ID for the given Unicode value. ----------------------------------------------------------------------------------------------*/ ! wchar GrEngine::GetGlyphIDFromUnicode(int nUnicode) { ! wchar chwGlyphID = MapToPseudo(nUnicode); if (chwGlyphID != 0) return chwGlyphID; // return a pseudo-glyph *************** *** 1974,1978 **** return 0; ! return TtfUtil::Cmap31Lookup(m_pCmap31, chwUnicode); // returns 0 if chwUnicode is invalid } --- 1990,1994 ---- return 0; ! return TtfUtil::Cmap31Lookup(m_pCmap31, nUnicode); // returns 0 if nUnicode is invalid } Index: GrPass.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPass.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrPass.cpp 11 Nov 2002 23:31:48 -0000 1.2 --- GrPass.cpp 2 Jan 2003 21:18:45 -0000 1.3 *************** *** 545,552 **** int ichwSegOffset; // offset from the official start of the segment GrFeatureValues fval; LgCharRenderProps * pchrp = NULL; ! wchar chwUnicode = pchstrm->NextGet(ptman, &fval, &pchrp, &ichwSegOffset); ! wchar chwGlyphID = ptman->GetGlyphIDFromUnicode(chwUnicode); GrSlotState * pslotNew; --- 545,553 ---- int ichwSegOffset; // offset from the official start of the segment + int cchw; // number of 16-bit chars consumed GrFeatureValues fval; LgCharRenderProps * pchrp = NULL; ! int nUnicode = pchstrm->NextGet(ptman, &fval, &pchrp, &ichwSegOffset, &cchw); ! wchar chwGlyphID = ptman->GetGlyphIDFromUnicode(nUnicode); GrSlotState * pslotNew; *************** *** 555,558 **** --- 556,561 ---- psstrmOut->NextPut(pslotNew); psstrmOut->MapInputChunk(islotChunkI, islotChunkO, pchstrm->SegOffset(), false, false); + // Mapping the output chunks of the char stream has already been handled by the + // char stream. } *************** *** 856,860 **** if (!CanResyncSkip(psstrmOutput)) { ! Assert(false); return (m_cslotSkipToResync - psstrmOutput->WritePos()); } --- 859,863 ---- if (!CanResyncSkip(psstrmOutput)) { ! Assert(false); // caller makes sure this doesn't happen return (m_cslotSkipToResync - psstrmOutput->WritePos()); } *************** *** 1190,1196 **** psstrmOut->UnwindOutput(islotOut, IsPosPass()); ! if (psstrmOut->WritePos() < m_cslotSkipToResync) { ! m_fDidResyncSkip = false; psstrmOut->ClearSlotsSkippedToResync(); } --- 1193,1205 ---- psstrmOut->UnwindOutput(islotOut, IsPosPass()); ! if (psstrmIn->ReadPos() < psstrmIn->SlotsSkippedToResync()) { ! ptman->Pass(m_ipass - 1)->UndoResyncSkip(); ! psstrmIn->ClearSlotsSkippedToResync(); ! } ! if (psstrmOut->WritePos() < psstrmOut->SlotsSkippedToResync()) ! { ! Assert(psstrmOut->SlotsSkippedToResync() == m_cslotSkipToResync); ! UndoResyncSkip(); psstrmOut->ClearSlotsSkippedToResync(); } Index: GrSegment.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSegment.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrSegment.cpp 12 Nov 2002 22:30:56 -0000 1.2 --- GrSegment.cpp 2 Jan 2003 21:18:45 -0000 1.3 *************** *** 1678,1682 **** } - /*---------------------------------------------------------------------------------------------- Fill in the given buffer with the data that was used to initialize this segment-- --- 1678,1681 ---- *************** *** 2873,2877 **** } - /*---------------------------------------------------------------------------------------------- Return the given output slot. --- 2872,2875 ---- *************** *** 2999,3002 **** --- 2997,3002 ---- *pfAfter = fAfter; + Assert(GrCharStream::AtUnicodeCharBoundary(m_pgts, ichwBase + dichw)); + return ichwBase + dichw; } *************** *** 3030,3035 **** *pfAfter = false; } ! ! return dichw + ichwBase; } --- 3030,3038 ---- *pfAfter = false; } ! ! // This should be true because of the way the associations are set up: ! Assert(GrCharStream::AtUnicodeCharBoundary(m_pgts, ichwBase + dichw)); ! ! return ichwBase + dichw; } *************** *** 3080,3083 **** --- 3083,3087 ---- NOTE that ichw indicates a CHARACTER, not a location between characters. So ichw = 3, fBefore = false indicates a selection between characters 3 and 4. + For surrogates, it indicates the FIRST of the pair of 16-bit chars. ----------------------------------------------------------------------------------------------*/ int GrSegment::UnderlyingToLogicalSurface(int ichwBase, int ichw, bool fBefore) *************** *** 3101,3106 **** { isloutRet = m_prgisloutBefore[ichw - m_ichwAssocsMin]; ! ++ichw; ! } while (isloutRet == kPosInfinity && ichw < m_ichwAssocsLim) ; return isloutRet; } --- 3105,3111 ---- { isloutRet = m_prgisloutBefore[ichw - m_ichwAssocsMin]; ! do { ++ichw; } ! while (!GrCharStream::AtUnicodeCharBoundary(m_pgts, ichw)); ! } while (isloutRet == kPosInfinity && ichw < m_ichwAssocsLim); return isloutRet; } *************** *** 3115,3119 **** { isloutRet = m_prgisloutAfter[ichw - m_ichwAssocsMin]; ! --ichw; } while (isloutRet == kNegInfinity && ichw >= 0); return isloutRet; --- 3120,3125 ---- { isloutRet = m_prgisloutAfter[ichw - m_ichwAssocsMin]; ! do { --ichw; } ! while (!GrCharStream::AtUnicodeCharBoundary(m_pgts, ichw)); } while (isloutRet == kNegInfinity && ichw >= 0); return isloutRet; *************** *** 4509,4516 **** Return false if the line segment does not need to be added after all. ! If we have to split this rectangle into two, add the second one to vrectMoreToAdd, so ! we can do the same process on it. ! ! If we can merge the two rectangles, add the result to vrectMoreToAdd (so it can be properly checked for further overlaps), and adjust the rectangle in the vector so it will be deleted. --- 4515,4519 ---- Return false if the line segment does not need to be added after all. ! If we can merge the two line segments, add the result to vrectMoreToAdd (so it can be properly checked for further overlaps), and adjust the rectangle in the vector so it will be deleted. *************** *** 5013,5016 **** --- 5016,5020 ---- return ((nDir % 2) != 0); } + /*---------------------------------------------------------------------------------------------- Return whether the given slot is right-to-left. *************** *** 5056,5057 **** --- 5060,5162 ---- } + /*---------------------------------------------------------------------------------------------- + Return the physical width of the character range. + ----------------------------------------------------------------------------------------------*/ + /* + GrResult GrSegment::GetWidthOfRange(int ichwBase, IGrGraphics * pgg, int ichwMin, int ichwLim, + RECT rs, RECT rd, int * pdxd) + { + GrResult res; + + if (!m_prgslout) + { + *pdxd = 0; + return kresUnexpected; + } + + // Do this in chunks of characters that are in the same direction. + + int dxd = 0; + int ichMinLp = ichwMin; + for ( ; ; ) + { + int nDirDepth; + int ichLimLp = EndOfDirectionRange(ichwBase, pgg, ichMinLp, ichwLim, &nDirDepth); + if (ichLimLp == ichMinLp) + break; + + bool fRtl = nDirDepth % 2; + + int isloutFirst = UnderlyingToLogicalSurface(ichwBase, ichMinLp, true); + int isloutLast = UnderlyingToLogicalSurface(ichwBase, ichLimLp - 1, false); + + int xsGlyphLeft, xsGlyphRight; + + res = kresOk; + + int igbbFirst = LogicalToPhysicalSurface(isloutFirst); + int igbbLast = LogicalToPhysicalSurface(isloutLast); + + GrSlotOutput * psloutFirst = OutputSlot(isloutFirst); + GrSlotOutput * psloutLast = OutputSlot(isloutLast); + + if (fRtl) + { + Assert(igbbLast <= igbbFirst); // because gbb's are in LTR order. + xsGlyphRight = GetWidthOfText(pgg, igbbFirst) + + psloutFirst->GlyphMetricLogUnits(pgg, kgmetAdvWidth); + xsGlyphLeft = GetWidthOfText(pgg, igbbLast); + } + else + { + Assert(igbbFirst <= igbbLast); + xsGlyphLeft = GetWidthOfText(pgg, igbbFirst); + xsGlyphRight = GetWidthOfText(pgg, igbbLast) + + psloutLast->GlyphMetricLogUnits(pgg, kgmetAdvWidth); + } + + int xdLeft = ScaleX(xsGlyphLeft, rs, rd); + int xdRight = ScaleX(xsGlyphRight, rs, rd); + dxd += xdRight - xdLeft; + + ichMinLp = ichLimLp; + } + + *pdxd = dxd; + return kresOk; + } + */ + + + /*---------------------------------------------------------------------------------------------- + Return the index of the next character that is of a different direction, or ichwLim, + whichever comes first. + ----------------------------------------------------------------------------------------------*/ + /* + int GrSegment::EndOfDirectionRange(int ichwBase, IGrGraphics * pgg, int ichwMin, int ichwLim, + int * pnDirDepth) + { + if (ichwMin >= ichwLim) + return ichwLim; + + int isloutMin = UnderlyingToLogicalSurface(ichwBase, ichwMin, true); + GrSlotOutput * psloutMin = OutputSlot(isloutMin); + *pnDirDepth = psloutMin->DirLevel(); + + if (*pnDirDepth == -1) // not calculated because no bidi pass + { + *pnDirDepth = m_nDirDepth; + return ichwLim; + } + + int ichwRet = ichwMin; + for( ; ichwRet < ichwLim; ichwRet++) + { + int islout = UnderlyingToLogicalSurface(ichwBase, ichwRet, true); + GrSlotOutput * pslout = OutputSlot(islout); + if (pslout->DirLevel() != *pnDirDepth) + return ichwRet; + } + return ichwRet; + } + */ Index: GrSlotState.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrSlotState.cpp 11 Nov 2002 23:31:48 -0000 1.2 --- GrSlotState.cpp 2 Jan 2003 21:18:47 -0000 1.3 *************** *** 354,358 **** { Assert(PassModified() >= pslot->PassModified()); ! pslot->SetComponentRefsFor(pslout, slatiArg); } } --- 354,358 ---- { Assert(PassModified() >= pslot->PassModified()); ! pslot->SetComponentRefsFor(pslout, -1); } } *************** *** 536,540 **** --- 536,542 ---- #ifdef _DEBUG if (IsLineBreak(ptman->LBGlyphID())) + { Warn("Getting metrics of line-break slot"); + } #endif // _DEBUG if (IsLineBreak(ptman->LBGlyphID())) *************** *** 962,972 **** /*---------------------------------------------------------------------------------------------- ! Offsets of a single glyph relative to the previous advance position. ----------------------------------------------------------------------------------------------*/ ! int GrSlotState::GlyphXOffset(GrSlotStream * psstrm) { ! return Base(psstrm)->ClusterRootOffset() + m_xsOffsetX; } int GrSlotState::GlyphYOffset(GrSlotStream * psstrm) { --- 964,981 ---- /*---------------------------------------------------------------------------------------------- ! X-offset of a single glyph relative to the previous advance position. ----------------------------------------------------------------------------------------------*/ ! int GrSlotState::GlyphXOffset(GrSlotStream * psstrm, bool fFakeItalic) { ! int xsRet = Base(psstrm)->ClusterRootOffset() + m_xsOffsetX; ! if (fFakeItalic) ! // fake an italic slant ! xsRet += m_ysOffsetY / 4; ! return xsRet; } + /*---------------------------------------------------------------------------------------------- + Y-offsets of a single glyph relative to the previous advance position. + ----------------------------------------------------------------------------------------------*/ int GrSlotState::GlyphYOffset(GrSlotStream * psstrm) { *************** *** 1026,1035 **** if (nGpoint == kGpointZero) nGpoint = 0; ! ptman->GPointToXY(pslotRoot->GlyphID(), nGpoint, pxsAttAtX, pysAttAtY); ! ! // Adjust by offsets. ! *pxsAttAtX += ptman->EmToLogUnits(m_mAttachAtXOffset); ! *pysAttAtY += ptman->EmToLogUnits(m_mAttachAtYOffset); ! } --- 1035,1053 ---- if (nGpoint == kGpointZero) nGpoint = 0; ! bool fImpl = ptman->GPointToXY(pslotRoot->GlyphID(), nGpoint, pxsAttAtX, pysAttAtY); ! if (!fImpl) ! { ! // Fall back to using x- and y-coordinates; no adjustment for hinting. ! int mX = m_mAttachAtX + m_mAttachAtXOffset; ! int mY = m_mAttachAtY + m_mAttachAtYOffset; ! *pxsAttAtX = ptman->EmToLogUnits(mX); ! *pysAttAtY = ptman->EmToLogUnits(mY); ! } ! else ! { ! // Adjust by offsets. ! *pxsAttAtX += ptman->EmToLogUnits(m_mAttachAtXOffset); ! *pysAttAtY += ptman->EmToLogUnits(m_mAttachAtYOffset); ! } } *************** *** 1049,1057 **** if (nGpoint == kGpointZero) nGpoint = 0; ! ptman->GPointToXY(m_chwGlyphID, nGpoint, pxsAttWithX, pysAttWithY); ! ! // Adjust by offsets. ! *pxsAttWithX += ptman->EmToLogUnits(m_mAttachWithXOffset); ! *pysAttWithY += ptman->EmToLogUnits(m_mAttachWithYOffset); } } --- 1067,1085 ---- if (nGpoint == kGpointZero) nGpoint = 0; ! bool fImpl = ptman->GPointToXY(m_chwGlyphID, nGpoint, pxsAttWithX, pysAttWithY); ! if (!fImpl) ! { ! // Fall back to using x- and y-coordinates; no adjustment for hinting. ! int mX = m_mAttachWithX + m_mAttachWithXOffset; ! int mY = m_mAttachWithY + m_mAttachWithYOffset; ! *pxsAttWithX = ptman->EmToLogUnits(mX); ! *pysAttWithY = ptman->EmToLogUnits(mY); ! } ! else ! { ! // Adjust by offsets. ! *pxsAttWithX += ptman->EmToLogUnits(m_mAttachWithXOffset); ! *pysAttWithY += ptman->EmToLogUnits(m_mAttachWithYOffset); ! } } } Index: GrSlotState.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrSlotState.h 7 Nov 2002 13:59:51 -0000 1.2 --- GrSlotState.h 2 Jan 2003 21:18:47 -0000 1.3 *************** *** 675,679 **** } ! int GlyphXOffset(GrSlotStream * psstrm); int GlyphYOffset(GrSlotStream * psstrm = NULL); --- 675,679 ---- } ! int GlyphXOffset(GrSlotStream * psstrm, bool fFakeItalic = false); int GlyphYOffset(GrSlotStream * psstrm = NULL); Index: GrSlotStream.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotStream.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrSlotStream.cpp 11 Nov 2002 23:31:48 -0000 1.2 --- GrSlotStream.cpp 2 Jan 2003 21:18:47 -0000 1.3 *************** *** 389,393 **** --- 389,395 ---- #ifdef _DEBUG if (islotLp <= 0) + { Warn("Pathological case in bidi algorithm"); + } #endif // _DEBUG dircLp = AdjacentNonBndNeutralCode(ptman, islotLp - 1, -1); *************** *** 1570,1573 **** --- 1572,1577 ---- m_islotReadPos += cslot; m_cslotSkippedForResync = cslot; + // Should never skip past the beginning of the line. + Assert(m_islotSegMin == -1 || m_islotReadPos <= m_islotSegMin); } Index: GrTableManager.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrTableManager.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrTableManager.cpp 12 Nov 2002 22:26:08 -0000 1.2 --- GrTableManager.cpp 2 Jan 2003 21:18:47 -0000 1.3 *************** *** 777,780 **** --- 777,788 ---- vcslotSkipOffsets.Resize(m_cpass); + if (cbNextMax == 0 || !pbNextSegDat) + { + // Caller is not interested in cross-line-boundary contextualization. + Assert(cbNextMax == 0); + Assert(!pbNextSegDat); + return; + } + if (cbNextMax < m_cpass + 4) ThrowHr(WarnHr(E_INVALIDARG)); *************** *** 784,798 **** if (!fNextSegNeedsContext) { - // No line break needed--the rest of the range fits in this segment. - - // current we don't bother recording this information: - // *pb++ = (byte)lbEnd; - // *pb++ = (byte)kdircNeutral; - // *pb++ = (byte)kdircNeutral; - // *pb++ = 0; - // for (int ipass = 0; ipass < m_cpass; ipass++) - // *pb++ = 0; - // *pcbNextSegDat = 4; /// + m_cpass; - // No contextualization between this segment and the next, whatever kind of renderer // it might use. --- 792,795 ---- *************** *** 801,807 **** } int islotUnderLim = islotUnderBreak; if (!m_fInsertedLB && !m_fFinalLB) ! // Then islotUnderBreak is the postion of the last slot in the segment; increment // to get the lim in stream zero. islotUnderLim++; --- 798,806 ---- } + wchar chwLB = LBGlyphID(); + int islotUnderLim = islotUnderBreak; if (!m_fInsertedLB && !m_fFinalLB) ! // Then islotUnderBreak is the position of the last slot in the segment; increment // to get the lim in stream zero. islotUnderLim++; *************** *** 835,860 **** // Record how much of each pass to redo in the next segment. ! islot = islotSurfaceLim; - wchar chwLB = LBGlyphID(); - int cslotMaxPreContextForAllPasses = 0; int ipass; ! for (ipass = m_cpass - 1; ipass >= 0; --ipass) { GrSlotStream * psstrmIn = (ipass == 0) ? NULL : InputStream(ipass); GrSlotStream * psstrmOut = OutputStream(ipass); ! int islotPrev; // Initially we have to include at least this many prior slots: ! int cslotSkipOffset = Pass(ipass)->MaxRulePreContext(); ! cslotMaxPreContextForAllPasses = max(cslotSkipOffset, cslotMaxPreContextForAllPasses); ! if (islot == psstrmOut->WritePos()) { ! if (ipass == 0) ! islotPrev = pchstrm->Pos(); ! else ! islotPrev = psstrmIn->ReadPos(); } else --- 834,868 ---- // Record how much of each pass to redo in the next segment. + // The basic algorithm is described in the "WR Data Transform Engine" document. + // But here we are doing a variation on what is described there. We are calculating + // the backup locations for BOTH the rule start locations and the necessary pre-contexts. + // It is the precontext values that are recorded for use by the following segment. But we + // also calculate the positions for the rule-start locations to make sure there is enough + // pre-context at each pass. ! int islotRS = islotSurfaceLim; // rule-start positions ! int islotPC = islotRS; // to handle pre-context positions ! ! // If line-breaks are irrelevant to this font, we don't need to bother. ! bool fGiveUp = !m_pgreng->LineBreakFlag(); int ipass; ! for (ipass = m_cpass - 1; ipass >= 0 && !fGiveUp; --ipass) { GrSlotStream * psstrmIn = (ipass == 0) ? NULL : InputStream(ipass); GrSlotStream * psstrmOut = OutputStream(ipass); ! int islotBackupMin = (ipass == 0) ? 0 : psstrmOut->SegMin(); ! if (ipass >= m_cpassLB && m_fInitialLB) ! islotBackupMin++; // how far we can back up--not before the start of this segment ! ! int islotPrevRS; // corresponding slot in the previous stream for rule-start position ! int islotPrevPC; // same for pre-context position // Initially we have to include at least this many prior slots: ! int cslotSkipOffset = 0; ! if (islotRS == psstrmOut->WritePos()) { ! islotPrevRS = (ipass == 0) ? pchstrm->Pos() : psstrmIn->ReadPos(); } else *************** *** 862,900 **** // Ignore the final line-break, because it is explicitly inserted during // the (final) line-break pass. ! // if (ipass == m_cpassLB && psstrm->SlotAt(islot)->IsFinalLineBreak(chwLB)) // { ! // Assert(islot > 0); ! // islot--; // } // Ignore the chunk in the pass that generated the line break that corresponds // to the inserted line break being chunked with the previous glyph--we don't // want to treat that as a cross-line-boundary contextual! ! if (ipass == m_cpassLB && psstrmOut->SlotAt(islot)->IsFinalLineBreak(chwLB)) ! //if (psstrm->ChunkInPrev(islot) == -1) { ! // Assert(psstrm->ChunkInPrev(islot) == -1); ! if (islot+1 == psstrmOut->WritePos()) { ! islotPrev = (ipass == 0) ? pchstrm->SegOffset() : psstrmIn->ReadPos(); } else ! islotPrev = psstrmOut->ChunkInPrev(islot+1); } else { ! // Back up to the beginning of a chunk. ! while (islot > 0 && (islotPrev = psstrmOut->ChunkInPrev(islot)) == -1) { ! --islot; ++cslotSkipOffset; } } } vcslotSkipOffsets[ipass] = cslotSkipOffset; ! islot = islotPrev; if (ipass == 0) ! islot += m_cslotPreSeg; // convert from underlying chars to stream-zero slots } --- 870,959 ---- // Ignore the final line-break, because it is explicitly inserted during // the (final) line-break pass. ! // if (ipass == m_cpassLB && psstrm->SlotAt(islotRS)->IsFinalLineBreak(chwLB)) // { ! // Assert(islotRS > 0); ! // islotRS--; // } // Ignore the chunk in the pass that generated the line break that corresponds // to the inserted line break being chunked with the previous glyph--we don't // want to treat that as a cross-line-boundary contextual! ! if (ipass == m_cpassLB && psstrmOut->SlotAt(islotRS)->IsFinalLineBreak(chwLB)) { ! // Assert(psstrm->ChunkInPrev(islotRS) == -1); ! if (islotRS + 1 == psstrmOut->WritePos()) ! islotPrevRS = (ipass == 0) ? pchstrm->SegOffset() : psstrmIn->ReadPos(); ! else ! islotPrevRS = psstrmOut->ChunkInPrev(islotRS + 1); ! } ! else ! { ! // Back up to the beginning of a chunk. ! while (islotRS >= islotBackupMin && ! (islotPrevRS = psstrmOut->ChunkInPrev(islotRS)) == -1) { ! --islotRS; ! //++cslotSkipOffset; } + } + } + if (islotPrevRS == -1 || islotRS < islotBackupMin) // hit the start of the segment + { + // In order to get enough context to be sure to run the same rules again, + // we'd have to back up into the previous segment. Too complicated, so give up. + fGiveUp = true; + break; + } + + int cslotPreContext = Pass(ipass)->MaxRulePreContext(); + LBackupPC: + if (islotPC == psstrmOut->WritePos()) + { + islotPrevPC = (ipass == 0) ? pchstrm->Pos() : psstrmIn->ReadPos(); + } + else + { + if (ipass == m_cpassLB && psstrmOut->SlotAt(islotPC)->IsFinalLineBreak(chwLB)) + { + if (islotPC+1 == psstrmOut->WritePos()) + islotPrevPC = (ipass == 0) ? pchstrm->SegOffset() : psstrmIn->ReadPos(); else ! islotPrevPC = psstrmOut->ChunkInPrev(islotPC+1); } else { ! // Back up to the beginning of a chunk; also make sure there are enough slots ! // to handle the required pre-context for this pass. ! while (islotPC >= islotBackupMin && ! ((islotPrevPC = psstrmOut->ChunkInPrev(islotPC)) == -1 || ! islotPrevRS - islotPrevPC < cslotPreContext)) { ! --islotPC; ++cslotSkipOffset; } } } + if (islotPC >= islotBackupMin && islotPrevRS - islotPrevPC < cslotPreContext) + { + --islotPC; + ++cslotSkipOffset; + goto LBackupPC; + } + if (islotPrevPC == -1 || islotPC < islotBackupMin) // hit the start of the segment + { + fGiveUp = true; + break; + } vcslotSkipOffsets[ipass] = cslotSkipOffset; ! ! islotRS = islotPrevRS; ! islotPC = islotPrevPC; if (ipass == 0) ! { ! // Convert from underlying chars to stream-zero slots. ! islotRS += m_cslotPreSeg; ! islotPC += m_cslotPreSeg; ! } } *************** *** 903,907 **** // because the pre-context is now included in this count, and it normal to have // a pre-context in the final positioning pass. ! // Assert(vcslotSkipOffsets[m_cpass-1] == 0); // Also no adjustments are made by the glyph-generation pass, so this should always --- 962,966 ---- // because the pre-context is now included in this count, and it normal to have // a pre-context in the final positioning pass. ! //Assert(vcslotSkipOffsets[m_cpass-1] == 0); // Also no adjustments are made by the glyph-generation pass, so this should always *************** *** 911,915 **** // The number of slots in the underlying input previous to the line-break // that must be reprocessed: ! int cslotPreLB = islotUnderLim - islot + cslotMaxPreContextForAllPasses; Assert(cslotPreLB >= 0); --- 970,982 ---- // The number of slots in the underlying input previous to the line-break // that must be reprocessed: ! int cslotPreLB = islotUnderLim - islotPC; ! ! if (fGiveUp) ! { ! // We can't reasonably provide enough context, so don't try to do it at all. ! cslotPreLB = 0; ! for (ipass = 0; ipass < m_cpass; ipass++) ! vcslotSkipOffsets[ipass] = 0; ! } Assert(cslotPreLB >= 0); *************** *** 1088,1092 **** int cslotBackup = 0; ! if (cbPrev == 0) { m_lbPrevEnd = klbNoBreak; m_dircInitialStrongDir = kdircNeutral; --- 1155,1160 ---- int cslotBackup = 0; ! if (cbPrev == 0) ! { m_lbPrevEnd = klbNoBreak; m_dircInitialStrongDir = kdircNeutral; *************** *** 1391,1395 **** if (ResultFailed(res)) { ! WARN(res); return false; } --- 1459,1464 ---- if (ResultFailed(res)) { ! if (res != kresNotImpl) // normal on Linux ! WARN(res); return false; } *************** *** 1401,1407 **** //:> Functions to forward to the engine. //:>------------------------------------------------------------------------------------------*/ ! wchar GrTableManager::GetGlyphIDFromUnicode(wchar chw) { ! return m_pgreng->GetGlyphIDFromUnicode(chw); } --- 1470,1476 ---- //:> Functions to forward to the engine. //:>------------------------------------------------------------------------------------------*/ ! wchar GrTableManager::GetGlyphIDFromUnicode(int nUnicode) { ! return m_pgreng->GetGlyphIDFromUnicode(nUnicode); } *************** *** 1579,1582 **** --- 1648,1653 ---- bool fLastBase = false; + bool fFakeItalic = m_pgreng->FakeItalic(); + // Need to calculate up to the base of the last leaf slot, if it happens to be later // in the stream than the last actual slot. *************** *** 1632,1636 **** pslot->CalcCompositeMetrics(this, psstrm, kPosInfinity, true); ! int xsInc = pslot->GlyphXOffset(psstrm); int ysInc = pslot->GlyphYOffset(psstrm); int xsAdvX = pslot->ClusterAdvWidth(psstrm); --- 1703,1707 ---- pslot->CalcCompositeMetrics(this, psstrm, kPosInfinity, true); ! int xsInc = pslot->GlyphXOffset(psstrm, fFakeItalic); int ysInc = pslot->GlyphYOffset(psstrm); int xsAdvX = pslot->ClusterAdvWidth(psstrm); *************** *** 1696,1702 **** continue; } ! int xsCluster = pslotBase->XPosition() - pslotBase->GlyphXOffset(psstrm); int ysCluster = pslotBase->YPosition() - pslotBase->GlyphYOffset(psstrm); ! int xsInc = pslot->GlyphXOffset(psstrm); int ysInc = pslot->GlyphYOffset(psstrm); pslot->SetXPos(xsCluster + xsInc); --- 1767,1773 ---- continue; } ! int xsCluster = pslotBase->XPosition() - pslotBase->GlyphXOffset(psstrm, fFakeItalic); int ysCluster = pslotBase->YPosition() - pslotBase->GlyphYOffset(psstrm); ! int xsInc = pslot->GlyphXOffset(psstrm, fFakeItalic); int ysInc = pslot->GlyphYOffset(psstrm); pslot->SetXPos(xsCluster + xsInc); Index: GrTableManager.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrTableManager.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrTableManager.h 7 Nov 2002 13:59:51 -0000 1.2 --- GrTableManager.h 2 Jan 2003 21:18:47 -0000 1.3 *************** *** 151,155 **** // Forward to the engine itself ! wchar GetGlyphIDFromUnicode(wchar chw); wchar ActualGlyphForOutput(wchar chwGlyphID); GrGlyphTable * GlyphTable(); --- 151,155 ---- // Forward to the engine itself ! wchar GetGlyphIDFromUnicode(int nUnicode); wchar ActualGlyphForOutput(wchar chwGlyphID); GrGlyphTable * GlyphTable(); *************** *** 294,303 **** void LogAttributes(std::ofstream & strmOut, int ipass); void LogUnderlyingHeader(std::ofstream & strmOut, int ichwMin, ! int ichwLim, int cchwBackup); void LogSlotHeader(std::ofstream & strmOut, int cslot, int cspPerSlot, int cspLeading, int islotMin = 0); void SlotAttrsModified(int ipass, bool * rgfMods, int * pccomp, int *pcassoc); void LogInTable(std::ofstream & strmOut, int n); ! void LogHexInTable(std::ofstream & strmOut, wchar chw); void LogDirCodeInTable(std::ofstream & strmOut, int dirc); void LogBreakWeightInTable(std::ofstream & strmOut, int lb); --- 294,303 ---- void LogAttributes(std::ofstream & strmOut, int ipass); void LogUnderlyingHeader(std::ofstream & strmOut, int ichwMin, ! int ichwLim, int cchwBackup, int * prgichw16bit); void LogSlotHeader(std::ofstream & strmOut, int cslot, int cspPerSlot, int cspLeading, int islotMin = 0); void SlotAttrsModified(int ipass, bool * rgfMods, int * pccomp, int *pcassoc); void LogInTable(std::ofstream & strmOut, int n); ! void LogHexInTable(std::ofstream & strmOut, wchar chw, bool fPlus = false); void LogDirCodeInTable(std::ofstream & strmOut, int dirc); void LogBreakWeightInTable(std::ofstream & strmOut, int lb); Index: TransductionLog.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/TransductionLog.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** TransductionLog.cpp 5 Nov 2002 21:29:24 -0000 1.1.1.1 --- TransductionLog.cpp 2 Jan 2003 21:18:47 -0000 1.2 *************** *** 126,130 **** strmOut << "UNDERLYING INPUT\n\n"; ! wchar rgchw[MAX_SLOTS]; bool rgfNewRun[MAX_SLOTS]; memset(rgfNewRun, 0, MAX_SLOTS); --- 126,130 ---- strmOut << "UNDERLYING INPUT\n\n"; ! int rgnChars[MAX_SLOTS]; bool rgfNewRun[MAX_SLOTS]; memset(rgfNewRun, 0, MAX_SLOTS); *************** *** 132,149 **** COLORREF rgclrFore[MAX_SLOTS]; COLORREF rgclrBack[MAX_SLOTS]; ! int cchw = pchstrm->GetLogData(this, rgchw, rgfNewRun, rgfval, rgclrFore, rgclrBack, ! cchwBackup); ! cchw = min(cchw, MAX_SLOTS); ! LogUnderlyingHeader(strmOut, pchstrm->Min(), (pchstrm->Min() + cchw - cchwBackup), ! cchwBackup); // Text strmOut << "Text: "; // 15 spaces ! for (int ichw = 0; ichw < cchw; ichw++) { ! if (rgchw[ichw] < 0x0100) // ANSI ! strmOut << (char)rgchw[ichw] << " "; // 6 spaces else strmOut << " "; --- 132,159 ---- COLORREF rgclrFore[MAX_SLOTS]; COLORREF rgclrBack[MAX_SLOTS]; + int cchwMax16bitChars; ! int cnUnicode = pchstrm->GetLogData(this, rgnChars, rgfNewRun, rgfval, rgclrFore, rgclrBack, ! cchwBackup, &cchwMax16bitChars); ! cnUnicode = min(cnUnicode, MAX_SLOTS); ! wchar rgchwChars2[MAX_SLOTS]; ! int rgichw16bit[MAX_SLOTS]; ! if (cchwMax16bitChars > 1) ! { ! cchwMax16bitChars = min(cchwMax16bitChars, 2); // max of 2 16-bit chars per slot ! pchstrm->GetLogDataSurrogates(this, cnUnicode, cchwBackup, cchwMax16bitChars, rgnChars, ! rgchwChars2, rgichw16bit); ! } ! ! LogUnderlyingHeader(strmOut, pchstrm->Min(), (pchstrm->Min() + cnUnicode - cchwBackup), ! cchwBackup, rgichw16bit); // Text strmOut << "Text: "; // 15 spaces ! for (int ichw = 0; ichw < cnUnicode; ichw++) { ! if (rgnChars[ichw] < 0x0100 && rgchwChars2[ichw] == 0) // ANSI ! strmOut << (char)rgnChars[ichw] << " "; // 6 spaces else strmOut << " "; *************** *** 153,164 **** // Unicode strmOut << "Unicode: "; ! for (ichw = 0; ichw < cchw; ichw++) ! LogHexInTable(strmOut, rgchw[ichw]); strmOut << "\n"; // Runs strmOut << "Runs: "; int crun = 0; ! for (ichw = 0; ichw < cchw; ichw++) { if (rgfNewRun[ichw]) --- 163,186 ---- // Unicode strmOut << "Unicode: "; ! for (ichw = 0; ichw < cnUnicode; ichw++) ! LogHexInTable(strmOut, rgnChars[ichw]); strmOut << "\n"; + if (cchwMax16bitChars > 1) + { + strmOut << " "; + for (ichw = 0; ichw < cnUnicode; ichw++) + { + if (rgchwChars2[ichw] == 0) + strmOut << " "; + else + LogHexInTable(strmOut, rgchwChars2[ichw]); + } + strmOut << "\n"; + } // Runs strmOut << "Runs: "; int crun = 0; ! for (ichw = 0; ichw < cnUnicode; ichw++) { if (rgfNewRun[ichw]) *************** *** 175,179 **** strmOut << "Features and character properties:\n"; crun = 0; ! for (ichw = 0; ichw < cchw; ichw++) { if (rgfNewRun[ichw]) --- 197,201 ---- strmOut << "Features and character properties:\n"; crun = 0; ! for (ichw = 0; ichw < cnUnicode; ichw++) { if (rgfNewRun[ichw]) *************** *** 258,267 **** ENHANCE SharonC: do we need to show the underline properties? ----------------------------------------------------------------------------------------------*/ ! int GrCharStream::GetLogData(GrTableManager * ptman, wchar * rgchw, bool * rgfNewRun, ! GrFeatureValues * rgfval, COLORREF * rgclrFore, COLORREF * rgclrBack, int cchwBackup) { int ichwPosToStop = m_ichwPos; int ichwStart = m_ichwMin - cchwBackup; // Restart the stream. m_ichwPos = ichwStart; --- 280,292 ---- ENHANCE SharonC: do we need to show the underline properties? ----------------------------------------------------------------------------------------------*/ ! int GrCharStream::GetLogData(GrTableManager * ptman, int * rgnChars, bool * rgfNewRun, ! GrFeatureValues * rgfval, COLORREF * rgclrFore, COLORREF * rgclrBack, int cchwBackup, ! int * pcchwMax16bit) { int ichwPosToStop = m_ichwPos; int ichwStart = m_ichwMin - cchwBackup; + *pcchwMax16bit = 0; + // Restart the stream. m_ichwPos = ichwStart; *************** *** 269,272 **** --- 294,298 ---- m_ichwRunLim = 0; m_ichwRunOffset = kPosInfinity; + m_vislotNextChunkMap.Clear(); int c = 0; *************** *** 281,289 **** GrFeatureValues fval; LgCharRenderProps * pchrp; ! int ichwOffset; ! wchar chw = NextGet(ptman, &fval, &pchrp, &ichwOffset); if (c < MAX_SLOTS) { ! rgchw[c] = chw; if (rgfNewRun[c]) { --- 307,316 ---- GrFeatureValues fval; LgCharRenderProps * pchrp; ! int ichwOffset, cchw16bit; ! int nChar = NextGet(ptman, &fval, &pchrp, &ichwOffset, &cchw16bit); if (c < MAX_SLOTS) { ! rgnChars[c] = nChar; ! *pcchwMax16bit = max(*pcchwMax16bit, cchw16bit); if (rgfNewRun[c]) { *************** *** 301,304 **** --- 328,372 ---- /*---------------------------------------------------------------------------------------------- + If any of the characters are comprised of surrogates, fill in the arrays with + the 16-bit chars for display. To do this we get the 16-bit characters directly from the + text source. + ----------------------------------------------------------------------------------------------*/ + void GrCharStream::GetLogDataSurrogates(GrTableManager * ptman, int cn32bit, int cchwBackup, + int cchwMax16bit, int * prgnChars, wchar * prgchw2, int * prgichw16bit) + { + for (int i = 0; i < cn32bit; i++) + { + prgchw2[i] = 0; + } + + int ichwLim = m_ichwPos; + int ichwMin = m_ichwMin - cchwBackup; + + int cchw = ichwLim - ichwMin; + wchar * prgchwRunText = NewObj wchar[cchw]; + GrResult res = m_pgts->Fetch(ichwMin, ichwLim, prgchwRunText); + if (ResultFailed(res)) + return; + int ichw = ichwMin; + int inUnicode = 0; + while (ichw < ichwLim) + { + // Replace 32-bit char with (first) 16-bit char. + prgnChars[inUnicode] = (int)prgchwRunText[ichw - ichwMin]; + prgichw16bit[ichw] = 1; + ichw++; + + if (!AtUnicodeCharBoundary(prgchwRunText, cchw, ichw - ichwMin)) + { + prgchw2[inUnicode] = prgchwRunText[ichw - ichwMin]; + prgichw16bit[ichw] = 2; + ichw++; + } + inUnicode++; + } + delete[] prgchwRunText; + } + + /*---------------------------------------------------------------------------------------------- Output the glyph IDs generated by the glyph generation pass (pass 0). ----------------------------------------------------------------------------------------------*/ *************** *** 652,658 **** // ptman->LogSlotHeader(strmOut, m_ichwAssocsLim, SP_PER_SLOT, LEADING_SP, m_ichwAssocsMin); ptman->LogUnderlyingHeader(strmOut, pchstrm->Min(), (pchstrm->Min() + m_ichwAssocsLim), ! -m_ichwAssocsMin); ! wchar rgchw[MAX_SLOTS]; bool rgfNewRun[MAX_SLOTS]; memset(rgfNewRun, 0, MAX_SLOTS); --- 720,726 ---- // ptman->LogSlotHeader(strmOut, m_ichwAssocsLim, SP_PER_SLOT, LEADING_SP, m_ichwAssocsMin); ptman->LogUnderlyingHeader(strmOut, pchstrm->Min(), (pchstrm->Min() + m_ichwAssocsLim), ! -m_ichwAssocsMin, NULL); ! int rgnChars[MAX_SLOTS]; bool rgfNewRun[MAX_SLOTS]; memset(rgfNewRun, 0, MAX_SLOTS); *************** *** 660,676 **** COLORREF rgclrFore[MAX_SLOTS]; COLORREF rgclrBack[MAX_SLOTS]; ! int cchw = pchstrm->GetLogData(ptman, rgchw, rgfNewRun, rgfval, rgclrFore, rgclrBack, ! -m_ichwAssocsMin); cchw = min(cchw, MAX_SLOTS); // Text strmOut << "Text: "; // 15 spaces for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (rgchw[ichw] < 0x0100) // ANSI ! strmOut << (char)rgchw[ichw] << " "; // 6 spaces else strmOut << " "; } strmOut << "\n"; --- 728,764 ---- COLORREF rgclrFore[MAX_SLOTS]; COLORREF rgclrBack[MAX_SLOTS]; + int cchwMax16bitChars; ! int cchw = pchstrm->GetLogData(ptman, rgnChars, rgfNewRun, rgfval, rgclrFore, rgclrBack, ! -m_ichwAssocsMin, &cchwMax16bitChars); cchw = min(cchw, MAX_SLOTS); + wchar rgchwChars2[MAX_SLOTS]; + int rgichw16bit[MAX_SLOTS]; + if (cchwMax16bitChars > 1) + { + cchwMax16bitChars = min(cchwMax16bitChars, 4); // we show up to 4 16-bit chars per slot + pchstrm->GetLogDataSurrogates(ptman, cchw, -m_ichwAssocsMin, cchwMax16bitChars, + rgnChars, rgchwChars2, rgichw16bit); + } + // Text strmOut << "Text: "; // 15 spaces + int inUnicode = 0; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! wchar chw, chwNext; ! switch (rgichw16bit[ichw]) ! { ! default: ! case 1: chw = rgnChars[inUnicode]; chwNext = rgchwChars2[inUnicode]; break; ! case 2: chw = rgchwChars2[inUnicode]; chwNext = 0; break; ! } ! if (rgichw16bit[ichw] == 1 && chwNext == 0 && chw < 0x0100) // ANSI ! strmOut << (char)chw << " "; // 6 spaces else strmOut << " "; + if (chwNext == 0) + inUnicode++; } strmOut << "\n"; *************** *** 678,683 **** // Unicode strmOut << "Unicode: "; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) ! ptman->LogHexInTable(strmOut, rgchw[ichw]); strmOut << "\n"; --- 766,783 ---- // Unicode strmOut << "Unicode: "; + inUnicode = 0; for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) ! { ! wchar chw, chwNext; ! switch (rgichw16bit[ichw]) ! { ! default: ! case 1: chw = rgnChars[inUnicode]; chwNext = rgchwChars2[inUnicode]; break; ! case 2: chw = rgchwChars2[inUnicode]; chwNext = 0; break; ! } ! ptman->LogHexInTable(strmOut, chw, chwNext != 0); ! if (chwNext == 0) ! inUnicode++; ! } strmOut << "\n"; *************** *** 685,689 **** for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (m_prgisloutBefore[ichw] == kNegInfinity) strmOut << "<-- "; else if (m_prgisloutBefore[ichw] == kPosInfinity) --- 785,792 ---- for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (rgichw16bit[ichw] > 1) ! // continuation of Unicode codepoint ! strmOut << " "; ! else if (m_prgisloutBefore[ichw] == kNegInfinity) strmOut << "<-- "; else if (m_prgisloutBefore[ichw] == kPosInfinity) *************** *** 712,716 **** for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (m_prgisloutAfter[ichw] == kNegInfinity) strmOut << "<-- "; else if (m_prgisloutAfter[ichw] == kPosInfinity) --- 815,822 ---- for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (rgichw16bit[ichw] > 1) ! // continuation of Unicode codepoint ! strmOut << " "; ! else if (m_prgisloutAfter[ichw] == kNegInfinity) strmOut << "<-- "; else if (m_prgisloutAfter[ichw] == kPosInfinity) *************** *** 726,730 **** for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (m_prgisloutLigature[ichw] != kNegInfinity) ptman->LogInTable(strmOut, m_prgisloutLigature[ichw]); else --- 832,839 ---- for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (rgichw16bit[ichw] > 1) ! // continuation of Unicode codepoint ! strmOut << " "; ! else if (m_prgisloutLigature[ichw] != kNegInfinity) ptman->LogInTable(strmOut, m_prgisloutLigature[ichw]); else *************** *** 736,740 **** for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (m_prgisloutLigature[ichw] != kNegInfinity) ptman->LogInTable(strmOut, m_prgiComponent[ichw] + 1); // 1-based else --- 845,852 ---- for (ichw = 0; ichw < (m_ichwAssocsLim - m_ichwAssocsMin); ichw++) { ! if (rgichw16bit[ichw] > 1) ! // continuation of Unicode codepoint ! strmOut << " "; ! else if (m_prgisloutLigature[ichw] != kNegInfinity) ptman->LogInTable(strmOut, m_prgiComponent[ichw] + 1); // 1-based else *************** *** 840,854 **** Write out the header lines for the underlying data. ----------------------------------------------------------------------------------------------*/ ! void GrTableManager::LogUnderlyingHeader(std::ofstream & strmOut, int ichwMin, ! int ichwLim, int cchwBackup) { strmOut << "string "; ! for (int ichw = ichwMin - cchwBack... [truncated message content] |
From: <sil...@li...> - 2003-01-02 21:18:56
|
Update of /cvsroot/silgraphite/silgraphite/src/TtfUtil In directory sc8-pr-cvs1:/tmp/cvs-serv14941/src/TtfUtil Modified Files: Makefile.am Log Message: Synchronized with FW, 20 Dec 2002, changelist #05908 Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/TtfUtil/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Makefile.am 9 Nov 2002 23:29:37 -0000 1.2 --- Makefile.am 2 Jan 2003 21:18:48 -0000 1.3 *************** *** 1,3 **** ! ttfutildir = $(top_srcdir)/src/TtfUtil ! ! libgrengine_a_SOURCES += $(ttfutildir)/TtfUtil.cpp --- 1,3 ---- ! ttfutildir = $(top_srcdir)/src/TtfUtil ! ! libgrengine_a_SOURCES += $(ttfutildir)/TtfUtil.cpp |
From: <sil...@li...> - 2003-01-02 21:18:56
|
Update of /cvsroot/silgraphite/silgraphite/src/lib In directory sc8-pr-cvs1:/tmp/cvs-serv14941/src/lib Modified Files: GrUtil.cpp GrUtil.h Log Message: Synchronized with FW, 20 Dec 2002, changelist #05908 Index: GrUtil.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/lib/GrUtil.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GrUtil.cpp 12 Nov 2002 23:11:31 -0000 1.2 --- GrUtil.cpp 2 Jan 2003 21:18:49 -0000 1.3 *************** *** 25,29 **** #ifdef _WIN32 #include <windows.h> ! #endif #include <stdio.h> #include "GrUtil.h" --- 25,30 ---- #ifdef _WIN32 #include <windows.h> ! #endif // _WIN32 ! #include <stdio.h> #include "GrUtil.h" *************** *** 77,87 **** AssertPtr(phkey); ! #ifdef GR_FW ! StrApp str; ! str.Format("Software\\SIL\\GraphiteFonts\\%s", pszFontKey); ! #else ! char str[260]; ! sprintf(str, "Software\\SIL\\GraphiteFonts\\%s", pszFontKey); ! #endif if (at == katRead) --- 78,88 ---- AssertPtr(phkey); ! //#ifdef GR_FW ! // StrApp str; ! // str.Format(_T("Software\\SIL\\GraphiteFonts\\%s"), pszFontKey); ! //#else ! achar str[260]; ! _stprintf(str, _T("Software\\SIL\\GraphiteFonts\\%s"), pszFontKey); ! //#endif if (at == katRead) *************** *** 108,112 **** for ( ; ; ) { ! char rgch[256]; DWORD cb = isizeof(rgch); LONG l = ::RegEnumKeyEx(hkey, dwIndex, rgch, &cb, NULL, NULL, NULL, NULL); --- 109,113 ---- for ( ; ; ) { ! achar rgch[256]; DWORD cb = isizeof(rgch); LONG l = ::RegEnumKeyEx(hkey, dwIndex, rgch, &cb, NULL, NULL, NULL, NULL); *************** *** 140,144 **** if (OpenFontKey(pszFontKey, pszStyle, katRead, &hkey)) { ! char rgch[MAX_PATH]; DWORD cb = isizeof(rgch); DWORD dwT; --- 141,145 ---- if (OpenFontKey(pszFontKey, pszStyle, katRead, &hkey)) { ! achar rgch[MAX_PATH]; DWORD cb = isizeof(rgch); DWORD dwT; *************** *** 171,178 **** for ( ; ; ) { ! char rgch[256]; DWORD cb = isizeof(rgch); LONG l = ::RegEnumKeyEx(hkey, dwIndex, rgch, &cb, NULL, NULL, NULL, NULL); ! if (strcmp(pszFontKey, rgch) == 0) return true; else if (l == ERROR_NO_MORE_ITEMS) --- 172,179 ---- for ( ; ; ) { ! achar rgch[256]; DWORD cb = isizeof(rgch); LONG l = ::RegEnumKeyEx(hkey, dwIndex, rgch, &cb, NULL, NULL, NULL, NULL); ! if (_tcscmp(pszFontKey, rgch) == 0) return true; else if (l == ERROR_NO_MORE_ITEMS) Index: GrUtil.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/lib/GrUtil.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GrUtil.h 12 Nov 2002 22:27:10 -0000 1.3 --- GrUtil.h 2 Jan 2003 21:18:49 -0000 1.4 *************** *** 20,24 **** #ifndef GR_FW ! #include "UtilVector.h" #include "UtilString.h" #endif // !GR_FW --- 20,24 ---- #ifndef GR_FW ! #include "UtilVector.h" // was Vector.h #include "UtilString.h" #endif // !GR_FW |
From: <sil...@li...> - 2002-12-18 11:18:05
|
Update of /cvsroot/silgraphite/silgraphite In directory sc8-pr-cvs1:/tmp/cvs-serv3987 Modified Files: Tag: linuxdev_0_9 ChangeLog Log Message: one more try of syncmail Index: ChangeLog =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/Attic/ChangeLog,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -C2 -d -r1.1.2.3 -r1.1.2.4 *** ChangeLog 18 Dec 2002 11:16:22 -0000 1.1.2.3 --- ChangeLog 18 Dec 2002 11:18:02 -0000 1.1.2.4 *************** *** 2,6 **** 18th December 2002 Daniel Glassey ! test syncmail (2) 22nd November 2002 Daniel Glassey --- 2,6 ---- 18th December 2002 Daniel Glassey ! test syncmail (3) 22nd November 2002 Daniel Glassey |