diff options
-rw-r--r-- | vcl/generic/glyphs/gcach_ftyp.cxx | 21 | ||||
-rw-r--r-- | vcl/generic/glyphs/gcach_rbmp.cxx | 25 | ||||
-rw-r--r-- | vcl/generic/glyphs/glyphcache.cxx | 6 | ||||
-rw-r--r-- | vcl/headless/svptext.cxx | 45 | ||||
-rw-r--r-- | vcl/inc/generic/glyphcache.hxx | 27 |
5 files changed, 55 insertions, 69 deletions
diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx index 29c88203517f..979be11377c5 100644 --- a/vcl/generic/glyphs/gcach_ftyp.cxx +++ b/vcl/generic/glyphs/gcach_ftyp.cxx @@ -650,7 +650,6 @@ ImplFontEntry* ImplFTSFontData::CreateFontInstance( FontSelectPattern& rFSD ) co ServerFont::ServerFont( const FontSelectPattern& rFSD, FtFontInfo* pFI ) : maGlyphList( 0), maFontSelData(rFSD), - mnExtInfo(0), mnRefCount(1), mnBytesUsed( sizeof(ServerFont) ), mpPrevGCFont( NULL ), @@ -1420,20 +1419,19 @@ bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const if( rRawBitmap.mnAllocated < nNeededSize ) { - delete[] rRawBitmap.mpBits; rRawBitmap.mnAllocated = 2*nNeededSize; - rRawBitmap.mpBits = new unsigned char[ rRawBitmap.mnAllocated ]; + rRawBitmap.mpBits.reset(new unsigned char[ rRawBitmap.mnAllocated ]); } if( !mbArtBold || pFTEmbolden ) { - memcpy( rRawBitmap.mpBits, rBitmapFT.buffer, nNeededSize ); + memcpy( rRawBitmap.mpBits.get(), rBitmapFT.buffer, nNeededSize ); } else { - memset( rRawBitmap.mpBits, 0, nNeededSize ); + memset( rRawBitmap.mpBits.get(), 0, nNeededSize ); const unsigned char* pSrcLine = rBitmapFT.buffer; - unsigned char* pDstLine = rRawBitmap.mpBits; + unsigned char* pDstLine = rRawBitmap.mpBits.get(); for( int h = rRawBitmap.mnHeight; --h >= 0; ) { memcpy( pDstLine, pSrcLine, rBitmapFT.pitch ); @@ -1441,7 +1439,7 @@ bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const pSrcLine += rBitmapFT.pitch; } - unsigned char* p = rRawBitmap.mpBits; + unsigned char* p = rRawBitmap.mpBits.get(); for( sal_uLong y=0; y < rRawBitmap.mnHeight; y++ ) { unsigned char nLastByte = 0; @@ -1549,13 +1547,12 @@ bool ServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap ) const const sal_uLong nNeededSize = rRawBitmap.mnScanlineSize * rRawBitmap.mnHeight; if( rRawBitmap.mnAllocated < nNeededSize ) { - delete[] rRawBitmap.mpBits; rRawBitmap.mnAllocated = 2*nNeededSize; - rRawBitmap.mpBits = new unsigned char[ rRawBitmap.mnAllocated ]; + rRawBitmap.mpBits.reset(new unsigned char[ rRawBitmap.mnAllocated ]); } const unsigned char* pSrc = rBitmapFT.buffer; - unsigned char* pDest = rRawBitmap.mpBits; + unsigned char* pDest = rRawBitmap.mpBits.get(); if( !bEmbedded ) { for( int y = rRawBitmap.mnHeight, x; --y >= 0 ; ) @@ -1585,7 +1582,7 @@ bool ServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap ) const if( mbArtBold && !pFTEmbolden ) { // overlay with glyph image shifted by one left pixel - unsigned char* p = rRawBitmap.mpBits; + unsigned char* p = rRawBitmap.mpBits.get(); for( sal_uLong y=0; y < rRawBitmap.mnHeight; y++ ) { unsigned char nLastByte = 0; @@ -1601,7 +1598,7 @@ bool ServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap ) const if( !bEmbedded && mbUseGamma ) { - unsigned char* p = rRawBitmap.mpBits; + unsigned char* p = rRawBitmap.mpBits.get(); for( sal_uLong y=0; y < rRawBitmap.mnHeight; y++ ) { for( sal_uLong x=0; x < rRawBitmap.mnWidth; x++ ) diff --git a/vcl/generic/glyphs/gcach_rbmp.cxx b/vcl/generic/glyphs/gcach_rbmp.cxx index 684f8869328d..0efe54cef3e0 100644 --- a/vcl/generic/glyphs/gcach_rbmp.cxx +++ b/vcl/generic/glyphs/gcach_rbmp.cxx @@ -23,16 +23,12 @@ RawBitmap::RawBitmap() -: mpBits(0), mnAllocated(0) +: mnAllocated(0) {} RawBitmap::~RawBitmap() -{ - delete[] mpBits; - mpBits = 0; - mnAllocated = 0; -} +{} // used by 90 and 270 degree rotations on 8 bit deep bitmaps @@ -171,7 +167,7 @@ bool RawBitmap::Rotate( int nAngle ) mnYOffset = -(mnYOffset + mnHeight); if( mnBitCount == 8 ) { - ImplRotate8_180( mpBits, mnWidth, mnHeight, mnScanlineSize-mnWidth ); + ImplRotate8_180( mpBits.get(), mnWidth, mnHeight, mnScanlineSize-mnWidth ); return true; } nNewWidth = mnWidth; @@ -203,7 +199,7 @@ bool RawBitmap::Rotate( int nAngle ) { case 1800: // rotate by 180 degrees // we know we only need to deal with 1 bit depth - ImplRotate1_180( pBuf, mpBits + mnHeight * mnScanlineSize, + ImplRotate1_180( pBuf, mpBits.get() + mnHeight * mnScanlineSize, mnWidth, mnHeight, mnScanlineSize - (mnWidth + 7) / 8 ); break; case +900: // rotate left by 90 degrees @@ -211,11 +207,11 @@ bool RawBitmap::Rotate( int nAngle ) mnXOffset = mnYOffset; mnYOffset = -nNewHeight - i; if( mnBitCount == 8 ) - ImplRotate8_90( pBuf, mpBits + mnWidth - 1, + ImplRotate8_90( pBuf, mpBits.get() + mnWidth - 1, nNewWidth, nNewHeight, +mnScanlineSize, -1-mnHeight*mnScanlineSize, nNewScanlineSize - nNewWidth ); else - ImplRotate1_90( pBuf, mpBits + (mnWidth - 1) / 8, + ImplRotate1_90( pBuf, mpBits.get() + (mnWidth - 1) / 8, nNewWidth, nNewHeight, +mnScanlineSize, (-mnWidth & 7), +1, nNewScanlineSize - (nNewWidth + 7) / 8 ); break; @@ -225,11 +221,11 @@ bool RawBitmap::Rotate( int nAngle ) mnXOffset = -(nNewWidth + mnYOffset); mnYOffset = i; if( mnBitCount == 8 ) - ImplRotate8_90( pBuf, mpBits + mnScanlineSize * (mnHeight-1), + ImplRotate8_90( pBuf, mpBits.get() + mnScanlineSize * (mnHeight-1), nNewWidth, nNewHeight, -mnScanlineSize, +1+mnHeight*mnScanlineSize, nNewScanlineSize - nNewWidth ); else - ImplRotate1_90( pBuf, mpBits + mnScanlineSize * (mnHeight-1), + ImplRotate1_90( pBuf, mpBits.get() + mnScanlineSize * (mnHeight-1), nNewWidth, nNewHeight, -mnScanlineSize, +7, -1, nNewScanlineSize - (nNewWidth + 7) / 8 ); break; @@ -241,13 +237,12 @@ bool RawBitmap::Rotate( int nAngle ) if( nBufSize < mnAllocated ) { - memcpy( mpBits, pBuf, nBufSize ); + memcpy( mpBits.get(), pBuf, nBufSize ); delete[] pBuf; } else { - delete[] mpBits; - mpBits = pBuf; + mpBits.reset(pBuf); mnAllocated = nBufSize; } diff --git a/vcl/generic/glyphs/glyphcache.cxx b/vcl/generic/glyphs/glyphcache.cxx index a32b88fd82a0..43c628dd1688 100644 --- a/vcl/generic/glyphs/glyphcache.cxx +++ b/vcl/generic/glyphs/glyphcache.cxx @@ -315,9 +315,9 @@ void GlyphCache::GrowNotify() } -inline void GlyphCache::RemovingGlyph( ServerFont& rSF, GlyphData& rGD, int nGlyphIndex ) +inline void GlyphCache::RemovingGlyph( GlyphData& rGD ) { - mrPeer.RemovingGlyph( rSF, rGD, nGlyphIndex ); + mrPeer.RemovingGlyph( rGD ); mnBytesUsed -= sizeof( GlyphData ); --mnGlyphCount; } @@ -372,7 +372,7 @@ void ServerFont::GarbageCollect( long nMinLruIndex ) { OSL_ASSERT( mnBytesUsed >= sizeof(GlyphData) ); mnBytesUsed -= sizeof( GlyphData ); - GlyphCache::GetInstance().RemovingGlyph( *this, rGD, it->first ); + GlyphCache::GetInstance().RemovingGlyph( rGD ); maGlyphList.erase( it ); it_next = maGlyphList.begin(); } diff --git a/vcl/headless/svptext.cxx b/vcl/headless/svptext.cxx index bbe38f465648..ff316039ac6f 100644 --- a/vcl/headless/svptext.cxx +++ b/vcl/headless/svptext.cxx @@ -17,6 +17,10 @@ * the License at http://www.apache.org/licenses/LICENSE-2.0 . */ +#include "sal/config.h" + +#include <cassert> + #include <basegfx/range/b2drange.hxx> #include <basegfx/range/b2ibox.hxx> #include <basegfx/polygon/b2dpolypolygon.hxx> @@ -50,7 +54,7 @@ public: protected: virtual void RemovingFont( ServerFont& ); - virtual void RemovingGlyph( ServerFont&, GlyphData&, int nGlyphIndex ); + virtual void RemovingGlyph( GlyphData& ); class SvpGcpHelper { @@ -113,14 +117,14 @@ BitmapDeviceSharedPtr SvpGlyphPeer::GetGlyphBmp( ServerFont& rServerFont, int nGlyphIndex, basebmp::Format nBmpFormat, B2IPoint& rTargetPos ) { GlyphData& rGlyphData = rServerFont.GetGlyphData( nGlyphIndex ); - SvpGcpHelper* pGcpHelper = (SvpGcpHelper*)rGlyphData.ExtDataRef().mpData; - // nothing to do if the GlyphPeer hasn't allocated resources for the glyph if( rGlyphData.ExtDataRef().meInfo != nBmpFormat ) { - if( rGlyphData.ExtDataRef().meInfo == FORMAT_NONE ) + SvpGcpHelper* pGcpHelper = static_cast<SvpGcpHelper*>( + rGlyphData.ExtDataRef().mpData); + bool bNew = pGcpHelper == 0; + if( bNew ) pGcpHelper = new SvpGcpHelper; - RawBitmap& rRawBitmap = pGcpHelper->maRawBitmap; // get glyph bitmap in matching format bool bFound = false; @@ -143,22 +147,28 @@ BitmapDeviceSharedPtr SvpGlyphPeer::GetGlyphBmp( ServerFont& rServerFont, // return .notdef glyph if needed if( !bFound && (nGlyphIndex != 0) ) { - delete pGcpHelper; + if( bNew ) + delete pGcpHelper; return GetGlyphBmp( rServerFont, 0, nBmpFormat, rTargetPos ); } // construct alpha mask from raw bitmap - const B2IVector aSize( rRawBitmap.mnScanlineSize, rRawBitmap.mnHeight ); + const B2IVector aSize( + pGcpHelper->maRawBitmap.mnScanlineSize, + pGcpHelper->maRawBitmap.mnHeight ); if( aSize.getX() && aSize.getY() ) { static PaletteMemorySharedVector aDummyPAL; - RawMemorySharedArray aRawPtr( rRawBitmap.mpBits ); - pGcpHelper->maBitmapDev = createBitmapDevice( aSize, true, nBmpFormat, aRawPtr, aDummyPAL ); + pGcpHelper->maBitmapDev = createBitmapDevice( aSize, true, nBmpFormat, pGcpHelper->maRawBitmap.mpBits, aDummyPAL ); } - rServerFont.SetExtended( nBmpFormat, (void*)pGcpHelper ); + rGlyphData.ExtDataRef().meInfo = nBmpFormat; + rGlyphData.ExtDataRef().mpData = pGcpHelper; } + SvpGcpHelper* pGcpHelper = static_cast<SvpGcpHelper*>( + rGlyphData.ExtDataRef().mpData); + assert(pGcpHelper != 0); rTargetPos += B2IPoint( pGcpHelper->maRawBitmap.mnXOffset, pGcpHelper->maRawBitmap.mnYOffset ); return pGcpHelper->maBitmapDev; } @@ -170,16 +180,13 @@ void SvpGlyphPeer::RemovingFont( ServerFont& ) } -void SvpGlyphPeer::RemovingGlyph( ServerFont&, GlyphData& rGlyphData, int /*nGlyphIndex*/ ) +void SvpGlyphPeer::RemovingGlyph( GlyphData& rGlyphData ) { - if( rGlyphData.ExtDataRef().mpData != 0 ) - { - // release the glyph related resources - DBG_ASSERT( (rGlyphData.ExtDataRef().meInfo <= FORMAT_MAX), "SVP::RG() invalid alpha format" ); - SvpGcpHelper* pGcpHelper = (SvpGcpHelper*)rGlyphData.ExtDataRef().mpData; - delete[] pGcpHelper->maRawBitmap.mpBits; - delete pGcpHelper; - } + SvpGcpHelper* pGcpHelper = static_cast<SvpGcpHelper*>( + rGlyphData.ExtDataRef().mpData); + rGlyphData.ExtDataRef().meInfo = basebmp::FORMAT_NONE; + rGlyphData.ExtDataRef().mpData = 0; + delete pGcpHelper; } diff --git a/vcl/inc/generic/glyphcache.hxx b/vcl/inc/generic/glyphcache.hxx index 1457dd52dd3a..d33aee125053 100644 --- a/vcl/inc/generic/glyphcache.hxx +++ b/vcl/inc/generic/glyphcache.hxx @@ -34,6 +34,7 @@ struct ImplKernPairData; class ImplFontOptions; #include <tools/gen.hxx> +#include <basebmp/bitmapdevice.hxx> #include <boost/unordered_map.hpp> #include <boost/unordered_set.hpp> #include <boost/shared_ptr.hpp> @@ -90,7 +91,7 @@ private: friend class ServerFont; // used by ServerFont class only void AddedGlyph( ServerFont&, GlyphData& ); - void RemovingGlyph( ServerFont&, GlyphData&, int nGlyphIndex ); + void RemovingGlyph( GlyphData& ); void UsingGlyph( ServerFont&, GlyphData& ); void GrowNotify(); @@ -139,7 +140,9 @@ private: // ----------------------------------------------------------------------- // the glyph specific data needed by a GlyphCachePeer is usually trivial, -// not attaching it to the corresponding GlyphData would be overkill +// not attaching it to the corresponding GlyphData would be overkill; +// this is currently only used by the headless (aka svp) plugin, where meInfo is +// basebmp::Format and mpData is SvpGcpHelper* struct ExtGlyphData { int meInfo; @@ -219,10 +222,6 @@ public: bool GetGlyphBitmap1( int nGlyphIndex, RawBitmap& ) const; bool GetGlyphBitmap8( int nGlyphIndex, RawBitmap& ) const; - void SetExtended( int nInfo, void* ppVoid ); - int GetExtInfo() { return mnExtInfo; } - void* GetExtPointer() { return mpExtData; } - private: friend class GlyphCache; friend class ServerFontLayout; @@ -248,10 +247,6 @@ private: const FontSelectPattern maFontSelData; - // info for GlyphcachePeer - int mnExtInfo; - void* mpExtData; - // used by GlyphCache for cache LRU algorithm mutable long mnRefCount; mutable sal_uLong mnBytesUsed; @@ -351,7 +346,7 @@ protected: public: sal_Int32 GetByteCount() const { return mnBytesUsed; } virtual void RemovingFont( ServerFont& ) {} - virtual void RemovingGlyph( ServerFont&, GlyphData&, int ) {} + virtual void RemovingGlyph( GlyphData& ) {} protected: sal_Int32 mnBytesUsed; @@ -367,7 +362,7 @@ public: bool Rotate( int nAngle ); public: - unsigned char* mpBits; + basebmp::RawMemorySharedArray mpBits; sal_uLong mnAllocated; sal_uLong mnWidth; @@ -382,14 +377,6 @@ public: // ======================================================================= -inline void ServerFont::SetExtended( int nInfo, void* pVoid ) -{ - mnExtInfo = nInfo; - mpExtData = pVoid; -} - -// ======================================================================= - // ExtraKernInfo allows an on-demand query of extra kerning info #i29881# // The kerning values have to be scaled to match the font size before use class VCL_DLLPUBLIC ExtraKernInfo |