diff -r 000000000000 -r d46562c3d99d svgtopt/SVG/SVGImpl/src/SVGFontHashMap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svgtopt/SVG/SVGImpl/src/SVGFontHashMap.cpp Thu Jan 07 16:19:02 2010 +0200 @@ -0,0 +1,445 @@ +/* +* Copyright (c) 2003 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: SVG Implementation source file + * +*/ + + +#include "SVGFontHashMap.h" +#include "SVGDocumentImpl.h" + +//SVG Font storage + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontHashMap* CSvgFontHashMap::NewL() + { + CSvgFontHashMap* self = new ( ELeave ) CSvgFontHashMap; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontHashMap* CSvgFontHashMap::NewLC() + { + CSvgFontHashMap* self = new ( ELeave ) CSvgFontHashMap; + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// ========================================================================== +// Need method description +// ========================================================================== +void CSvgFontHashMap::ConstructL() + { + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontHashMap::CSvgFontHashMap() + + { + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontHashMap::~CSvgFontHashMap() + { + iSvgFontMapItems.ResetAndDestroy(); + iSvgFontMapItems.Close(); + + iFontDocumentPointers.ResetAndDestroy(); + iFontDocumentPointers.Close(); + } + +// ========================================================================== +// CSvgFontHashMap::AddFontL( CSvgFontElementImpl* aFontPtr, +// const TDesC& aFontFamilyName ) +// return ETrue if Font added +// return EFalse if Font was already in map +// ========================================================================== +TBool CSvgFontHashMap::AddFontL( CSvgFontElementImpl* aFontPtr, + const TDesC& aFontFamilyName ) +{ + CSvgFontMapItem* lFontMapItem = GetFontMapItem( aFontFamilyName ); + + if (lFontMapItem) + { + //already a reference to this font in the font map + AddReferenceToFontL( aFontFamilyName); + return EFalse; + } + else + { + //didnt find that font in the font map...add it + CSvgFontMapItem* lNewSvgFontMapItem = CSvgFontMapItem::NewL( ); + + lNewSvgFontMapItem->SetFontPtr( aFontPtr ); + lNewSvgFontMapItem->CopyFontFamilyName( aFontFamilyName ); + lNewSvgFontMapItem->IncrementReferenceCount(); + + iSvgFontMapItems.Append(lNewSvgFontMapItem); + + return ETrue; + } +} + +// -------------------------------------------------------------------------- +// void CSvgFontHashMap::AddReferenceToFontL( CFbsBitmap* aFont, +// return ETrue if reference successfully added +// return EFalse if already in map so just incremented reference +// --------------------------------------------------------------------------- +TBool CSvgFontHashMap::AddReferenceToFontL( const TDesC& aFontFamilyName ) + { + CSvgFontMapItem* lFontMapItem = GetFontMapItem( aFontFamilyName ); + + if (lFontMapItem) + { + //already a reference to this Font in the Font map + lFontMapItem->IncrementReferenceCount(); + return ETrue; + } + else + { + return EFalse; + } + + } + +// -------------------------------------------------------------------------- +// TBool CSvgFontHashMap::HasFontName( const TDesC& aFontName +// --------------------------------------------------------------------------- +TBool CSvgFontHashMap::HasFontFamilyName( const TDesC& aFontFamilyName ) + { + TBool lHaveFont = EFalse; + + TInt svgFontMapItemsCnt = iSvgFontMapItems.Count(); + for (TInt i=0; i < svgFontMapItemsCnt; i++) + { + if ( aFontFamilyName == ((CSvgFontMapItem*)iSvgFontMapItems[i])->GetFontFamilyName() ) + { + lHaveFont = ETrue; + } + } + + return lHaveFont; + + } + +// -------------------------------------------------------------------------- +// CSvgFontMapItem* CSvgFontHashMap::GetFontMapItem( const TDesC& aFontName +// --------------------------------------------------------------------------- +CSvgFontMapItem* CSvgFontHashMap::GetFontMapItem( const TDesC& aFontFamilyName ) +{ + TInt svgFontMapItemsCnt = iSvgFontMapItems.Count(); + for ( TInt i = 0; i < svgFontMapItemsCnt; i++ ) + { + CSvgFontMapItem* lFontMap = (CSvgFontMapItem*)iSvgFontMapItems[i]; + + TInt result = aFontFamilyName.Compare( lFontMap->GetFontFamilyName() ); + + if ( result == 0 ) + { + return lFontMap; + } + } + + return NULL; +} + +// -------------------------------------------------------------------------- +// TBool CSvgDocumentImpl::RemoveReferenceFromFontL( const TDesC& aFontName ) +// returns True if there aren't any left +// returns False if there are references to that Font left +// --------------------------------------------------------------------------- +TBool CSvgFontHashMap::RemoveReferenceFromFontL( const TDesC& aFontFamilyName ) + { + + CSvgFontMapItem* lFontMapItem = GetFontMapItem( aFontFamilyName ); + + if (lFontMapItem != NULL) + { + //we have this lFontMapElement + TInt aReferenceCount = lFontMapItem->DecrementReferenceCount(); + + if (aReferenceCount <= 0) + { + //no more references to this Font remove it from the map + iSvgFontMapItems.Remove(iSvgFontMapItems.Find(lFontMapItem)); + delete lFontMapItem; + return ETrue; + } + } + + return EFalse; + } + +// -------------------------------------------------------------------------- +// START OF EXTERNAL SVG FONT DOCUMENT METHODS +// -------------------------------------------------------------------------- +// TBool CSvgFontHashMap::AddFontDocument(CSvgDocumentImpl* newFontDocument, const TDesC& aFontFamily) +// --------------------------------------------------------------------------- +TBool CSvgFontHashMap::AddFontDocument(CSvgDocumentImpl* aFontDocument, const TDesC& aFontFamily) +{ + if (aFontDocument == NULL) + { + //no document passed in + return EFalse; + } + + CSvgElementImpl* myFontElement = (CSvgElementImpl*)GetFontPtr(aFontFamily); + + if (myFontElement == NULL) + { + //no font in of this name in map so we can't add its document handle + return EFalse; + } + + if ( !HasFontDocument(aFontDocument) ) + { + //then add it to the list of font documents + iFontDocumentPointers.Append(aFontDocument); + + //and add it to the current document's font map + TInt errorcode = KErrNone; + TRAP(errorcode, AddFontL((CSvgFontElementImpl*)myFontElement, aFontFamily)); + + return ETrue; + } + + return EFalse; +} + +// -------------------------------------------------------------------------- +// void CSvgFontHashMap::DeleteFontDocument(const TDesC& aFontFamily) +// --------------------------------------------------------------------------- +void CSvgFontHashMap::DeleteFontDocument(const TDesC& aFontFamily) +{ + CSvgElementImpl* myFontElement = NULL; + + TInt fontDocPointersCnt = iFontDocumentPointers.Count(); + for (TInt i=0; i < fontDocPointersCnt; i++) + { + CSvgDocumentImpl* myDoc = (CSvgDocumentImpl*)iFontDocumentPointers[i]; + + myFontElement = (CSvgElementImpl*)GetFontPtr(aFontFamily); + + if (myFontElement != NULL) + { + iFontDocumentPointers.Remove(i); + TInt error = KErrNone; + TRAP(error,RemoveReferenceFromFontL(aFontFamily)); + if (myDoc) + { + delete myDoc; + myDoc = NULL; + } + } + } +} + +// -------------------------------------------------------------------------- +// TBool CSvgFontHashMap::HasFontDocument(CSvgDocumentImpl* myDoc) +// --------------------------------------------------------------------------- +TBool CSvgFontHashMap::HasFontDocument(CSvgDocumentImpl* myDoc) +{ + //check to see if we have this document pointer already + TBool hasFontPointer = EFalse; + + TInt fontDocPointersCnt = iFontDocumentPointers.Count(); + for (TInt i=0; i < fontDocPointersCnt; i++) + { + if ((CSvgDocumentImpl*)iFontDocumentPointers[i] == myDoc) + { + hasFontPointer = ETrue; + } + } + + return hasFontPointer; +} + +// -------------------------------------------------------------------------- +//END OF EXTERNAL SVG FONT DOCUMENT +// -------------------------------------------------------------------------- + +// -------------------------------------------------------------------------- +// void CSvgFontHashMap::PrintFontHashMap( ) +// --------------------------------------------------------------------------- +void CSvgFontHashMap::PrintFontHashMap() +{ + RDebug::Printf("----Font Hash Map----\n"); + TInt svgFontMapItemsCnt = iSvgFontMapItems.Count(); + for (TInt i=0; i< svgFontMapItemsCnt; i++) + { + CSvgFontMapItem* lFontMapItem = iSvgFontMapItems[i]; + + if(lFontMapItem) + { + lFontMapItem->Print(); + } + } +} + +// -------------------------------------------------------------------------- +// CFbsBitmap* CSvgDocumentImpl::GetFontPtr( const TDesC& aFontName ) +// --------------------------------------------------------------------------- +CSvgFontElementImpl* CSvgFontHashMap::GetFontPtr( const TDesC& aFontFamilyName ) + { + + CSvgFontMapItem* lFontMapItem = GetFontMapItem( aFontFamilyName ); + + if (lFontMapItem) + { + return (lFontMapItem->GetFontPtr()); + } + + return NULL; + + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontMapItem* CSvgFontMapItem::NewL() + { + CSvgFontMapItem* self = new ( ELeave ) CSvgFontMapItem; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontMapItem* CSvgFontMapItem::NewLC() + { + CSvgFontMapItem* self = new ( ELeave ) CSvgFontMapItem; + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +// ========================================================================== +// Need method description +// ========================================================================== +void CSvgFontMapItem::ConstructL() + { + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontMapItem::CSvgFontMapItem() + { + } + +// ========================================================================== +// Need method description +// ========================================================================== +CSvgFontMapItem::~CSvgFontMapItem() + { + if (iFontFamilyName) + { + delete iFontFamilyName; + iFontFamilyName = NULL; + } + /*if (iFontPtr) + { + delete iFontPtr; + } + if (iFontDocumentPtr) + { + delete iFontDocumentPtr; + }*/ + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +CSvgFontElementImpl* CSvgFontMapItem::GetFontPtr() + { + return iFontPtr; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +const TDesC& CSvgFontMapItem::GetFontFamilyName() + { + return ( const TDesC & ) *iFontFamilyName; + } + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgFontMapItem::SetFontPtr( CSvgFontElementImpl* aFontPtr ) + { + iFontPtr = aFontPtr; + } + + +// --------------------------------------------------------------------------- +// +// --------------------------------------------------------------------------- +void CSvgFontMapItem::CopyFontFamilyName( const TDesC& aFontFamilyName ) + { + if (iFontFamilyName) + { + delete iFontFamilyName; + iFontFamilyName = NULL; + } + + iFontFamilyName = aFontFamilyName.Alloc(); + } + +//----------------------------------------------------------------------- +// +//----------------------------------------------------------------------- +TInt CSvgFontMapItem::IncrementReferenceCount( ) + { + iFontReferenceCount++; + return iFontReferenceCount; + } + +//----------------------------------------------------------------------- +// +//----------------------------------------------------------------------- +TInt CSvgFontMapItem::DecrementReferenceCount() + { + iFontReferenceCount--; + return iFontReferenceCount; + } + +//----------------------------------------------------------------------- +// +//----------------------------------------------------------------------- +void CSvgFontMapItem::Print() +{ + RDebug::RawPrint(iFontFamilyName->Des()); + RDebug::Printf("ref_count = %d fontptr = %d fontdocptr = %d \n", iFontReferenceCount, iFontPtr, iFontDocumentPtr); +}