office-gobmx/vcl/inc/outfont.hxx

429 lines
19 KiB
C++
Raw Normal View History

/* -*- 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_OUTFONT_HXX
#define _SV_OUTFONT_HXX
#include <tools/string.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 <boost/unordered_map.hpp>
class ImplDevFontListData;
class ImplGetDevFontList;
class ImplGetDevSizeList;
class ImplFontEntry;
class ImplDirectFontSubstitution;
class ImplPreMatchFontSubstitution;
class ImplGlyphFallbackFontSubstitution;
class FontSelectPattern;
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; }
bool operator==(const ImplFontAttributes& rOther) const;
bool operator!=(const ImplFontAttributes& rOther) const
{
return !(*this == rOther);
}
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
};
// ----------------
// - 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 PhysicalFontFace : public ImplDevFontAttributes
{
public:
// by using an PhysicalFontFace object as a factory for its corresponding
// ImplFontEntry an ImplFontEntry can be extended to cache device and
// font instance specific data
virtual ImplFontEntry* CreateFontInstance( FontSelectPattern& ) 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); }
PhysicalFontFace* GetNextFace() const { return mpNext; }
PhysicalFontFace* CreateAlias() const { return Clone(); }
bool IsBetterMatch( const FontSelectPattern&, FontMatchStatus& ) const;
StringCompare CompareWithSize( const PhysicalFontFace& ) const;
StringCompare CompareIgnoreSize( const PhysicalFontFace& ) const;
virtual ~PhysicalFontFace() {}
virtual PhysicalFontFace* Clone() const = 0;
protected:
explicit PhysicalFontFace( 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
PhysicalFontFace* mpNext;
};
class FontSelectPatternAttributes : public ImplFontAttributes
{
public:
FontSelectPatternAttributes( const Font&, const String& rSearchName,
const Size&, float fExactHeight );
FontSelectPatternAttributes( const PhysicalFontFace&, const Size&,
float fExactHeight, int nOrientation, bool bVertical );
size_t hashCode() const;
bool operator==(const FontSelectPatternAttributes& rOther) const;
bool operator!=(const FontSelectPatternAttributes& rOther) const
{
return !(*this == rOther);
}
public:
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
bool mbEmbolden; // Force emboldening
ItalicMatrix maItalicMatrix; // Force matrix for slant
};
class FontSelectPattern : public FontSelectPatternAttributes
{
public:
FontSelectPattern( const Font&, const String& rSearchName,
const Size&, float fExactHeight );
FontSelectPattern( const PhysicalFontFace&, const Size&,
float fExactHeight, int nOrientation, bool bVertical );
public: // TODO: change to private
const PhysicalFontFace* mpFontData; // a matching PhysicalFontFace object
ImplFontEntry* mpFontEntry; // pointer to the resulting FontCache entry
void copyAttributes(const FontSelectPatternAttributes &rAttributes);
};
// -------------------
// - 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 boost::unordered_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( PhysicalFontFace* );
void Clear();
int Count() const { return maDevFontList.size(); }
// find the device font
ImplDevFontListData* FindFontFamily( const String& rFontName ) const;
ImplDevFontListData* ImplFindByFont( FontSelectPattern&, bool bPrinter, ImplDirectFontSubstitution* ) const;
ImplDevFontListData* ImplFindBySearchName( const String& ) const;
// suggest fonts for glyph fallback
ImplDevFontListData* GetGlyphFallbackFont( FontSelectPattern&,
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;
ImplDevFontListData* ImplFindByTokenNames(const rtl::OUString& rTokenStr) const;
protected:
void InitMatchData() const;
bool AreMapNamesAvailable() const { return mbMapNames; }
ImplDevFontListData* ImplFindByAliasName(const rtl::OUString& rSearchName,
const rtl::OUString& rShortName) const;
ImplDevFontListData* ImplFindBySubstFontAttr( const utl::FontNameAttr& ) const;
ImplDevFontListData* ImplFindByAttributes(sal_uLong nSearchType, FontWeight, FontWidth,
FontItalic, const rtl::OUString& 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 FontSelectPattern& );
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; // Height of bold underline
long mnBUnderlineOffset; // Offset from bold underline to baseline
long mnDUnderlineSize; // Height of double underline
long mnDUnderlineOffset1; // Offset from double underline to baseline
long mnDUnderlineOffset2; // Offset from double underline to baseline
long mnWUnderlineSize; // Height of WaveLine underline
long mnWUnderlineOffset; // Offset from WaveLine underline to baseline, but centrered to WaveLine
long mnAboveUnderlineSize; // Height of single underline (for Vertical Right)
long mnAboveUnderlineOffset; // Offset from single underline to baseline (for Vertical Right)
long mnAboveBUnderlineSize; // Height of bold underline (for Vertical Right)
long mnAboveBUnderlineOffset; // Offset from bold underline to baseline (for Vertical Right)
long mnAboveDUnderlineSize; // Height of double underline (for Vertical Right)
long mnAboveDUnderlineOffset1; // Offset from double underline to baseline (for Vertical Right)
long mnAboveDUnderlineOffset2; // Offset from double underline to baseline (for Vertical Right)
long mnAboveWUnderlineSize; // Height of WaveLine-strike-out (for Vertical Right)
long mnAboveWUnderlineOffset; // Offset from WaveLine-strike-out to baseline, but centrered to to WaveLine (for Vertical Right)
long mnStrikeoutSize; // Height of single strike-out
long mnStrikeoutOffset; // Offset from single strike-out to baseline
long mnBStrikeoutSize; // Height of bold strike-out
long mnBStrikeoutOffset; // Offset of bold strike-out to baseline
long mnDStrikeoutSize; // Height of double strike-out
long mnDStrikeoutOffset1; // Offset of double strike-out to baseline
long mnDStrikeoutOffset2; // Offset of double strike-out to baseline
};
// -----------------
// - ImplFontEntry -
// ------------------
// TODO: rename ImplFontEntry to LogicalFontInstance
// TODO: allow sharing of metrics for related fonts
class VCL_PLUGIN_PUBLIC ImplFontEntry
{
public:
explicit ImplFontEntry( const FontSelectPattern& );
virtual ~ImplFontEntry();
public: // TODO: make data members private
FontSelectPattern 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 ::boost::unordered_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
CWS-TOOLING: integrate CWS otf01 2009-08-26 15:25:19 +0200 hdu r275426 : #i10000# make ubuntu-8.10 buildbot happy 2009-08-21 11:58:07 +0200 hdu r275230 : #i43029# another compile fix for 64bit platforms 2009-08-21 09:00:26 +0200 hdu r275216 : #i43029# sal_Int32 is defined differently on some platforms 2009-08-19 13:41:07 +0200 hdu r275149 : #i43029# fix use of sft-based subsetting in centralized code 2009-08-19 10:42:23 +0200 hdu r275140 : #i43029# --amend previous commit with omitted files 2009-08-19 10:14:54 +0200 hdu r275137 : #i43029# finishing touches for CWS otf01 start to centralize the previously open-coded font-subset/font-embed requests do the rest when the SCM allows source-file moves and commits with finer granularity 2009-08-17 15:11:24 +0200 hdu r275057 : CWS-TOOLING: rebase CWS otf01 to trunk@275001 (milestone: DEV300:m55) 2009-08-14 17:07:06 +0200 hdu r274998 : #i43029# CFF-subsetting now works on all platforms for PDF-export and PS-printing 2009-08-14 15:13:23 +0200 hdu r274984 : #i43029# OOo-build-baseline allows avoiding brute-forcing codepoint coverage calculation 2009-08-14 14:33:36 +0200 hdu r274981 : #i43029# CmapResult becomes a class 2009-08-13 15:57:55 +0200 hdu r274948 : #i43029# start implementing glue-code for CFF-subsetting on WIN 2009-08-10 17:10:46 +0200 hdu r274828 : #100000# WAE: signedness-warning 2009-08-10 14:08:05 +0200 hdu r274810 : #100000# 2009-08-10 13:34:55 +0200 hdu r274807 : #i43029# update ParseCmap() as we need to handle glyph-mapping ourselves on win for non-sft-supported fonts 2009-07-11 11:32:37 +0200 hdu r273909 : CWS-TOOLING: rebase CWS otf01 to trunk@273858 (milestone: DEV300:m52) 2009-07-03 17:14:55 +0200 hdu r273714 : #i43029# last step before centralizing UNX fontsubset code into platform independent layer 2009-07-03 17:00:14 +0200 hdu r273712 : #i10000# remove compile warning when debug=t 2009-07-03 16:28:29 +0200 hdu r273710 : #i43029# another step to centralize fontsubset code 2009-07-03 15:23:45 +0200 hdu r273705 : #i43029# PDF-export on UNX now starts to support OTF/CFF 2009-07-02 16:19:46 +0200 hdu r273663 : #i43029# warn when subsetting encounters glyph with deprecated SEAC-like endchar 2009-06-25 11:40:55 +0200 hdu r273372 : #i43029# ensure validity of cff-subsetted glyph name 2009-06-24 10:22:13 +0200 hdu r273318 : #i43029# check validity of exported sfnt subtable 2009-06-23 16:25:54 +0200 hdu r273292 : #i43029# use direct CFF->PFA font subsetting 2009-06-23 16:24:33 +0200 hdu r273289 : #i43029# allow font subset directly into a provided FILE handle 2009-06-23 16:22:44 +0200 hdu r273286 : #i43029# implement direct CFF->PFA font subsetting 2009-06-19 17:13:02 +0200 hdu r273171 : #i43029# CFF subsetting starts to work for psprinting 2009-06-18 15:48:42 +0200 hdu r273122 : #i43029# psprint requires explicit control of font subset name 2009-06-18 15:43:21 +0200 hdu r273121 : #i43029# psprint requires explicit control of font subset name 2009-06-16 18:15:43 +0200 hdu r273033 : #i43029# minor reshuffling to prepare CFF->PS font uploading 2009-06-16 16:25:21 +0200 hdu r273025 : #i43029# minimal-invasive change to sft.cxx to access a SFNT's CFF subtable 2009-06-12 15:51:42 +0200 hdu r272925 : #i43029# support OT/CFF subsetting for our PDF export on MacOSX 2009-06-12 15:43:26 +0200 hdu r272924 : #i43029# provide subset metrics as required by subset requesters 2009-05-27 13:58:59 +0200 hdu r272342 : #i43029# TripleInt is already reserved by OSX Carbon 2009-05-27 13:41:12 +0200 hdu r272339 : #i43029# fix warnings and make it compile on different platforms 2009-05-26 18:18:38 +0200 hdu r272315 : #i43029# start moving font subsetting into specialized class 2009-05-26 17:23:55 +0200 hdu r272312 : #i43029# improve name for CFF->PFB subsetted font 2009-05-25 17:12:27 +0200 hdu r272264 : #i43029# PDF-export: get type1-subsetting of the ground 2009-05-25 11:15:39 +0200 hdu r272227 : #i43029# fix BlueValues/FontBBox topdict entries 2009-05-25 10:59:16 +0200 hdu r272222 : #i43029# better PFB-DICT entries for FontBBox and BlueValues 2009-05-25 10:26:46 +0200 hdu r272219 : #i43029# emit other PRIVDICT hints for CFF->PFB subsetting 2009-05-25 10:10:25 +0200 hdu r272218 : #i43029# sign-extend shortint/longint typeopts/dictops 2009-05-25 09:38:33 +0200 hdu r272217 : #i43029# better glyph names for CFF-subsetted PFB 2009-05-20 18:57:11 +0200 hdu r272147 : #i43029# a CFF-subsetter gets the Blues 2009-05-20 14:05:35 +0200 hdu r272127 : #i43029# implement CreateFontSubsetFromCff() 2009-05-18 12:33:05 +0200 hdu r272012 : #i43029# add and use CffSubsetterContext::writeCurveTo() 2009-05-15 11:38:08 +0200 hdu r271931 : CffTable: allow charwidth parameter for type2 endchar operator 2009-05-14 18:55:25 +0200 hdu r271916 : #i43029# implement flex/flex1/hflex/hflex1 typeop conversion, fix type1val writing 2009-05-11 09:53:26 +0200 hdu r271750 : #i101695# improve import of ghostscript-PDF font names 2009-05-07 11:35:12 +0200 hdu r271644 : #i43029# adusted whitespace conventions from previously private code 2009-05-06 12:33:11 +0200 hdu r271579 : #i43029# change copyright header, fix warnings on some compilers 2009-05-06 10:50:50 +0200 hdu r271576 : improve whitespace and constness in some POS code 2009-05-05 16:10:56 +0200 hdu r271532 : #i43029# makefile support for new cff subsetter code 2009-05-05 14:56:29 +0200 hdu r271519 : #i43029# start integrating my CFF->Type1 subsetter code 2009-05-04 17:07:14 +0200 hdu r271474 : #i100140# remove obsoleted tables used for encoding conversion 2009-05-04 17:05:20 +0200 hdu r271473 : #i100140# use generic encoding converters in xlat.cxx 2009-04-15 11:58:25 +0200 hdu r270829 : #i101102# remove build dependency to removed module psprint 2009-04-14 15:57:13 +0200 hdu r270788 : CWS-TOOLING: rebase CWS otf01 to trunk@270723 (milestone: DEV300:m46) 2009-03-11 14:49:56 +0100 hdu r269335 : CWS-TOOLING: rebase CWS otf01 to trunk@269297 (milestone: DEV300:m43) 2009-02-06 12:32:22 +0100 hdu r267451 : resync CWS across CVS->SVN change 2009-02-06 12:32:04 +0100 hdu r267450 : resync CWS across CVS->SVN change
2009-08-27 07:02:29 -05:00
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */