office-gobmx/vcl/inc/glyphcache.hxx
Jan Holesovsky 83380a7805 Merge commit 'ooo/DEV300_m106' into libreoffice-3-4
Conflicts:
	cppcanvas/source/mtfrenderer/transparencygroupaction.cxx
	l10ntools/scripts/localize.pl
	l10ntools/source/directory.cxx
	l10ntools/source/srciter.cxx
	padmin/Executable_spadmin.bin.mk
	padmin/Library_spa.mk
	svtools/inc/svtools/filter.hxx
	svtools/inc/svtools/grfmgr.hxx
	svtools/source/filter/filter.cxx
	svtools/source/filter/filter2.cxx
	svtools/source/filter/wmf/emfwr.cxx
	svtools/source/filter/wmf/enhwmf.cxx
	svtools/source/filter/wmf/winmtf.cxx
	svtools/source/filter/wmf/winmtf.hxx
	svtools/source/filter/wmf/winwmf.cxx
	svtools/source/filter/wmf/wmfwr.cxx
	svtools/source/graphic/grfmgr.cxx
	svtools/source/graphic/grfmgr2.cxx
	toolkit/source/controls/controlmodelcontainerbase.cxx
	toolkit/source/controls/unocontrol.cxx
	toolkit/source/helper/formpdfexport.cxx
	toolkit/source/helper/unowrapper.cxx
	vcl/Package_osx.mk
	vcl/aqua/source/app/salinst.cxx
	vcl/aqua/source/app/salsys.cxx
	vcl/aqua/source/dtrans/aqua_service.cxx
	vcl/aqua/source/dtrans/test_aquacb.cxx
	vcl/aqua/source/res/makefile.mk
	vcl/aqua/source/window/salframe.cxx
	vcl/aqua/source/window/salframeview.mm
	vcl/inc/aqua/salgdi.h
	vcl/inc/aqua/salinst.h
	vcl/inc/graphite_adaptors.hxx
	vcl/inc/graphite_cache.hxx
	vcl/inc/graphite_serverfont.hxx
	vcl/inc/impprn.hxx
	vcl/inc/svdata.hxx
	vcl/inc/unx/i18n_status.hxx
	vcl/inc/unx/saldata.hxx
	vcl/inc/unx/salfont.h
	vcl/inc/unx/salinst.h
	vcl/inc/unx/salprn.h
	vcl/inc/unx/salsys.h
	vcl/inc/unx/sm.hxx
	vcl/inc/vcl/gdimtf.hxx
	vcl/inc/vcl/graph.hxx
	vcl/inc/vcl/outdev.hxx
	vcl/inc/vcl/polyscan.hxx
	vcl/inc/vcl/svcompat.hxx
	vcl/inc/vcl/svgread.hxx
	vcl/inc/vcl/unobrok.hxx
	vcl/inc/win/salgdi.h
	vcl/inc/win/wincomp.hxx
	vcl/prj/d.lst
	vcl/source/app/dbggui.cxx
	vcl/source/app/idlemgr.cxx
	vcl/source/app/makefile.mk
	vcl/source/app/settings.cxx
	vcl/source/app/sound.cxx
	vcl/source/app/stdtext.cxx
	vcl/source/app/svapp.cxx
	vcl/source/app/svdata.cxx
	vcl/source/app/svmain.cxx
	vcl/source/app/timer.cxx
	vcl/source/app/unohelp.cxx
	vcl/source/components/dtranscomp.cxx
	vcl/source/control/button.cxx
	vcl/source/control/combobox.cxx
	vcl/source/control/ctrl.cxx
	vcl/source/control/edit.cxx
	vcl/source/control/field2.cxx
	vcl/source/control/ilstbox.cxx
	vcl/source/gdi/bitmap.cxx
	vcl/source/gdi/bitmapex.cxx
	vcl/source/gdi/cvtgrf.cxx
	vcl/source/gdi/font.cxx
	vcl/source/gdi/image.cxx
	vcl/source/gdi/imagerepository.cxx
	vcl/source/gdi/impbmp.cxx
	vcl/source/gdi/impgraph.cxx
	vcl/source/gdi/impimagetree.cxx
	vcl/source/gdi/jobset.cxx
	vcl/source/gdi/makefile.mk
	vcl/source/gdi/metaact.cxx
	vcl/source/gdi/outdev.cxx
	vcl/source/gdi/outdev2.cxx
	vcl/source/gdi/outdev5.cxx
	vcl/source/gdi/outdev6.cxx
	vcl/source/gdi/outmap.cxx
	vcl/source/gdi/polyscan.cxx
	vcl/source/gdi/print.cxx
	vcl/source/gdi/print2.cxx
	vcl/source/gdi/region.cxx
	vcl/source/gdi/salgdilayout.cxx
	vcl/source/gdi/sallayout.cxx
	vcl/source/gdi/svcompat.cxx
	vcl/source/gdi/virdev.cxx
	vcl/source/glyphs/gcach_ftyp.cxx
	vcl/source/glyphs/gcach_vdev.cxx
	vcl/source/glyphs/gcach_vdev.hxx
	vcl/source/glyphs/graphite_adaptors.cxx
	vcl/source/glyphs/graphite_cache.cxx
	vcl/source/glyphs/graphite_layout.cxx
	vcl/source/glyphs/graphite_serverfont.cxx
	vcl/source/glyphs/graphite_textsrc.hxx
	vcl/source/glyphs/makefile.mk
	vcl/source/src/makefile.mk
	vcl/source/window/accel.cxx
	vcl/source/window/brdwin.cxx
	vcl/source/window/btndlg.cxx
	vcl/source/window/dialog.cxx
	vcl/source/window/dndevdis.cxx
	vcl/source/window/dockmgr.cxx
	vcl/source/window/dockwin.cxx
	vcl/source/window/floatwin.cxx
	vcl/source/window/introwin.cxx
	vcl/source/window/keycod.cxx
	vcl/source/window/menu.cxx
	vcl/source/window/msgbox.cxx
	vcl/source/window/scrwnd.cxx
	vcl/source/window/split.cxx
	vcl/source/window/splitwin.cxx
	vcl/source/window/status.cxx
	vcl/source/window/syswin.cxx
	vcl/source/window/tabpage.cxx
	vcl/source/window/toolbox.cxx
	vcl/source/window/toolbox2.cxx
	vcl/source/window/window.cxx
	vcl/source/window/window2.cxx
	vcl/source/window/winproc.cxx
	vcl/source/window/wrkwin.cxx
	vcl/unx/generic/app/i18n_cb.cxx
	vcl/unx/generic/app/i18n_ic.cxx
	vcl/unx/generic/app/saldata.cxx
	vcl/unx/generic/app/saldisp.cxx
	vcl/unx/generic/app/salinst.cxx
	vcl/unx/generic/app/wmadaptor.cxx
	vcl/unx/generic/fontmanager/afm_hash.cpp
	vcl/unx/generic/gdi/salbmp.cxx
	vcl/unx/generic/gdi/salgdi3.cxx
	vcl/unx/generic/gdi/xrender_peer.cxx
	vcl/unx/generic/window/salframe.cxx
	vcl/unx/generic/window/salobj.cxx
	vcl/unx/gtk/a11y/makefile.mk
	vcl/unx/gtk/app/gtksys.cxx
	vcl/unx/gtk/app/makefile.mk
	vcl/unx/gtk/window/gtkframe.cxx
	vcl/unx/gtk/window/gtkobject.cxx
	vcl/unx/headless/svpinst.cxx
	vcl/unx/headless/svpinst.hxx
	vcl/unx/headless/svpprn.hxx
	vcl/unx/kde/kdedata.cxx
	vcl/unx/kde/salnativewidgets-kde.cxx
	vcl/unx/kde4/KDESalDisplay.hxx
	vcl/unx/kde4/KDEXLib.cxx
	vcl/unx/kde4/KDEXLib.hxx
	vcl/unx/kde4/VCLKDEApplication.cxx
	vcl/unx/kde4/makefile.mk
	vcl/unx/source/app/makefile.mk
	vcl/unx/source/fontmanager/makefile.mk
	vcl/unx/source/gdi/makefile.mk
	vcl/unx/source/inc/salcursors.h
	vcl/util/linksvp/makefile.mk
	vcl/win/source/app/saldata.cxx
	vcl/win/source/app/salinst.cxx
	vcl/win/source/app/salshl.cxx
	vcl/win/source/gdi/makefile.mk
	vcl/win/source/gdi/salbmp.cxx
	vcl/win/source/gdi/salgdi.cxx
	vcl/win/source/gdi/salgdi2.cxx
	vcl/win/source/gdi/salgdi3.cxx
	vcl/win/source/gdi/salgdi_gdiplus.cxx
	vcl/win/source/gdi/salprn.cxx
	vcl/win/source/gdi/salvd.cxx
	vcl/win/source/gdi/winlayout.cxx
	vcl/win/source/window/salframe.cxx
	vcl/win/source/window/salmenu.cxx
	vcl/win/source/window/salobj.cxx
