xref: /AOO41X/main/vcl/inc/os2/salgdi.h (revision 5f27b83cee6e25e8a00edc4ae51b88fe9d2801da)
124f6443dSAndrew Rist /**************************************************************
2fc9fd3f1SPedro Giffuni  *
324f6443dSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
424f6443dSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
524f6443dSAndrew Rist  * distributed with this work for additional information
624f6443dSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
724f6443dSAndrew Rist  * to you under the Apache License, Version 2.0 (the
824f6443dSAndrew Rist  * "License"); you may not use this file except in compliance
924f6443dSAndrew Rist  * with the License.  You may obtain a copy of the License at
10fc9fd3f1SPedro Giffuni  *
1124f6443dSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12fc9fd3f1SPedro Giffuni  *
1324f6443dSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1424f6443dSAndrew Rist  * software distributed under the License is distributed on an
1524f6443dSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1624f6443dSAndrew Rist  * KIND, either express or implied.  See the License for the
1724f6443dSAndrew Rist  * specific language governing permissions and limitations
1824f6443dSAndrew Rist  * under the License.
19fc9fd3f1SPedro Giffuni  *
2024f6443dSAndrew Rist  *************************************************************/
2124f6443dSAndrew Rist 
2224f6443dSAndrew Rist 
23fc9fd3f1SPedro Giffuni 
24fc9fd3f1SPedro Giffuni #ifndef _SV_SALGDI_H
25fc9fd3f1SPedro Giffuni #define _SV_SALGDI_H
26fc9fd3f1SPedro Giffuni 
27fc9fd3f1SPedro Giffuni #include <sallayout.hxx>
28fc9fd3f1SPedro Giffuni #include <salgdi.hxx>
29fc9fd3f1SPedro Giffuni #include <outfont.hxx>
30fc9fd3f1SPedro Giffuni #include <impfont.hxx>
31fc9fd3f1SPedro Giffuni 
32fc9fd3f1SPedro Giffuni #include <hash_set>
33fc9fd3f1SPedro Giffuni 
34fc9fd3f1SPedro Giffuni class ImplOs2FontEntry;
35fc9fd3f1SPedro Giffuni 
36fc9fd3f1SPedro Giffuni // -----------
37fc9fd3f1SPedro Giffuni // - Defines -
38fc9fd3f1SPedro Giffuni // -----------
39fc9fd3f1SPedro Giffuni 
40fc9fd3f1SPedro Giffuni // win32 platform specific options. Move them to the PMK file?
41fc9fd3f1SPedro Giffuni #define GCP_USEKERNING    0x0008
42fc9fd3f1SPedro Giffuni #define USE_UNISCRIBE
43fc9fd3f1SPedro Giffuni #define GCP_KERN_HACK
44fc9fd3f1SPedro Giffuni #define GNG_VERT_HACK
45fc9fd3f1SPedro Giffuni 
46fc9fd3f1SPedro Giffuni // os2 specific physically available font face
47fc9fd3f1SPedro Giffuni class ImplOs2FontData : public ImplFontData
48fc9fd3f1SPedro Giffuni {
49fc9fd3f1SPedro Giffuni public:
50fc9fd3f1SPedro Giffuni                             ImplOs2FontData( PFONTMETRICS,
51fc9fd3f1SPedro Giffuni                                 int nFontHeight,
52fc9fd3f1SPedro Giffuni                                 PM_BYTE nPitchAndFamily  );
53fc9fd3f1SPedro Giffuni                             ~ImplOs2FontData();
54fc9fd3f1SPedro Giffuni 
55fc9fd3f1SPedro Giffuni     virtual ImplFontData*   Clone() const;
56fc9fd3f1SPedro Giffuni     virtual ImplFontEntry*  CreateFontInstance( ImplFontSelectData& ) const;
57fc9fd3f1SPedro Giffuni     virtual sal_IntPtr      GetFontId() const;
58fc9fd3f1SPedro Giffuni     void                    SetFontId( sal_IntPtr nId ) { mnId = nId; }
59fc9fd3f1SPedro Giffuni     void                    UpdateFromHPS( HPS ) const;
60fc9fd3f1SPedro Giffuni 
61fc9fd3f1SPedro Giffuni     bool                    HasChar( sal_uInt32 cChar ) const;
62fc9fd3f1SPedro Giffuni 
63fc9fd3f1SPedro Giffuni     PFONTMETRICS            GetFontMetrics() const          { return pFontMetric; }
64fc9fd3f1SPedro Giffuni     USHORT                  GetCharSet() const          { return meOs2CharSet; }
65fc9fd3f1SPedro Giffuni     PM_BYTE                    GetPitchAndFamily() const   { return mnPitchAndFamily; }
66fc9fd3f1SPedro Giffuni     bool                    IsGlyphApiDisabled() const  { return mbDisableGlyphApi; }
67fc9fd3f1SPedro Giffuni     bool                    SupportsKorean() const      { return mbHasKoreanRange; }
68fc9fd3f1SPedro Giffuni     bool                    SupportsCJK() const         { return mbHasCJKSupport; }
69fc9fd3f1SPedro Giffuni     bool                    SupportsArabic() const      { return mbHasArabicSupport; }
70fc9fd3f1SPedro Giffuni     bool                    AliasSymbolsHigh() const    { return mbAliasSymbolsHigh; }
71fc9fd3f1SPedro Giffuni     bool                    AliasSymbolsLow() const     { return mbAliasSymbolsLow; }
72fc9fd3f1SPedro Giffuni 
73fc9fd3f1SPedro Giffuni     const ImplFontCharMap*        GetImplFontCharMap() const;
74fc9fd3f1SPedro Giffuni     const Ucs2SIntMap* GetEncodingVector() const { return mpEncodingVector; }
75fc9fd3f1SPedro Giffuni     void SetEncodingVector( const Ucs2SIntMap* pNewVec ) const
76fc9fd3f1SPedro Giffuni     {
77fc9fd3f1SPedro Giffuni         if( mpEncodingVector )
78fc9fd3f1SPedro Giffuni             delete mpEncodingVector;
79fc9fd3f1SPedro Giffuni         mpEncodingVector = pNewVec;
80fc9fd3f1SPedro Giffuni     }
81fc9fd3f1SPedro Giffuni 
82fc9fd3f1SPedro Giffuni private:
83fc9fd3f1SPedro Giffuni     sal_IntPtr              mnId;
84fc9fd3f1SPedro Giffuni     mutable bool                    mbDisableGlyphApi;
85fc9fd3f1SPedro Giffuni     mutable bool                    mbHasKoreanRange;
86fc9fd3f1SPedro Giffuni     mutable bool                    mbHasCJKSupport;
87fc9fd3f1SPedro Giffuni 
88fc9fd3f1SPedro Giffuni     mutable bool                    mbHasArabicSupport;
89fc9fd3f1SPedro Giffuni     mutable ImplFontCharMap*        mpUnicodeMap;
90fc9fd3f1SPedro Giffuni     mutable const Ucs2SIntMap*      mpEncodingVector;
91fc9fd3f1SPedro Giffuni 
92fc9fd3f1SPedro Giffuni     // TODO: get rid of the members below needed to work with the Win9x non-unicode API
93fc9fd3f1SPedro Giffuni     PM_BYTE*                   mpFontCharSets;     // all Charsets for the current font (used on W98 for kerning)
94fc9fd3f1SPedro Giffuni     PM_BYTE                    mnFontCharSetCount; // Number of Charsets of the current font; 0 - if not queried
95fc9fd3f1SPedro Giffuni     USHORT                  meOs2CharSet;
96fc9fd3f1SPedro Giffuni     PM_BYTE                    mnPitchAndFamily;
97fc9fd3f1SPedro Giffuni     bool                    mbAliasSymbolsHigh;
98fc9fd3f1SPedro Giffuni     bool                    mbAliasSymbolsLow;
99fc9fd3f1SPedro Giffuni     PFONTMETRICS            pFontMetric;
100fc9fd3f1SPedro Giffuni 
101fc9fd3f1SPedro Giffuni private:
102fc9fd3f1SPedro Giffuni     void                    ReadCmapTable( HDC ) const;
103fc9fd3f1SPedro Giffuni     void                    ReadOs2Table( HDC ) const;
104fc9fd3f1SPedro Giffuni 
105fc9fd3f1SPedro Giffuni #ifdef GNG_VERT_HACK
106fc9fd3f1SPedro Giffuni     void                    ReadGsubTable( HDC ) const;
107fc9fd3f1SPedro Giffuni 
108fc9fd3f1SPedro Giffuni     typedef std::hash_set<int> IntHashSet;
109fc9fd3f1SPedro Giffuni     mutable IntHashSet      maGsubTable;
110fc9fd3f1SPedro Giffuni     mutable bool            mbGsubRead;
111fc9fd3f1SPedro Giffuni public:
112fc9fd3f1SPedro Giffuni     bool                    HasGSUBstitutions( HDC ) const;
113fc9fd3f1SPedro Giffuni     bool                    IsGSUBstituted( sal_Unicode ) const;
114fc9fd3f1SPedro Giffuni #endif // GNG_VERT_HACK
115fc9fd3f1SPedro Giffuni 
116fc9fd3f1SPedro Giffuni };
117fc9fd3f1SPedro Giffuni 
118fc9fd3f1SPedro Giffuni 
119fc9fd3f1SPedro Giffuni // -------------------
120fc9fd3f1SPedro Giffuni // - SalGraphicsData -
121fc9fd3f1SPedro Giffuni // -------------------
122fc9fd3f1SPedro Giffuni 
123fc9fd3f1SPedro Giffuni class Os2SalGraphics : public SalGraphics
124fc9fd3f1SPedro Giffuni {
125fc9fd3f1SPedro Giffuni public:
126fc9fd3f1SPedro Giffuni 	HPS 					mhPS;				// HPS
127fc9fd3f1SPedro Giffuni 	HDC 					mhDC;				// HDC
128fc9fd3f1SPedro Giffuni 	HWND					mhWnd;				// HWND
129fc9fd3f1SPedro Giffuni 	LONG					mnHeight;			// Height of frame Window
130fc9fd3f1SPedro Giffuni 	ULONG					mnClipElementCount; // number of clip rects in clip rect array
131fc9fd3f1SPedro Giffuni 	RECTL*					mpClipRectlAry; 	// clip rect array
132fc9fd3f1SPedro Giffuni 	ULONG					mnFontMetricCount;	// number of entries in the font list
133fc9fd3f1SPedro Giffuni 	PFONTMETRICS			mpFontMetrics;		// cached font list
134fc9fd3f1SPedro Giffuni 	LONG					mnOrientationX; 	// X-Font orientation
135fc9fd3f1SPedro Giffuni 	LONG					mnOrientationY; 	// Y-Font orientation
136fc9fd3f1SPedro Giffuni 	sal_Bool					mbLine; 			// draw lines
137fc9fd3f1SPedro Giffuni 	sal_Bool					mbFill; 			// fill areas
138fc9fd3f1SPedro Giffuni 	sal_Bool					mbPrinter;			// is Printer
139fc9fd3f1SPedro Giffuni 	sal_Bool					mbVirDev;			// is VirDev
140fc9fd3f1SPedro Giffuni 	sal_Bool					mbWindow;			// is Window
141fc9fd3f1SPedro Giffuni 	sal_Bool					mbScreen;			// is Screen compatible
142fc9fd3f1SPedro Giffuni 	bool					mbXORMode;			// _every_ output with RasterOp XOR
143fc9fd3f1SPedro Giffuni 	ULONG					mhFonts[ MAX_FALLBACK ];        // Font + Fallbacks
144fc9fd3f1SPedro Giffuni 	const ImplOs2FontData*			mpOs2FontData[ MAX_FALLBACK ];  // pointer to the most recent font face
145fc9fd3f1SPedro Giffuni 	ImplOs2FontEntry*			mpOs2FontEntry[ MAX_FALLBACK ]; // pointer to the most recent font instance
146fc9fd3f1SPedro Giffuni 	ULONG					mhDefFont;			// DefaultFont
147fc9fd3f1SPedro Giffuni 	float					mfFontScale;			// allows metrics emulation of huge font sizes
148fc9fd3f1SPedro Giffuni 	sal_Bool					mbFontKernInit; 	// FALSE: FontKerns must be queried
149fc9fd3f1SPedro Giffuni 	KERNINGPAIRS*				mpFontKernPairs;	// Kerning Pairs of the current Font
150fc9fd3f1SPedro Giffuni 	ULONG					mnFontKernPairCount;// Number of Kerning Pairs of the current Font
151fc9fd3f1SPedro Giffuni 
152fc9fd3f1SPedro Giffuni 	USHORT					ImplDoSetFont( ImplFontSelectData* i_pFont, float& o_rFontScale, int );
153fc9fd3f1SPedro Giffuni 
154fc9fd3f1SPedro Giffuni public:
155fc9fd3f1SPedro Giffuni     Os2SalGraphics();
156fc9fd3f1SPedro Giffuni     virtual ~Os2SalGraphics();
157fc9fd3f1SPedro Giffuni 
158fc9fd3f1SPedro Giffuni protected:
159fc9fd3f1SPedro Giffuni     virtual bool        setClipRegion( const Region& );
160fc9fd3f1SPedro Giffuni     // draw --> LineColor and FillColor and RasterOp and ClipRegion
161fc9fd3f1SPedro Giffuni     virtual void		drawPixel( long nX, long nY );
162fc9fd3f1SPedro Giffuni     virtual void		drawPixel( long nX, long nY, SalColor nSalColor );
163fc9fd3f1SPedro Giffuni     virtual void		drawLine( long nX1, long nY1, long nX2, long nY2 );
164fc9fd3f1SPedro Giffuni     virtual void		drawRect( long nX, long nY, long nWidth, long nHeight );
165fc9fd3f1SPedro Giffuni     virtual void		drawPolyLine( ULONG nPoints, const SalPoint* pPtAry );
166fc9fd3f1SPedro Giffuni     virtual void		drawPolygon( ULONG nPoints, const SalPoint* pPtAry );
167fc9fd3f1SPedro Giffuni     virtual void		drawPolyPolygon( ULONG nPoly, const ULONG* pPoints, PCONSTSALPOINT* pPtAry );
168fc9fd3f1SPedro Giffuni     virtual bool        drawPolyPolygon( const ::basegfx::B2DPolyPolygon&, double fTransparency );
1695aaf853bSArmin Le Grand     virtual bool        drawPolyLine(
1705aaf853bSArmin Le Grand         const ::basegfx::B2DPolygon&,
1715aaf853bSArmin Le Grand         double fTransparency,
1725aaf853bSArmin Le Grand         const ::basegfx::B2DVector& rLineWidth,
1735aaf853bSArmin Le Grand         basegfx::B2DLineJoin,
1745aaf853bSArmin Le Grand         com::sun::star::drawing::LineCap);
175fc9fd3f1SPedro Giffuni     virtual sal_Bool	drawPolyLineBezier( sal_uIntPtr nPoints, const SalPoint* pPtAry, const sal_uInt8* pFlgAry );
176fc9fd3f1SPedro Giffuni     virtual sal_Bool	drawPolygonBezier( sal_uIntPtr nPoints, const SalPoint* pPtAry, const sal_uInt8* pFlgAry );
177fc9fd3f1SPedro Giffuni     virtual sal_Bool	drawPolyPolygonBezier( sal_uInt32 nPoly, const sal_uInt32* pPoints, const SalPoint* const* pPtAry, const sal_uInt8* const* pFlgAry );
178fc9fd3f1SPedro Giffuni 
179fc9fd3f1SPedro Giffuni     // CopyArea --> No RasterOp, but ClipRegion
180fc9fd3f1SPedro Giffuni     virtual void		copyArea( long nDestX, long nDestY, long nSrcX, long nSrcY, long nSrcWidth,
181fc9fd3f1SPedro Giffuni                                   long nSrcHeight, USHORT nFlags );
182fc9fd3f1SPedro Giffuni 
183fc9fd3f1SPedro Giffuni     // CopyBits and DrawBitmap --> RasterOp and ClipRegion
184fc9fd3f1SPedro Giffuni     // CopyBits() --> pSrcGraphics == NULL, then CopyBits on same Graphics
185*5f27b83cSArmin Le Grand     virtual void		copyBits( const SalTwoRect& rPosAry, SalGraphics* pSrcGraphics );
186*5f27b83cSArmin Le Grand     virtual void		drawBitmap( const SalTwoRect& rPosAry, const SalBitmap& rSalBitmap );
187*5f27b83cSArmin Le Grand     virtual void		drawBitmap( const SalTwoRect& rPosAry,
188fc9fd3f1SPedro Giffuni                                     const SalBitmap& rSalBitmap,
189fc9fd3f1SPedro Giffuni                                     SalColor nTransparentColor );
190*5f27b83cSArmin Le Grand     virtual void		drawBitmap( const SalTwoRect& rPosAry,
191fc9fd3f1SPedro Giffuni                                     const SalBitmap& rSalBitmap,
192fc9fd3f1SPedro Giffuni                                     const SalBitmap& rTransparentBitmap );
193*5f27b83cSArmin Le Grand     virtual void		drawMask( const SalTwoRect& rPosAry,
194fc9fd3f1SPedro Giffuni                                   const SalBitmap& rSalBitmap,
195fc9fd3f1SPedro Giffuni                                   SalColor nMaskColor );
196fc9fd3f1SPedro Giffuni 
197fc9fd3f1SPedro Giffuni     virtual SalBitmap*	getBitmap( long nX, long nY, long nWidth, long nHeight );
198fc9fd3f1SPedro Giffuni     virtual SalColor	getPixel( long nX, long nY );
199fc9fd3f1SPedro Giffuni 
200fc9fd3f1SPedro Giffuni     // invert --> ClipRegion (only Windows or VirDevs)
201fc9fd3f1SPedro Giffuni     virtual void		invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags);
202fc9fd3f1SPedro Giffuni     virtual void		invert( ULONG nPoints, const SalPoint* pPtAry, SalInvert nFlags );
203fc9fd3f1SPedro Giffuni 
204fc9fd3f1SPedro Giffuni     virtual sal_Bool		drawEPS( long nX, long nY, long nWidth, long nHeight, void* pPtr, ULONG nSize );
205fc9fd3f1SPedro Giffuni 
206fc9fd3f1SPedro Giffuni #if 0
207fc9fd3f1SPedro Giffuni     // native widget rendering methods that require mirroring
208fc9fd3f1SPedro Giffuni     virtual sal_Bool        hitTestNativeControl( ControlType nType, ControlPart nPart, const Region& rControlRegion,
209fc9fd3f1SPedro Giffuni                                               const Point& aPos, sal_Bool& rIsInside );
210fc9fd3f1SPedro Giffuni     virtual sal_Bool        drawNativeControl( ControlType nType, ControlPart nPart, const Region& rControlRegion,
211fc9fd3f1SPedro Giffuni                                            ControlState nState, const ImplControlValue& aValue,
212fc9fd3f1SPedro Giffuni                                            rtl::OUString aCaption );
213fc9fd3f1SPedro Giffuni     virtual sal_Bool        drawNativeControlText( ControlType nType, ControlPart nPart, const Region& rControlRegion,
214fc9fd3f1SPedro Giffuni                                                ControlState nState, const ImplControlValue& aValue,
215fc9fd3f1SPedro Giffuni                                                rtl::OUString aCaption );
216fc9fd3f1SPedro Giffuni     virtual sal_Bool        getNativeControlRegion( ControlType nType, ControlPart nPart, const Region& rControlRegion, ControlState nState,
217fc9fd3f1SPedro Giffuni                                                 const ImplControlValue& aValue, rtl::OUString aCaption,
218fc9fd3f1SPedro Giffuni                                                 Region &rNativeBoundingRegion, Region &rNativeContentRegion );
219fc9fd3f1SPedro Giffuni #endif
220fc9fd3f1SPedro Giffuni 
221fc9fd3f1SPedro Giffuni     virtual bool		drawAlphaBitmap( const SalTwoRect&,
222fc9fd3f1SPedro Giffuni                                          const SalBitmap& rSourceBitmap,
223fc9fd3f1SPedro Giffuni                                          const SalBitmap& rAlphaBitmap );
224*5f27b83cSArmin Le Grand     virtual bool drawTransformedBitmap(
225*5f27b83cSArmin Le Grand         const basegfx::B2DPoint& rNull,
226*5f27b83cSArmin Le Grand         const basegfx::B2DPoint& rX,
227*5f27b83cSArmin Le Grand         const basegfx::B2DPoint& rY,
228*5f27b83cSArmin Le Grand         const SalBitmap& rSourceBitmap,
229*5f27b83cSArmin Le Grand         const SalBitmap* pAlphaBitmap);
230fc9fd3f1SPedro Giffuni     virtual bool		drawAlphaRect( long nX, long nY, long nWidth, long nHeight, sal_uInt8 nTransparency );
231fc9fd3f1SPedro Giffuni 
232fc9fd3f1SPedro Giffuni public:
233fc9fd3f1SPedro Giffuni     // public SalGraphics methods, the interface to teh independent vcl part
234fc9fd3f1SPedro Giffuni 
235fc9fd3f1SPedro Giffuni     // get device resolution
236fc9fd3f1SPedro Giffuni     virtual void			GetResolution( long& rDPIX, long& rDPIY );
237fc9fd3f1SPedro Giffuni     // get the depth of the device
238fc9fd3f1SPedro Giffuni     virtual USHORT			GetBitCount();
239fc9fd3f1SPedro Giffuni     // get the width of the device
240fc9fd3f1SPedro Giffuni     virtual long			GetGraphicsWidth() const;
241fc9fd3f1SPedro Giffuni 
242fc9fd3f1SPedro Giffuni     // set the clip region to empty
243fc9fd3f1SPedro Giffuni     virtual void			ResetClipRegion();
244fc9fd3f1SPedro Giffuni 
245fc9fd3f1SPedro Giffuni     // set the line color to transparent (= don't draw lines)
246fc9fd3f1SPedro Giffuni     virtual void			SetLineColor();
247fc9fd3f1SPedro Giffuni     // set the line color to a specific color
248fc9fd3f1SPedro Giffuni     virtual void			SetLineColor( SalColor nSalColor );
249fc9fd3f1SPedro Giffuni     // set the fill color to transparent (= don't fill)
250fc9fd3f1SPedro Giffuni     virtual void			SetFillColor();
251fc9fd3f1SPedro Giffuni     // set the fill color to a specific color, shapes will be
252fc9fd3f1SPedro Giffuni     // filled accordingly
253fc9fd3f1SPedro Giffuni     virtual void          	SetFillColor( SalColor nSalColor );
254fc9fd3f1SPedro Giffuni     // enable/disable XOR drawing
255fc9fd3f1SPedro Giffuni     virtual void			SetXORMode( bool bSet, bool );
256fc9fd3f1SPedro Giffuni     // set line color for raster operations
257fc9fd3f1SPedro Giffuni     virtual void			SetROPLineColor( SalROPColor nROPColor );
258fc9fd3f1SPedro Giffuni     // set fill color for raster operations
259fc9fd3f1SPedro Giffuni     virtual void			SetROPFillColor( SalROPColor nROPColor );
260fc9fd3f1SPedro Giffuni     // set the text color to a specific color
261fc9fd3f1SPedro Giffuni     virtual void			SetTextColor( SalColor nSalColor );
262fc9fd3f1SPedro Giffuni     // set the font
263fc9fd3f1SPedro Giffuni     virtual USHORT         SetFont( ImplFontSelectData*, int nFallbackLevel );
264fc9fd3f1SPedro Giffuni     // get the current font's etrics
265fc9fd3f1SPedro Giffuni     virtual void			GetFontMetric( ImplFontMetricData*, int nFallbackLevel );
266fc9fd3f1SPedro Giffuni     // get kernign pairs of the current font
267fc9fd3f1SPedro Giffuni     // return only PairCount if (pKernPairs == NULL)
268fc9fd3f1SPedro Giffuni     virtual ULONG			GetKernPairs( ULONG nPairs, ImplKernPairData* pKernPairs );
269fc9fd3f1SPedro Giffuni     // get the repertoire of the current font
270fc9fd3f1SPedro Giffuni     virtual const ImplFontCharMap* GetImplFontCharMap() const;
271fc9fd3f1SPedro Giffuni     // graphics must fill supplied font list
272fc9fd3f1SPedro Giffuni     virtual void			GetDevFontList( ImplDevFontList* );
273fc9fd3f1SPedro Giffuni     // graphics should call ImplAddDevFontSubstitute on supplied
274fc9fd3f1SPedro Giffuni     // OutputDevice for all its device specific preferred font substitutions
275fc9fd3f1SPedro Giffuni     virtual void			GetDevFontSubstList( OutputDevice* );
276fc9fd3f1SPedro Giffuni     virtual bool			AddTempDevFont( ImplDevFontList*, const String& rFileURL, const String& rFontName );
277fc9fd3f1SPedro Giffuni     // CreateFontSubset: a method to get a subset of glyhps of a font
278fc9fd3f1SPedro Giffuni     // inside a new valid font file
279fc9fd3f1SPedro Giffuni     // returns TRUE if creation of subset was successfull
280fc9fd3f1SPedro Giffuni     // parameters: rToFile: contains a osl file URL to write the subset to
281fc9fd3f1SPedro Giffuni     //             pFont: describes from which font to create a subset
282fc9fd3f1SPedro Giffuni     //             pGlyphIDs: the glyph ids to be extracted
283fc9fd3f1SPedro Giffuni     //             pEncoding: the character code corresponding to each glyph
284fc9fd3f1SPedro Giffuni     //             pWidths: the advance widths of the correspoding glyphs (in PS font units)
285fc9fd3f1SPedro Giffuni     //             nGlyphs: the number of glyphs
286fc9fd3f1SPedro Giffuni     //             rInfo: additional outgoing information
287fc9fd3f1SPedro Giffuni     // implementation note: encoding 0 with glyph id 0 should be added implicitly
288fc9fd3f1SPedro Giffuni     // as "undefined character"
289fc9fd3f1SPedro Giffuni     virtual sal_Bool			CreateFontSubset( const rtl::OUString& rToFile,
290fc9fd3f1SPedro Giffuni                                               const ImplFontData* pFont,
291fc9fd3f1SPedro Giffuni                                               long* pGlyphIDs,
292fc9fd3f1SPedro Giffuni                                               sal_uInt8* pEncoding,
293fc9fd3f1SPedro Giffuni                                               sal_Int32* pWidths,
294fc9fd3f1SPedro Giffuni                                               int nGlyphs,
295fc9fd3f1SPedro Giffuni                                               FontSubsetInfo& rInfo // out parameter
296fc9fd3f1SPedro Giffuni                                               );
297fc9fd3f1SPedro Giffuni 
298fc9fd3f1SPedro Giffuni     // GetFontEncodingVector: a method to get the encoding map Unicode
299fc9fd3f1SPedro Giffuni 	// to font encoded character; this is only used for type1 fonts and
300fc9fd3f1SPedro Giffuni     // may return NULL in case of unknown encoding vector
301fc9fd3f1SPedro Giffuni     // if ppNonEncoded is set and non encoded characters (that is type1
302fc9fd3f1SPedro Giffuni     // glyphs with only a name) exist it is set to the corresponding
303fc9fd3f1SPedro Giffuni     // map for non encoded glyphs; the encoding vector contains -1
304fc9fd3f1SPedro Giffuni     // as encoding for these cases
305fc9fd3f1SPedro Giffuni     virtual const Ucs2SIntMap* GetFontEncodingVector( const ImplFontData*, const Ucs2OStrMap** ppNonEncoded );
306fc9fd3f1SPedro Giffuni 
307fc9fd3f1SPedro Giffuni     // GetEmbedFontData: gets the font data for a font marked
308fc9fd3f1SPedro Giffuni     // embeddable by GetDevFontList or NULL in case of error
309fc9fd3f1SPedro Giffuni     // parameters: pFont: describes the font in question
310fc9fd3f1SPedro Giffuni     //             pWidths: the widths of all glyphs from char code 0 to 255
311fc9fd3f1SPedro Giffuni     //                      pWidths MUST support at least 256 members;
312fc9fd3f1SPedro Giffuni     //             rInfo: additional outgoing information
313fc9fd3f1SPedro Giffuni     //             pDataLen: out parameter, contains the PM_BYTE length of the returned buffer
314fc9fd3f1SPedro Giffuni     virtual const void*	GetEmbedFontData( const ImplFontData*,
315fc9fd3f1SPedro Giffuni                                           const sal_Ucs* pUnicodes,
316fc9fd3f1SPedro Giffuni                                           sal_Int32* pWidths,
317fc9fd3f1SPedro Giffuni                                           FontSubsetInfo& rInfo,
318fc9fd3f1SPedro Giffuni                                           long* pDataLen );
319fc9fd3f1SPedro Giffuni     // frees the font data again
320fc9fd3f1SPedro Giffuni     virtual void			FreeEmbedFontData( const void* pData, long nDataLen );
321fc9fd3f1SPedro Giffuni 
322fc9fd3f1SPedro Giffuni     virtual void            GetGlyphWidths( const ImplFontData* pFont,
323fc9fd3f1SPedro Giffuni                                             bool bVertical,
324fc9fd3f1SPedro Giffuni                                             Int32Vector& rWidths,
325fc9fd3f1SPedro Giffuni                                             Ucs2UIntMap& rUnicodeEnc );
326fc9fd3f1SPedro Giffuni 
327fc9fd3f1SPedro Giffuni     virtual sal_Bool                    GetGlyphBoundRect( long nIndex, Rectangle& );
328fc9fd3f1SPedro Giffuni     virtual sal_Bool                    GetGlyphOutline( long nIndex, ::basegfx::B2DPolyPolygon& );
329fc9fd3f1SPedro Giffuni 
330fc9fd3f1SPedro Giffuni     virtual SalLayout*              GetTextLayout( ImplLayoutArgs&, int nFallbackLevel );
331fc9fd3f1SPedro Giffuni     virtual void					 DrawServerFontLayout( const ServerFontLayout& );
332fc9fd3f1SPedro Giffuni     virtual bool            supportsOperation( OutDevSupportType ) const;
333fc9fd3f1SPedro Giffuni 
334fc9fd3f1SPedro Giffuni     // Query the platform layer for control support
335fc9fd3f1SPedro Giffuni     virtual sal_Bool IsNativeControlSupported( ControlType nType, ControlPart nPart );
336fc9fd3f1SPedro Giffuni 
337fc9fd3f1SPedro Giffuni     virtual SystemGraphicsData GetGraphicsData() const;
338fc9fd3f1SPedro Giffuni     virtual SystemFontData     GetSysFontData( int nFallbacklevel ) const;
339fc9fd3f1SPedro Giffuni };
340fc9fd3f1SPedro Giffuni 
341fc9fd3f1SPedro Giffuni // Init/Deinit Graphics
342fc9fd3f1SPedro Giffuni void ImplSalInitGraphics( Os2SalGraphics* mpData );
343fc9fd3f1SPedro Giffuni void ImplSalDeInitGraphics( Os2SalGraphics* mpData );
344fc9fd3f1SPedro Giffuni 
345fc9fd3f1SPedro Giffuni // -----------
346fc9fd3f1SPedro Giffuni // - Defines -
347fc9fd3f1SPedro Giffuni // -----------
348fc9fd3f1SPedro Giffuni 
349fc9fd3f1SPedro Giffuni #define TY( y ) 			(mnHeight-(y)-1)
350fc9fd3f1SPedro Giffuni 
351fc9fd3f1SPedro Giffuni // offset for lcid field, used for fallback font selection
352fc9fd3f1SPedro Giffuni #define LCID_BASE						100
353fc9fd3f1SPedro Giffuni 
354fc9fd3f1SPedro Giffuni // -----------
355fc9fd3f1SPedro Giffuni // - Inlines -
356fc9fd3f1SPedro Giffuni // -----------
357fc9fd3f1SPedro Giffuni 
358fc9fd3f1SPedro Giffuni // #102411# Win's GCP mishandles kerning => we need to do it ourselves
359fc9fd3f1SPedro Giffuni // SalGraphicsData::mpFontKernPairs is sorted by
360fc9fd3f1SPedro Giffuni inline bool ImplCmpKernData( const KERNINGPAIRS& a, const KERNINGPAIRS& b )
361fc9fd3f1SPedro Giffuni {
362fc9fd3f1SPedro Giffuni     if( a.sFirstChar < b.sFirstChar )
363fc9fd3f1SPedro Giffuni         return true;
364fc9fd3f1SPedro Giffuni     if( a.sFirstChar > b.sFirstChar )
365fc9fd3f1SPedro Giffuni         return false;
366fc9fd3f1SPedro Giffuni     return (a.sSecondChar < b.sSecondChar);
367fc9fd3f1SPedro Giffuni }
368fc9fd3f1SPedro Giffuni 
369fc9fd3f1SPedro Giffuni // called extremely often from just one spot => inline
370fc9fd3f1SPedro Giffuni inline bool ImplOs2FontData::HasChar( sal_uInt32 cChar ) const
371fc9fd3f1SPedro Giffuni {
372fc9fd3f1SPedro Giffuni     if( mpUnicodeMap->HasChar( cChar ) )
373fc9fd3f1SPedro Giffuni         return true;
374fc9fd3f1SPedro Giffuni     // second chance to allow symbol aliasing
375fc9fd3f1SPedro Giffuni     if( mbAliasSymbolsLow && ((cChar-0xF000) <= 0xFF) )
376fc9fd3f1SPedro Giffuni         cChar -= 0xF000;
377fc9fd3f1SPedro Giffuni     else if( mbAliasSymbolsHigh && (cChar <= 0xFF) )
378fc9fd3f1SPedro Giffuni         cChar += 0xF000;
379fc9fd3f1SPedro Giffuni     return mpUnicodeMap->HasChar( cChar );
380fc9fd3f1SPedro Giffuni }
381fc9fd3f1SPedro Giffuni 
382fc9fd3f1SPedro Giffuni #endif // _SV_SALGDI_H
383