bea5e37dd3
Rename ImplFontSelectData to FontSelectPattern because I can never remember the name of the thing. This way I'll be able to remember that its basically the equivalent of fontconfig's FcPattern
201 lines
7 KiB
C++
201 lines
7 KiB
C++
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
/*************************************************************************
|
|
*
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
|
*
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
|
*
|
|
* This file is part of OpenOffice.org.
|
|
*
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
* only, as published by the Free Software Foundation.
|
|
*
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License version 3 for more details
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
* <http://www.openoffice.org/license.html>
|
|
* for a copy of the LGPLv3 License.
|
|
*
|
|
************************************************************************/
|
|
|
|
#ifndef _SV_GCACHFTYP_HXX
|
|
#define _SV_GCACHFTYP_HXX
|
|
|
|
#include "generic/glyphcache.hxx"
|
|
|
|
#include <rtl/textcvt.h>
|
|
|
|
class FreetypeServerFont;
|
|
#ifdef ENABLE_GRAPHITE
|
|
class GraphiteFaceWrapper;
|
|
#endif
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
// FtFontFile has the responsibility that a font file is only mapped once.
|
|
// (#86621#) the old directly ft-managed solution caused it to be mapped
|
|
// in up to nTTC*nSizes*nOrientation*nSynthetic times
|
|
class FtFontFile
|
|
{
|
|
public:
|
|
static FtFontFile* FindFontFile( const ::rtl::OString& rNativeFileName );
|
|
|
|
bool Map();
|
|
void Unmap();
|
|
|
|
const unsigned char* GetBuffer() const { return mpFileMap; }
|
|
int GetFileSize() const { return mnFileSize; }
|
|
const ::rtl::OString* GetFileName() const { return &maNativeFileName; }
|
|
int GetLangBoost() const { return mnLangBoost; }
|
|
|
|
private:
|
|
FtFontFile( const ::rtl::OString& rNativeFileName );
|
|
|
|
const ::rtl::OString maNativeFileName;
|
|
const unsigned char* mpFileMap;
|
|
int mnFileSize;
|
|
int mnRefCount;
|
|
int mnLangBoost;
|
|
};
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
// FtFontInfo corresponds to an unscaled font face
|
|
class FtFontInfo
|
|
{
|
|
public:
|
|
FtFontInfo( const ImplDevFontAttributes&,
|
|
const ::rtl::OString& rNativeFileName,
|
|
int nFaceNum, sal_IntPtr nFontId, int nSynthetic,
|
|
const ExtraKernInfo* );
|
|
~FtFontInfo();
|
|
|
|
const unsigned char* GetTable( const char*, sal_uLong* pLength=0 ) const;
|
|
|
|
FT_FaceRec_* GetFaceFT();
|
|
#ifdef ENABLE_GRAPHITE
|
|
GraphiteFaceWrapper* GetGraphiteFace();
|
|
#endif
|
|
void ReleaseFaceFT( FT_FaceRec_* );
|
|
|
|
const ::rtl::OString* GetFontFileName() const { return mpFontFile->GetFileName(); }
|
|
int GetFaceNum() const { return mnFaceNum; }
|
|
int GetSynthetic() const { return mnSynthetic; }
|
|
sal_IntPtr GetFontId() const { return mnFontId; }
|
|
bool IsSymbolFont() const { return maDevFontAttributes.IsSymbolFont(); }
|
|
const ImplFontAttributes& GetFontAttributes() const { return maDevFontAttributes; }
|
|
|
|
void AnnounceFont( ImplDevFontList* );
|
|
|
|
int GetGlyphIndex( sal_UCS4 cChar ) const;
|
|
void CacheGlyphIndex( sal_UCS4 cChar, int nGI ) const;
|
|
|
|
bool GetFontCodeRanges( CmapResult& ) const;
|
|
const ImplFontCharMap* GetImplFontCharMap( void );
|
|
|
|
bool HasExtraKerning() const;
|
|
int GetExtraKernPairs( ImplKernPairData** ) const;
|
|
int GetExtraGlyphKernValue( int nLeftGlyph, int nRightGlyph ) const;
|
|
|
|
private:
|
|
FT_FaceRec_* maFaceFT;
|
|
FtFontFile* mpFontFile;
|
|
const int mnFaceNum;
|
|
int mnRefCount;
|
|
const int mnSynthetic;
|
|
#ifdef ENABLE_GRAPHITE
|
|
bool mbCheckedGraphite;
|
|
GraphiteFaceWrapper * mpGraphiteFace;
|
|
#endif
|
|
sal_IntPtr mnFontId;
|
|
ImplDevFontAttributes maDevFontAttributes;
|
|
|
|
const ImplFontCharMap* mpFontCharMap;
|
|
|
|
// cache unicode->glyphid mapping because looking it up is expensive
|
|
// TODO: change to boost::unordered_multimap when a use case requires a m:n mapping
|
|
typedef ::boost::unordered_map<int,int> Int2IntMap;
|
|
mutable Int2IntMap* mpChar2Glyph;
|
|
mutable Int2IntMap* mpGlyph2Char;
|
|
void InitHashes() const;
|
|
|
|
const ExtraKernInfo* mpExtraKernInfo;
|
|
};
|
|
|
|
// these two inlines are very important for performance
|
|
|
|
inline int FtFontInfo::GetGlyphIndex( sal_UCS4 cChar ) const
|
|
{
|
|
if( !mpChar2Glyph )
|
|
return -1;
|
|
Int2IntMap::const_iterator it = mpChar2Glyph->find( cChar );
|
|
if( it == mpChar2Glyph->end() )
|
|
return -1;
|
|
return it->second;
|
|
}
|
|
|
|
inline void FtFontInfo::CacheGlyphIndex( sal_UCS4 cChar, int nIndex ) const
|
|
{
|
|
if( !mpChar2Glyph )
|
|
InitHashes();
|
|
(*mpChar2Glyph)[ cChar ] = nIndex;
|
|
(*mpGlyph2Char)[ nIndex ] = cChar;
|
|
}
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
class FreetypeManager
|
|
{
|
|
public:
|
|
FreetypeManager();
|
|
~FreetypeManager();
|
|
|
|
void AddFontFile( const rtl::OString& rNormalizedName,
|
|
int nFaceNum, sal_IntPtr nFontId, const ImplDevFontAttributes&,
|
|
const ExtraKernInfo* );
|
|
void AnnounceFonts( ImplDevFontList* ) const;
|
|
void ClearFontList();
|
|
|
|
ServerFont* CreateFont( const FontSelectPattern& );
|
|
|
|
private:
|
|
typedef ::boost::unordered_map<sal_IntPtr,FtFontInfo*> FontList;
|
|
FontList maFontList;
|
|
|
|
sal_IntPtr mnMaxFontId;
|
|
sal_IntPtr mnNextFontId;
|
|
};
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
class ImplFTSFontData : public ImplFontData
|
|
{
|
|
private:
|
|
FtFontInfo* mpFtFontInfo;
|
|
enum { IFTSFONT_MAGIC = 0x1F150A1C };
|
|
|
|
public:
|
|
ImplFTSFontData( FtFontInfo*, const ImplDevFontAttributes& );
|
|
|
|
FtFontInfo* GetFtFontInfo() const { return mpFtFontInfo; }
|
|
|
|
virtual ImplFontEntry* CreateFontInstance( FontSelectPattern& ) const;
|
|
virtual ImplFontData* Clone() const { return new ImplFTSFontData( *this ); }
|
|
virtual sal_IntPtr GetFontId() const { return mpFtFontInfo->GetFontId(); }
|
|
|
|
static bool CheckFontData( const ImplFontData& r ) { return r.CheckMagic( IFTSFONT_MAGIC ); }
|
|
};
|
|
|
|
// -----------------------------------------------------------------------
|
|
|
|
#endif // _SV_GCACHFTYP_HXX
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|