vcl/inc/unx/fontmanager.hxx | 114 ++------ vcl/inc/unx/printergfx.hxx | 23 - vcl/unx/generic/fontmanager/fontcache.cxx | 123 +------- vcl/unx/generic/fontmanager/fontconfig.cxx | 6 vcl/unx/generic/fontmanager/fontmanager.cxx | 368 +++++++------------------- vcl/unx/generic/print/genpspgraphics.cxx | 58 +--- vcl/unx/generic/print/glyphset.cxx | 319 ----------------------- vcl/unx/generic/print/glyphset.hxx | 27 - vcl/unx/generic/print/text_gfx.cxx | 387 ---------------------------- 9 files changed, 196 insertions(+), 1229 deletions(-)
New commits: commit 30ebc895c95ee66adf172717249aa1789b309eff Author: Khaled Hosny <khaledho...@eglug.org> Date: Fri Nov 25 09:19:15 2016 +0200 There is one font file type now Change-Id: I47b6f36de5c77cfdf831a2b3ce10b973159520b1 Reviewed-on: https://gerrit.libreoffice.org/31231 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Khaled Hosny <khaledho...@eglug.org> diff --git a/vcl/inc/unx/fontmanager.hxx b/vcl/inc/unx/fontmanager.hxx index a7a2753..0a2de15 100644 --- a/vcl/inc/unx/fontmanager.hxx +++ b/vcl/inc/unx/fontmanager.hxx @@ -53,14 +53,6 @@ class FontSelectPattern; namespace psp { class PPDParser; -namespace fonttype -{ -enum type { - Unknown = 0, - TrueType = 2, -}; -} - /* * the difference between FastPrintFontInfo and PrintFontInfo * is that the information in FastPrintFontInfo can usually @@ -74,7 +66,6 @@ enum type { struct FastPrintFontInfo { fontID m_nID; // FontID - fonttype::type m_eType; // font attributes OUString m_aFamilyName; @@ -90,7 +81,6 @@ struct FastPrintFontInfo FastPrintFontInfo() : m_nID(0) - , m_eType(fonttype::Unknown) , m_eFamilyStyle(FAMILY_DONTKNOW) , m_eItalic(ITALIC_DONTKNOW) , m_eWidth(WIDTH_DONTKNOW) @@ -131,16 +121,13 @@ struct CharacterMetric 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; friend struct PrintFont; - friend struct TrueTypeFontFile; friend class FontCache; struct PrintFontMetrics @@ -171,46 +158,37 @@ class VCL_PLUGIN_PUBLIC PrintFontManager struct PrintFont { - fonttype::type m_eType; - // font attributes - int m_nFamilyName; // atom - std::vector< 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; - 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; - - explicit PrintFont( fonttype::type eType ); - virtual ~PrintFont(); - virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider ) = 0; - }; - - 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() override; - virtual bool queryMetricPage( int nPage, utl::MultiAtomProvider* pProvider ) override; + int m_nFamilyName; // atom + std::vector<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; + 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; + + 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 + + explicit PrintFont(); + ~PrintFont(); + bool queryMetricPage(int nPage, utl::MultiAtomProvider* pProvider); }; fontID m_nNextFontID; @@ -233,14 +211,14 @@ class VCL_PLUGIN_PUBLIC PrintFontManager OString getFontFile( PrintFont* pFont ) const; bool analyzeFontFile( int nDirID, const OString& rFileName, std::list< PrintFont* >& rNewFonts, const char *pFormat=nullptr ) const; - static OUString convertTrueTypeName( void* pNameRecord ); // actually a NameRecord* formt font subsetting code - static void analyzeTrueTypeFamilyName( void* pTTFont, std::list< OUString >& rnames ); // actually a TrueTypeFont* from font subsetting code - bool analyzeTrueTypeFile( PrintFont* pFont ) const; + static OUString convertSfntName( void* pNameRecord ); // actually a NameRecord* formt font subsetting code + static void analyzeSfntFamilyName( void* pTTFont, std::list< OUString >& rnames ); // actually a TrueTypeFont* from font subsetting code + bool analyzeSfntFile(PrintFont* pFont) const; // finds the font id for the nFaceIndex face in this font file - // There may be multiple font ids for TrueType collections + // There may be multiple font ids for font collections fontID findFontFileID( int nDirID, const OString& rFile, int nFaceIndex ) const; - // There may be multiple font ids for TrueType collections + // There may be multiple font ids for font collections std::vector<fontID> findFontFileIDs( int nDirID, const OString& rFile ) const; static FontFamily matchFamilyName( const OUString& rFamily ); @@ -293,7 +271,7 @@ class VCL_PLUGIN_PUBLIC PrintFontManager public: static PrintFontManager& get(); // one instance only - // There may be multiple font ids for TrueType collections + // There may be multiple font ids for font collections std::vector<fontID> addFontFile( const OString& rFileName ); void initialize(); @@ -311,13 +289,6 @@ public: // get a specific fonts PSName name const OUString& getPSName( 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 { @@ -363,7 +334,7 @@ public: // the user is responsible to allocate pArray large enough bool getMetrics( fontID nFontID, const sal_Unicode* pString, int nLen, CharacterMetric* pArray ) const; - // creates a new font subset of an existing TrueType font + // creates a new font subset of an existing SFNT font // returns true in case of success, else false // nFont: the font to be subsetted // rOutFile: the file to put the new subset into; diff --git a/vcl/unx/generic/fontmanager/fontcache.cxx b/vcl/unx/generic/fontmanager/fontcache.cxx index 5c6df51..7407efb 100644 --- a/vcl/unx/generic/fontmanager/fontcache.cxx +++ b/vcl/unx/generic/fontmanager/fontcache.cxx @@ -37,7 +37,7 @@ #include <cstdio> #endif -#define CACHE_MAGIC "LibreOffice PspFontCacheFile format 7" +#define CACHE_MAGIC "LibreOffice PspFontCacheFile format 8" using namespace std; using namespace psp; @@ -133,9 +133,7 @@ void FontCache::flush() aStream.WriteLine(aLine.makeStringAndClear()); int nEntrySize = entry_it->second.m_aEntry.size(); - // write: type;nfonts - aLine.append(static_cast<sal_Int32>(rEntry.front()->m_eType)); - aLine.append(';'); + // write: nfonts aLine.append(static_cast<sal_Int32>(nEntrySize)); aStream.WriteLine(aLine.makeStringAndClear()); @@ -148,7 +146,7 @@ void FontCache::flush() * fontnr;PSName;italic;weight;width;pitch;encoding;ascend;descend;leading;vsubst;gxw;gxh;gyw;gyh;useroverride;embed;antialias[;{metricfile,typeflags}][;stylename] */ if( nEntrySize > 1 ) - nSubEntry = static_cast<const PrintFontManager::TrueTypeFontFile*>(*it)->m_nCollectionEntry; + nSubEntry = (*it)->m_nCollectionEntry; else nSubEntry = 0; @@ -200,15 +198,8 @@ void FontCache::flush() aLine.append(static_cast<sal_Int32>(0)); aLine.append(';'); aLine.append(static_cast<sal_Int32>(0)); - - switch( (*it)->m_eType ) - { - case fonttype::TrueType: - aLine.append(';'); - aLine.append(static_cast<sal_Int32>(static_cast<const PrintFontManager::TrueTypeFontFile*>(*it)->m_nTypeFlags)); - break; - default: break; - } + aLine.append(';'); + aLine.append(static_cast<sal_Int32>((*it)->m_nTypeFlags)); if( !(*it)->m_aStyleName.isEmpty() ) { aLine.append(';'); @@ -308,15 +299,6 @@ void FontCache::read() const char* pLine = aLine.getStr(); - fonttype::type eType = (fonttype::type)atoi( pLine ); - if( eType != fonttype::TrueType ) - continue; - while( *pLine && *pLine != ';' ) - pLine++; - if( *pLine != ';' ) - continue; - - pLine++; sal_Int32 nFonts = atoi( pLine ); for( int n = 0; n < nFonts; n++ ) { @@ -324,14 +306,7 @@ void FontCache::read() pLine = aLine.getStr(); int nLen = aLine.getLength(); - PrintFontManager::PrintFont* pFont = nullptr; - switch( eType ) - { - case fonttype::TrueType: - pFont = new PrintFontManager::TrueTypeFontFile(); - break; - default: break; - } + PrintFontManager::PrintFont* pFont = new PrintFontManager::PrintFont(); sal_Int32 nIndex; @@ -397,18 +372,11 @@ void FontCache::read() pFont->m_bUserOverride = (atoi( pLine + nTokenPos[15] ) != 0); int nStyleTokenNr = 18; - switch( eType ) - { - case fonttype::TrueType: - static_cast<PrintFontManager::TrueTypeFontFile*>(pFont)->m_nTypeFlags = atoi( pLine + nTokenPos[18] ); - static_cast<PrintFontManager::TrueTypeFontFile*>(pFont)->m_nCollectionEntry = nCollEntry; - static_cast<PrintFontManager::TrueTypeFontFile*>(pFont)->m_nDirectory = nDir; - static_cast<PrintFontManager::TrueTypeFontFile*>(pFont)->m_aFontFile = aFile; - nStyleTokenNr++; - break; - break; - default: break; - } + pFont->m_nTypeFlags = atoi( pLine + nTokenPos[18] ); + pFont->m_nCollectionEntry = nCollEntry; + pFont->m_nDirectory = nDir; + pFont->m_aFontFile = aFile; + nStyleTokenNr++; if( nTokens > nStyleTokenNr ) pFont->m_aStyleName = OUString::intern( pLine + nTokenPos[nStyleTokenNr], nLen - nTokenPos[nStyleTokenNr], @@ -459,18 +427,10 @@ void FontCache::read() */ void FontCache::copyPrintFont( const PrintFontManager::PrintFont* pFrom, PrintFontManager::PrintFont* pTo ) { - if( pFrom->m_eType != pTo->m_eType ) - return; - switch( pFrom->m_eType ) - { - case fonttype::TrueType: - static_cast<PrintFontManager::TrueTypeFontFile*>(pTo)->m_nDirectory = static_cast<const PrintFontManager::TrueTypeFontFile*>(pFrom)->m_nDirectory; - static_cast<PrintFontManager::TrueTypeFontFile*>(pTo)->m_aFontFile = static_cast<const PrintFontManager::TrueTypeFontFile*>(pFrom)->m_aFontFile; - static_cast<PrintFontManager::TrueTypeFontFile*>(pTo)->m_nCollectionEntry = static_cast<const PrintFontManager::TrueTypeFontFile*>(pFrom)->m_nCollectionEntry; - static_cast<PrintFontManager::TrueTypeFontFile*>(pTo)->m_nTypeFlags = static_cast<const PrintFontManager::TrueTypeFontFile*>(pFrom)->m_nTypeFlags; - break; - default: break; - } + pTo->m_nDirectory = pFrom->m_nDirectory; + pTo->m_aFontFile = pFrom->m_aFontFile; + pTo->m_nCollectionEntry = pFrom->m_nCollectionEntry; + pTo->m_nTypeFlags = pFrom->m_nTypeFlags; pTo->m_nFamilyName = pFrom->m_nFamilyName; pTo->m_aStyleName = pFrom->m_aStyleName; pTo->m_aAliases = pFrom->m_aAliases; @@ -498,24 +458,11 @@ void FontCache::copyPrintFont( const PrintFontManager::PrintFont* pFrom, PrintFo */ bool FontCache::equalsPrintFont( const PrintFontManager::PrintFont* pLeft, PrintFontManager::PrintFont* pRight ) { - if( pLeft->m_eType != pRight->m_eType ) - return false; - switch( pLeft->m_eType ) - { - case fonttype::TrueType: - { - const PrintFontManager::TrueTypeFontFile* pLT = static_cast<const PrintFontManager::TrueTypeFontFile*>(pLeft); - const PrintFontManager::TrueTypeFontFile* pRT = static_cast<const PrintFontManager::TrueTypeFontFile*>(pRight); - if( pRT->m_nDirectory != pLT->m_nDirectory || - pRT->m_aFontFile != pLT->m_aFontFile || - pRT->m_nCollectionEntry != pLT->m_nCollectionEntry || - pRT->m_nTypeFlags != pLT->m_nTypeFlags ) - return false; - } - break; - default: break; - } - if( pRight->m_nFamilyName != pLeft->m_nFamilyName || + if (pRight->m_nDirectory != pLeft->m_nDirectory || + pRight->m_aFontFile != pLeft->m_aFontFile || + pRight->m_nCollectionEntry != pLeft->m_nCollectionEntry || + pRight->m_nTypeFlags != pLeft->m_nTypeFlags || + pRight->m_nFamilyName != pLeft->m_nFamilyName || pRight->m_aStyleName != pLeft->m_aStyleName || pRight->m_nPSName != pLeft->m_nPSName || pRight->m_eItalic != pLeft->m_eItalic || @@ -549,18 +496,8 @@ bool FontCache::equalsPrintFont( const PrintFontManager::PrintFont* pLeft, Print */ PrintFontManager::PrintFont* FontCache::clonePrintFont( const PrintFontManager::PrintFont* pOldFont ) { - PrintFontManager::PrintFont* pFont = nullptr; - switch( pOldFont->m_eType ) - { - case fonttype::TrueType: - pFont = new PrintFontManager::TrueTypeFontFile(); - break; - default: break; - } - if( pFont ) - { - copyPrintFont( pOldFont, pFont ); - } + PrintFontManager::PrintFont* pFont = new PrintFontManager::PrintFont(); + copyPrintFont( pOldFont, pFont ); return pFont; } @@ -595,15 +532,8 @@ void FontCache::updateFontCacheEntry( const PrintFontManager::PrintFont* pFont, { OString aFile; int nDirID = 0; - switch( pFont->m_eType ) - { - case fonttype::TrueType: - nDirID = static_cast<const PrintFontManager::TrueTypeFontFile*>(pFont)->m_nDirectory; - aFile = static_cast<const PrintFontManager::TrueTypeFontFile*>(pFont)->m_aFontFile; - break; - default: - return; - } + nDirID = pFont->m_nDirectory; + aFile = pFont->m_aFontFile; FontCacheData::const_iterator dir = m_aCache.find( nDirID ); FontDirMap::const_iterator entry; std::list< PrintFontManager::PrintFont* >::const_iterator font; @@ -616,10 +546,7 @@ void FontCache::updateFontCacheEntry( const PrintFontManager::PrintFont* pFont, { for( font = entry->second.m_aEntry.begin(); font != entry->second.m_aEntry.end(); ++font ) { - if( (*font)->m_eType == pFont->m_eType && - ( (*font)->m_eType != fonttype::TrueType || - static_cast<const PrintFontManager::TrueTypeFontFile*>(*font)->m_nCollectionEntry == static_cast<const PrintFontManager::TrueTypeFontFile*>(pFont)->m_nCollectionEntry - ) ) + if ((*font)->m_nCollectionEntry == pFont->m_nCollectionEntry) break; } if( font != entry->second.m_aEntry.end() ) diff --git a/vcl/unx/generic/fontmanager/fontconfig.cxx b/vcl/unx/generic/fontmanager/fontconfig.cxx index ea01866..538bdba 100644 --- a/vcl/unx/generic/fontmanager/fontconfig.cxx +++ b/vcl/unx/generic/fontmanager/fontconfig.cxx @@ -593,8 +593,7 @@ void PrintFontManager::countFontconfigFonts( std::unordered_map<OString, int, OS { for( std::list< PrintFont* >::iterator it = aFonts.begin(); it != aFonts.end(); ++it ) { - if( (*it)->m_eType == fonttype::TrueType && - static_cast<TrueTypeFontFile*>(*it)->m_nCollectionEntry == nCollectionEntry ) + if( (*it)->m_nCollectionEntry == nCollectionEntry ) { pUpdate = *it; break; @@ -604,8 +603,7 @@ void PrintFontManager::countFontconfigFonts( std::unordered_map<OString, int, OS // additional entries will be created in the cache // if this is a new index (that is if the loop above // ran to the end of the list) - if( pUpdate->m_eType == fonttype::TrueType ) // sanity check, this should always be the case here - static_cast<TrueTypeFontFile*>(pUpdate)->m_nCollectionEntry = nCollectionEntry; + pUpdate->m_nCollectionEntry = nCollectionEntry; } else { diff --git a/vcl/unx/generic/fontmanager/fontmanager.cxx b/vcl/unx/generic/fontmanager/fontmanager.cxx index 152c01b..dbd816e 100644 --- a/vcl/unx/generic/fontmanager/fontmanager.cxx +++ b/vcl/unx/generic/fontmanager/fontmanager.cxx @@ -94,25 +94,27 @@ inline sal_uInt16 getUInt16BE( const sal_uInt8*& pBuffer ) /* * PrintFont implementations */ -PrintFontManager::PrintFont::PrintFont( fonttype::type eType ) : - m_eType( eType ), - m_nFamilyName( 0 ), - m_nPSName( 0 ), - m_eItalic( ITALIC_DONTKNOW ), - m_eWidth( WIDTH_DONTKNOW ), - m_eWeight( WEIGHT_DONTKNOW ), - m_ePitch( PITCH_DONTKNOW ), - m_aEncoding( RTL_TEXTENCODING_DONTKNOW ), - m_pMetrics( nullptr ), - m_nAscend( 0 ), - m_nDescend( 0 ), - m_nLeading( 0 ), - m_nXMin( 0 ), - m_nYMin( 0 ), - m_nXMax( 0 ), - m_nYMax( 0 ), - m_bHaveVerticalSubstitutedGlyphs( false ), - m_bUserOverride( false ) +PrintFontManager::PrintFont::PrintFont() +: m_nFamilyName(0) +, m_nPSName(0) +, m_eItalic(ITALIC_DONTKNOW) +, m_eWidth(WIDTH_DONTKNOW) +, m_eWeight(WEIGHT_DONTKNOW) +, m_ePitch(PITCH_DONTKNOW) +, m_aEncoding(RTL_TEXTENCODING_DONTKNOW) +, m_pMetrics(nullptr) +, m_nAscend(0) +, m_nDescend(0) +, m_nLeading(0) +, m_nXMin(0) +, m_nYMin(0) +, m_nXMax(0) +, m_nYMax(0) +, m_bHaveVerticalSubstitutedGlyphs(false) +, m_bUserOverride( false ) +, m_nDirectory(0) +, m_nCollectionEntry(0) +, m_nTypeFlags(TYPEFLAG_INVALID) { } @@ -121,18 +123,7 @@ PrintFontManager::PrintFont::~PrintFont() delete m_pMetrics; } -PrintFontManager::TrueTypeFontFile::TrueTypeFontFile() -: PrintFont( fonttype::TrueType ) -, m_nDirectory( 0 ) -, m_nCollectionEntry( 0 ) -, m_nTypeFlags( TYPEFLAG_INVALID ) -{} - -PrintFontManager::TrueTypeFontFile::~TrueTypeFontFile() -{ -} - -bool PrintFontManager::TrueTypeFontFile::queryMetricPage( int nPage, MultiAtomProvider* /*pProvider*/ ) +bool PrintFontManager::PrintFont::queryMetricPage( int nPage, MultiAtomProvider* /*pProvider*/ ) { bool bSuccess = false; @@ -365,11 +356,11 @@ bool PrintFontManager::analyzeFontFile( int nDirID, const OString& rFontFile, :: for( int i = 0; i < nLength; i++ ) { - TrueTypeFontFile* pFont = new TrueTypeFontFile(); + PrintFont* pFont = new PrintFont(); pFont->m_nDirectory = nDirID; pFont->m_aFontFile = rFontFile; pFont->m_nCollectionEntry = i; - if( ! analyzeTrueTypeFile( pFont ) ) + if (!analyzeSfntFile(pFont)) { delete pFont; pFont = nullptr; @@ -380,13 +371,13 @@ bool PrintFontManager::analyzeFontFile( int nDirID, const OString& rFontFile, :: } else { - TrueTypeFontFile* pFont = new TrueTypeFontFile(); + PrintFont* pFont = new PrintFont(); pFont->m_nDirectory = nDirID; pFont->m_aFontFile = rFontFile; pFont->m_nCollectionEntry = 0; // need to read the font anyway to get aliases inside the font file - if( ! analyzeTrueTypeFile( pFont ) ) + if (!analyzeSfntFile(pFont)) { delete pFont; pFont = nullptr; @@ -411,19 +402,10 @@ fontID PrintFontManager::findFontFileID( int nDirID, const OString& rFontFile, i std::unordered_map< fontID, PrintFont* >::const_iterator it = m_aFonts.find( *font_it ); if( it == m_aFonts.end() ) continue; - switch( it->second->m_eType ) - { - case fonttype::TrueType: - { - TrueTypeFontFile* const pFont = static_cast< TrueTypeFontFile* const >((*it).second); - if( pFont->m_nDirectory == nDirID && - pFont->m_aFontFile == rFontFile && pFont->m_nCollectionEntry == nFaceIndex ) - nID = it->first; - } - break; - default: - break; - } + PrintFont* const pFont = (*it).second; + if (pFont->m_nDirectory == nDirID && + pFont->m_aFontFile == rFontFile && pFont->m_nCollectionEntry == nFaceIndex) + nID = it->first; } return nID; @@ -442,25 +424,16 @@ std::vector<fontID> PrintFontManager::findFontFileIDs( int nDirID, const OString std::unordered_map< fontID, PrintFont* >::const_iterator it = m_aFonts.find( *font_it ); if( it == m_aFonts.end() ) continue; - switch( it->second->m_eType ) - { - case fonttype::TrueType: - { - TrueTypeFontFile* const pFont = static_cast< TrueTypeFontFile* const >((*it).second); - if( pFont->m_nDirectory == nDirID && - pFont->m_aFontFile == rFontFile ) - aIds.push_back(it->first); - } - break; - default: - break; - } + PrintFont* const pFont = (*it).second; + if (pFont->m_nDirectory == nDirID && + pFont->m_aFontFile == rFontFile) + aIds.push_back(it->first); } return aIds; } -OUString PrintFontManager::convertTrueTypeName( void* pRecord ) +OUString PrintFontManager::convertSfntName( void* pRecord ) { NameRecord* pNameRecord = static_cast<NameRecord*>(pRecord); OUString aValue; @@ -605,7 +578,7 @@ namespace } } -void PrintFontManager::analyzeTrueTypeFamilyName( void* pTTFont, ::std::list< OUString >& rNames ) +void PrintFontManager::analyzeSfntFamilyName( void* pTTFont, ::std::list< OUString >& rNames ) { OUString aFamily; @@ -650,7 +623,7 @@ void PrintFontManager::analyzeTrueTypeFamilyName( void* pTTFont, ::std::list< OU else nMatch = 1000; } - OUString aName = convertTrueTypeName( pNameRecords + i ); + OUString aName = convertSfntName( pNameRecords + i ); aSet.insert( aName ); if (aName.isEmpty()) continue; @@ -672,21 +645,20 @@ void PrintFontManager::analyzeTrueTypeFamilyName( void* pTTFont, ::std::list< OU return; } -bool PrintFontManager::analyzeTrueTypeFile( PrintFont* pFont ) const +bool PrintFontManager::analyzeSfntFile( PrintFont* pFont ) const { bool bSuccess = false; rtl_TextEncoding aEncoding = osl_getThreadTextEncoding(); OString aFile = getFontFile( pFont ); TrueTypeFont* pTTFont = nullptr; - TrueTypeFontFile* pTTFontFile = static_cast< TrueTypeFontFile* >(pFont); - if( OpenTTFontFile( aFile.getStr(), pTTFontFile->m_nCollectionEntry, &pTTFont ) == SF_OK ) + if( OpenTTFontFile( aFile.getStr(), pFont->m_nCollectionEntry, &pTTFont ) == SF_OK ) { TTGlobalFontInfo aInfo; GetTTGlobalFontInfo( pTTFont, & aInfo ); ::std::list< OUString > aNames; - analyzeTrueTypeFamilyName( pTTFont, aNames ); + analyzeSfntFamilyName( pTTFont, aNames ); // set family name from XLFD if possible if( ! pFont->m_nFamilyName ) @@ -702,11 +674,11 @@ bool PrintFontManager::analyzeTrueTypeFile( PrintFont* pFont ) const // poor font does not have a family name // name it to file name minus the extension - dotIndex = pTTFontFile->m_aFontFile.lastIndexOf( '.' ); + dotIndex = pFont->m_aFontFile.lastIndexOf( '.' ); if ( dotIndex == -1 ) - dotIndex = pTTFontFile->m_aFontFile.getLength(); + dotIndex = pFont->m_aFontFile.getLength(); - pFont->m_nFamilyName = m_pAtoms->getAtom( ATOM_FAMILYNAME, OStringToOUString( pTTFontFile->m_aFontFile.copy( 0, dotIndex ), aEncoding ) ); + pFont->m_nFamilyName = m_pAtoms->getAtom( ATOM_FAMILYNAME, OStringToOUString( pFont->m_aFontFile.copy( 0, dotIndex ), aEncoding ) ); } } for( ::std::list< OUString >::iterator it = aNames.begin(); it != aNames.end(); ++it ) @@ -814,7 +786,7 @@ bool PrintFontManager::analyzeTrueTypeFile( PrintFont* pFont ) const pFont->m_nYMax = aInfo.yMax; // get type flags - pTTFontFile->m_nTypeFlags = (unsigned int)aInfo.typeFlags; + pFont->m_nTypeFlags = (unsigned int)aInfo.typeFlags; // get vertical substitutions flag pFont->m_bHaveVerticalSubstitutedGlyphs = DoesVerticalSubstitution( pTTFont, 1 ); @@ -941,15 +913,10 @@ void PrintFontManager::initialize() { fontID aFont = m_nNextFontID++; m_aFonts[ aFont ] = *it; - if( (*it)->m_eType == fonttype::TrueType ) - m_aFontFileToFontID[ static_cast<TrueTypeFontFile*>(*it)->m_aFontFile ].insert( aFont ); -#if OSL_DEBUG_LEVEL > 1 - else - fprintf(stderr, "Un-cached type '%d'\n", (*it)->m_eType); + m_aFontFileToFontID[(*it)->m_aFontFile].insert(aFont); #if OSL_DEBUG_LEVEL > 2 fprintf( stderr, "adding cached font %d: %s\n", aFont, getFontFileSysPath( aFont ).getStr() ); #endif -#endif } if( ! m_pFontCache->scanAdditionalFiles( aPath ) ) continue; @@ -1004,7 +971,6 @@ void PrintFontManager::fillPrintFontInfo( PrintFont* pFont, FastPrintFontInfo& r { std::unordered_map< int, FontFamily >::const_iterator style_it = m_aFamilyTypes.find( pFont->m_nFamilyName ); - rInfo.m_eType = pFont->m_eType; rInfo.m_aFamilyName = m_pAtoms->getString( ATOM_FAMILYNAME, pFont->m_nFamilyName ); rInfo.m_aStyleName = pFont->m_aStyleName; rInfo.m_eFamilyStyle = style_it != m_aFamilyTypes.end() ? style_it->second : FAMILY_DONTKNOW; @@ -1014,7 +980,7 @@ void PrintFontManager::fillPrintFontInfo( PrintFont* pFont, FastPrintFontInfo& r rInfo.m_ePitch = pFont->m_ePitch; rInfo.m_aEncoding = pFont->m_aEncoding; - rInfo.m_bSubsettable = (pFont->m_eType == fonttype::TrueType); // TODO: rename to SfntType + rInfo.m_bSubsettable = true; rInfo.m_aAliases.clear(); for( int i : pFont->m_aAliases ) @@ -1027,9 +993,7 @@ void PrintFontManager::fillPrintFontInfo( PrintFont* pFont, PrintFontInfo& rInfo ! pFont->m_pMetrics || pFont->m_pMetrics->isEmpty() ) { - // might be a truetype font not analyzed - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); + analyzeSfntFile(pFont); } fillPrintFontInfo( pFont, static_cast< FastPrintFontInfo& >( rInfo ) ); @@ -1069,8 +1033,7 @@ void PrintFontManager::getFontBoundingBox( fontID nFontID, int& xMin, int& yMin, { if( pFont->m_nXMin == 0 && pFont->m_nYMin == 0 && pFont->m_nXMax == 0 && pFont->m_nYMax == 0 ) { - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); + analyzeSfntFile(pFont); } xMin = pFont->m_nXMin; yMin = pFont->m_nYMin; @@ -1083,8 +1046,7 @@ int PrintFontManager::getFontFaceNumber( fontID nFontID ) const { int nRet = 0; PrintFont* pFont = getFont( nFontID ); - if( pFont && pFont->m_eType == fonttype::TrueType ) - nRet = static_cast< TrueTypeFontFile* >(pFont)->m_nCollectionEntry; + nRet = pFont->m_nCollectionEntry; if (nRet < 0) nRet = 0; return nRet; @@ -1159,13 +1121,12 @@ OString PrintFontManager::getFontFile( PrintFont* pFont ) const { OString aPath; - if( pFont && pFont->m_eType == fonttype::TrueType ) + if (pFont) { - TrueTypeFontFile* pTTFont = static_cast< TrueTypeFontFile* >(pFont); - std::unordered_map< int, OString >::const_iterator it = m_aAtomToDir.find( pTTFont->m_nDirectory ); + std::unordered_map< int, OString >::const_iterator it = m_aAtomToDir.find(pFont->m_nDirectory); aPath = it->second; aPath += "/"; - aPath += pTTFont->m_aFontFile; + aPath += pFont->m_aFontFile; } return aPath; } @@ -1175,8 +1136,7 @@ const OUString& PrintFontManager::getPSName( fontID nFontID ) const PrintFont* pFont = getFont( nFontID ); if( pFont && pFont->m_nPSName == 0 ) { - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); + analyzeSfntFile(pFont); } return m_pAtoms->getString( ATOM_PSNAME, pFont ? pFont->m_nPSName : INVALID_ATOM ); @@ -1187,9 +1147,7 @@ int PrintFontManager::getFontAscend( fontID nFontID ) const PrintFont* pFont = getFont( nFontID ); if (pFont && pFont->m_nAscend == 0 && pFont->m_nDescend == 0) { - // might be a truetype font not yet analyzed - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); + analyzeSfntFile(pFont); } return pFont ? pFont->m_nAscend : 0; } @@ -1199,9 +1157,7 @@ int PrintFontManager::getFontDescend( fontID nFontID ) const PrintFont* pFont = getFont( nFontID ); if (pFont && pFont->m_nAscend == 0 && pFont->m_nDescend == 0) { - // might be a truetype font not yet analyzed - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); + analyzeSfntFile(pFont); } return pFont ? pFont->m_nDescend : 0; } @@ -1216,9 +1172,7 @@ bool PrintFontManager::getMetrics( fontID nFontID, const sal_Unicode* pString, i || ! pFont->m_pMetrics || pFont->m_pMetrics->isEmpty() ) { - // might be a font not yet analyzed - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); + analyzeSfntFile(pFont); } for( int i = 0; i < nLen; i++ ) @@ -1256,14 +1210,7 @@ bool PrintFontManager::createFontSubset( if( !pFont ) return false; - switch( pFont->m_eType ) - { - case psp::fonttype::TrueType: rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; break; - default: - return false; - } - if( pFont->m_eType != fonttype::TrueType ) - return false; + rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; // reshuffle array of requested glyphs to make sure glyph0==notdef sal_uInt8 pEnc[256]; @@ -1299,8 +1246,7 @@ bool PrintFontManager::createFontSubset( const OString aFromFile = getFontFile( pFont ); TrueTypeFont* pTTFont = nullptr; // TODO: rename to SfntFont - TrueTypeFontFile* pTTFontFile = static_cast< TrueTypeFontFile* >(pFont); - if( OpenTTFontFile( aFromFile.getStr(), pTTFontFile->m_nCollectionEntry, &pTTFont ) != SF_OK ) + if( OpenTTFontFile( aFromFile.getStr(), pFont->m_nCollectionEntry, &pTTFont ) != SF_OK ) return false; // prepare system name for write access for subset file target @@ -1398,65 +1344,61 @@ void PrintFontManager::getGlyphWidths( fontID nFont, std::map< sal_Unicode, sal_uInt32 >& rUnicodeEnc ) { PrintFont* pFont = getFont( nFont ); - if( !pFont || pFont->m_eType != fonttype::TrueType ) + if (!pFont) return; - if( pFont->m_eType == fonttype::TrueType ) + TrueTypeFont* pTTFont = nullptr; + OString aFromFile = getFontFile( pFont ); + if( OpenTTFontFile( aFromFile.getStr(), pFont->m_nCollectionEntry, &pTTFont ) != SF_OK ) + return; + int nGlyphs = GetTTGlyphCount(pTTFont); + if (nGlyphs > 0) { - TrueTypeFont* pTTFont = nullptr; - TrueTypeFontFile* pTTFontFile = static_cast< TrueTypeFontFile* >(pFont); - OString aFromFile = getFontFile( pFont ); - if( OpenTTFontFile( aFromFile.getStr(), pTTFontFile->m_nCollectionEntry, &pTTFont ) != SF_OK ) - return; - int nGlyphs = GetTTGlyphCount( pTTFont ); - if( nGlyphs > 0 ) + rWidths.resize(nGlyphs); + std::vector<sal_uInt16> aGlyphIds(nGlyphs); + for (int i = 0; i < nGlyphs; i++) + aGlyphIds[i] = sal_uInt16(i); + TTSimpleGlyphMetrics* pMetrics = GetTTSimpleGlyphMetrics(pTTFont, + &aGlyphIds[0], + nGlyphs, + bVertical); + if (pMetrics) { - rWidths.resize(nGlyphs); - std::vector<sal_uInt16> aGlyphIds(nGlyphs); - for( int i = 0; i < nGlyphs; i++ ) - aGlyphIds[i] = sal_uInt16(i); - TTSimpleGlyphMetrics* pMetrics = GetTTSimpleGlyphMetrics( pTTFont, - &aGlyphIds[0], - nGlyphs, - bVertical ); - if( pMetrics ) - { - for( int i = 0; i< nGlyphs; i++ ) - rWidths[i] = pMetrics[i].adv; - free( pMetrics ); - rUnicodeEnc.clear(); - } + for (int i = 0; i< nGlyphs; i++) + rWidths[i] = pMetrics[i].adv; + free(pMetrics); + rUnicodeEnc.clear(); + } - // fill the unicode map - // TODO: isn't this map already available elsewhere in the fontmanager? - const sal_uInt8* pCmapData = nullptr; - int nCmapSize = 0; - if( GetSfntTable( pTTFont, O_cmap, &pCmapData, &nCmapSize ) ) + // fill the unicode map + // TODO: isn't this map already available elsewhere in the fontmanager? + const sal_uInt8* pCmapData = nullptr; + int nCmapSize = 0; + if (GetSfntTable(pTTFont, O_cmap, &pCmapData, &nCmapSize)) + { + CmapResult aCmapResult; + if (ParseCMAP(pCmapData, nCmapSize, aCmapResult)) { - CmapResult aCmapResult; - if( ParseCMAP( pCmapData, nCmapSize, aCmapResult ) ) + FontCharMapRef xFontCharMap(new FontCharMap(aCmapResult)); + for (sal_uInt32 cOld = 0;;) { - FontCharMapRef xFontCharMap( new FontCharMap(aCmapResult) ); - for( sal_uInt32 cOld = 0;;) - { - // get next unicode covered by font - const sal_uInt32 c = xFontCharMap->GetNextChar( cOld ); - if( c == cOld ) - break; - cOld = c; + // get next unicode covered by font + const sal_uInt32 c = xFontCharMap->GetNextChar(cOld); + if (c == cOld) + break; + cOld = c; #if 1 // TODO: remove when sal_Unicode covers all of unicode - if( c > (sal_Unicode)~0 ) - break; + if (c > (sal_Unicode)~0) + break; #endif - // get the matching glyph index - const sal_GlyphId aGlyphId = xFontCharMap->GetGlyphIndex( c ); - // update the requested map - rUnicodeEnc[ (sal_Unicode)c ] = aGlyphId; - } + // get the matching glyph index + const sal_GlyphId aGlyphId = xFontCharMap->GetGlyphIndex(c); + // update the requested map + rUnicodeEnc[(sal_Unicode)c] = aGlyphId; } } } - CloseTTFont( pTTFont ); } + CloseTTFont(pTTFont); } /// used by online unit tests via dlopen. diff --git a/vcl/unx/generic/print/genpspgraphics.cxx b/vcl/unx/generic/print/genpspgraphics.cxx index a0f1314..7bedffe 100644 --- a/vcl/unx/generic/print/genpspgraphics.cxx +++ b/vcl/unx/generic/print/genpspgraphics.cxx @@ -914,18 +914,8 @@ FontAttributes GenPspGraphics::Info2FontAttributes( const psp::FastPrintFontInfo aDFA.SetSymbolFlag( (rInfo.m_aEncoding == RTL_TEXTENCODING_SYMBOL) ); aDFA.SetSubsettableFlag( rInfo.m_bSubsettable ); aDFA.SetEmbeddableFlag(false); - - switch( rInfo.m_eType ) - { - case psp::fonttype::TrueType: - aDFA.SetQuality( 512 ); - aDFA.SetBuiltInFontFlag( false ); - break; - default: - aDFA.SetQuality( 0 ); - aDFA.SetBuiltInFontFlag( false ); - break; - } + aDFA.SetQuality(512); + aDFA.SetBuiltInFontFlag(false); aDFA.SetOrientationFlag( true ); @@ -970,28 +960,24 @@ void GenPspGraphics::AnnounceFonts( PhysicalFontCollection* pFontCollection, con { int nQuality = 0; - if( aInfo.m_eType == psp::fonttype::TrueType ) + psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); + OString aFileName( rMgr.getFontFileSysPath( aInfo.m_nID ) ); + int nPos = aFileName.lastIndexOf( '_' ); + if( nPos == -1 || aFileName[nPos+1] == '.' ) + nQuality += 5; + else { - // asian type 1 fonts are not known - psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); - OString aFileName( rMgr.getFontFileSysPath( aInfo.m_nID ) ); - int nPos = aFileName.lastIndexOf( '_' ); - if( nPos == -1 || aFileName[nPos+1] == '.' ) - nQuality += 5; - else + static const char* pLangBoost = nullptr; + static bool bOnce = true; + if( bOnce ) { - static const char* pLangBoost = nullptr; - static bool bOnce = true; - if( bOnce ) - { - bOnce = false; - pLangBoost = vcl::getLangBoost(); - } - - if( pLangBoost ) - if( aFileName.copy( nPos+1, 3 ).equalsIgnoreAsciiCase( pLangBoost ) ) - nQuality += 10; + bOnce = false; + pLangBoost = vcl::getLangBoost(); } + + if( pLangBoost ) + if( aFileName.copy( nPos+1, 3 ).equalsIgnoreAsciiCase( pLangBoost ) ) + nQuality += 10; } ImplPspFontData* pFD = new ImplPspFontData( aInfo ); @@ -1127,15 +1113,7 @@ const void* GenPspGraphics::DoGetEmbedFontData( psp::fontID aFont, const sal_Ucs for (size_t i = 0; i < nLen; ++i) pWidths[i] = (aMetrics[i].width > 0 ? aMetrics[i].width : 0); - switch( aFontInfo.m_eType ) - { - case psp::fonttype::TrueType: - rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; - break; - default: - DoFreeEmbedFontData( pFile, *pDataLen ); - return nullptr; - } + rInfo.m_nFontType = FontSubsetInfo::SFNT_TTF; return pFile; } diff --git a/vcl/unx/generic/print/glyphset.cxx b/vcl/unx/generic/print/glyphset.cxx index 58b640a..7d8ee2e 100644 --- a/vcl/unx/generic/print/glyphset.cxx +++ b/vcl/unx/generic/print/glyphset.cxx @@ -49,7 +49,6 @@ GlyphSet::GlyphSet (sal_Int32 nFontID, bool bVertical) mbVertical (bVertical) { PrintFontManager &rMgr = PrintFontManager::get(); - meBaseType = rMgr.getFontType (mnFontID); maBaseName = OUStringToOString (rMgr.getPSName(mnFontID), RTL_TEXTENCODING_ASCII_US); mnBaseEncoding = rMgr.getFontEncoding(mnFontID); @@ -181,20 +180,13 @@ GlyphSet::AddGlyphID ( OString GlyphSet::GetGlyphSetName (sal_Int32 nGlyphSetID) { - if (meBaseType == fonttype::TrueType) - { - OStringBuffer aSetName( maBaseName.getLength() + 32 ); - aSetName.append( maBaseName ); - aSetName.append( "FID" ); - aSetName.append( mnFontID ); - aSetName.append( mbVertical ? "VGSet" : "HGSet" ); - aSetName.append( nGlyphSetID ); - return aSetName.makeStringAndClear(); - } - else - { - return maBaseName; - } + OStringBuffer aSetName( maBaseName.getLength() + 32 ); + aSetName.append( maBaseName ); + aSetName.append( "FID" ); + aSetName.append( mnFontID ); + aSetName.append( mbVertical ? "VGSet" : "HGSet" ); + aSetName.append( nGlyphSetID ); + return aSetName.makeStringAndClear(); } OString @@ -341,10 +333,6 @@ static void CreatePSUploadableFont( TrueTypeFont* pSrcFont, FILE* pTmpFile, void GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAllowType42, std::list< OString >& rSuppliedFonts ) { - // only for truetype fonts - if (meBaseType != fonttype::TrueType) - return; - TrueTypeFont *pTTFont; OString aTTFileName (rGfx.GetFontMgr().getFontFileSysPath(mnFontID)); int nFace = rGfx.GetFontMgr().getFontFaceNumber(mnFontID); diff --git a/vcl/unx/generic/print/glyphset.hxx b/vcl/unx/generic/print/glyphset.hxx index 7b0eba9..92c6756 100644 --- a/vcl/unx/generic/print/glyphset.hxx +++ b/vcl/unx/generic/print/glyphset.hxx @@ -43,7 +43,6 @@ private: sal_Int32 mnFontID; bool mbVertical; OString maBaseName; - fonttype::type meBaseType; rtl_TextEncoding mnBaseEncoding; typedef std::unordered_map< sal_Unicode, sal_uInt8 > char_map_t; @@ -71,7 +70,6 @@ public: ~GlyphSet (); sal_Int32 GetFontID () { return mnFontID;} - fonttype::type GetFontType () { return meBaseType;} static OString GetReencodedFontName (rtl_TextEncoding nEnc, const OString &rFontName); diff --git a/vcl/unx/generic/print/text_gfx.cxx b/vcl/unx/generic/print/text_gfx.cxx index eda0f17..bff561a 100644 --- a/vcl/unx/generic/print/text_gfx.cxx +++ b/vcl/unx/generic/print/text_gfx.cxx @@ -232,10 +232,7 @@ PrinterGfx::writeResources( osl::File* pFile, std::list< OString >& rSuppliedFon std::list< GlyphSet >::iterator aIter; for (aIter = maPS3Font.begin(); aIter != maPS3Font.end(); ++aIter) { - if (aIter->GetFontType() == fonttype::TrueType) - { - aIter->PSUploadFont (*pFile, *this, mbUploadPS42Fonts, rSuppliedFonts ); - } + aIter->PSUploadFont (*pFile, *this, mbUploadPS42Fonts, rSuppliedFonts ); } } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 1c3526bfc07cd13636bfb84f5ad45a058ec74415 Author: Khaled Hosny <khaledho...@eglug.org> Date: Thu Nov 24 09:54:48 2016 +0200 Dead code Change-Id: I24d365f8231431a4062d026622c2f72bb5ed7af7 Reviewed-on: https://gerrit.libreoffice.org/31230 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Khaled Hosny <khaledho...@eglug.org> diff --git a/vcl/inc/unx/fontmanager.hxx b/vcl/inc/unx/fontmanager.hxx index 46a951a..a7a2753 100644 --- a/vcl/inc/unx/fontmanager.hxx +++ b/vcl/inc/unx/fontmanager.hxx @@ -357,23 +357,12 @@ public: // get a fonts glyph bounding box void 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 ) 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; - // creates a new font subset of an existing TrueType font // returns true in case of success, else false // nFont: the font to be subsetted diff --git a/vcl/inc/unx/printergfx.hxx b/vcl/inc/unx/printergfx.hxx index 88c04d5..7f8a735 100644 --- a/vcl/inc/unx/printergfx.hxx +++ b/vcl/inc/unx/printergfx.hxx @@ -102,7 +102,6 @@ public: } }; -class Font2; class GlyphSet; class PrinterJob; class PrintFontManager; @@ -154,8 +153,6 @@ struct GraphicsStatus GraphicsStatus(); }; -class Font2; - class VCL_DLLPUBLIC PrinterGfx { private: @@ -215,13 +212,6 @@ private: std::list< GraphicsStatus > maGraphicsStack; GraphicsStatus& currentState() { return maGraphicsStack.front(); } - /* font */ - friend class Font2; - int getCharWidth (bool b_vert, sal_Unicode n_char, - CharacterMetric *p_bbox); - fontID getCharMetric (const Font2 &rFont, sal_Unicode n_char, - CharacterMetric *p_bbox); - public: /* graphics status update */ void PSSetColor (); @@ -264,21 +254,11 @@ public: sal_Int16 nGlyphs, sal_Int16 nBytes, const sal_Int32* pDeltaArray = nullptr); void PSComment (const sal_Char* pComment ); - void LicenseWarning (const Point& rPoint, const sal_Unicode* pStr, - sal_Int16 nLen, const sal_Int32* pDeltaArray); void OnEndJob (); void writeResources( osl::File* pFile, std::list< OString >& rSuppliedFonts ); PrintFontManager& GetFontMgr () { return mrFontMgr; } - void drawVerticalizedText (const Point& rPoint, - const sal_Unicode* pStr, - sal_Int16 nLen, - const sal_Int32* pDeltaArray ); - void drawText (const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen, - const sal_Int32* pDeltaArray = nullptr); - void drawGlyphs( const Point& rPoint, sal_GlyphId* pGlyphIds, sal_Unicode* pUnicodes, @@ -360,9 +340,6 @@ public: { return maVirtualStatus.mbArtItalic; } bool GetArtificialBold() const { return maVirtualStatus.mbArtBold; } - void DrawText (const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen, - const sal_Int32* pDeltaArray); void SetTextColor (PrinterColor& rTextColor) { maTextColor = rTextColor; } diff --git a/vcl/unx/generic/fontmanager/fontmanager.cxx b/vcl/unx/generic/fontmanager/fontmanager.cxx index 4c839f4..152c01b 100644 --- a/vcl/unx/generic/fontmanager/fontmanager.cxx +++ b/vcl/unx/generic/fontmanager/fontmanager.cxx @@ -1206,69 +1206,6 @@ int PrintFontManager::getFontDescend( fontID nFontID ) const return pFont ? pFont->m_nDescend : 0; } -void PrintFontManager::hasVerticalSubstitutions( fontID nFontID, - const sal_Unicode* pCharacters, int nCharacters, bool* pHasSubst ) const -{ - PrintFont* pFont = getFont( nFontID ); - if (pFont && pFont->m_nAscend == 0 && pFont->m_nDescend == 0) - { - // might be a truetype font not yet analyzed - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); - } - - if (!pFont || !pFont->m_bHaveVerticalSubstitutedGlyphs) - memset( pHasSubst, 0, sizeof(bool)*nCharacters ); - else - { - for( int i = 0; i < nCharacters; i++ ) - { - sal_Unicode code = pCharacters[i]; - if( ! pFont->m_pMetrics || - ! ( pFont->m_pMetrics->m_aPages[ code >> 11 ] & ( 1 << ( ( code >> 8 ) & 7 ) ) ) ) - pFont->queryMetricPage( code >> 8, m_pAtoms ); - std::unordered_map< sal_Unicode, bool >::const_iterator it = pFont->m_pMetrics->m_bVerticalSubstitutions.find( code ); - pHasSubst[i] = it != pFont->m_pMetrics->m_bVerticalSubstitutions.end(); - } - } -} - -bool PrintFontManager::isFontDownloadingAllowedForPrinting( fontID nFont ) const -{ - static const char* pEnable = getenv( "PSPRINT_ENABLE_TTF_COPYRIGHTAWARENESS" ); - bool bRet = true; - - if( pEnable && *pEnable ) - { - PrintFont* pFont = getFont( nFont ); - if( pFont && pFont->m_eType == fonttype::TrueType ) - { - TrueTypeFontFile* pTTFontFile = static_cast<TrueTypeFontFile*>(pFont); - if( pTTFontFile->m_nTypeFlags & TYPEFLAG_INVALID ) - { - TrueTypeFont* pTTFont = nullptr; - OString aFile = getFontFile( pFont ); - if( OpenTTFontFile( aFile.getStr(), pTTFontFile->m_nCollectionEntry, &pTTFont ) == SF_OK ) - { - // get type flags - TTGlobalFontInfo aInfo; - GetTTGlobalFontInfo( pTTFont, & aInfo ); - pTTFontFile->m_nTypeFlags = (unsigned int)aInfo.typeFlags; - CloseTTFont( pTTFont ); - } - } - - unsigned int nCopyrightFlags = pTTFontFile->m_nTypeFlags & TYPEFLAG_COPYRIGHT_MASK; - - // http://www.microsoft.com/typography/tt/ttf_spec/ttch02.doc - // Font embedding is allowed if not restricted completely (only bit 1 set). - // Preview&Print (bit 2), Editable (bit 3) or Installable (==0) fonts are ok. - bRet = ( nCopyrightFlags & 0x02 ) != 0x02; - } - } - return bRet; -} - bool PrintFontManager::getMetrics( fontID nFontID, const sal_Unicode* pString, int nLen, CharacterMetric* pArray ) const { PrintFont* pFont = getFont( nFontID ); @@ -1304,51 +1241,6 @@ bool PrintFontManager::getMetrics( fontID nFontID, const sal_Unicode* pString, i return true; } -bool PrintFontManager::getMetrics( fontID nFontID, sal_Unicode minCharacter, sal_Unicode maxCharacter, CharacterMetric* pArray, bool bVertical ) const -{ - OSL_PRECOND(minCharacter <= maxCharacter, "invalid char. range"); - if (minCharacter > maxCharacter) - return false; - - PrintFont* pFont = getFont( nFontID ); - if( ! pFont ) - return false; - - if( ( pFont->m_nAscend == 0 && pFont->m_nDescend == 0 ) - || ! pFont->m_pMetrics || pFont->m_pMetrics->isEmpty() - ) - { - // might be a font not yet analyzed - if( pFont->m_eType == fonttype::TrueType ) - analyzeTrueTypeFile( pFont ); - } - - sal_Unicode code = minCharacter; - do - { - if( ! pFont->m_pMetrics || - ! ( pFont->m_pMetrics->m_aPages[ code >> 11 ] & ( 1 << ( ( code >> 8 ) & 7 ) ) ) ) - pFont->queryMetricPage( code >> 8, m_pAtoms ); - pArray[ code - minCharacter ].width = -1; - pArray[ code - minCharacter ].height = -1; - if( pFont->m_pMetrics ) - { - int effectiveCode = code; - effectiveCode |= bVertical ? 1 << 16 : 0; - std::unordered_map< int, CharacterMetric >::const_iterator it = - pFont->m_pMetrics->m_aMetrics.find( effectiveCode ); - // if no vertical metrics are available assume rotated horizontal metrics - if( bVertical && (it == pFont->m_pMetrics->m_aMetrics.end()) ) - it = pFont->m_pMetrics->m_aMetrics.find( code ); - // the character metrics are in it->second - if( it != pFont->m_pMetrics->m_aMetrics.end() ) - pArray[ code - minCharacter ] = it->second; - } - } while( code++ != maxCharacter ); - - return true; -} - // TODO: move most of this stuff into the central font-subsetting code bool PrintFontManager::createFontSubset( FontSubsetInfo& rInfo, diff --git a/vcl/unx/generic/print/glyphset.cxx b/vcl/unx/generic/print/glyphset.cxx index 15c0fd8..58b640a 100644 --- a/vcl/unx/generic/print/glyphset.cxx +++ b/vcl/unx/generic/print/glyphset.cxx @@ -61,17 +61,6 @@ GlyphSet::~GlyphSet () } bool -GlyphSet::GetCharID ( - sal_Unicode nChar, - unsigned char* nOutGlyphID, - sal_Int32* nOutGlyphSetID - ) -{ - return LookupCharID (nChar, nOutGlyphID, nOutGlyphSetID) - || AddCharID (nChar, nOutGlyphID, nOutGlyphSetID); -} - -bool GlyphSet::GetGlyphID ( sal_GlyphId nGlyph, sal_Unicode nUnicode, @@ -84,37 +73,6 @@ GlyphSet::GetGlyphID ( } bool -GlyphSet::LookupCharID ( - sal_Unicode nChar, - unsigned char* nOutGlyphID, - sal_Int32* nOutGlyphSetID - ) -{ - char_list_t::iterator aGlyphSet; - sal_Int32 nGlyphSetID; - - // loop through all the font subsets - for (aGlyphSet = maCharList.begin(), nGlyphSetID = 1; - aGlyphSet != maCharList.end(); - ++aGlyphSet, nGlyphSetID++) - { - // check every subset if it contains the queried unicode char - char_map_t::const_iterator aGlyph = (*aGlyphSet).find (nChar); - if (aGlyph != (*aGlyphSet).end()) - { - // success: found the unicode char, return the glyphid and the glyphsetid - *nOutGlyphSetID = nGlyphSetID; - *nOutGlyphID = (*aGlyph).second; - return true; - } - } - - *nOutGlyphSetID = -1; - *nOutGlyphID = 0; - return false; -} - -bool GlyphSet::LookupGlyphID ( sal_GlyphId nGlyph, unsigned char* nOutGlyphID, @@ -146,27 +104,6 @@ GlyphSet::LookupGlyphID ( } unsigned char -GlyphSet::GetAnsiMapping (sal_Unicode nUnicodeChar) -{ - static rtl_UnicodeToTextConverter aConverter = - rtl_createUnicodeToTextConverter(RTL_TEXTENCODING_MS_1252); - static rtl_UnicodeToTextContext aContext = - rtl_createUnicodeToTextContext( aConverter ); - - sal_Char nAnsiChar; - sal_uInt32 nCvtInfo; - sal_Size nCvtChars; - const sal_uInt32 nCvtFlags = RTL_UNICODETOTEXT_FLAGS_UNDEFINED_ERROR - | RTL_UNICODETOTEXT_FLAGS_INVALID_ERROR; - - sal_Size nSize = rtl_convertUnicodeToText( aConverter, aContext, - &nUnicodeChar, 1, &nAnsiChar, 1, - nCvtFlags, &nCvtInfo, &nCvtChars ); - - return nSize == 1 ? (unsigned char)nAnsiChar : (unsigned char)0; -} - -unsigned char GlyphSet::GetSymbolMapping (sal_Unicode nUnicodeChar) { if (0x0000 < nUnicodeChar && nUnicodeChar < 0x0100) @@ -178,75 +115,11 @@ GlyphSet::GetSymbolMapping (sal_Unicode nUnicodeChar) } void -GlyphSet::AddNotdef (char_map_t &rCharMap) -{ - if (rCharMap.empty()) - rCharMap[0] = 0; -} - -void GlyphSet::AddNotdef (glyph_map_t &rGlyphMap) { if (rGlyphMap.empty()) rGlyphMap[0] = 0; } -bool -GlyphSet::AddCharID ( - sal_Unicode nChar, - unsigned char* nOutGlyphID, - sal_Int32* nOutGlyphSetID - ) -{ - unsigned char nMappedChar; - - // XXX important: avoid to reencode type1 symbol fonts - if (mnBaseEncoding == RTL_TEXTENCODING_SYMBOL) - nMappedChar = GetSymbolMapping (nChar); - else - nMappedChar = GetAnsiMapping (nChar); - - // create an empty glyphmap that is reserved for iso1252 encoded glyphs - // (or -- unencoded -- symbol glyphs) and a second map that takes any other - if (maCharList.empty()) - { - char_map_t aMap, aMapp; - - maCharList.push_back (aMap); - maCharList.push_back (aMapp); - } - // if the last map is full, create a new one - if ((!nMappedChar) && (maCharList.back().size() == 255)) - { - char_map_t aMap; - maCharList.push_back (aMap); - } - - // insert a new glyph in the font subset - if (nMappedChar) - { - // always put iso1252 chars into the first map, map them on itself - char_map_t& aGlyphSet = maCharList.front(); - AddNotdef (aGlyphSet); - - aGlyphSet [nChar] = nMappedChar; - *nOutGlyphSetID = 1; - *nOutGlyphID = nMappedChar; - } - else - { - // other chars are just appended to the list - char_map_t& aGlyphSet = maCharList.back(); - AddNotdef (aGlyphSet); - - int nSize = aGlyphSet.size(); - - aGlyphSet [nChar] = nSize; - *nOutGlyphSetID = maCharList.size(); - *nOutGlyphID = aGlyphSet [nChar]; - } - - return true; -} bool GlyphSet::AddGlyphID ( @@ -306,25 +179,6 @@ GlyphSet::AddGlyphID ( } OString -GlyphSet::GetCharSetName (sal_Int32 nGlyphSetID) -{ - if (meBaseType == fonttype::TrueType) - { - OStringBuffer aSetName( maBaseName.getLength() + 32 ); - aSetName.append( maBaseName ); - aSetName.append( "FID" ); - aSetName.append( mnFontID ); - aSetName.append( mbVertical ? "VCSet" : "HCSet" ); - aSetName.append( nGlyphSetID ); - return aSetName.makeStringAndClear(); - } - else - { - return maBaseName; - } -} - -OString GlyphSet::GetGlyphSetName (sal_Int32 nGlyphSetID) { if (meBaseType == fonttype::TrueType) @@ -343,48 +197,6 @@ GlyphSet::GetGlyphSetName (sal_Int32 nGlyphSetID) } } -sal_Int32 -GlyphSet::GetGlyphSetEncoding (sal_Int32 nGlyphSetID) -{ - if (meBaseType == fonttype::TrueType) - return RTL_TEXTENCODING_DONTKNOW; - else - { - if (mnBaseEncoding == RTL_TEXTENCODING_SYMBOL) - return RTL_TEXTENCODING_SYMBOL; - else - return nGlyphSetID == 1 ? RTL_TEXTENCODING_MS_1252 - : RTL_TEXTENCODING_USER_START + nGlyphSetID; - } -} - -OString -GlyphSet::GetGlyphSetEncodingName (rtl_TextEncoding nEnc, const OString &rFontName) -{ - if ( nEnc == RTL_TEXTENCODING_MS_1252 - || nEnc == RTL_TEXTENCODING_ISO_8859_1) - { - return OString("ISO1252Encoding"); - } - else - if (nEnc >= RTL_TEXTENCODING_USER_START && nEnc <= RTL_TEXTENCODING_USER_END) - { - return rFontName - + OString("Enc") - + OString::number ((nEnc - RTL_TEXTENCODING_USER_START)); - } - else - { - return OString(); - } -} - -OString -GlyphSet::GetGlyphSetEncodingName (sal_Int32 nGlyphSetID) -{ - return GetGlyphSetEncodingName (GetGlyphSetEncoding(nGlyphSetID), maBaseName); -} - OString GlyphSet::GetReencodedFontName (rtl_TextEncoding nEnc, const OString &rFontName) { @@ -413,8 +225,7 @@ void GlyphSet::DrawGlyphs( const sal_GlyphId* pGlyphIds, const sal_Unicode* pUnicodes, sal_Int16 nLen, - const sal_Int32* pDeltaArray, - const bool bUseGlyphs) + const sal_Int32* pDeltaArray) { unsigned char *pGlyphID = static_cast<unsigned char*>(alloca (nLen * sizeof(unsigned char))); sal_Int32 *pGlyphSetID = static_cast<sal_Int32*>(alloca (nLen * sizeof(sal_Int32))); @@ -423,10 +234,7 @@ void GlyphSet::DrawGlyphs( // convert unicode to font glyph id and font subset for (int nChar = 0; nChar < nLen; nChar++) { - if (bUseGlyphs) - GetGlyphID (pGlyphIds[nChar], pUnicodes[nChar], pGlyphID + nChar, pGlyphSetID + nChar); - else - GetCharID (pUnicodes[nChar], pGlyphID + nChar, pGlyphSetID + nChar); + GetGlyphID (pGlyphIds[nChar], pUnicodes[nChar], pGlyphID + nChar, pGlyphSetID + nChar); aGlyphSet.insert (pGlyphSetID[nChar]); } @@ -475,72 +283,14 @@ void GlyphSet::DrawGlyphs( aPoint.Move (nOffset, 0); OString aGlyphSetName; - if (bUseGlyphs) - aGlyphSetName = GetGlyphSetName(*aSet); - else - aGlyphSetName = GetCharSetName(*aSet); + aGlyphSetName = GetGlyphSetName(*aSet); - rGfx.PSSetFont (aGlyphSetName, GetGlyphSetEncoding(*aSet)); + rGfx.PSSetFont (aGlyphSetName, RTL_TEXTENCODING_DONTKNOW); rGfx.PSMoveTo (aPoint); rGfx.PSShowText (pGlyphSubset, nGlyphs, nGlyphs, nGlyphs > 1 ? pDeltaSubset : nullptr); } } -void -GlyphSet::DrawText (PrinterGfx &rGfx, const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen, const sal_Int32* pDeltaArray) -{ - // dispatch to the impl method - if (pDeltaArray == nullptr) - ImplDrawText (rGfx, rPoint, pStr, nLen); - else - ImplDrawText (rGfx, rPoint, pStr, nLen, pDeltaArray); -} - -void -GlyphSet::ImplDrawText (PrinterGfx &rGfx, const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen) -{ - rGfx.PSMoveTo (rPoint); - - int nChar; - unsigned char *pGlyphID = static_cast<unsigned char*>(alloca (nLen * sizeof(unsigned char))); - sal_Int32 *pGlyphSetID = static_cast<sal_Int32*>(alloca (nLen * sizeof(sal_Int32))); - - // convert unicode to glyph id and char set (font subset) - for (nChar = 0; nChar < nLen; nChar++) - GetCharID (pStr[nChar], pGlyphID + nChar, pGlyphSetID + nChar); - - // loop over the string to draw subsequent pieces of chars - // with the same postscript font - for (nChar = 0; nChar < nLen; /* atend */) - { - sal_Int32 nGlyphSetID = pGlyphSetID [nChar]; - sal_Int32 nGlyphs = 1; - for (int nNextChar = nChar + 1; nNextChar < nLen; nNextChar++) - { - if (pGlyphSetID[nNextChar] == nGlyphSetID) - nGlyphs++; - else - break; - } - - // show the text using the PrinterGfx text api - OString aGlyphSetName(GetCharSetName(nGlyphSetID)); - rGfx.PSSetFont (aGlyphSetName, GetGlyphSetEncoding(nGlyphSetID)); - rGfx.PSShowText (pGlyphID + nChar, nGlyphs, nGlyphs); - - nChar += nGlyphs; - } -} - -void -GlyphSet::ImplDrawText (PrinterGfx &rGfx, const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen, const sal_Int32* pDeltaArray) -{ - DrawGlyphs( rGfx, rPoint, nullptr, pStr, nLen, pDeltaArray, false); -} - struct EncEntry { unsigned char aEnc; @@ -608,47 +358,12 @@ GlyphSet::PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAllowType42 if (pTmpFile == nullptr) return; - // array of unicode source characters - sal_uInt16 pUChars[256]; - // encoding vector maps character encoding to the ordinal number // of the glyph in the output file unsigned char pEncoding[256]; sal_uInt16 pTTGlyphMapping[256]; const bool bAllowCID = false; // TODO: nPSLanguageLevel>=3 - // loop through all the font subsets - sal_Int32 nCharSetID; - char_list_t::iterator aCharSet; - for (aCharSet = maCharList.begin(), nCharSetID = 1; - aCharSet != maCharList.end(); - ++aCharSet, nCharSetID++) - { - if ((*aCharSet).empty()) - continue; - - // loop through all the chars in the subset - char_map_t::const_iterator aChar; - sal_Int32 n = 0; - for (aChar = (*aCharSet).begin(); aChar != (*aCharSet).end(); ++aChar) - { - pUChars [n] = (*aChar).first; - pEncoding [n] = (*aChar).second; - n++; - } - // create a mapping from the unicode chars to the char encoding in - // source TrueType font - MapString (pTTFont, pUChars, (*aCharSet).size(), pTTGlyphMapping, mbVertical); - - // create the current subset - OString aCharSetName = GetCharSetName(nCharSetID); - fprintf( pTmpFile, "%%%%BeginResource: font %s\n", aCharSetName.getStr() ); - CreatePSUploadableFont( pTTFont, pTmpFile, aCharSetName.getStr(), (*aCharSet).size(), - pTTGlyphMapping, pEncoding, bAllowType42, bAllowCID ); - fprintf( pTmpFile, "%%%%EndResource\n" ); - rSuppliedFonts.push_back( aCharSetName ); - } - // loop through all the font glyph subsets sal_Int32 nGlyphSetID; glyph_list_t::iterator aGlyphSet; diff --git a/vcl/unx/generic/print/glyphset.hxx b/vcl/unx/generic/print/glyphset.hxx index d807af4..7b0eba9 100644 --- a/vcl/unx/generic/print/glyphset.hxx +++ b/vcl/unx/generic/print/glyphset.hxx @@ -51,21 +51,10 @@ private: typedef std::unordered_map< sal_GlyphId, sal_uInt8 > glyph_map_t; typedef std::list< glyph_map_t > glyph_list_t; - char_list_t maCharList; glyph_list_t maGlyphList; OString GetGlyphSetName (sal_Int32 nGlyphSetID); - OString GetCharSetName (sal_Int32 nGlyphSetID); - sal_Int32 GetGlyphSetEncoding (sal_Int32 nGlyphSetID); - OString GetGlyphSetEncodingName (sal_Int32 nGlyphSetID); - bool GetCharID (sal_Unicode nChar, - unsigned char* nOutGlyphID, sal_Int32* nOutGlyphSetID); - bool LookupCharID (sal_Unicode nChar, - unsigned char* nOutGlyphID, sal_Int32* nOutGlyphSetID); - bool AddCharID (sal_Unicode nChar, - unsigned char* nOutGlyphID, - sal_Int32* nOutGlyphSetID); bool GetGlyphID (sal_GlyphId nGlyphId, sal_Unicode nUnicode, unsigned char* nOutGlyphID, sal_Int32* nOutGlyphSetID); bool LookupGlyphID (sal_GlyphId nGlyphId, @@ -73,17 +62,9 @@ private: bool AddGlyphID (sal_GlyphId nGlyphId, sal_Unicode nUnicode, unsigned char* nOutGlyphID, sal_Int32* nOutGlyphSetID); - static void AddNotdef (char_map_t &rCharMap); static void AddNotdef (glyph_map_t &rGlyphMap); - static unsigned char GetAnsiMapping (sal_Unicode nUnicodeChar); static unsigned char GetSymbolMapping (sal_Unicode nUnicodeChar); - void ImplDrawText (PrinterGfx &rGfx, const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen); - void ImplDrawText (PrinterGfx &rGfx, const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen, - const sal_Int32* pDeltaArray); - public: GlyphSet (sal_Int32 nFontID, bool bVertical); @@ -99,16 +80,12 @@ public: const OString &rFontName); bool IsVertical () { return mbVertical;} - void DrawText (PrinterGfx &rGfx, const Point& rPoint, - const sal_Unicode* pStr, sal_Int16 nLen, - const sal_Int32* pDeltaArray); void DrawGlyphs (PrinterGfx& rGfx, const Point& rPoint, const sal_GlyphId* pGlyphIds, const sal_Unicode* pUnicodes, sal_Int16 nLen, - const sal_Int32* pDeltaArray, - bool bUseGlyphs=true); + const sal_Int32* pDeltaArray); void PSUploadFont (osl::File& rOutFile, PrinterGfx &rGfx, bool bAsType42, std::list< OString >& rSuppliedFonts ); }; diff --git a/vcl/unx/generic/print/text_gfx.cxx b/vcl/unx/generic/print/text_gfx.cxx index 12f23fd..eda0f17 100644 --- a/vcl/unx/generic/print/text_gfx.cxx +++ b/vcl/unx/generic/print/text_gfx.cxx @@ -32,56 +32,6 @@ using namespace psp ; -namespace psp { -/* - container for a font and its helper fonts: - 1st is the font itself - 2nd is a fallback font, usually a font with unicode glyph repertoire (e.g. andale) - symbol fonts (adobe-fontspecific) may need special glyphmapping - (symbol page vc. latin page) -*/ -class Font2 -{ - private: - - #define Font2Size 2 - - fontID mpFont [Font2Size]; - bool mbSymbol; - - public: - - fontID GetFont (int nIdx) const - { return nIdx < Font2Size ? mpFont[nIdx] : -1 ; } - bool IsSymbolFont () const - { return mbSymbol; } - - explicit Font2 (const PrinterGfx &rGfx); - ~Font2 () {} -}; - -Font2::Font2(const PrinterGfx &rGfx) -{ - mpFont[0] = rGfx.GetFontID(); - mpFont[1] = 0; // fallback ID - - PrintFontManager &rMgr = PrintFontManager::get(); - mbSymbol = mpFont[0] != -1 && - rMgr.getFontEncoding(mpFont[0]) == RTL_TEXTENCODING_SYMBOL; -} - -} // namespace psp - -static int getVerticalDeltaAngle( sal_Unicode nChar ) -{ - int nRotation = GetVerticalFlags(nChar); - if (nRotation == GF_ROTR) - return -900; - if (nRotation == GF_ROTL) - return 900; - return 0; -} - /* * implement text handling printer routines, */ @@ -148,12 +98,6 @@ void PrinterGfx::DrawGlyphs( if( nLen <= 0 ) return; - if ( !mrFontMgr.isFontDownloadingAllowedForPrinting( mnFontID ) ) - { - LicenseWarning(rPoint, pUnicodes, nLen, pDeltaArray); - return; - } - // move and rotate the user coordinate system // avoid the gsave/grestore for the simple cases since it allows // reuse of the current font if it hasn't changed @@ -268,332 +212,6 @@ void PrinterGfx::DrawGlyphs( } } -void -PrinterGfx::DrawText ( - const Point& rPoint, - const sal_Unicode* pStr, - sal_Int16 nLen, - const sal_Int32* pDeltaArray - ) -{ - if (!nLen) - return; - - fontID nRestoreFont = mnFontID; - - // setup font[substitutes] and map the string into the symbol area in case of - // symbol font - Font2 aFont(*this); - sal_Unicode *pEffectiveStr; - if ( aFont.IsSymbolFont() ) - { - pEffectiveStr = static_cast<sal_Unicode*>(alloca(nLen * sizeof(pStr[0]))); - for (int i = 0; i < nLen; i++) - pEffectiveStr[i] = pStr[i] < 256 ? pStr[i] + 0xF000 : pStr[i]; - } - else - { - pEffectiveStr = const_cast<sal_Unicode*>(pStr); - } - - fontID *pFontMap = static_cast<fontID*>(alloca(nLen * sizeof(fontID))); - sal_Int32 *pCharWidth = static_cast<sal_Int32*>(alloca(nLen * sizeof(sal_Int32))); - - for( int n = 0; n < nLen; n++ ) - { - CharacterMetric aBBox; - // coverity[callee_ptr_arith] - pFontMap[n] = getCharMetric(aFont, pEffectiveStr[n], &aBBox); - pCharWidth[n] = getCharWidth(mbTextVertical, pEffectiveStr[n], &aBBox); - } - - // setup a new delta array, use virtual resolution of 1000 - sal_Int32* pNewDeltaArray = static_cast<sal_Int32*>(alloca( sizeof( sal_Int32 )*nLen )); - if ( pDeltaArray != nullptr) - { - for (int i = 0; i < nLen - 1; i++) - pNewDeltaArray[i] = 1000 * pDeltaArray[i]; - pNewDeltaArray[nLen - 1] = 0; - } - else - { - pNewDeltaArray[0] = pCharWidth[0]; - for (int i = 1; i < nLen; i++) - pNewDeltaArray[i] = pNewDeltaArray[i-1] + pCharWidth[i]; - } - - // move and rotate the user coordinate system - // avoid the gsave/grestore for the simple cases since it allows - // reuse of the current font if it hasn't changed - sal_Int32 nCurrentTextAngle = mnTextAngle; - sal_Int32 nCurrentPointX; - sal_Int32 nCurrentPointY; - - if (nCurrentTextAngle != 0) - { - PSGSave (); - PSTranslate (rPoint); - PSRotate (nCurrentTextAngle); - mnTextAngle = 0; - - nCurrentPointX = 0; - nCurrentPointY = 0; - } - else - { - nCurrentPointX = rPoint.X(); - nCurrentPointY = rPoint.Y(); - } - - // draw the string - sal_Int32 nDelta = 0; - for (int nTo = 0; nTo < nLen; ) - { - int nFrom = nTo; - fontID nFont = pFontMap[ nFrom ]; - - while ((nTo < nLen) && (nFont == pFontMap[nTo])) - { - pNewDeltaArray[ nTo ] = (sal_Int32)(((0.5 + pNewDeltaArray[ nTo ]) / 1000.0) - nDelta); - nTo++ ; - } - - SetFont( nFont, - maVirtualStatus.mnTextHeight, maVirtualStatus.mnTextWidth, - mnTextAngle, - mbTextVertical, - maVirtualStatus.mbArtItalic, - maVirtualStatus.mbArtBold - ); - - if (mbTextVertical) - { - drawVerticalizedText( - Point(nCurrentPointX + nDelta, nCurrentPointY), - pEffectiveStr + nFrom, nTo - nFrom, - pNewDeltaArray + nFrom ); - } - else - { - drawText( - Point(nCurrentPointX + nDelta, nCurrentPointY), - pEffectiveStr + nFrom, nTo - nFrom, - pDeltaArray == nullptr ? nullptr : pNewDeltaArray + nFrom ); - } - nDelta += pNewDeltaArray[ nTo - 1 ]; - } - - // restore the user coordinate system - if (nCurrentTextAngle != 0) - { - PSGRestore (); - mnTextAngle = nCurrentTextAngle; - } - - // restore the original font settings - SetFont( nRestoreFont, - maVirtualStatus.mnTextHeight, maVirtualStatus.mnTextWidth, - mnTextAngle, mbTextVertical, - maVirtualStatus.mbArtItalic, - maVirtualStatus.mbArtBold - ); -} - -void PrinterGfx::drawVerticalizedText( - const Point& rPoint, - const sal_Unicode* pStr, - sal_Int16 nLen, - const sal_Int32* pDeltaArray - ) -{ - PrintFontManager &rMgr = PrintFontManager::get(); - PrintFontInfo aInfo; - if (!rMgr.getFontInfo(mnFontID, aInfo)) - return; - - sal_Int32* pDelta = static_cast<sal_Int32*>(alloca( nLen * sizeof(sal_Int32) )); - - int nTextScale = maVirtualStatus.mnTextWidth ? maVirtualStatus.mnTextWidth : maVirtualStatus.mnTextHeight; - int nNormalAngle = mnTextAngle; - int nLastPos = 0; - - double fSin = sin( -2.0*M_PI*nNormalAngle/3600 ); - double fCos = cos( -2.0*M_PI*nNormalAngle/3600 ); - - bool* pGsubFlags = static_cast<bool*>(alloca( nLen * sizeof(bool) )); - rMgr.hasVerticalSubstitutions( mnFontID, pStr, nLen, pGsubFlags ); - - Point aPoint( rPoint ); - for( int i = 0; i < nLen; ) - { - int nDeltaAngle; - while( ( nDeltaAngle = getVerticalDeltaAngle( pStr[i] ) ) == 0 && i < nLen ) - i++; - if( i <= nLen && i > nLastPos ) - { - for( int n = nLastPos; n < i; n++ ) - pDelta[n] = pDeltaArray[n] - (aPoint.X() - rPoint.X() ); - - SetFont( mnFontID, - maVirtualStatus.mnTextHeight, maVirtualStatus.mnTextWidth, - nNormalAngle, mbTextVertical, - maVirtualStatus.mbArtItalic, - maVirtualStatus.mbArtBold ); - drawText( aPoint, pStr + nLastPos, i - nLastPos, pDelta + nLastPos ); - - aPoint.X() = (sal_Int32)(rPoint.X() + ((double)pDeltaArray[i-1] * fCos)); - aPoint.Y() = (sal_Int32)(rPoint.Y() + ((double)pDeltaArray[i-1] * fSin)); - } - if( i < nLen ) - { - int nOldWidth = maVirtualStatus.mnTextWidth; - int nOldHeight = maVirtualStatus.mnTextHeight; - SetFont( mnFontID, - nTextScale, - maVirtualStatus.mnTextHeight, - nNormalAngle + nDeltaAngle, - mbTextVertical, - maVirtualStatus.mbArtItalic, - maVirtualStatus.mbArtBold ); - - double nA = nTextScale * aInfo.m_nAscend / 1000.0; - double nD = nTextScale * aInfo.m_nDescend / 1000.0; - double fStretch = (double)maVirtualStatus.mnTextWidth / maVirtualStatus.mnTextHeight; - if( !pGsubFlags[i] ) - nD *= fStretch; - - Point aPos( aPoint ); - switch( nDeltaAngle ) - { - case +900: - aPos.X() += (sal_Int32)(+nA * fCos + nD * fSin); - aPos.Y() += (sal_Int32)(-nA * fSin + nD * fCos); - break; - case -900: - aPos.X() += (sal_Int32)(+nA * fSin + nD * fCos); - aPos.Y() += (sal_Int32)(-(nTextScale*fStretch - nD) * fCos); - break; - } - drawText( aPos, pStr+i, 1 ); - if( i < nLen-1 && pDeltaArray ) - { - aPoint.X() = (sal_Int32)(rPoint.X() + ((double)pDeltaArray[i] * fCos)); - aPoint.Y() = (sal_Int32)(rPoint.Y() + ((double)pDeltaArray[i] * fSin)); - } - - // swap text width/height again - SetFont( mnFontID, - nOldHeight, - nOldWidth, - nNormalAngle, - mbTextVertical, - maVirtualStatus.mbArtItalic, - maVirtualStatus.mbArtBold ); - } - i++; - nLastPos = i; - } - mnTextAngle = nNormalAngle; -} - -void -PrinterGfx::LicenseWarning(const Point& rPoint, const sal_Unicode* pStr, - sal_Int16 nLen, const sal_Int32* pDeltaArray) -{ - // treat it like a builtin font in case a user has that font also in the - // printer. This is not so unlikely as it may seem; no print embedding - // licensed fonts are often used (or so they say) in companies: - // they are installed on displays and printers, but get not embedded in - // print files or documents because they are not licensed for use outside - // the company. - OString aMessage( "The font " ); - aMessage += OUStringToOString( mrFontMgr.getPSName(mnFontID), - RTL_TEXTENCODING_ASCII_US ); - aMessage += " could not be downloaded\nbecause its license does not allow for that"; - PSComment( aMessage.getStr() ); - - OString aFontName = OUStringToOString( - mrFontMgr.getPSName(mnFontID), - RTL_TEXTENCODING_ASCII_US); - PSSetFont (aFontName, RTL_TEXTENCODING_ISO_8859_1); - - std::size_t nSize = 4 * nLen; - unsigned char* pBuffer = static_cast<unsigned char*>(alloca (nSize* sizeof(unsigned char))); - - ConverterFactory &rCvt = GetConverterFactory (); - nSize = rCvt.Convert (pStr, nLen, pBuffer, nSize, RTL_TEXTENCODING_ISO_8859_1); - - PSMoveTo (rPoint); - PSShowText (pBuffer, nLen, nSize, pDeltaArray); -} - -void -PrinterGfx::drawText( - const Point& rPoint, - const sal_Unicode* pStr, - sal_Int16 nLen, - const sal_Int32* pDeltaArray - ) -{ - if (!(nLen > 0)) - return; - - fonttype::type eType = mrFontMgr.getFontType (mnFontID); - - if ( eType == fonttype::TrueType - && !mrFontMgr.isFontDownloadingAllowedForPrinting(mnFontID)) - { - LicenseWarning(rPoint, pStr, nLen, pDeltaArray); - return; - } - - // search for a glyph set matching the set font - std::list< GlyphSet >::iterator aIter; - for (aIter = maPS3Font.begin(); aIter != maPS3Font.end(); ++aIter) - if ( ((*aIter).GetFontID() == mnFontID) - && ((*aIter).IsVertical() == mbTextVertical)) - { - (*aIter).DrawText (*this, rPoint, pStr, nLen, pDeltaArray); - break; - } - - // not found ? create a new one - if (aIter == maPS3Font.end()) - { - maPS3Font.push_back (GlyphSet(mnFontID, mbTextVertical)); - maPS3Font.back().DrawText (*this, rPoint, pStr, nLen, pDeltaArray); - } -} - -int -PrinterGfx::getCharWidth (bool b_vert, sal_Unicode n_char, CharacterMetric *p_bbox) -{ - b_vert = b_vert && (getVerticalDeltaAngle(n_char) != 0); - int w = b_vert ? p_bbox->height : p_bbox->width; - w *= maVirtualStatus.mnTextWidth ? maVirtualStatus.mnTextWidth : maVirtualStatus.mnTextHeight; - return w; -} - -fontID -PrinterGfx::getCharMetric (const Font2 &rFont, sal_Unicode n_char, CharacterMetric *p_bbox) -{ - p_bbox->width = -1; - p_bbox->height = -1; - - for (fontID n = 0; n < Font2Size; n++) - { - fontID n_font = rFont.GetFont(n); - if (n_font != -1) - mrFontMgr.getMetrics( n_font, n_char, n_char, p_bbox ); - if (p_bbox->width >= 0 && p_bbox->height >= 0) - return n_font; - } - if (n_char != '?') - return getCharMetric (rFont, '?', p_bbox); - - return rFont.GetFont(0) != -1 ? rFont.GetFont(0) : rFont.GetFont(1); -} - /* * spool the converted truetype fonts to the page header after the page body is * complete _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits