19f62ea84SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 39f62ea84SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 49f62ea84SAndrew Rist * or more contributor license agreements. See the NOTICE file 59f62ea84SAndrew Rist * distributed with this work for additional information 69f62ea84SAndrew Rist * regarding copyright ownership. The ASF licenses this file 79f62ea84SAndrew Rist * to you under the Apache License, Version 2.0 (the 89f62ea84SAndrew Rist * "License"); you may not use this file except in compliance 99f62ea84SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 119f62ea84SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 139f62ea84SAndrew Rist * Unless required by applicable law or agreed to in writing, 149f62ea84SAndrew Rist * software distributed under the License is distributed on an 159f62ea84SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169f62ea84SAndrew Rist * KIND, either express or implied. See the License for the 179f62ea84SAndrew Rist * specific language governing permissions and limitations 189f62ea84SAndrew Rist * under the License. 19cdf0e10cSrcweir * 209f62ea84SAndrew Rist *************************************************************/ 219f62ea84SAndrew Rist 229f62ea84SAndrew Rist # 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include <basegfx/range/b2drange.hxx> 25cdf0e10cSrcweir #include <basegfx/range/b2irange.hxx> 26cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygon.hxx> 27cdf0e10cSrcweir 28cdf0e10cSrcweir #include <basebmp/scanlineformats.hxx> 29cdf0e10cSrcweir 30cdf0e10cSrcweir #include <tools/debug.hxx> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 2 33cdf0e10cSrcweir #include <basebmp/debug.hxx> 34cdf0e10cSrcweir #endif 35cdf0e10cSrcweir 36cdf0e10cSrcweir #include <outfont.hxx> 37cdf0e10cSrcweir #include <glyphcache.hxx> 38cdf0e10cSrcweir #include <impfont.hxx> 39cdf0e10cSrcweir 40cdf0e10cSrcweir #include "svpgdi.hxx" 41cdf0e10cSrcweir #include "svpbmp.hxx" 42cdf0e10cSrcweir #include "svppspgraphics.hxx" 43cdf0e10cSrcweir 44cdf0e10cSrcweir using namespace basegfx; 45cdf0e10cSrcweir using namespace basebmp; 46cdf0e10cSrcweir 47cdf0e10cSrcweir // =========================================================================== 48cdf0e10cSrcweir 49cdf0e10cSrcweir class SvpGlyphPeer 50cdf0e10cSrcweir : public GlyphCachePeer 51cdf0e10cSrcweir { 52cdf0e10cSrcweir public: 53cdf0e10cSrcweir SvpGlyphPeer() {} 54cdf0e10cSrcweir 55cdf0e10cSrcweir BitmapDeviceSharedPtr GetGlyphBmp( ServerFont&, int nGlyphIndex, 56cdf0e10cSrcweir sal_uInt32 nBmpFormat, B2IPoint& rTargetPos ); 57cdf0e10cSrcweir 58cdf0e10cSrcweir protected: 59cdf0e10cSrcweir virtual void RemovingFont( ServerFont& ); 60cdf0e10cSrcweir virtual void RemovingGlyph( ServerFont&, GlyphData&, int nGlyphIndex ); 61cdf0e10cSrcweir 62cdf0e10cSrcweir class SvpGcpHelper 63cdf0e10cSrcweir { 64cdf0e10cSrcweir public: 65cdf0e10cSrcweir RawBitmap maRawBitmap; 66cdf0e10cSrcweir BitmapDeviceSharedPtr maBitmapDev; 67cdf0e10cSrcweir }; 68cdf0e10cSrcweir }; 69cdf0e10cSrcweir 70cdf0e10cSrcweir // =========================================================================== 71cdf0e10cSrcweir 72cdf0e10cSrcweir class SvpGlyphCache : public GlyphCache 73cdf0e10cSrcweir { 74cdf0e10cSrcweir public: 75cdf0e10cSrcweir SvpGlyphPeer& GetPeer() { return reinterpret_cast<SvpGlyphPeer&>( mrPeer ); } 76cdf0e10cSrcweir static SvpGlyphCache& GetInstance(); 77cdf0e10cSrcweir private: 78cdf0e10cSrcweir SvpGlyphCache( SvpGlyphPeer& rPeer ) : GlyphCache( rPeer) {} 79cdf0e10cSrcweir }; 80cdf0e10cSrcweir 81cdf0e10cSrcweir //-------------------------------------------------------------------------- 82cdf0e10cSrcweir 83cdf0e10cSrcweir SvpGlyphCache& SvpGlyphCache::GetInstance() 84cdf0e10cSrcweir { 85cdf0e10cSrcweir static SvpGlyphPeer aSvpGlyphPeer; 86cdf0e10cSrcweir static SvpGlyphCache aGC( aSvpGlyphPeer ); 87cdf0e10cSrcweir return aGC; 88cdf0e10cSrcweir } 89cdf0e10cSrcweir 90cdf0e10cSrcweir // =========================================================================== 91cdf0e10cSrcweir 92cdf0e10cSrcweir BitmapDeviceSharedPtr SvpGlyphPeer::GetGlyphBmp( ServerFont& rServerFont, 93cdf0e10cSrcweir int nGlyphIndex, sal_uInt32 nBmpFormat, B2IPoint& rTargetPos ) 94cdf0e10cSrcweir { 95cdf0e10cSrcweir GlyphData& rGlyphData = rServerFont.GetGlyphData( nGlyphIndex ); 96cdf0e10cSrcweir SvpGcpHelper* pGcpHelper = (SvpGcpHelper*)rGlyphData.ExtDataRef().mpData; 97cdf0e10cSrcweir 98cdf0e10cSrcweir // nothing to do if the GlyphPeer hasn't allocated resources for the glyph 99cdf0e10cSrcweir if( rGlyphData.ExtDataRef().meInfo != sal::static_int_cast<int>(nBmpFormat) ) 100cdf0e10cSrcweir { 101cdf0e10cSrcweir if( rGlyphData.ExtDataRef().meInfo == Format::NONE ) 102cdf0e10cSrcweir pGcpHelper = new SvpGcpHelper; 103cdf0e10cSrcweir RawBitmap& rRawBitmap = pGcpHelper->maRawBitmap; 104cdf0e10cSrcweir 105cdf0e10cSrcweir // get glyph bitmap in matching format 106cdf0e10cSrcweir bool bFound = false; 107cdf0e10cSrcweir switch( nBmpFormat ) 108cdf0e10cSrcweir { 109cdf0e10cSrcweir case Format::ONE_BIT_LSB_GREY: 110cdf0e10cSrcweir bFound = rServerFont.GetGlyphBitmap1( nGlyphIndex, pGcpHelper->maRawBitmap ); 111cdf0e10cSrcweir break; 112cdf0e10cSrcweir case Format::EIGHT_BIT_GREY: 113cdf0e10cSrcweir bFound = rServerFont.GetGlyphBitmap8( nGlyphIndex, pGcpHelper->maRawBitmap ); 114cdf0e10cSrcweir break; 115cdf0e10cSrcweir default: 116cdf0e10cSrcweir DBG_ERROR( "SVP GCP::GetGlyphBmp(): illegal scanline format"); 117cdf0e10cSrcweir // fall back to black&white mask 118cdf0e10cSrcweir nBmpFormat = Format::ONE_BIT_LSB_GREY; 119cdf0e10cSrcweir bFound = false; 120cdf0e10cSrcweir break; 121cdf0e10cSrcweir } 122cdf0e10cSrcweir 123cdf0e10cSrcweir // return .notdef glyph if needed 124cdf0e10cSrcweir if( !bFound && (nGlyphIndex != 0) ) 125cdf0e10cSrcweir { 126cdf0e10cSrcweir delete pGcpHelper; 127cdf0e10cSrcweir return GetGlyphBmp( rServerFont, 0, nBmpFormat, rTargetPos ); 128cdf0e10cSrcweir } 129cdf0e10cSrcweir 130cdf0e10cSrcweir // construct alpha mask from raw bitmap 131cdf0e10cSrcweir const B2IVector aSize( rRawBitmap.mnScanlineSize, rRawBitmap.mnHeight ); 132cdf0e10cSrcweir if( aSize.getX() && aSize.getY() ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir static PaletteMemorySharedVector aDummyPAL; 135cdf0e10cSrcweir RawMemorySharedArray aRawPtr( rRawBitmap.mpBits ); 136cdf0e10cSrcweir pGcpHelper->maBitmapDev = createBitmapDevice( aSize, true, nBmpFormat, aRawPtr, aDummyPAL ); 137cdf0e10cSrcweir } 138cdf0e10cSrcweir 139cdf0e10cSrcweir rServerFont.SetExtended( nBmpFormat, (void*)pGcpHelper ); 140cdf0e10cSrcweir } 141cdf0e10cSrcweir 142cdf0e10cSrcweir rTargetPos += B2IPoint( pGcpHelper->maRawBitmap.mnXOffset, pGcpHelper->maRawBitmap.mnYOffset ); 143cdf0e10cSrcweir return pGcpHelper->maBitmapDev; 144cdf0e10cSrcweir } 145cdf0e10cSrcweir 146cdf0e10cSrcweir //-------------------------------------------------------------------------- 147cdf0e10cSrcweir 148cdf0e10cSrcweir void SvpGlyphPeer::RemovingFont( ServerFont& ) 149cdf0e10cSrcweir { 150cdf0e10cSrcweir // nothing to do: no font resources held in SvpGlyphPeer 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir //-------------------------------------------------------------------------- 154cdf0e10cSrcweir 155cdf0e10cSrcweir void SvpGlyphPeer::RemovingGlyph( ServerFont&, GlyphData& rGlyphData, int /*nGlyphIndex*/ ) 156cdf0e10cSrcweir { 157cdf0e10cSrcweir if( rGlyphData.ExtDataRef().mpData != Format::NONE ) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir // release the glyph related resources 160cdf0e10cSrcweir DBG_ASSERT( (rGlyphData.ExtDataRef().meInfo <= Format::MAX), "SVP::RG() invalid alpha format" ); 161cdf0e10cSrcweir SvpGcpHelper* pGcpHelper = (SvpGcpHelper*)rGlyphData.ExtDataRef().mpData; 162cdf0e10cSrcweir delete[] pGcpHelper->maRawBitmap.mpBits; 163cdf0e10cSrcweir delete pGcpHelper; 164cdf0e10cSrcweir } 165cdf0e10cSrcweir } 166cdf0e10cSrcweir 167cdf0e10cSrcweir // =========================================================================== 168cdf0e10cSrcweir 169cdf0e10cSrcweir // PspKernInfo allows on-demand-querying of psprint provided kerning info (#i29881#) 170cdf0e10cSrcweir class PspKernInfo : public ExtraKernInfo 171cdf0e10cSrcweir { 172cdf0e10cSrcweir public: 173cdf0e10cSrcweir PspKernInfo( int nFontId ) : ExtraKernInfo(nFontId) {} 174cdf0e10cSrcweir protected: 175cdf0e10cSrcweir virtual void Initialize() const; 176cdf0e10cSrcweir }; 177cdf0e10cSrcweir 178cdf0e10cSrcweir //-------------------------------------------------------------------------- 179cdf0e10cSrcweir 180cdf0e10cSrcweir void PspKernInfo::Initialize() const 181cdf0e10cSrcweir { 182cdf0e10cSrcweir mbInitialized = true; 183cdf0e10cSrcweir 184cdf0e10cSrcweir // get the kerning pairs from psprint 185cdf0e10cSrcweir const psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); 186cdf0e10cSrcweir typedef std::list< psp::KernPair > PspKernPairs; 187cdf0e10cSrcweir const PspKernPairs& rKernPairs = rMgr.getKernPairs( mnFontId ); 188cdf0e10cSrcweir if( rKernPairs.empty() ) 189cdf0e10cSrcweir return; 190cdf0e10cSrcweir 191cdf0e10cSrcweir // feed psprint's kerning list into a lookup-friendly container 192*75c24b65SHerbert Dürr maUnicodeKernPairs.rehash( rKernPairs.size() ); 193cdf0e10cSrcweir PspKernPairs::const_iterator it = rKernPairs.begin(); 194cdf0e10cSrcweir for(; it != rKernPairs.end(); ++it ) 195cdf0e10cSrcweir { 196cdf0e10cSrcweir ImplKernPairData aKernPair = { it->first, it->second, it->kern_x }; 197cdf0e10cSrcweir maUnicodeKernPairs.insert( aKernPair ); 198cdf0e10cSrcweir } 199cdf0e10cSrcweir } 200cdf0e10cSrcweir 201cdf0e10cSrcweir // =========================================================================== 202cdf0e10cSrcweir 203cdf0e10cSrcweir sal_uInt16 SvpSalGraphics::SetFont( ImplFontSelectData* pIFSD, int nFallbackLevel ) 204cdf0e10cSrcweir { 205cdf0e10cSrcweir // release all no longer needed font resources 206cdf0e10cSrcweir for( int i = nFallbackLevel; i < MAX_FALLBACK; ++i ) 207cdf0e10cSrcweir { 208cdf0e10cSrcweir if( m_pServerFont[i] != NULL ) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir // old server side font is no longer referenced 211cdf0e10cSrcweir SvpGlyphCache::GetInstance().UncacheFont( *m_pServerFont[i] ); 212cdf0e10cSrcweir m_pServerFont[i] = NULL; 213cdf0e10cSrcweir } 214cdf0e10cSrcweir } 215cdf0e10cSrcweir 216cdf0e10cSrcweir // return early if there is no new font 217cdf0e10cSrcweir if( !pIFSD ) 218cdf0e10cSrcweir return 0; 219cdf0e10cSrcweir 220cdf0e10cSrcweir // handle the request for a non-native X11-font => use the GlyphCache 221cdf0e10cSrcweir ServerFont* pServerFont = SvpGlyphCache::GetInstance().CacheFont( *pIFSD ); 222cdf0e10cSrcweir if( !pServerFont ) 223cdf0e10cSrcweir return SAL_SETFONT_BADFONT; 224cdf0e10cSrcweir 225cdf0e10cSrcweir // check selected font 226cdf0e10cSrcweir if( !pServerFont->TestFont() ) 227cdf0e10cSrcweir { 228cdf0e10cSrcweir SvpGlyphCache::GetInstance().UncacheFont( *pServerFont ); 229cdf0e10cSrcweir return SAL_SETFONT_BADFONT; 230cdf0e10cSrcweir } 231cdf0e10cSrcweir 232cdf0e10cSrcweir // update SalGraphics font settings 233cdf0e10cSrcweir m_pServerFont[ nFallbackLevel ] = pServerFont; 234cdf0e10cSrcweir return SAL_SETFONT_USEDRAWTEXTARRAY; 235cdf0e10cSrcweir } 236cdf0e10cSrcweir 237cdf0e10cSrcweir // --------------------------------------------------------------------------- 238cdf0e10cSrcweir 239cdf0e10cSrcweir void SvpSalGraphics::GetFontMetric( ImplFontMetricData* pMetric, int nFallbackLevel ) 240cdf0e10cSrcweir { 241cdf0e10cSrcweir if( nFallbackLevel >= MAX_FALLBACK ) 242cdf0e10cSrcweir return; 243cdf0e10cSrcweir 244cdf0e10cSrcweir if( m_pServerFont[nFallbackLevel] != NULL ) 245cdf0e10cSrcweir { 246cdf0e10cSrcweir long rDummyFactor; 247cdf0e10cSrcweir m_pServerFont[nFallbackLevel]->FetchFontMetric( *pMetric, rDummyFactor ); 248cdf0e10cSrcweir } 249cdf0e10cSrcweir } 250cdf0e10cSrcweir 251cdf0e10cSrcweir // --------------------------------------------------------------------------- 252cdf0e10cSrcweir 253cdf0e10cSrcweir sal_uLong SvpSalGraphics::GetKernPairs( sal_uLong nPairs, ImplKernPairData* pKernPairs ) 254cdf0e10cSrcweir { 255cdf0e10cSrcweir sal_uLong nGotPairs = 0; 256cdf0e10cSrcweir 257cdf0e10cSrcweir if( m_pServerFont[0] != NULL ) 258cdf0e10cSrcweir { 259cdf0e10cSrcweir ImplKernPairData* pTmpKernPairs = NULL; 260cdf0e10cSrcweir nGotPairs = m_pServerFont[0]->GetKernPairs( &pTmpKernPairs ); 261cdf0e10cSrcweir for( sal_uLong i = 0; i < nPairs && i < nGotPairs; ++i ) 262cdf0e10cSrcweir pKernPairs[ i ] = pTmpKernPairs[ i ]; 263cdf0e10cSrcweir delete[] pTmpKernPairs; 264cdf0e10cSrcweir } 265cdf0e10cSrcweir 266cdf0e10cSrcweir return nGotPairs; 267cdf0e10cSrcweir } 268cdf0e10cSrcweir 269cdf0e10cSrcweir // --------------------------------------------------------------------------- 270cdf0e10cSrcweir 271cdf0e10cSrcweir const ImplFontCharMap* SvpSalGraphics::GetImplFontCharMap() const 272cdf0e10cSrcweir { 273cdf0e10cSrcweir if( !m_pServerFont[0] ) 274cdf0e10cSrcweir return NULL; 275cdf0e10cSrcweir 276cdf0e10cSrcweir const ImplFontCharMap* pIFCMap = m_pServerFont[0]->GetImplFontCharMap(); 277cdf0e10cSrcweir return pIFCMap; 278cdf0e10cSrcweir } 279cdf0e10cSrcweir 280cdf0e10cSrcweir // --------------------------------------------------------------------------- 281cdf0e10cSrcweir 282cdf0e10cSrcweir void SvpSalGraphics::GetDevFontList( ImplDevFontList* pDevFontList ) 283cdf0e10cSrcweir { 284cdf0e10cSrcweir GlyphCache& rGC = SvpGlyphCache::GetInstance(); 285cdf0e10cSrcweir 286cdf0e10cSrcweir psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); 287cdf0e10cSrcweir psp::FastPrintFontInfo aInfo; 288cdf0e10cSrcweir ::std::list< psp::fontID > aList; 289cdf0e10cSrcweir rMgr.getFontList( aList ); 290cdf0e10cSrcweir ::std::list< psp::fontID >::iterator it; 291cdf0e10cSrcweir for( it = aList.begin(); it != aList.end(); ++it ) 292cdf0e10cSrcweir { 293cdf0e10cSrcweir if( !rMgr.getFontFastInfo( *it, aInfo ) ) 294cdf0e10cSrcweir continue; 295cdf0e10cSrcweir 296cdf0e10cSrcweir // the GlyphCache must not bother with builtin fonts because 297cdf0e10cSrcweir // it cannot access or use them anyway 298cdf0e10cSrcweir if( aInfo.m_eType == psp::fonttype::Builtin ) 299cdf0e10cSrcweir continue; 300cdf0e10cSrcweir 301cdf0e10cSrcweir // normalize face number to the GlyphCache 302cdf0e10cSrcweir int nFaceNum = rMgr.getFontFaceNumber( aInfo.m_nID ); 303cdf0e10cSrcweir if( nFaceNum < 0 ) 304cdf0e10cSrcweir nFaceNum = 0; 305cdf0e10cSrcweir 306cdf0e10cSrcweir // for fonts where extra kerning info can be provided on demand 307cdf0e10cSrcweir // an ExtraKernInfo object is supplied 308cdf0e10cSrcweir const ExtraKernInfo* pExtraKernInfo = NULL; 309cdf0e10cSrcweir if( aInfo.m_eType == psp::fonttype::Type1 ) 310cdf0e10cSrcweir pExtraKernInfo = new PspKernInfo( *it ); 311cdf0e10cSrcweir 312cdf0e10cSrcweir // inform GlyphCache about this font provided by the PsPrint subsystem 313cdf0e10cSrcweir ImplDevFontAttributes aDFA = PspGraphics::Info2DevFontAttributes( aInfo ); 314cdf0e10cSrcweir aDFA.mnQuality += 4096; 315cdf0e10cSrcweir const rtl::OString& rFileName = rMgr.getFontFileSysPath( aInfo.m_nID ); 316cdf0e10cSrcweir rGC.AddFontFile( rFileName, nFaceNum, aInfo.m_nID, aDFA, pExtraKernInfo ); 317cdf0e10cSrcweir } 318cdf0e10cSrcweir 319cdf0e10cSrcweir // announce glyphcache fonts 320cdf0e10cSrcweir rGC.AnnounceFonts( pDevFontList ); 321cdf0e10cSrcweir } 322cdf0e10cSrcweir 323cdf0e10cSrcweir // --------------------------------------------------------------------------- 324cdf0e10cSrcweir 325cdf0e10cSrcweir void SvpSalGraphics::GetDevFontSubstList( OutputDevice* ) 326cdf0e10cSrcweir {} 327cdf0e10cSrcweir 328cdf0e10cSrcweir // --------------------------------------------------------------------------- 329cdf0e10cSrcweir 330cdf0e10cSrcweir bool SvpSalGraphics::AddTempDevFont( ImplDevFontList*, 331cdf0e10cSrcweir const String&, const String& ) 332cdf0e10cSrcweir { 333cdf0e10cSrcweir return false; 334cdf0e10cSrcweir } 335cdf0e10cSrcweir 336cdf0e10cSrcweir // --------------------------------------------------------------------------- 337cdf0e10cSrcweir 338cdf0e10cSrcweir sal_Bool SvpSalGraphics::CreateFontSubset( 339cdf0e10cSrcweir const rtl::OUString& rToFile, 340cdf0e10cSrcweir const ImplFontData* pFont, 341cdf0e10cSrcweir sal_Int32* pGlyphIDs, 342cdf0e10cSrcweir sal_uInt8* pEncoding, 343cdf0e10cSrcweir sal_Int32* pWidths, 344cdf0e10cSrcweir int nGlyphCount, 345cdf0e10cSrcweir FontSubsetInfo& rInfo 346cdf0e10cSrcweir ) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir // in this context the pFont->GetFontId() is a valid PSP 349cdf0e10cSrcweir // font since they are the only ones left after the PDF 350cdf0e10cSrcweir // export has filtered its list of subsettable fonts (for 351cdf0e10cSrcweir // which this method was created). The correct way would 352cdf0e10cSrcweir // be to have the GlyphCache search for the ImplFontData pFont 353cdf0e10cSrcweir psp::fontID aFont = pFont->GetFontId(); 354cdf0e10cSrcweir 355cdf0e10cSrcweir psp::PrintFontManager& rMgr = psp::PrintFontManager::get(); 356cdf0e10cSrcweir bool bSuccess = rMgr.createFontSubset( rInfo, 357cdf0e10cSrcweir aFont, 358cdf0e10cSrcweir rToFile, 359cdf0e10cSrcweir pGlyphIDs, 360cdf0e10cSrcweir pEncoding, 361cdf0e10cSrcweir pWidths, 362cdf0e10cSrcweir nGlyphCount ); 363cdf0e10cSrcweir return bSuccess; 364cdf0e10cSrcweir } 365cdf0e10cSrcweir 366cdf0e10cSrcweir // --------------------------------------------------------------------------- 367cdf0e10cSrcweir 368cdf0e10cSrcweir const Ucs2SIntMap* SvpSalGraphics::GetFontEncodingVector( const ImplFontData* pFont, const Ucs2OStrMap** pNonEncoded ) 369cdf0e10cSrcweir { 370cdf0e10cSrcweir // in this context the pFont->GetFontId() is a valid PSP 371cdf0e10cSrcweir // font since they are the only ones left after the PDF 372cdf0e10cSrcweir // export has filtered its list of subsettable fonts (for 373cdf0e10cSrcweir // which this method was created). The correct way would 374cdf0e10cSrcweir // be to have the GlyphCache search for the ImplFontData pFont 375cdf0e10cSrcweir psp::fontID aFont = pFont->GetFontId(); 376cdf0e10cSrcweir return PspGraphics::DoGetFontEncodingVector( aFont, pNonEncoded ); 377cdf0e10cSrcweir } 378cdf0e10cSrcweir 379cdf0e10cSrcweir // --------------------------------------------------------------------------- 380cdf0e10cSrcweir 381cdf0e10cSrcweir const void* SvpSalGraphics::GetEmbedFontData( 382cdf0e10cSrcweir const ImplFontData* pFont, 383cdf0e10cSrcweir const sal_Ucs* pUnicodes, 384cdf0e10cSrcweir sal_Int32* pWidths, 385cdf0e10cSrcweir FontSubsetInfo& rInfo, 386cdf0e10cSrcweir long* pDataLen 387cdf0e10cSrcweir ) 388cdf0e10cSrcweir { 389cdf0e10cSrcweir // in this context the pFont->GetFontId() is a valid PSP 390cdf0e10cSrcweir // font since they are the only ones left after the PDF 391cdf0e10cSrcweir // export has filtered its list of subsettable fonts (for 392cdf0e10cSrcweir // which this method was created). The correct way would 393cdf0e10cSrcweir // be to have the GlyphCache search for the ImplFontData pFont 394cdf0e10cSrcweir psp::fontID aFont = pFont->GetFontId(); 395cdf0e10cSrcweir return PspGraphics::DoGetEmbedFontData( aFont, pUnicodes, pWidths, rInfo, pDataLen ); 396cdf0e10cSrcweir } 397cdf0e10cSrcweir 398cdf0e10cSrcweir // --------------------------------------------------------------------------- 399cdf0e10cSrcweir 400cdf0e10cSrcweir void SvpSalGraphics::FreeEmbedFontData( const void* pData, long nLen ) 401cdf0e10cSrcweir { 402cdf0e10cSrcweir PspGraphics::DoFreeEmbedFontData( pData, nLen ); 403cdf0e10cSrcweir } 404cdf0e10cSrcweir 405cdf0e10cSrcweir void SvpSalGraphics::GetGlyphWidths( const ImplFontData* pFont, 406cdf0e10cSrcweir bool bVertical, 407cdf0e10cSrcweir Int32Vector& rWidths, 408cdf0e10cSrcweir Ucs2UIntMap& rUnicodeEnc ) 409cdf0e10cSrcweir { 410cdf0e10cSrcweir // in this context the pFont->GetFontId() is a valid PSP 411cdf0e10cSrcweir // font since they are the only ones left after the PDF 412cdf0e10cSrcweir // export has filtered its list of subsettable fonts (for 413cdf0e10cSrcweir // which this method was created). The correct way would 414cdf0e10cSrcweir // be to have the GlyphCache search for the ImplFontData pFont 415cdf0e10cSrcweir psp::fontID aFont = pFont->GetFontId(); 416cdf0e10cSrcweir PspGraphics::DoGetGlyphWidths( aFont, bVertical, rWidths, rUnicodeEnc ); 417cdf0e10cSrcweir } 418cdf0e10cSrcweir 419cdf0e10cSrcweir // --------------------------------------------------------------------------- 420cdf0e10cSrcweir 421cdf0e10cSrcweir sal_Bool SvpSalGraphics::GetGlyphBoundRect( long nGlyphIndex, Rectangle& rRect ) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir int nLevel = nGlyphIndex >> GF_FONTSHIFT; 424cdf0e10cSrcweir if( nLevel >= MAX_FALLBACK ) 425cdf0e10cSrcweir return sal_False; 426cdf0e10cSrcweir 427cdf0e10cSrcweir ServerFont* pSF = m_pServerFont[ nLevel ]; 428cdf0e10cSrcweir if( !pSF ) 429cdf0e10cSrcweir return sal_False; 430cdf0e10cSrcweir 431cdf0e10cSrcweir nGlyphIndex &= ~GF_FONTMASK; 432cdf0e10cSrcweir const GlyphMetric& rGM = pSF->GetGlyphMetric( nGlyphIndex ); 433cdf0e10cSrcweir rRect = Rectangle( rGM.GetOffset(), rGM.GetSize() ); 434cdf0e10cSrcweir return sal_True; 435cdf0e10cSrcweir } 436cdf0e10cSrcweir 437cdf0e10cSrcweir // --------------------------------------------------------------------------- 438cdf0e10cSrcweir 439cdf0e10cSrcweir sal_Bool SvpSalGraphics::GetGlyphOutline( long nGlyphIndex, B2DPolyPolygon& rPolyPoly ) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir int nLevel = nGlyphIndex >> GF_FONTSHIFT; 442cdf0e10cSrcweir if( nLevel >= MAX_FALLBACK ) 443cdf0e10cSrcweir return sal_False; 444cdf0e10cSrcweir 445cdf0e10cSrcweir const ServerFont* pSF = m_pServerFont[ nLevel ]; 446cdf0e10cSrcweir if( !pSF ) 447cdf0e10cSrcweir return sal_False; 448cdf0e10cSrcweir 449cdf0e10cSrcweir nGlyphIndex &= ~GF_FONTMASK; 450cdf0e10cSrcweir if( pSF->GetGlyphOutline( nGlyphIndex, rPolyPoly ) ) 451cdf0e10cSrcweir return sal_True; 452cdf0e10cSrcweir 453cdf0e10cSrcweir return sal_False; 454cdf0e10cSrcweir } 455cdf0e10cSrcweir 456cdf0e10cSrcweir // --------------------------------------------------------------------------- 457cdf0e10cSrcweir 458cdf0e10cSrcweir SalLayout* SvpSalGraphics::GetTextLayout( ImplLayoutArgs&, int nFallbackLevel ) 459cdf0e10cSrcweir { 460cdf0e10cSrcweir GenericSalLayout* pLayout = NULL; 461cdf0e10cSrcweir 462cdf0e10cSrcweir if( m_pServerFont[ nFallbackLevel ] ) 463cdf0e10cSrcweir pLayout = new ServerFontLayout( *m_pServerFont[ nFallbackLevel ] ); 464cdf0e10cSrcweir 465cdf0e10cSrcweir return pLayout; 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir // --------------------------------------------------------------------------- 469cdf0e10cSrcweir 470cdf0e10cSrcweir void SvpSalGraphics::DrawServerFontLayout( const ServerFontLayout& rSalLayout ) 471cdf0e10cSrcweir { 472cdf0e10cSrcweir // iterate over all glyphs in the layout 473cdf0e10cSrcweir Point aPos; 474cdf0e10cSrcweir sal_GlyphId nGlyphIndex; 475cdf0e10cSrcweir SvpGlyphPeer& rGlyphPeer = SvpGlyphCache::GetInstance().GetPeer(); 476cdf0e10cSrcweir for( int nStart = 0; rSalLayout.GetNextGlyphs( 1, &nGlyphIndex, aPos, nStart ); ) 477cdf0e10cSrcweir { 478cdf0e10cSrcweir int nLevel = nGlyphIndex >> GF_FONTSHIFT; 479cdf0e10cSrcweir DBG_ASSERT( nLevel < MAX_FALLBACK, "SvpGDI: invalid glyph fallback level" ); 480cdf0e10cSrcweir ServerFont* pSF = m_pServerFont[ nLevel ]; 481cdf0e10cSrcweir if( !pSF ) 482cdf0e10cSrcweir continue; 483cdf0e10cSrcweir 484cdf0e10cSrcweir // get the glyph's alpha mask and adjust the drawing position 485cdf0e10cSrcweir nGlyphIndex &= ~GF_FONTMASK; 486cdf0e10cSrcweir B2IPoint aDstPoint( aPos.X(), aPos.Y() ); 487cdf0e10cSrcweir BitmapDeviceSharedPtr aAlphaMask 488cdf0e10cSrcweir = rGlyphPeer.GetGlyphBmp( *pSF, nGlyphIndex, m_eTextFmt, aDstPoint ); 489cdf0e10cSrcweir if( !aAlphaMask ) // ignore empty glyphs 490cdf0e10cSrcweir continue; 491cdf0e10cSrcweir 492cdf0e10cSrcweir // blend text color into target using the glyph's mask 493cdf0e10cSrcweir const B2IRange aSrcRect( B2ITuple(0,0), aAlphaMask->getSize() ); 494cdf0e10cSrcweir m_aDevice->drawMaskedColor( m_aTextColor, aAlphaMask, aSrcRect, aDstPoint, m_aClipMap ); 495cdf0e10cSrcweir } 496cdf0e10cSrcweir } 497cdf0e10cSrcweir 498cdf0e10cSrcweir // =========================================================================== 499