2011-04-22 15:09:06 +02:00

391 lines
14 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
*
* OpenOffice.org - a multi-platform office productivity suite
*
* This file is part of OpenOffice.org.
*
* OpenOffice.org is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License version 3
* only, as published by the Free Software Foundation.
*
* OpenOffice.org is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License version 3 for more details
* (a copy is included in the LICENSE file that accompanied this code).
*
* You should have received a copy of the GNU Lesser General Public License
* version 3 along with OpenOffice.org. If not, see
* <http://www.openoffice.org/license.html>
* for a copy of the LGPLv3 License.
*
************************************************************************/
#ifndef _SV_GLYPHCACHE_HXX
#define _SV_GLYPHCACHE_HXX
#include <vcl/dllapi.h>
class GlyphCache;
class GlyphMetric;
class GlyphData;
class ServerFont;
class GlyphCachePeer;
class ServerFontLayoutEngine;
class ServerFontLayout;
class ExtraKernInfo;
struct ImplKernPairData;
class ImplFontOptions;
#include <tools/gen.hxx>
#include <boost/unordered_map.hpp>
#include <boost/unordered_set.hpp>
#include <boost/shared_ptr.hpp>
namespace basegfx { class B2DPolyPolygon; }
class RawBitmap;
#include <outfont.hxx>
#include <impfont.hxx>
class ServerFontLayout;
#include <sallayout.hxx>
namespace vcl
{
struct FontCapabilities;
}
// =======================================================================
class VCL_PLUGIN_PUBLIC GlyphCache
{
public:
explicit GlyphCache( GlyphCachePeer& );
/*virtual*/ ~GlyphCache();
static GlyphCache& GetInstance();
void LoadFonts();
void ClearFontPath();
void AddFontPath( const String& rFontPath );
void AddFontFile( const rtl::OString& rNormalizedName,
int nFaceNum, sal_IntPtr nFontId, const ImplDevFontAttributes&,
const ExtraKernInfo* = NULL );
void AnnounceFonts( ImplDevFontList* ) const;
ServerFont* CacheFont( const ImplFontSelectData& );
void UncacheFont( ServerFont& );
void InvalidateAllGlyphs();
protected:
GlyphCachePeer& mrPeer;
private:
friend class ServerFont;
// used by ServerFont class only
void AddedGlyph( ServerFont&, GlyphData& );
void RemovingGlyph( ServerFont&, GlyphData&, int nGlyphIndex );
void UsingGlyph( ServerFont&, GlyphData& );
void GrowNotify();
private:
sal_uLong CalcByteCount() const;
void GarbageCollect();
// the GlyphCache's FontList matches a font request to a serverfont instance
// the FontList key's mpFontData member is reinterpreted as integer font id
struct IFSD_Equal{ bool operator()( const ImplFontSelectData&, const ImplFontSelectData& ) const; };
struct IFSD_Hash{ size_t operator()( const ImplFontSelectData& ) const; };
typedef ::boost::unordered_map<ImplFontSelectData,ServerFont*,IFSD_Hash,IFSD_Equal > FontList;
FontList maFontList;
sal_uLong mnMaxSize; // max overall cache size in bytes
mutable sal_uLong mnBytesUsed;
mutable long mnLruIndex;
mutable int mnGlyphCount;
ServerFont* mpCurrentGCFont;
class FreetypeManager* mpFtManager;
};
// =======================================================================
class GlyphMetric
{
public:
Point GetOffset() const { return maOffset; }
Point GetDelta() const { return maDelta; }
Size GetSize() const { return maSize; }
long GetCharWidth() const { return mnAdvanceWidth; }
protected:
friend class GlyphData;
void SetOffset( int nX, int nY ) { maOffset = Point( nX, nY); }
void SetDelta( int nX, int nY ) { maDelta = Point( nX, nY); }
void SetSize( const Size& s ) { maSize = s; }
void SetCharWidth( long nW ) { mnAdvanceWidth = nW; }
private:
long mnAdvanceWidth;
Point maDelta;
Point maOffset;
Size maSize;
};
// -----------------------------------------------------------------------
// the glyph specific data needed by a GlyphCachePeer is usually trivial,
// not attaching it to the corresponding GlyphData would be overkill
struct ExtGlyphData
{
int meInfo;
void* mpData;
ExtGlyphData() : meInfo(0), mpData(NULL) {}
};
// -----------------------------------------------------------------------
class GlyphData
{
public:
const GlyphMetric& GetMetric() const { return maMetric; }
Size GetSize() const { return maMetric.GetSize(); }
void SetSize( const Size& s) { maMetric.SetSize( s ); }
void SetOffset( int nX, int nY ) { maMetric.SetOffset( nX, nY ); }
void SetDelta( int nX, int nY ) { maMetric.SetDelta( nX, nY ); }
void SetCharWidth( long nW ) { maMetric.SetCharWidth( nW ); }
void SetLruValue( int n ) const { mnLruValue = n; }
long GetLruValue() const { return mnLruValue;}
ExtGlyphData& ExtDataRef() { return maExtData; }
const ExtGlyphData& ExtDataRef() const { return maExtData; }
private:
GlyphMetric maMetric;
ExtGlyphData maExtData;
// used by GlyphCache for cache LRU algorithm
mutable long mnLruValue;
};
// =======================================================================
class VCL_PLUGIN_PUBLIC ServerFont
{
public:
virtual const ::rtl::OString* GetFontFileName() const { return NULL; }
virtual int GetFontFaceNumber() const { return 0; }
virtual bool TestFont() const { return true; }
virtual void* GetFtFace() const { return 0; }
virtual int GetLoadFlags() const { return 0; }
virtual void SetFontOptions( boost::shared_ptr<ImplFontOptions> ) {}
virtual boost::shared_ptr<ImplFontOptions> GetFontOptions() const
{ return boost::shared_ptr<ImplFontOptions>(); }
virtual bool NeedsArtificialBold() const { return false; }
virtual bool NeedsArtificialItalic() const { return false; }
const ImplFontSelectData& GetFontSelData() const { return maFontSelData; }
virtual void FetchFontMetric( ImplFontMetricData&, long& rFactor ) const = 0;
virtual sal_uLong GetKernPairs( ImplKernPairData** ) const { return 0; }
virtual int GetGlyphKernValue( int, int ) const { return 0; }
virtual const ImplFontCharMap* GetImplFontCharMap() const = 0;
virtual bool GetFontCapabilities(vcl::FontCapabilities &) const { return false; }
Point TransformPoint( const Point& ) const;
GlyphData& GetGlyphData( int nGlyphIndex );
const GlyphMetric& GetGlyphMetric( int nGlyphIndex )
{ return GetGlyphData( nGlyphIndex ).GetMetric(); }
virtual int GetGlyphIndex( sal_UCS4 ) const = 0;
virtual bool GetGlyphOutline( int nGlyphIndex, ::basegfx::B2DPolyPolygon& ) const = 0;
virtual bool GetAntialiasAdvice( void ) const = 0;
bool IsGlyphInvisible( int nGlyphIndex );
virtual bool GetGlyphBitmap1( int nGlyphIndex, RawBitmap& ) const = 0;
virtual bool GetGlyphBitmap8( int nGlyphIndex, RawBitmap& ) const = 0;
void SetExtended( int nInfo, void* ppVoid );
int GetExtInfo() { return mnExtInfo; }
void* GetExtPointer() { return mpExtData; }
protected:
friend class GlyphCache;
friend class ServerFontLayout;
explicit ServerFont( const ImplFontSelectData& );
virtual ~ServerFont();
void AddRef() const { ++mnRefCount; }
long GetRefCount() const { return mnRefCount; }
long Release() const;
sal_uLong GetByteCount() const { return mnBytesUsed; }
virtual void InitGlyphData( int nGlyphIndex, GlyphData& ) const = 0;
virtual void GarbageCollect( long );
void ReleaseFromGarbageCollect();
virtual ServerFontLayoutEngine* GetLayoutEngine() { return NULL; }
private:
typedef ::boost::unordered_map<int,GlyphData> GlyphList;
mutable GlyphList maGlyphList;
const ImplFontSelectData maFontSelData;
// info for GlyphcachePeer
int mnExtInfo;
void* mpExtData;
// used by GlyphCache for cache LRU algorithm
mutable long mnRefCount;
mutable sal_uLong mnBytesUsed;
ServerFont* mpPrevGCFont;
ServerFont* mpNextGCFont;
protected:
// 16.16 fixed point values used for a rotated font
long mnCos;
long mnSin;
private:
int mnZWJ;
int mnZWNJ;
bool mbCollectedZW;
};
// =======================================================================
// a class for cache entries for physical font instances that are based on serverfonts
class VCL_PLUGIN_PUBLIC ImplServerFontEntry : public ImplFontEntry
{
private:
ServerFont* mpServerFont;
boost::shared_ptr<ImplFontOptions> mpFontOptions;
bool mbGotFontOptions;
public:
ImplServerFontEntry( ImplFontSelectData& );
virtual ~ImplServerFontEntry();
void SetServerFont( ServerFont* p) { mpServerFont = p; }
void HandleFontOptions();
};
// =======================================================================
class VCL_PLUGIN_PUBLIC ServerFontLayout : public GenericSalLayout
{
private:
ServerFont& mrServerFont;
// enforce proper copy semantic
SAL_DLLPRIVATE ServerFontLayout( const ServerFontLayout& );
SAL_DLLPRIVATE ServerFontLayout& operator=( const ServerFontLayout& );
public:
ServerFontLayout( ServerFont& );
virtual bool LayoutText( ImplLayoutArgs& );
virtual void AdjustLayout( ImplLayoutArgs& );
virtual void DrawText( SalGraphics& ) const;
ServerFont& GetServerFont() const { return mrServerFont; }
};
// =======================================================================
class ServerFontLayoutEngine
{
public:
virtual ~ServerFontLayoutEngine() {}
virtual bool operator()( ServerFontLayout&, ImplLayoutArgs& );
};
// =======================================================================
class GlyphCachePeer
{
protected:
GlyphCachePeer() : mnBytesUsed(0) {}
virtual ~GlyphCachePeer() {}
public:
sal_Int32 GetByteCount() const { return mnBytesUsed; }
virtual void RemovingFont( ServerFont& ) {}
virtual void RemovingGlyph( ServerFont&, GlyphData&, int ) {}
protected:
sal_Int32 mnBytesUsed;
};
// =======================================================================
class VCL_PLUGIN_PUBLIC RawBitmap
{
public:
RawBitmap();
~RawBitmap();
bool Rotate( int nAngle );
public:
unsigned char* mpBits;
sal_uLong mnAllocated;
sal_uLong mnWidth;
sal_uLong mnHeight;
sal_uLong mnScanlineSize;
sal_uLong mnBitCount;
int mnXOffset;
int mnYOffset;
};
// =======================================================================
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_PLUGIN_PUBLIC ExtraKernInfo
{
public:
ExtraKernInfo( sal_IntPtr nFontId );
virtual ~ExtraKernInfo() {}
bool HasKernPairs() const;
int GetUnscaledKernPairs( ImplKernPairData** ) const;
int GetUnscaledKernValue( sal_Unicode cLeft, sal_Unicode cRight ) const;
protected:
mutable bool mbInitialized;
virtual void Initialize() const = 0;
protected:
sal_IntPtr mnFontId;
// container to map a unicode pair to an unscaled kerning value
struct PairEqual{ int operator()(const ImplKernPairData& rA, const ImplKernPairData& rB) const
{ return (rA.mnChar1 == rB.mnChar1) && (rA.mnChar2 == rB.mnChar2); } };
struct PairHash{ int operator()(const ImplKernPairData& rA) const
{ return (rA.mnChar1) * 256 ^ rA.mnChar2; } };
typedef boost::unordered_set< ImplKernPairData, PairHash, PairEqual > UnicodeKernPairs;
mutable UnicodeKernPairs maUnicodeKernPairs;
};
// =======================================================================
#endif // _SV_GLYPHCACHE_HXX
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */