summaryrefslogtreecommitdiffstats
path: root/include/vcl/fontmanager.hxx
diff options
context:
space:
mode:
authorTor Lillqvist <tml@collabora.com>2013-12-11 10:13:15 +0200
committerTor Lillqvist <tml@collabora.com>2013-12-11 10:30:02 +0200
commita0e8a1b69106dd55dd52fc6966ecf2b19d461fa9 (patch)
tree2d1e71e021e03e5a3491425d44208c6ba019988b /include/vcl/fontmanager.hxx
parentdisplayconnectiondispatch.hxx is private to vcl (diff)
downloadcore-a0e8a1b69106dd55dd52fc6966ecf2b19d461fa9.tar.gz
core-a0e8a1b69106dd55dd52fc6966ecf2b19d461fa9.zip
fontmanager.hxx is private to vcl
Change-Id: Iec1d1539db0b44d2ddc420cf500585098d4793fc
Diffstat (limited to 'include/vcl/fontmanager.hxx')
-rw-r--r--include/vcl/fontmanager.hxx537
1 files changed, 0 insertions, 537 deletions
diff --git a/include/vcl/fontmanager.hxx b/include/vcl/fontmanager.hxx
deleted file mode 100644
index ca78376972a0..000000000000
--- a/include/vcl/fontmanager.hxx
+++ /dev/null
@@ -1,537 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed
- * with this work for additional information regarding copyright
- * ownership. The ASF licenses this file to you under the Apache
- * License, Version 2.0 (the "License"); you may not use this file
- * except in compliance with the License. You may obtain a copy of
- * the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
-
-#ifndef INCLUDED_VCL_FONTMANAGER_HXX
-#define INCLUDED_VCL_FONTMANAGER_HXX
-
-#include <boost/unordered_map.hpp>
-#include <map>
-#include <list>
-#include <set>
-
-#include <vcl/dllapi.h>
-#include <vcl/helper.hxx>
-#include <vcl/timer.hxx>
-#include <vcl/vclenum.hxx>
-#include <com/sun/star/lang/Locale.hpp>
-
-#include <vector>
-
-#define ATOM_FAMILYNAME 2
-#define ATOM_PSNAME 3
-
-/*
- * some words on metrics: every length returned by PrintFontManager and
- * friends are PostScript afm style, that is they are 1/1000 font height
- */
-
-// forward declarations
-namespace utl { class MultiAtomProvider; } // see unotools/atom.hxx
-class FontSubsetInfo;
-class ImplFontOptions;
-class FontSelectPattern;
-
-namespace psp {
-class PPDParser; // see ppdparser.hxx
-
-namespace fonttype
-{
-enum type {
- Unknown = 0,
- Type1 = 1,
- TrueType = 2,
-};
-}
-
-/*
- * the difference between FastPrintFontInfo and PrintFontInfo
- * is that the information in FastPrintFontInfo can usually
- * be gathered without openening either the font file or
- * an afm metric file. they are gathered from fonts.dir alone.
- * if only FastPrintFontInfo is gathered and PrintFontInfo
- * on demand and for less fonts, then performance in startup
- * increases considerably
- */
-
-struct FastPrintFontInfo
-{
- fontID m_nID; // FontID
- fonttype::type m_eType;
-
- // font attributes
- OUString m_aFamilyName;
- OUString m_aStyleName;
- std::list< OUString > m_aAliases;
- FontFamily m_eFamilyStyle;
- FontItalic m_eItalic;
- FontWidth m_eWidth;
- FontWeight m_eWeight;
- FontPitch m_ePitch;
- rtl_TextEncoding m_aEncoding;
- bool m_bSubsettable;
- bool m_bEmbeddable;
-
- FastPrintFontInfo() :
- m_nID( 0 ),
- m_eType( fonttype::Unknown ),
- m_eFamilyStyle( FAMILY_DONTKNOW ),
- m_eItalic( ITALIC_DONTKNOW ),
- m_eWidth( WIDTH_DONTKNOW ),
- m_eWeight( WEIGHT_DONTKNOW ),
- m_ePitch( PITCH_DONTKNOW ),
- m_aEncoding( RTL_TEXTENCODING_DONTKNOW )
- {}
-};
-
-struct PrintFontInfo : public FastPrintFontInfo
-{
- int m_nAscend;
- int m_nDescend;
- int m_nLeading;
- int m_nWidth;
-
- PrintFontInfo() :
- FastPrintFontInfo(),
- m_nAscend( 0 ),
- m_nDescend( 0 ),
- m_nLeading( 0 ),
- m_nWidth( 0 )
- {}
-};
-
-// the values are per thousand of the font size
-// note: width, height contain advances, not bounding box
-struct CharacterMetric
-{
- short int width, height;
-
- CharacterMetric() : width( 0 ), height( 0 ) {}
- bool operator==( const CharacterMetric& rOther ) const
- { return rOther.width == width && rOther.height == height; }
- bool operator!=( const CharacterMetric& rOther ) const
- { return rOther.width != width || rOther.height != height; }
-};
-
-class FontCache;
-
-// a class to manage printable fonts
-// aims are type1 and truetype fonts
-
-class FontCache;
-
-class VCL_PLUGIN_PUBLIC PrintFontManager
-{
- struct PrintFont;
- struct TrueTypeFontFile;
- struct Type1FontFile;
- friend struct PrintFont;
- friend struct TrueTypeFontFile;
- friend struct Type1FontFile;
- friend class FontCache;
-
- struct PrintFontMetrics
- {
- // character metrics are stored by the following keys:
- // lower two bytes contain a sal_Unicode (a UCS2 character)
- // upper byte contains: 0 for horizontal metric
- // 1 for vertical metric
- // highest byte: 0 for now
- boost::unordered_map< int, CharacterMetric > m_aMetrics;
- // contains the unicode blocks for which metrics were queried
- // this implies that metrics should be queried in terms of
- // unicode blocks. here a unicode block is identified
- // by the upper byte of the UCS2 encoding.
- // note that the corresponding bit should be set even
- // if the font does not support a single character of that page
- // this map shows, which pages were queried already
- // if (like in AFM metrics) all metrics are queried in
- // a single pass, then all bits should be set
- char m_aPages[32];
-
- boost::unordered_map< sal_Unicode, bool > m_bVerticalSubstitutions;
-
- PrintFontMetrics() {}
-
- bool isEmpty() const { return m_aMetrics.empty(); }
- };
-
- struct PrintFont
- {
- fonttype::type m_eType;
-
- // font attributes
- int m_nFamilyName; // atom
- std::list< int > m_aAliases;
- int m_nPSName; // atom
- OUString m_aStyleName;
- FontItalic m_eItalic;
- FontWidth m_eWidth;
- FontWeight m_eWeight;
- FontPitch m_ePitch;
- rtl_TextEncoding m_aEncoding;
- bool m_bFontEncodingOnly; // set if font should be only accessed by builtin encoding
- CharacterMetric m_aGlobalMetricX;
- CharacterMetric m_aGlobalMetricY;
- PrintFontMetrics* m_pMetrics;
- int m_nAscend;
- int m_nDescend;
- int m_nLeading;
- int m_nXMin; // font bounding box
- int m_nYMin;
- int m_nXMax;
- int m_nYMax;
- bool m_bHaveVerticalSubstitutedGlyphs;
- bool m_bUserOverride;
-
- std::map< sal_Unicode, sal_Int32 > m_aEncodingVector;
- std::map< sal_Unicode, OString > m_aNonEncoded;
-
- explicit PrintFont( fonttype::type eType );
- virtual ~PrintFont();
- virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider ) = 0;
-
- bool readAfmMetrics( utl::MultiAtomProvider* pProvider, bool bFillEncodingvector, bool bOnlyGlobalAttributes );
- };
-
- struct Type1FontFile : public PrintFont
- {
- int m_nDirectory; // atom containing system dependent path
- OString m_aFontFile; // relative to directory
- OString m_aMetricFile; // dito
-
- /* note: m_aFontFile and Metric file are not atoms
- because they should be fairly unique */
-
- Type1FontFile() : PrintFont( fonttype::Type1 ), m_nDirectory( 0 ) {}
- virtual ~Type1FontFile();
- virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider );
- };
-
- struct TrueTypeFontFile : public PrintFont
- {
- int m_nDirectory; // atom containing system dependent path
- OString m_aFontFile; // relative to directory
- int m_nCollectionEntry; // 0 for regular fonts, 0 to ... for fonts stemming from collections
- unsigned int m_nTypeFlags; // copyright bits and PS-OpenType flag
-
- TrueTypeFontFile();
- virtual ~TrueTypeFontFile();
- virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider );
- };
-
- fontID m_nNextFontID;
- boost::unordered_map< fontID, PrintFont* > m_aFonts;
- boost::unordered_map< int, FontFamily > m_aFamilyTypes;
- std::list< OUString > m_aPrinterDrivers;
- std::list< OString > m_aFontDirectories;
- std::list< int > m_aPrivateFontDirectories;
- utl::MultiAtomProvider* m_pAtoms;
- // for speeding up findFontFileID
- boost::unordered_map< OString, std::set< fontID >, OStringHash >
- m_aFontFileToFontID;
-
- boost::unordered_map< OString, int, OStringHash >
- m_aDirToAtom;
- boost::unordered_map< int, OString > m_aAtomToDir;
- int m_nNextDirAtom;
-
- boost::unordered_multimap< OString, sal_Unicode, OStringHash >
- m_aAdobenameToUnicode;
- boost::unordered_multimap< sal_Unicode, OString >
- m_aUnicodeToAdobename;
- boost::unordered_multimap< sal_Unicode, sal_uInt8 > m_aUnicodeToAdobecode;
- boost::unordered_multimap< sal_uInt8, sal_Unicode > m_aAdobecodeToUnicode;
-
- mutable FontCache* m_pFontCache;
-
- OString getAfmFile( PrintFont* pFont ) const;
- OString getFontFile( PrintFont* pFont ) const;
-
- bool analyzeFontFile( int nDirID, const OString& rFileName, std::list< PrintFont* >& rNewFonts, const char *pFormat=NULL ) const;
- OUString convertTrueTypeName( void* pNameRecord ) const; // actually a NameRecord* formt font subsetting code
- void analyzeTrueTypeFamilyName( void* pTTFont, std::list< OUString >& rnames ) const; // actually a TrueTypeFont* from font subsetting code
- bool analyzeTrueTypeFile( PrintFont* pFont ) const;
- // finds the font id for the nFaceIndex face in this font file
- // There may be multiple font ids for TrueType collections
- fontID findFontFileID( int nDirID, const OString& rFile, int nFaceIndex ) const;
-
- // There may be multiple font ids for TrueType collections
- std::vector<fontID> findFontFileIDs( int nDirID, const OString& rFile ) const;
-
- bool knownFontFile( int nDirID, const OString& rFile ) const
- {
- return findFontFileID(nDirID, rFile, 0) != 0;
- }
-
- FontFamily matchFamilyName( const OUString& rFamily ) const;
-
- PrintFont* getFont( fontID nID ) const
- {
- boost::unordered_map< fontID, PrintFont* >::const_iterator it;
- it = m_aFonts.find( nID );
- return it == m_aFonts.end() ? NULL : it->second;
- }
- void fillPrintFontInfo( PrintFont* pFont, FastPrintFontInfo& rInfo ) const;
- void fillPrintFontInfo( PrintFont* pFont, PrintFontInfo& rInfo ) const;
-
- OString getDirectory( int nAtom ) const;
- int getDirectoryAtom( const OString& rDirectory, bool bCreate = false );
-
- /* try to initialize fonts from libfontconfig
-
- called from <code>initialize()</code>
- */
- void initFontconfig();
- void countFontconfigFonts( boost::unordered_map<OString, int, OStringHash>& o_rVisitedPaths );
- /* deinitialize fontconfig
- */
- void deinitFontconfig();
-
- /* register an application specific font directory for libfontconfig
-
- since fontconfig is asked for font substitutes before OOo will check for font availability
- and fontconfig will happily substitute fonts it doesn't know (e.g. "Arial Narrow" -> "DejaVu Sans Book"!)
- it becomes necessary to tell the library about all the hidden font treasures
-
- @returns
- true if libfontconfig accepted the directory
- false else (e.g. no libfontconfig found)
- */
- bool addFontconfigDir(const OString& rDirectory);
-
- std::set<OString> m_aPreviousLangSupportRequests;
- std::vector<OString> m_aCurrentRequests;
- Timer m_aFontInstallerTimer;
-
- DECL_LINK( autoInstallFontLangSupport, void* );
-
- PrintFontManager();
- ~PrintFontManager();
-public:
- static PrintFontManager& get(); // one instance only
-
- // There may be multiple font ids for TrueType collections
- std::vector<fontID> addFontFile( const OString& rFileName );
-
- void initialize();
-
- // returns the number of managed fonts
- int getFontCount() const { return m_aFonts.size(); }
-
- // returns the ids of all managed fonts.
- void getFontList( std::list< fontID >& rFontIDs );
- // get the font list and fast font info.
- void getFontListWithFastInfo( std::list< FastPrintFontInfo >& rFonts );
-
- // get font info for a specific font
- bool getFontInfo( fontID nFontID, PrintFontInfo& rInfo ) const;
- // get fast font info for a specific font
- bool getFontFastInfo( fontID nFontID, FastPrintFontInfo& rInfo ) const;
-
- // routines to get font info in small pieces
-
- // get a specific fonts PSName name
- const OUString& getPSName( fontID nFontID ) const;
-
- // get a specific fonts family name aliases
- void getFontFamilyAliases( fontID nFontID ) const;
-
- // get a specific fonts type
- fonttype::type getFontType( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_eType : fonttype::Unknown;
- }
-
- // get a specific fonts italic type
- FontItalic getFontItalic( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_eItalic : ITALIC_DONTKNOW;
- }
-
- // get a specific fonts width type
- FontWidth getFontWidth( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_eWidth : WIDTH_DONTKNOW;
- }
-
- // get a specific fonts weight type
- FontWeight getFontWeight( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_eWeight : WEIGHT_DONTKNOW;
- }
-
- // get a specific fonts pitch type
- FontPitch getFontPitch( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_ePitch : PITCH_DONTKNOW;
- }
-
- // get a specific fonts encoding
- rtl_TextEncoding getFontEncoding( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_aEncoding : RTL_TEXTENCODING_DONTKNOW;
- }
-
- // should i only use font's builtin encoding ?
- bool getUseOnlyFontEncoding( fontID nFontID ) const
- {
- PrintFont* pFont = getFont( nFontID );
- return pFont ? pFont->m_bFontEncodingOnly : false;
- }
-
- // get a specific fonts system dependent filename
- OString getFontFileSysPath( fontID nFontID ) const
- {
- return getFontFile( getFont( nFontID ) );
- }
-
- // get the ttc face number
- int getFontFaceNumber( fontID nFontID ) const;
-
- // get a specific fonts ascend
- int getFontAscend( fontID nFontID ) const;
-
- // get a specific fonts descent
- int getFontDescend( fontID nFontID ) const;
-
- // get a fonts glyph bounding box
- bool getFontBoundingBox( fontID nFont, int& xMin, int& yMin, int& xMax, int& yMax );
-
- // info whether an array of glyphs has vertical substitutions
- void hasVerticalSubstitutions( fontID nFontID, const sal_Unicode* pCharacters,
- int nCharacters, bool* pHasSubst ) const;
-
- // get a specific fonts metrics
-
- // get metrics for a sal_Unicode range
- // the user is responsible to allocate pArray large enough
- bool getMetrics( fontID nFontID, sal_Unicode minCharacter, sal_Unicode maxCharacter, CharacterMetric* pArray, bool bVertical = false ) const;
- // get metrics for an array of sal_Unicode characters
- // the user is responsible to allocate pArray large enough
- bool getMetrics( fontID nFontID, const sal_Unicode* pString, int nLen, CharacterMetric* pArray, bool bVertical = false ) const;
-
- // get encoding vector of font, currently only for Type1 fonts
- // returns NULL if encoding vector is empty or font is not type1;
- // if ppNonEncoded is set and non encoded type1 glyphs exist
- // then *ppNonEncoded is set to the mapping for nonencoded glyphs.
- // the encoding vector contains -1 for non encoded glyphs
- const std::map< sal_Unicode, sal_Int32 >* getEncodingMap( fontID nFontID, const std::map< sal_Unicode, OString >** ppNonEncoded ) const;
-
- // evaluates copyright flags for TrueType fonts for printing/viewing
- // type1 fonts do not have such a feature, so return for them is true
- bool isFontDownloadingAllowedForPrinting( fontID nFont ) const;
-
- // helper for type 1 fonts
- std::list< OString > getAdobeNameFromUnicode( sal_Unicode aChar ) const;
-
- std::pair< boost::unordered_multimap< sal_Unicode, sal_uInt8 >::const_iterator,
- boost::unordered_multimap< sal_Unicode, sal_uInt8 >::const_iterator >
- getAdobeCodeFromUnicode( sal_Unicode aChar ) const
- {
- return m_aUnicodeToAdobecode.equal_range( aChar );
- }
- std::list< sal_Unicode > getUnicodeFromAdobeName( const OString& rName ) const;
- std::pair< boost::unordered_multimap< sal_uInt8, sal_Unicode >::const_iterator,
- boost::unordered_multimap< sal_uInt8, sal_Unicode >::const_iterator >
- getUnicodeFromAdobeCode( sal_uInt8 aChar ) const
- {
- return m_aAdobecodeToUnicode.equal_range( aChar );
- }
-
- // creates a new font subset of an existing TrueType font
- // returns true in case of success, else false
- // nFont: the font to be subsetted
- // rOutFile: the file to put the new subset into;
- // must be a valid osl file URL
- // pGlyphIDs: input array of glyph ids for new font
- // pNewEncoding: the corresponding encoding in the new font
- // pWidths: output array of widths of requested glyphs
- // nGlyphs: number of glyphs in arrays
- // pCapHeight:: capital height of the produced font
- // pXMin, pYMin, pXMax, pYMax: outgoing font bounding box
- // TODO: callers of this method should use its FontSubsetInfo counterpart directly
- bool createFontSubset( FontSubsetInfo&,
- fontID nFont,
- const OUString& rOutFile,
- sal_Int32* pGlyphIDs,
- sal_uInt8* pNewEncoding,
- sal_Int32* pWidths,
- int nGlyphs,
- bool bVertical = false
- );
- void getGlyphWidths( fontID nFont,
- bool bVertical,
- std::vector< sal_Int32 >& rWidths,
- std::map< sal_Unicode, sal_uInt32 >& rUnicodeEnc );
-
-
- // font administration functions
-
- /* system dependendent font matching
-
- <p>
- <code>matchFont</code> matches a pattern of font characteristics
- and returns the closest match if possibe. If a match was found
- the <code>FastPrintFontInfo</code> passed in as parameter
- will be update to the found matching font.
- </p>
- <p>
- implementation note: currently the function is only implemented
- for fontconfig.
- </p>
-
- @param rInfo
- out of the FastPrintFontInfo structure the following
- fields will be used for the match:
- <ul>
- <li>family name</li>
- <li>italic</li>
- <li>width</li>
- <li>weight</li>
- <li>pitch</li>
- </ul>
-
- @param rLocale
- if <code>rLocal</code> contains non empty strings the corresponding
- locale will be used for font matching also; e.g. "Sans" can result
- in different fonts in e.g. english and japanese
-
- @returns
- true if a match was found
- false else
- */
- bool matchFont( FastPrintFontInfo& rInfo, const com::sun::star::lang::Locale& rLocale );
- ImplFontOptions* getFontOptions( const FastPrintFontInfo&, int nSize, void (*subcallback)(void*)) const;
-
- bool Substitute( FontSelectPattern &rPattern, OUString& rMissingCodes );
-
- int FreeTypeCharIndex( void *pFace, sal_uInt32 aChar );
-};
-
-} // namespace
-
-#endif // INCLUDED_VCL_FONTMANAGER_HXX
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */