PdfFont* PdfFontCache::GetDuplicateFontType1( PdfFont * pFont, const char* pszSuffix ) { TCISortedFontList it = m_vecFonts.begin(); std::string id = pFont->GetIdentifier().GetName(); id += pszSuffix; // Search if the object is a cached normal font while( it != m_vecFonts.end() ) { if( (*it).m_pFont->GetIdentifier() == id ) return (*it).m_pFont; ++it; } // Search if the object is a cached font subset it = m_vecFontSubsets.begin(); while( it != m_vecFontSubsets.end() ) { if( (*it).m_pFont->GetIdentifier() == id ) return (*it).m_pFont; ++it; } // Create a copy of the font PODOFO_ASSERT( pFont->GetFontMetrics()->GetFontType() == ePdfFontType_Type1Pfb ); PdfFontMetrics *pMetrics = new PdfFontMetrics( &m_ftLibrary, pFont->GetFontMetrics()->GetFilename() ); PdfFont* newFont = new PdfFontType1( static_cast<PdfFontType1 *>(pFont), pMetrics, pszSuffix, m_pParent ); if( newFont ) { std::string name = newFont->GetFontMetrics()->GetFontname(); name += pszSuffix; TFontCacheElement element; element.m_pFont = newFont; element.m_bBold = newFont->IsBold(); element.m_bItalic = newFont->IsItalic(); element.m_sFontName = name; element.m_pEncoding = newFont->GetEncoding(); m_vecFonts .push_back( element ); // Now sort the font list std::sort( m_vecFonts.begin(), m_vecFonts.end() ); } return newFont; }
PdfFont* PdfFontCache::GetFont( PdfObject* pObject ) { TCISortedFontList it = m_vecFonts.begin(); const PdfReference & ref = pObject->Reference(); // Search if the object is a cached normal font while( it != m_vecFonts.end() ) { if( (*it).m_pFont->GetObject()->Reference() == ref ) return (*it).m_pFont; ++it; } // Search if the object is a cached font subset it = m_vecFontSubsets.begin(); while( it != m_vecFontSubsets.end() ) { if( (*it).m_pFont->GetObject()->Reference() == ref ) return (*it).m_pFont; ++it; } // Create a new font PdfFont* pFont = PdfFontFactory::CreateFont( &m_ftLibrary, pObject ); if( pFont ) { TFontCacheElement element; element.m_pFont = pFont; element.m_bBold = pFont->IsBold(); element.m_bItalic = pFont->IsItalic(); element.m_sFontName = pFont->GetFontMetrics()->GetFontname(); element.m_pEncoding = NULL; m_vecFonts .push_back( element ); // Now sort the font list std::sort( m_vecFonts.begin(), m_vecFonts.end() ); } return pFont; }
PdfFont* PdfFontCache::CreateFontObject( TISortedFontList itSorted, TSortedFontList & rvecContainer, PdfFontMetrics* pMetrics, bool bEmbedd, bool bBold, bool bItalic, const char* pszFontName, const PdfEncoding * const pEncoding ) { PdfFont* pFont; try { int nFlags = ePdfFont_Normal; if( bEmbedd ) nFlags |= ePdfFont_Embedded; if( bBold ) nFlags |= ePdfFont_Bold; if( bItalic ) nFlags |= ePdfFont_Italic; pFont = PdfFontFactory::CreateFontObject( pMetrics, nFlags, pEncoding, m_pParent ); if( pFont ) { TFontCacheElement element; element.m_pFont = pFont; element.m_bBold = pFont->IsBold(); element.m_bItalic = pFont->IsItalic(); element.m_sFontName = pszFontName; element.m_pEncoding = pEncoding; // Do a sorted insert, so no need to sort again rvecContainer.insert( itSorted, element ); } } catch( PdfError & e ) { e.AddToCallstack( __FILE__, __LINE__ ); e.PrintErrorMsg(); PdfError::LogMessage( eLogSeverity_Error, "Cannot initialize font: %s\n", pszFontName ? pszFontName : "" ); return NULL; } return pFont; }