diff -r 57c618273d5c -r bbf46f59e123 graphicsdeviceinterface/gdi/sgdi/FONT.CPP --- a/graphicsdeviceinterface/gdi/sgdi/FONT.CPP Thu Aug 19 11:11:18 2010 +0300 +++ b/graphicsdeviceinterface/gdi/sgdi/FONT.CPP Tue Aug 31 16:31:06 2010 +0300 @@ -24,6 +24,7 @@ #include "gdiinline.inl" #include "gdistructs.h" #include "gdiconsts.h" +#include "gdiplatapi.h" /** Names holds the types & data associated with the glyph selection @@ -1615,3 +1616,195 @@ // being the first three elements in TScript. return TPtrC(KTScript2GlyphSample[aScript - 3]); } + + +EXPORT_C RFontTable::RFontTable():iTableContent(0), iLength(0), + iFont(NULL), iTag(0) + { + // a null constructor. + } + +EXPORT_C TInt +RFontTable::Open(CFont& aFont, TUint32 aTag) + { + TGetFontTableParam param; + param.iTag = aTag; + + // remember the parameters, to be used when releasing the font table. + iFont = &aFont; + iTag = aTag; + + TInt ret = aFont.ExtendedFunction(KFontGetFontTable, (TAny *)¶m); + if (KErrNone == ret) + { + iTableContent = (TAny *)param.iContent; + iLength = param.iLength; + } + return ret; + } + +EXPORT_C TInt +RFontTable::TableLength() const + { + return iLength; + } + +EXPORT_C const TUint8* +RFontTable::TableContent() const + { + return (TUint8*)iTableContent; + } + +EXPORT_C void +RFontTable::Close() + { + if (NULL != iFont) + { + (void)iFont->ExtendedFunction(KFontReleaseFontTable, (TAny *)&iTag); + } + iTableContent = 0; + iLength = 0; + iFont = NULL; + iTag = 0; + } + +EXPORT_C +RGlyphOutlineIterator::RGlyphOutlineIterator():iOutlines(0), iLengths(0), + iCursor(-1), iCount(0), iFont(NULL), iCodes(NULL), iHinted(EFalse) + { + // a null constructor. + } + +EXPORT_C TInt +RGlyphOutlineIterator::Open(CFont& aFont, const TUint* aCodes, TInt aCount, TBool aHinted) + { + if (NULL == aCodes || 0 == aCount) + { + return KErrArgument; + } + TGetGlyphOutlineParam param; + iLengths = (TInt *)User::Alloc(sizeof(TInt) * aCount); + if (NULL == iLengths) + { + return KErrNoMemory; + } + iOutlines = (TAny **)User::Alloc(sizeof(TAny *) * aCount); + if (NULL == iOutlines) + { + User::Free(iLengths); + iLengths = NULL; + return KErrNoMemory; + } + + param.iLengths = iLengths; + param.iCount = aCount; + param.iCodes = aCodes; + param.iHinted = aHinted; + param.iOutlines = iOutlines; + + /* information needed in Close() */ + iCodes = (TUint *)User::Alloc(sizeof(TUint) * aCount); + if (NULL == iCodes) + { + User::Free(iLengths); + User::Free(iOutlines); + iLengths = NULL; + iOutlines = NULL; + return KErrNoMemory; + } + Mem::Copy(iCodes, aCodes, aCount*sizeof(TUint)); + iFont = &aFont; + iHinted = aHinted; + iCount = aCount; + + TInt ret = aFont.ExtendedFunction(KFontGetGlyphOutline, (TAny *)¶m); + if (KErrNone != ret) + { + User::Free(iLengths); + User::Free(iOutlines); + User::Free(iCodes); + iLengths = NULL; + iOutlines = NULL; + iCodes = NULL; + iFont = NULL; + } + else + { + iCursor = 0; + } + + return ret; + } + +EXPORT_C const TUint8* +RGlyphOutlineIterator::Outline() const + { + GDI_ASSERT_ALWAYS(iCursor >= 0, EGdiPanic_Unknown); + + if (iLengths[iCursor] < 0) + { + return NULL; + } + else + { + return (const TUint8*)iOutlines[iCursor]; + } + } + +EXPORT_C TInt +RGlyphOutlineIterator::OutlineLength() const + { + GDI_ASSERT_ALWAYS(iCursor >= 0, EGdiPanic_Unknown); + + if (iLengths[iCursor] < 0) + { + return KErrGeneral; + } + else + { + return iLengths[iCursor]; + } + } + +EXPORT_C TInt +RGlyphOutlineIterator::Next() + { + if (iCursor >= 0 && iCursor < iCount-1) + { + ++iCursor; + return KErrNone; + } + else + { + iCursor = -1; + // if the iterator goes beyond the last element [when + // Next() returns KErrNotFound], the next call + // to Outline() or OutlineLength() will panic. + + return KErrNotFound; + } + } + +EXPORT_C void +RGlyphOutlineIterator::Close() + { + TReleaseGlyphOutlineParam param; + param.iCount = iCount; + param.iHinted = iHinted; + param.iCodes = iCodes; + + if (NULL != iFont) + { + iFont->ExtendedFunction(KFontReleaseGlyphOutline, (TAny *)¶m); + } + + iFont = NULL; + iCount = 0; + User::Free(iLengths); + iLengths = NULL; + iCursor = -1; + User::Free(iCodes); + iCodes = NULL; + User::Free(iOutlines); + iOutlines = NULL; + }