blob: 5f81f5dfec4d2fad15160acc23f5a3c217ea9dcb [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef _SV_OUTFONT_HXX
#define _SV_OUTFONT_HXX
#include <tools/string.hxx>
#include <tools/list.hxx>
#include <i18npool/lang.h>
#include <tools/gen.hxx>
#include <tools/solar.h>
#include <vcl/dllapi.h>
#include <unotools/fontdefs.hxx>
#include <vcl/vclenum.hxx>
#include <hash_map>
class ImplDevFontListData;
class ImplGetDevFontList;
class ImplGetDevSizeList;
class ImplFontEntry;
class ImplDirectFontSubstitution;
class ImplPreMatchFontSubstitution;
class ImplGlyphFallbackFontSubstitution;
class ImplFontSelectData;
class Font;
class ConvertChar;
struct FontMatchStatus;
class OutputDevice;
namespace com { namespace sun { namespace star { namespace lang { struct Locale; }}}}
// ----------------------
// - ImplFontAttributes -
// ----------------------
// device independent font properties
class ImplFontAttributes
{
public: // TODO: create matching interface class
const String& GetFamilyName() const { return maName; }
const String& GetStyleName() const { return maStyleName; }
FontWeight GetWeight() const { return meWeight; }
FontItalic GetSlant() const { return meItalic; }
FontFamily GetFamilyType() const { return meFamily; }
FontPitch GetPitch() const { return mePitch; }
FontWidth GetWidthType() const { return meWidthType; }
bool IsSymbolFont() const { return mbSymbolFlag; }
public: // TODO: hide members behind accessor methods
String maName; // Font Family Name
String maStyleName; // Font Style Name
FontWeight meWeight; // Weight Type
FontItalic meItalic; // Slant Type
FontFamily meFamily; // Family Type
FontPitch mePitch; // Pitch Type
FontWidth meWidthType; // Width Type
bool mbSymbolFlag;
};
// -------------------------
// - ImplDevFontAttributes -
// -------------------------
// device dependent font properties
class ImplDevFontAttributes : public ImplFontAttributes
{
public: // TODO: create matching interface class
const String& GetAliasNames() const { return maMapNames; }
int GetQuality() const { return mnQuality; }
bool IsRotatable() const { return mbOrientation; }
bool IsDeviceFont() const { return mbDevice; }
bool IsEmbeddable() const { return mbEmbeddable; }
bool IsSubsettable() const { return mbSubsettable; }
public: // TODO: hide members behind accessor methods
String maMapNames; // List of family name aliass separated with ';'
int mnQuality; // Quality (used when similar fonts compete)
bool mbOrientation; // true: physical font can be rotated
bool mbDevice; // true: built in font
bool mbSubsettable; // true: a subset of the font can be created
bool mbEmbeddable; // true: the font can be embedded
};
// ----------------
// - ImplFontData -
// ----------------
// TODO: rename ImplFontData to PhysicalFontFace
// TODO: no more direct access to members
// TODO: add reference counting
// TODO: get rid of height/width for scalable fonts
// TODO: make cloning cheaper
// abstract base class for physical font faces
class VCL_PLUGIN_PUBLIC ImplFontData : public ImplDevFontAttributes
{
public:
// by using an ImplFontData object as a factory for its corresponding
// ImplFontEntry an ImplFontEntry can be extended to cache device and
// font instance specific data
virtual ImplFontEntry* CreateFontInstance( ImplFontSelectData& ) const = 0;
virtual int GetHeight() const { return mnHeight; }
virtual int GetWidth() const { return mnWidth; }
virtual sal_IntPtr GetFontId() const = 0;
int GetFontMagic() const { return mnMagic; }
bool IsScalable() const { return (mnHeight == 0); }
bool CheckMagic( int n ) const { return (n == mnMagic); }
ImplFontData* GetNextFace() const { return mpNext; }
ImplFontData* CreateAlias() const { return Clone(); }
bool IsBetterMatch( const ImplFontSelectData&, FontMatchStatus& ) const;
StringCompare CompareWithSize( const ImplFontData& ) const;
StringCompare CompareIgnoreSize( const ImplFontData& ) const;
virtual ~ImplFontData() {}
virtual ImplFontData* Clone() const = 0;
protected:
explicit ImplFontData( const ImplDevFontAttributes&, int nMagic );
void SetBitmapSize( int nW, int nH ) { mnWidth=nW; mnHeight=nH; }
long mnWidth; // Width (in pixels)
long mnHeight; // Height (in pixels)
private:
friend class ImplDevFontListData;
const int mnMagic; // poor man's RTTI
ImplFontData* mpNext;
};
// ----------------------
// - ImplFontSelectData -
// ----------------------
class ImplFontSelectData : public ImplFontAttributes
{
public:
ImplFontSelectData( const Font&, const String& rSearchName,
const Size&, float fExactHeight );
ImplFontSelectData( const ImplFontData&, const Size&,
float fExactHeight, int nOrientation, bool bVertical );
public: // TODO: change to private
String maTargetName; // name of the font name token that is chosen
String maSearchName; // name of the font that matches best
int mnWidth; // width of font in pixel units
int mnHeight; // height of font in pixel units
float mfExactHeight; // requested height (in pixels with subpixel details)
int mnOrientation; // text orientation in 3600 system
LanguageType meLanguage; // text language
bool mbVertical; // vertical mode of requested font
bool mbNonAntialiased; // true if antialiasing is disabled
const ImplFontData* mpFontData; // a matching ImplFontData object
ImplFontEntry* mpFontEntry; // pointer to the resulting FontCache entry
};
// -------------------
// - ImplDevFontList -
// -------------------
// TODO: merge with ImplFontCache
// TODO: rename to LogicalFontManager
class VCL_PLUGIN_PUBLIC ImplDevFontList
{
private:
friend class WinGlyphFallbackSubstititution;
mutable bool mbMatchData; // true if matching attributes are initialized
bool mbMapNames; // true if MapNames are available
typedef std::hash_map<const String, ImplDevFontListData*,FontNameHash> DevFontList;
DevFontList maDevFontList;
ImplPreMatchFontSubstitution* mpPreMatchHook; // device specific prematch substitution
ImplGlyphFallbackFontSubstitution* mpFallbackHook; // device specific glyh fallback substitution
public:
explicit ImplDevFontList();
virtual ~ImplDevFontList();
// fill the list with device fonts
void Add( ImplFontData* );
void Clear();
int Count() const { return maDevFontList.size(); }
// find the device font
ImplDevFontListData* FindFontFamily( const String& rFontName ) const;
ImplDevFontListData* ImplFindByFont( ImplFontSelectData&, bool bPrinter, ImplDirectFontSubstitution* ) const;
ImplDevFontListData* ImplFindBySearchName( const String& ) const;
// suggest fonts for glyph fallback
ImplDevFontListData* GetGlyphFallbackFont( ImplFontSelectData&,
rtl::OUString& rMissingCodes, int nFallbackLevel ) const;
// prepare platform specific font substitutions
void SetPreMatchHook( ImplPreMatchFontSubstitution* );
void SetFallbackHook( ImplGlyphFallbackFontSubstitution* );
// misc utilities
ImplDevFontList* Clone( bool bScalable, bool bEmbeddable ) const;
ImplGetDevFontList* GetDevFontList() const;
ImplGetDevSizeList* GetDevSizeList( const String& rFontName ) const;
//used by 2-level font fallback
ImplDevFontListData* ImplFindByLocale( com::sun::star::lang::Locale& ) const;
protected:
void InitMatchData() const;
bool AreMapNamesAvailable() const { return mbMapNames; }
ImplDevFontListData* ImplFindByTokenNames( const String& ) const;
ImplDevFontListData* ImplFindByAliasName( const String& rSearchName, const String& rShortName ) const;
ImplDevFontListData* ImplFindBySubstFontAttr( const utl::FontNameAttr& ) const;
ImplDevFontListData* ImplFindByAttributes( sal_uLong nSearchType, FontWeight, FontWidth,
FontFamily, FontItalic, const String& rSearchFamily ) const;
ImplDevFontListData* FindDefaultFont() const;
private:
void InitGenericGlyphFallback() const;
mutable ImplDevFontListData** mpFallbackList;
mutable int mnFallbackCount;
};
// --------------------
// - ImplKernPairData -
// --------------------
// TODO: get rid of ImplKernPairData and use outdev.hxx's KerningPair struct
// the problem is that outdev.hxx is too high level for the device layers
// and outdev.hxx's customers depend on KerningPair being defined there
struct ImplKernPairData
{
sal_uInt16 mnChar1;
sal_uInt16 mnChar2;
long mnKern;
};
// -----------------------
// - ImplFontMetricData -
// -----------------------
class ImplFontMetricData : public ImplFontAttributes
{
public:
explicit ImplFontMetricData( const ImplFontSelectData& );
void ImplInitTextLineSize( const OutputDevice* pDev );
void ImplInitAboveTextLineSize();
public: // TODO: hide members behind accessor methods
// font instance attributes from the font request
long mnWidth; // Reference Width
short mnOrientation; // Rotation in 1/10 degrees
// font metrics measured for the font instance
long mnAscent; // Ascent
long mnDescent; // Descent
long mnIntLeading; // Internal Leading
long mnExtLeading; // External Leading
int mnSlant; // Slant (Italic/Oblique)
long mnMinKashida; // Minimal width of kashida (Arabic)
// font attributes queried from the font instance
int meFamilyType; // Font Family Type
bool mbDevice; // Flag for Device Fonts
bool mbScalableFont;
bool mbKernableFont;
// font metrics that are usually derived from the measurements
long mnUnderlineSize; // Lineheight of Underline
long mnUnderlineOffset; // Offset from Underline to Baseline
long mnBUnderlineSize; // Hoehe von fetter Unterstreichung
long mnBUnderlineOffset; // Offset von fetter Unterstreichung zur Baseline
long mnDUnderlineSize; // Hoehe von doppelter Unterstreichung
long mnDUnderlineOffset1; // Offset von doppelter Unterstreichung zur Baseline
long mnDUnderlineOffset2; // Offset von doppelter Unterstreichung zur Baseline
long mnWUnderlineSize; // Hoehe von WaveLine-Unterstreichung
long mnWUnderlineOffset; // Offset von WaveLine-Unterstreichung zur Baseline, jedoch zentriert zur WaveLine
long mnAboveUnderlineSize; // Hoehe von einfacher Unterstreichung (for Vertical Right)
long mnAboveUnderlineOffset; // Offset von einfacher Unterstreichung zur Baseline (for Vertical Right)
long mnAboveBUnderlineSize; // Hoehe von fetter Unterstreichung (for Vertical Right)
long mnAboveBUnderlineOffset; // Offset von fetter Unterstreichung zur Baseline (for Vertical Right)
long mnAboveDUnderlineSize; // Hoehe von doppelter Unterstreichung (for Vertical Right)
long mnAboveDUnderlineOffset1; // Offset von doppelter Unterstreichung zur Baseline (for Vertical Right)
long mnAboveDUnderlineOffset2; // Offset von doppelter Unterstreichung zur Baseline (for Vertical Right)
long mnAboveWUnderlineSize; // Hoehe von WaveLine-Unterstreichung (for Vertical Right)
long mnAboveWUnderlineOffset; // Offset von WaveLine-Unterstreichung zur Baseline, jedoch zentriert zur WaveLine (for Vertical Right)
long mnStrikeoutSize; // Hoehe von einfacher Durchstreichung
long mnStrikeoutOffset; // Offset von einfacher Durchstreichung zur Baseline
long mnBStrikeoutSize; // Hoehe von fetter Durchstreichung
long mnBStrikeoutOffset; // Offset von fetter Durchstreichung zur Baseline
long mnDStrikeoutSize; // Hoehe von doppelter Durchstreichung
long mnDStrikeoutOffset1; // Offset von doppelter Durchstreichung zur Baseline
long mnDStrikeoutOffset2; // Offset von doppelter Durchstreichung zur Baseline
};
// -----------------
// - ImplFontEntry -
// ------------------
// TODO: rename ImplFontEntry to LogicalFontInstance
// TODO: allow sharing of metrics for related fonts
class VCL_PLUGIN_PUBLIC ImplFontEntry
{
public:
explicit ImplFontEntry( const ImplFontSelectData& );
virtual ~ImplFontEntry();
public: // TODO: make data members private
ImplFontSelectData maFontSelData; // FontSelectionData
ImplFontMetricData maMetric; // Font Metric
const ConvertChar* mpConversion; // used e.g. for StarBats->StarSymbol
long mnLineHeight;
sal_uLong mnRefCount;
sal_uInt16 mnSetFontFlags; // Flags returned by SalGraphics::SetFont()
short mnOwnOrientation; // text angle if lower layers don't rotate text themselves
short mnOrientation; // text angle in 3600 system
bool mbInit; // true if maMetric member is valid
void AddFallbackForUnicode( sal_UCS4, FontWeight eWeight, const String& rFontName );
bool GetFallbackForUnicode( sal_UCS4, FontWeight eWeight, String* pFontName ) const;
void IgnoreFallbackForUnicode( sal_UCS4, FontWeight eWeight, const String& rFontName );
private:
// cache of Unicode characters and replacement font names
// TODO: a fallback map can be shared with many other ImplFontEntries
// TODO: at least the ones which just differ in orientation, stretching or height
typedef ::std::pair<sal_UCS4,FontWeight> GFBCacheKey;
struct GFBCacheKey_Hash{ size_t operator()( const GFBCacheKey& ) const; };
typedef ::std::hash_map<GFBCacheKey,String,GFBCacheKey_Hash> UnicodeFallbackList;
UnicodeFallbackList* mpUnicodeFallbackList;
};
class ImplTextLineInfo
{
private:
long mnWidth;
xub_StrLen mnIndex;
xub_StrLen mnLen;
public:
ImplTextLineInfo( long nWidth, xub_StrLen nIndex, xub_StrLen nLen )
{
mnWidth = nWidth;
mnIndex = nIndex;
mnLen = nLen;
}
long GetWidth() const { return mnWidth; }
xub_StrLen GetIndex() const { return mnIndex; }
xub_StrLen GetLen() const { return mnLen; }
};
#define MULTITEXTLINEINFO_RESIZE 16
typedef ImplTextLineInfo* PImplTextLineInfo;
class ImplMultiTextLineInfo
{
private:
PImplTextLineInfo* mpLines;
xub_StrLen mnLines;
xub_StrLen mnSize;
public:
ImplMultiTextLineInfo();
~ImplMultiTextLineInfo();
void AddLine( ImplTextLineInfo* pLine );
void Clear();
ImplTextLineInfo* GetLine( sal_uInt16 nLine ) const
{ return mpLines[nLine]; }
xub_StrLen Count() const { return mnLines; }
private:
ImplMultiTextLineInfo( const ImplMultiTextLineInfo& );
ImplMultiTextLineInfo& operator=( const ImplMultiTextLineInfo& );
};
#endif // _SV_OUTFONT_HXX