webengine/osswebengine/WebCore/platform/symbian/FontCacheSymbian.cpp
changeset 0 dd21522fd290
child 13 10e98eab6f85
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/platform/symbian/FontCacheSymbian.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,233 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  
+*
+*/
+
+
+
+#include "config.h"
+#include "FontCache.h"
+#include "FontPlatformData.h"
+#include "Font.h"
+#include "StaticObjectsContainer.h"
+#include "PlatformFontCache.h"
+#include <../bidi.h>            // work around for multiple bidi.h files
+#include "ZoomFactor.h"
+#include <e32base.h>
+#include <e32std.h>
+#include <w32std.h>
+#include <COEMAIN.H>
+#include <fbs.h>
+#include <FeatMgr.h>
+#include <Languages.hrh>
+
+#include <AknFontAccess.h>
+#include <AknUtils.h>
+#include <AknLayoutFont.h>
+#include <AknFontSpecification.h>
+
+// CONSTANTS
+_LIT( KPlatformDefaultFontFamily,   "S60 WebKit" ); 
+
+namespace WebCore
+{
+
+void FontCache::platformInit()
+{
+    // don't support Glphy caching in S60, so force to use the complex path
+    Font::setCodePath( Font::Complex );
+    StaticObjectsContainer::instance()->fontCache()->Initialize();
+}
+
+const FontData* FontCache::getFontDataForCharacters(const Font& font, const UChar* characters, int length)
+{
+    // this function shouldn't be called.
+    __ASSERT_ALWAYS( 0, User::Panic(_L("FontCache:"), 0) );
+    return 0;
+}
+
+FontPlatformData* FontCache::getSimilarFontPlatformData(const Font& font)
+{
+    return 0;
+}
+
+FontPlatformData* FontCache::getLastResortFallbackFont(const Font& font)
+{
+   // the default fallback font
+   return getCachedFontPlatformData(font.fontDescription(), StaticObjectsContainer::instance()->fontCache()->DeviceDefaultFontFamilies());
+}
+
+FontPlatformData* FontCache::getDeviceDefaultFont(float size)
+{
+    FontDescription fd;
+    fd.setComputedSize(size);
+    return getCachedFontPlatformData(fd, StaticObjectsContainer::instance()->fontCache()->DeviceDefaultFontFamilies());
+}
+
+FontPlatformData* FontCache::createFontPlatformData(const FontDescription& fontDescription, const AtomicString& family)
+{
+    PlatformFontCache* platformCache = StaticObjectsContainer::instance()->fontCache();
+    return new FontPlatformData(platformCache->zoomedFont(fontDescription, 100));
+}
+
+const AtomicString& FontCache::systemFontFamilyName( const AtomicString& familyName )
+{
+    return StaticObjectsContainer::instance()->fontCache()->SystemFontFamily( familyName );
+}
+
+void PlatformFontCache::Initialize()
+    {
+    iScreenDevice = CCoeEnv::Static()->ScreenDevice();
+    iFontCache.clear();
+
+    // search for scalable fonts only to make lookups faster
+    TInt count(iScreenDevice->NumTypefaces());
+    for (TInt n=0; n<count; ++n)
+        {
+        TTypefaceSupport typeface;
+        iScreenDevice->TypefaceSupport(typeface, n);
+        if (typeface.iIsScalable)
+            {
+            // count the scalable typefaces
+            ++iTypefaceCount;
+            }
+        }
+
+    // populate typeface array
+    TInt i=0;
+    iSupportedNames = new AtomicString[iTypefaceCount];
+
+    for (TInt n=0; n<count; ++n)
+        {
+        TTypefaceSupport typeface;
+        iScreenDevice->TypefaceSupport(typeface, n);
+        if (typeface.iIsScalable)
+            {
+            iSupportedNames[i] = typeface.iTypeface.iName;
+            ++i;
+            }
+
+        }
+
+}
+
+PlatformFontCache::~PlatformFontCache()
+{
+    Vector<ZoomedSpec>::iterator it = iFontCache.begin();
+    Vector<ZoomedSpec>::iterator end = iFontCache.end();
+    for(;it != end; ++it) {
+        ReleaseFont( it->m_font );
+        it->m_font = 0;
+    }        
+    iFontCache.clear();
+    delete [] iSupportedNames;
+}
+
+const AtomicString& PlatformFontCache::SystemFontFamily( const AtomicString& familyName )
+{
+    // first check if we support this font
+    for (TInt n=0; n<iTypefaceCount; ++n)
+    {
+        if (iSupportedNames[n] == familyName )
+        {
+            return iSupportedNames[n];
+        }
+    }
+
+    return DeviceDefaultFontFamilies();
+}
+
+const AtomicString& PlatformFontCache::DeviceDefaultFontFamilies()
+    {
+    TPtrC font(KPlatformDefaultFontFamily);
+    iDeviceDefaultFont = font;
+    return iDeviceDefaultFont;
+    }
+
+CFont* PlatformFontCache::CreateFont(const ZoomedSpec& spec)
+{    
+    CFont* font = 0;
+    
+    Vector<ZoomedSpec>::const_iterator it = iFontCache.begin();
+    Vector<ZoomedSpec>::const_iterator end = iFontCache.end();
+    for (;it != end; ++it) {
+        if ((*it) == spec) {
+            font = it->m_font; 
+            return font;
+        }
+    }
+    
+    
+    if (spec.m_spec.iTypeface.iName == KPlatformDefaultFontFamily) { 
+        // fall back to platform default fonts by using TAknFontFamily 
+        font = AknFontAccess::GetClosestFont(*iScreenDevice, spec.m_spec.iFontStyle, spec.m_spec.iHeight * spec.m_zoom/100, (AknFontAccess::TAknFontFamily)0); 
+    } 
+    else { 
+        font = AknFontAccess::GetClosestFont(*iScreenDevice, spec.m_spec.iFontStyle, spec.m_spec.iHeight * spec.m_zoom/100, spec.m_spec.iTypeface.iName); 
+    } 
+        
+    
+    if (font) {
+        ZoomedSpec newSpec(spec);
+        newSpec.m_font = font;
+        iFontCache.append(newSpec);
+    }   
+	 
+    return font;
+}
+
+void PlatformFontCache::ReleaseFont(CFont* font)
+{
+    iScreenDevice->ReleaseFont(font);
+}
+
+void PlatformFontCache::setFontZoomFactor(int zoom)
+{
+    // adjust the zoom factor based on fonts
+    iFontZoomFactor = zoom;
+}
+
+TFontSpec PlatformFontCache::fontSpecInTwips(const FontDescription& fontDescription)
+{    
+    TInt fSize = fontDescription.computedPixelSize();
+
+    if (fSize == 0) fSize = 12;
+    TInt twipSize = iScreenDevice->VerticalPixelsToTwips(fSize);
+
+    // convert to platform-supported font family
+    TPtrC fPtr( SystemFontFamily( fontDescription.family().family() ) );
+    
+
+    TFontSpec fontSpec(fPtr, twipSize);
+    fontSpec.iFontStyle.SetStrokeWeight(fontDescription.bold() ? EStrokeWeightBold : EStrokeWeightNormal);
+    fontSpec.iFontStyle.SetPosture(fontDescription.italic() ? EPostureItalic : EPostureUpright);
+    fontSpec.iFontStyle.SetBitmapType(EAntiAliasedGlyphBitmap); // enable anti-aliasing
+    
+    if (fontDescription.bold() && fPtr==KPlatformDefaultFontFamily) {
+        fontSpec.iFontStyle.SetStrokeWeight(EStrokeWeightBold);
+    }
+
+    return fontSpec;
+}
+
+
+CFont* PlatformFontCache::zoomedFont(const FontDescription& fontDescription, int zoom)
+{
+    ZoomedSpec spec(fontSpecInTwips(fontDescription), zoom, 0);
+    return CreateFont(spec);
+}
+
+}
+