diff options
-rw-r--r-- | include/vcl/printerinfomanager.hxx | 21 | ||||
-rw-r--r-- | psprint_config/configuration/psprint.conf | 32 | ||||
-rw-r--r-- | vcl/generic/print/common_gfx.cxx | 25 | ||||
-rw-r--r-- | vcl/generic/print/genpspgraphics.cxx | 8 | ||||
-rw-r--r-- | vcl/generic/print/printerjob.cxx | 30 | ||||
-rw-r--r-- | vcl/generic/print/text_gfx.cxx | 62 | ||||
-rw-r--r-- | vcl/inc/generic/printergfx.hxx | 14 | ||||
-rw-r--r-- | vcl/null/printerinfomanager.cxx | 5 | ||||
-rw-r--r-- | vcl/unx/generic/printer/printerinfomanager.cxx | 153 |
9 files changed, 42 insertions, 308 deletions
diff --git a/include/vcl/printerinfomanager.hxx b/include/vcl/printerinfomanager.hxx index 96e784689483..b431fadb409b 100644 --- a/include/vcl/printerinfomanager.hxx +++ b/include/vcl/printerinfomanager.hxx @@ -50,24 +50,9 @@ struct PrinterInfo : JobData // a list of special features separated by ',' not used by psprint // but assigned from the outside (currently for "fax","pdf=","autoqueue","external_dialog") OUString m_aFeatures; - // a mapping of fonts to other fonts. - // this provides a method for the user - // to replace arbitrary fonts by printer builtin fonts - // currently this is only a mapping between font names - // assuming that only adbobe standard encoding fonts are - // built into the printer. in future it may be necessary - // to map to a font name and UCS2 vector which should be mapped - // this vector is currently implicitly given by the adobe - // standard encoding - bool m_bPerformFontSubstitution; - boost::unordered_map< OUString, OUString, OUStringHash > - m_aFontSubstitutes; - boost::unordered_map< fontID, fontID > - m_aFontSubstitutions; PrinterInfo() : - JobData(), - m_bPerformFontSubstitution( false ) + JobData() {} }; @@ -133,10 +118,6 @@ protected: virtual void initialize(); - // fill in font substitutions - // the resulting boost::unordered_map maps from source to target font ids - void fillFontSubstitutions( PrinterInfo& rInfo ) const; - // fill default paper if not configured in config file // default paper is e.g. locale dependent // if a paper is already set it will not be overwritten diff --git a/psprint_config/configuration/psprint.conf b/psprint_config/configuration/psprint.conf index b69bfe138797..d6c333bc280c 100644 --- a/psprint_config/configuration/psprint.conf +++ b/psprint_config/configuration/psprint.conf @@ -61,23 +61,6 @@ ; if key is absent the default value is driver specific ; PPD_PageSize=A4 -; Note: the following two key types are in the global section to provide -; defaults for newly added printers. -; PerformFontSubstitution: whether to replace downloadable fonts -; with resident fonts or not -PerformFontSubstitution=false - -; SubstFont_<downloadable font>: the resident font to replace -; <downloadable font> if PerformFontSubstitution is true -SubstFont_Helmet=Helvetica -SubstFont_Albany=Helvetica -SubstFont_Courier New=Courier -SubstFont_Arial=Helvetica -SubstFont_Times New Roman=Times -SubstFont_Thorndale=Times -SubstFont_Timmons=Times -SubstFont_Cumberland=Courier - [Generic Printer] ; for every printer a group with at least the keys @@ -114,18 +97,3 @@ Command= ; external_dialog to notify that the print command of a printer will show a dialog ; and therefore the application should not show its own dialog. ;Features= - -; PerformFontSubstitution: whether to replace downloadable fonts -; with resident fonts or not -PerformFontSubstitution=false - -; SubstFont_<downloadable font>: the resident font to replace -; <downloadable font> if PerformFontSubstitution is true -SubstFont_Helmet=Helvetica -SubstFont_Albany=Helvetica -SubstFont_Courier New=Courier -SubstFont_Arial=Helvetica -SubstFont_Times New Roman=Times -SubstFont_Thorndale=Times -SubstFont_Timmons=Times -SubstFont_Cumberland=Courier diff --git a/vcl/generic/print/common_gfx.cxx b/vcl/generic/print/common_gfx.cxx index 05825375fc7b..851739a55898 100644 --- a/vcl/generic/print/common_gfx.cxx +++ b/vcl/generic/print/common_gfx.cxx @@ -60,12 +60,6 @@ PrinterGfx::Init (PrinterJob &rPrinterJob) mnDpi = rPrinterJob.GetResolution(); rPrinterJob.GetScale (mfScaleX, mfScaleY); const PrinterInfo& rInfo( PrinterInfoManager::get().getPrinterInfo( rPrinterJob.GetPrinterName() ) ); - if( mpFontSubstitutes ) - delete const_cast< ::boost::unordered_map<fontID,fontID>* >(mpFontSubstitutes); - if( rInfo.m_bPerformFontSubstitution ) - mpFontSubstitutes = new ::boost::unordered_map< fontID, fontID >( rInfo.m_aFontSubstitutions ); - else - mpFontSubstitutes = NULL; mbUploadPS42Fonts = rInfo.m_pParser ? ( rInfo.m_pParser->isType42Capable() ? sal_True : sal_False ) : sal_False; return sal_True; @@ -84,12 +78,6 @@ PrinterGfx::Init (const JobData& rData) mfScaleX = (double)72.0 / (double)mnDpi; mfScaleY = (double)72.0 / (double)mnDpi; const PrinterInfo& rInfo( PrinterInfoManager::get().getPrinterInfo( rData.m_aPrinterName ) ); - if( mpFontSubstitutes ) - delete const_cast< ::boost::unordered_map<fontID,fontID>* >(mpFontSubstitutes); - if( rInfo.m_bPerformFontSubstitution ) - mpFontSubstitutes = new ::boost::unordered_map< fontID, fontID >( rInfo.m_aFontSubstitutions ); - else - mpFontSubstitutes = NULL; mbUploadPS42Fonts = rInfo.m_pParser ? ( rInfo.m_pParser->isType42Capable() ? sal_True : sal_False ) : sal_False; return sal_True; @@ -112,8 +100,7 @@ PrinterGfx::PrinterGfx() : mbCompressBmp (sal_True), maFillColor (0xff,0,0), maTextColor (0,0,0), - maLineColor (0, 0xff, 0), - mpFontSubstitutes( NULL ) + maLineColor (0, 0xff, 0) { maVirtualStatus.mfLineWidth = 1.0; maVirtualStatus.mnTextHeight = 12; @@ -124,16 +111,6 @@ PrinterGfx::PrinterGfx() : PrinterGfx::~PrinterGfx() { - /* - * the original reasoning why mpFontSubstitutes is a pointer was - * that applications should release all PrinterGfx when printers change - * because they are really invalid; the corresponding printers may have - * changed their settings or even not exist anymore. - * - * Alas, this is not always done real time. So we keep a local copy of - * the font substitutes now in case of bad timing. - */ - delete const_cast< ::boost::unordered_map<fontID,fontID>* >(mpFontSubstitutes); } void diff --git a/vcl/generic/print/genpspgraphics.cxx b/vcl/generic/print/genpspgraphics.cxx index 542986a23ca6..682eaa1de950 100644 --- a/vcl/generic/print/genpspgraphics.cxx +++ b/vcl/generic/print/genpspgraphics.cxx @@ -912,14 +912,8 @@ void GenPspGraphics::ClearDevFontCache() GlyphCache::GetInstance().ClearFontCache(); } -void GenPspGraphics::GetDevFontSubstList( OutputDevice* pOutDev ) +void GenPspGraphics::GetDevFontSubstList( OutputDevice* ) { - const psp::PrinterInfo& rInfo = psp::PrinterInfoManager::get().getPrinterInfo( m_pJobData->m_aPrinterName ); - if( rInfo.m_bPerformFontSubstitution ) - { - for( boost::unordered_map< OUString, OUString, OUStringHash >::const_iterator it = rInfo.m_aFontSubstitutes.begin(); it != rInfo.m_aFontSubstitutes.end(); ++it ) - pOutDev->ImplAddDevFontSubstitute( it->first, it->second, FONT_SUBSTITUTE_ALWAYS ); - } } void GenPspGraphics::GetFontMetric( ImplFontMetricData *pMetric, int ) diff --git a/vcl/generic/print/printerjob.cxx b/vcl/generic/print/printerjob.cxx index a979d5c66f96..287f545c6bfb 100644 --- a/vcl/generic/print/printerjob.cxx +++ b/vcl/generic/print/printerjob.cxx @@ -971,30 +971,24 @@ bool PrinterJob::writeSetup( osl::File* pFile, const JobData& rJob ) WritePS (pFile, "%%BeginSetup\n%\n"); // download fonts - std::list< OString > aFonts[2]; - m_pGraphics->writeResources( pFile, aFonts[0], aFonts[1] ); + std::list< OString > aFonts; + m_pGraphics->writeResources( pFile, aFonts ); - for( int i = 0; i < 2; i++ ) + if( !aFonts.empty() ) { - if( !aFonts[i].empty() ) + std::list< OString >::const_iterator it = aFonts.begin(); + OStringBuffer aLine( 256 ); + aLine.append( "%%DocumentSuppliedResources: font " ); + aLine.append( *it ); + aLine.append( "\n" ); + WritePS ( pFile, aLine.getStr() ); + while( (++it) != aFonts.end() ) { - std::list< OString >::const_iterator it = aFonts[i].begin(); - OStringBuffer aLine( 256 ); - if( i == 0 ) - aLine.append( "%%DocumentSuppliedResources: font " ); - else - aLine.append( "%%DocumentNeededResources: font " ); + aLine.setLength(0); + aLine.append( "%%+ font " ); aLine.append( *it ); aLine.append( "\n" ); WritePS ( pFile, aLine.getStr() ); - while( (++it) != aFonts[i].end() ) - { - aLine.setLength(0); - aLine.append( "%%+ font " ); - aLine.append( *it ); - aLine.append( "\n" ); - WritePS ( pFile, aLine.getStr() ); - } } } diff --git a/vcl/generic/print/text_gfx.cxx b/vcl/generic/print/text_gfx.cxx index 7dfa13068c4f..313f3b92e1e7 100644 --- a/vcl/generic/print/text_gfx.cxx +++ b/vcl/generic/print/text_gfx.cxx @@ -36,42 +36,39 @@ using namespace psp ; namespace psp { /* container for a font and its helper fonts: - 1st font is the font substitute e.g. helvetica substitutes arial on the printer - 2nd is the font itself - 3rd is a fallback font, usually a font with unicode glyph repertoir (e.g. andale) + 1st is the font itself + 2nd is a fallback font, usually a font with unicode glyph repertoir (e.g. andale) symbol fonts (adobe-fontspecific) may need special glyphmapping (symbol page vc. latin page) */ -class Font3 +class Font2 { private: - #define Font3Size 3 + #define Font2Size 2 - fontID mpFont [Font3Size]; + fontID mpFont [Font2Size]; bool mbSymbol; public: fontID GetFont (int nIdx) const - { return nIdx < Font3Size ? mpFont[nIdx] : -1 ; } + { return nIdx < Font2Size ? mpFont[nIdx] : -1 ; } bool IsSymbolFont () const { return mbSymbol; } - Font3 (const PrinterGfx &rGfx); - ~Font3 () {} + Font2 (const PrinterGfx &rGfx); + ~Font2 () {} }; -Font3::Font3(const PrinterGfx &rGfx) +Font2::Font2(const PrinterGfx &rGfx) { - mpFont[0] = rGfx.getFontSubstitute(); - mpFont[1] = rGfx.GetFontID(); - mpFont[2] = rGfx.getFallbackID(); - // mpFont[2] = rGfx.GetFontID(); - - PrintFontManager &rMgr = PrintFontManager::get(); - mbSymbol = mpFont[1] != -1 ? - rMgr.getFontEncoding(mpFont[1]) == RTL_TEXTENCODING_SYMBOL : false; + mpFont[0] = rGfx.GetFontID(); + mpFont[1] = rGfx.getFallbackID(); + + PrintFontManager &rMgr = PrintFontManager::get(); + mbSymbol = mpFont[0] != -1 ? + rMgr.getFontEncoding(mpFont[0]) == RTL_TEXTENCODING_SYMBOL : false; } } // namespace psp @@ -311,7 +308,7 @@ PrinterGfx::DrawText ( // setup font[substitutes] and map the string into the symbol area in case of // symbol font - Font3 aFont(*this); + Font2 aFont(*this); sal_Unicode *pEffectiveStr; if ( aFont.IsSymbolFont() ) { @@ -610,12 +607,12 @@ PrinterGfx::getCharWidth (sal_Bool b_vert, sal_Unicode n_char, CharacterMetric * } fontID -PrinterGfx::getCharMetric (const Font3 &rFont, sal_Unicode n_char, CharacterMetric *p_bbox) +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 < 3; n++) + for (fontID n = 0; n < Font2Size; n++) { fontID n_font = rFont.GetFont(n); if (n_font != -1) @@ -629,24 +626,10 @@ PrinterGfx::getCharMetric (const Font3 &rFont, sal_Unicode n_char, CharacterMetr return rFont.GetFont(0) != -1 ? rFont.GetFont(0) : rFont.GetFont(1); } -fontID -PrinterGfx::getFontSubstitute () const -{ - if( mpFontSubstitutes ) - { - ::boost::unordered_map< fontID, fontID >::const_iterator it = - mpFontSubstitutes->find( mnFontID ); - if( it != mpFontSubstitutes->end() ) - return it->second; - } - - return -1; -} - sal_Int32 PrinterGfx::GetCharWidth (sal_Unicode nFrom, sal_Unicode nTo, long *pWidthArray) { - Font3 aFont(*this); + Font2 aFont(*this); if (aFont.IsSymbolFont() && (nFrom < 256) && (nTo < 256)) { nFrom += 0xF000; @@ -684,7 +667,7 @@ PrinterGfx::OnEndJob () } void -PrinterGfx::writeResources( osl::File* pFile, std::list< OString >& rSuppliedFonts, std::list< OString >& rNeededFonts ) +PrinterGfx::writeResources( osl::File* pFile, std::list< OString >& rSuppliedFonts ) { // write all type 1 fonts std::list< sal_Int32 >::iterator aFont; @@ -739,11 +722,6 @@ PrinterGfx::writeResources( osl::File* pFile, std::list< OString >& rSuppliedFon // || aIter->GetFontType() == fonttype::Builtin ) { aIter->PSUploadEncoding (pFile, *this); - if( aIter->GetFontType() == fonttype::Builtin ) - rNeededFonts.push_back( - OUStringToOString( - mrFontMgr.getPSName( aIter->GetFontID() ), - RTL_TEXTENCODING_ASCII_US ) ); } } } diff --git a/vcl/inc/generic/printergfx.hxx b/vcl/inc/generic/printergfx.hxx index b2ecf2a86fdd..e56183dc9e20 100644 --- a/vcl/inc/generic/printergfx.hxx +++ b/vcl/inc/generic/printergfx.hxx @@ -117,7 +117,7 @@ public: * forward declarations */ -class Font3; +class Font2; class GlyphSet; class PrinterJob; class PrintFontManager; @@ -171,7 +171,7 @@ struct GraphicsStatus GraphicsStatus(); }; -class Font3; +class Font2; class VCL_DLLPUBLIC PrinterGfx { @@ -242,14 +242,12 @@ private: std::list< GraphicsStatus > maGraphicsStack; GraphicsStatus& currentState() { return maGraphicsStack.front(); } - /* font / font substitution */ - friend class Font3; - const ::boost::unordered_map< fontID, fontID >* mpFontSubstitutes; + /* font */ + friend class Font2; int getCharWidth (sal_Bool b_vert, sal_Unicode n_char, CharacterMetric *p_bbox); - fontID getCharMetric (const Font3 &rFont, sal_Unicode n_char, + fontID getCharMetric (const Font2 &rFont, sal_Unicode n_char, CharacterMetric *p_bbox); - fontID getFontSubstitute () const; fontID getFallbackID () const { return mnFallbackID; } public: @@ -301,7 +299,7 @@ public: void OnEndPage (); void OnEndJob (); - void writeResources( osl::File* pFile, std::list< OString >& rSuppliedFonts, std::list< OString >& rNeededFonts ); + void writeResources( osl::File* pFile, std::list< OString >& rSuppliedFonts ); PrintFontManager& GetFontMgr () { return mrFontMgr; } void drawVerticalizedText (const Point& rPoint, diff --git a/vcl/null/printerinfomanager.cxx b/vcl/null/printerinfomanager.cxx index a480856a0fba..cf0bad94a80b 100644 --- a/vcl/null/printerinfomanager.cxx +++ b/vcl/null/printerinfomanager.cxx @@ -122,11 +122,6 @@ bool PrinterInfoManager::addOrRemovePossible() const return false; } -void PrinterInfoManager::fillFontSubstitutions( PrinterInfo& /* rInfo */ ) const -{ - -} - void PrinterInfoManager::getSystemPrintCommands( std::list< OUString >& /* rCommands */ ) { diff --git a/vcl/unx/generic/printer/printerinfomanager.cxx b/vcl/unx/generic/printer/printerinfomanager.cxx index 4f8f56ec75ca..2f3cedda79cb 100644 --- a/vcl/unx/generic/printer/printerinfomanager.cxx +++ b/vcl/unx/generic/printer/printerinfomanager.cxx @@ -23,7 +23,6 @@ #include <signal.h> #include "cupsmgr.hxx" -#include "vcl/fontmanager.hxx" #include "vcl/strhelper.hxx" #include "unx/saldata.hxx" @@ -232,7 +231,6 @@ void PrinterInfoManager::initialize() // need a parser for the PPDContext. generic printer should do. m_aGlobalDefaults.m_pParser = PPDParser::getParser( OUString( "SGENPRT" ) ); m_aGlobalDefaults.m_aContext.setParser( m_aGlobalDefaults.m_pParser ); - m_aGlobalDefaults.m_bPerformFontSubstitution = true; m_bDisableCUPS = false; if( ! m_aGlobalDefaults.m_pParser ) @@ -293,15 +291,6 @@ void PrinterInfoManager::initialize() if (!aValue.isEmpty()) m_aGlobalDefaults.m_nPDFDevice = aValue.toInt32(); - aValue = aConfig.ReadKey( "PerformFontSubstitution" ); - if (!aValue.isEmpty()) - { - if (!aValue.equals("0") && !aValue.equalsIgnoreAsciiCase("false")) - m_aGlobalDefaults.m_bPerformFontSubstitution = true; - else - m_aGlobalDefaults.m_bPerformFontSubstitution = false; - } - aValue = aConfig.ReadKey( "DisableCUPS" ); if (!aValue.isEmpty()) { @@ -327,19 +316,10 @@ void PrinterInfoManager::initialize() sal_True ); } } - else if (aKey.startsWith("SubstFont_")) - { - aValue = aConfig.ReadKey( aKey ); - m_aGlobalDefaults.m_aFontSubstitutes[ OStringToOUString( aKey.copy( 10 ), RTL_TEXTENCODING_ISO_8859_1 ) ] = OStringToOUString( aValue, RTL_TEXTENCODING_ISO_8859_1 ); - } } - #if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "global settings: fontsubst = %s, %" SAL_PRI_SIZET "u substitutes\n", m_aGlobalDefaults.m_bPerformFontSubstitution ? "true" : "false", m_aGlobalDefaults.m_aFontSubstitutes.size() ); - #endif } } setDefaultPaper( m_aGlobalDefaults.m_aContext ); - fillFontSubstitutions( m_aGlobalDefaults ); // now collect all available printers for( print_dir_it = aDirList.begin(); print_dir_it != aDirList.end(); ++print_dir_it ) @@ -393,11 +373,6 @@ void PrinterInfoManager::initialize() Printer aPrinter; // initialize to global defaults aPrinter.m_aInfo = m_aGlobalDefaults; - // global settings do not default the printer substitution - // list ! the substitution list in there is only used for - // newly created printers - aPrinter.m_aInfo.m_aFontSubstitutes.clear(); - aPrinter.m_aInfo.m_aFontSubstitutions.clear(); aPrinterName = OStringToOUString(aValue.copy(nNamePos+1), RTL_TEXTENCODING_UTF8); @@ -511,15 +486,8 @@ void PrinterInfoManager::initialize() if (!aValue.isEmpty()) aPrinter.m_aInfo.m_nPDFDevice = aValue.toInt32(); - aValue = aConfig.ReadKey( "PerformFontSubstitution" ); - if (!aValue.equals("0") && !aValue.equalsIgnoreAsciiCase("false")) - aPrinter.m_aInfo.m_bPerformFontSubstitution = true; - else - aPrinter.m_aInfo.m_bPerformFontSubstitution = false; - // now iterate over all keys to extract multi key information: // 1. PPDContext information - // 2. Font substitution table for( int nKey = 0; nKey < aConfig.GetKeyCount(); ++nKey ) { OString aKey( aConfig.GetKeyName( nKey ) ); @@ -535,15 +503,9 @@ void PrinterInfoManager::initialize() sal_True ); } } - else if( aKey.startsWith("SubstFont_") ) - { - aValue = aConfig.ReadKey( aKey ); - aPrinter.m_aInfo.m_aFontSubstitutes[ OStringToOUString( aKey.copy( 10 ), RTL_TEXTENCODING_ISO_8859_1 ) ] = OStringToOUString( aValue, RTL_TEXTENCODING_ISO_8859_1 ); - } } setDefaultPaper( aPrinter.m_aInfo.m_aContext ); - fillFontSubstitutions( aPrinter.m_aInfo ); // finally insert printer FileBase::getFileURLFromSystemPath( aFile.PathToFileName(), aPrinter.m_aFile ); @@ -575,8 +537,7 @@ void PrinterInfoManager::initialize() return; // add a default printer for every available print queue - // merge paper and font substitution from default printer, - // all else from global defaults + // merge paper default printer, all else from global defaults PrinterInfo aMergeInfo( m_aGlobalDefaults ); aMergeInfo.m_aDriverName = "SGENPRT"; aMergeInfo.m_aFeatures = "autoqueue"; @@ -584,8 +545,6 @@ void PrinterInfoManager::initialize() if( !m_aDefaultPrinter.isEmpty() ) { PrinterInfo aDefaultInfo( getPrinterInfo( m_aDefaultPrinter ) ); - aMergeInfo.m_bPerformFontSubstitution = aDefaultInfo.m_bPerformFontSubstitution; - fillFontSubstitutions( aMergeInfo ); const PPDKey* pDefKey = aDefaultInfo.m_pParser->getKey( OUString( "PageSize" ) ); const PPDKey* pMergeKey = aMergeInfo.m_pParser->getKey( OUString( "PageSize" ) ); @@ -657,8 +616,6 @@ void PrinterInfoManager::changePrinterInfo( const OUString& rPrinter, const Prin if( it != m_aPrinters.end() ) { it->second.m_aInfo = rNewInfo; - // recalculate font substitutions - fillFontSubstitutions( it->second.m_aInfo ); it->second.m_bModified = true; writePrinterConfig(); } @@ -804,16 +761,6 @@ bool PrinterInfoManager::writePrinterConfig() pConfig->WriteKey(aKey.makeStringAndClear(), aValue.makeStringAndClear()); } } - - // write font substitution table - pConfig->WriteKey( "PerformFontSubstitution", it->second.m_aInfo.m_bPerformFontSubstitution ? "true" : "false" ); - for( ::boost::unordered_map< OUString, OUString, OUStringHash >::const_iterator subst = it->second.m_aInfo.m_aFontSubstitutes.begin(); - subst != it->second.m_aInfo.m_aFontSubstitutes.end(); ++subst ) - { - OStringBuffer aKey("SubstFont_"); - aKey.append(OUStringToOString(subst->first, RTL_TEXTENCODING_ISO_8859_1)); - pConfig->WriteKey( aKey.makeStringAndClear(), OUStringToOString( subst->second, RTL_TEXTENCODING_ISO_8859_1 ) ); - } } } @@ -841,7 +788,6 @@ bool PrinterInfoManager::addPrinter( const OUString& rPrinterName, const OUStrin aPrinter.m_aInfo.m_aContext.setParser( pParser ); aPrinter.m_aInfo.m_aPrinterName = rPrinterName; - fillFontSubstitutions( aPrinter.m_aInfo ); // merge PPD values with global defaults for( int nPPDValueModified = 0; nPPDValueModified < m_aGlobalDefaults.m_aContext.countValuesModified(); nPPDValueModified++ ) { @@ -962,103 +908,6 @@ bool PrinterInfoManager::addOrRemovePossible() const // ----------------------------------------------------------------- -void PrinterInfoManager::fillFontSubstitutions( PrinterInfo& rInfo ) const -{ - PrintFontManager& rFontManager( PrintFontManager::get() ); - rInfo.m_aFontSubstitutions.clear(); - - if( ! rInfo.m_bPerformFontSubstitution || - ! rInfo.m_aFontSubstitutes.size() ) - return; - - ::std::list< FastPrintFontInfo > aFonts; - ::boost::unordered_map< OUString, ::std::list< FastPrintFontInfo >, OUStringHash > aPrinterFonts; - rFontManager.getFontListWithFastInfo( aFonts, rInfo.m_pParser ); - - // get builtin fonts - ::std::list< FastPrintFontInfo >::const_iterator it; - for( it = aFonts.begin(); it != aFonts.end(); ++it ) - if( it->m_eType == fonttype::Builtin ) - aPrinterFonts[ it->m_aFamilyName.toAsciiLowerCase() ].push_back( *it ); - - // map lower case, so build a local copy of the font substitutions - ::boost::unordered_map< OUString, OUString, OUStringHash > aSubstitutions; - ::boost::unordered_map< OUString, OUString, OUStringHash >::const_iterator subst; - for( subst = rInfo.m_aFontSubstitutes.begin(); subst != rInfo.m_aFontSubstitutes.end(); ++subst ) - { - OUString aFamily( subst->first.toAsciiLowerCase() ); - // first look if there is a builtin of this family - // in this case override the substitution table - if( aPrinterFonts.find( aFamily ) != aPrinterFonts.end() ) - aSubstitutions[ aFamily ] = aFamily; - else - aSubstitutions[ aFamily ] = subst->second.toAsciiLowerCase(); - } - - - // now find substitutions - for( it = aFonts.begin(); it != aFonts.end(); ++it ) - { - if( it->m_eType != fonttype::Builtin ) - { - OUString aFamily( it->m_aFamilyName.toAsciiLowerCase() ); - subst = aSubstitutions.find( aFamily ); - if( subst != aSubstitutions.end() ) - { - // search a substitution - const ::std::list< FastPrintFontInfo >& rBuiltins( aPrinterFonts[ aSubstitutions[ aFamily ] ] ); - ::std::list< FastPrintFontInfo >::const_iterator builtin; - int nLastMatch = -10000; - fontID nSubstitute = -1; - for( builtin = rBuiltins.begin(); builtin != rBuiltins.end(); ++builtin ) - { - int nMatch = 0; - int nDiff; - if( builtin->m_eItalic == it->m_eItalic ) - nMatch += 8000; - - nDiff = builtin->m_eWeight - it->m_eWeight; - nDiff = nDiff < 0 ? -nDiff : nDiff; - nMatch += 4000 - 1000*nDiff; - - nDiff = builtin->m_eWidth - it->m_eWidth; - nDiff = nDiff < 0 ? -nDiff : nDiff; - nMatch += 2000 - 500*nDiff; - - if( nMatch > nLastMatch ) - { - nLastMatch = nMatch; - nSubstitute = builtin->m_nID; - } - } - if( nSubstitute != -1 ) - { - rInfo.m_aFontSubstitutions[ it->m_nID ] = nSubstitute; -#if OSL_DEBUG_LEVEL > 2 - FastPrintFontInfo aInfo; - rFontManager.getFontFastInfo( nSubstitute, aInfo ); - fprintf( stderr, - "substitute %s %s %d %d\n" - " -> %s %s %d %d\n", - OUStringToOString( it->m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr(), - it->m_eItalic == ITALIC_NONE ? "r" : it->m_eItalic == ITALIC_OBLIQUE ? "o" : it->m_eItalic == ITALIC_NORMAL ? "i" : "u", - it->m_eWeight, - it->m_eWidth, - - OUStringToOString( aInfo.m_aFamilyName, RTL_TEXTENCODING_ISO_8859_1 ).getStr(), - aInfo.m_eItalic == ITALIC_NONE ? "r" : aInfo.m_eItalic == ITALIC_OBLIQUE ? "o" : aInfo.m_eItalic == ITALIC_NORMAL ? "i" : "u", - aInfo.m_eWeight, - aInfo.m_eWidth - ); -#endif - } - } - } - } -} - -// ----------------------------------------------------------------- - void PrinterInfoManager::getSystemPrintCommands( std::list< OUString >& rCommands ) { if( m_pQueueInfo && m_pQueueInfo->hasChanged() ) |