xref: /aoo4110/main/vcl/source/gdi/salgdilayout.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_vcl.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <tools/ref.hxx>
28*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
29*b1cdbd2cSJim Jagielski #include <tools/poly.hxx>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
32*b1cdbd2cSJim Jagielski #include <vcl/region.hxx>
33*b1cdbd2cSJim Jagielski #include <vcl/virdev.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
35*b1cdbd2cSJim Jagielski #include <vcl/metaact.hxx>
36*b1cdbd2cSJim Jagielski #include <vcl/gdimtf.hxx>
37*b1cdbd2cSJim Jagielski #include <vcl/print.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/outdev.hxx>
39*b1cdbd2cSJim Jagielski #include <vcl/unowrap.hxx>
40*b1cdbd2cSJim Jagielski 
41*b1cdbd2cSJim Jagielski #include <window.h>
42*b1cdbd2cSJim Jagielski #include <outdev.h>
43*b1cdbd2cSJim Jagielski #include <sallayout.hxx>
44*b1cdbd2cSJim Jagielski #include <salgdi.hxx>
45*b1cdbd2cSJim Jagielski #include <salframe.hxx>
46*b1cdbd2cSJim Jagielski #include <salvd.hxx>
47*b1cdbd2cSJim Jagielski #include <salprn.hxx>
48*b1cdbd2cSJim Jagielski #include <svdata.hxx>
49*b1cdbd2cSJim Jagielski #include <outdata.hxx>
50*b1cdbd2cSJim Jagielski 
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski #include "basegfx/polygon/b2dpolygon.hxx"
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
55*b1cdbd2cSJim Jagielski // The only common SalFrame method
56*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
57*b1cdbd2cSJim Jagielski 
GetGeometry()58*b1cdbd2cSJim Jagielski SalFrameGeometry SalFrame::GetGeometry()
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski     // mirror frame coordinates at parent
61*b1cdbd2cSJim Jagielski     SalFrame *pParent = GetParent();
62*b1cdbd2cSJim Jagielski     if( pParent && Application::GetSettings().GetLayoutRTL() )
63*b1cdbd2cSJim Jagielski     {
64*b1cdbd2cSJim Jagielski         SalFrameGeometry aGeom = maGeometry;
65*b1cdbd2cSJim Jagielski         int parent_x = aGeom.nX - pParent->maGeometry.nX;
66*b1cdbd2cSJim Jagielski         aGeom.nX = pParent->maGeometry.nX + pParent->maGeometry.nWidth - maGeometry.nWidth - parent_x;
67*b1cdbd2cSJim Jagielski         return aGeom;
68*b1cdbd2cSJim Jagielski     }
69*b1cdbd2cSJim Jagielski     else
70*b1cdbd2cSJim Jagielski         return maGeometry;
71*b1cdbd2cSJim Jagielski }
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
74*b1cdbd2cSJim Jagielski 
SalGraphics()75*b1cdbd2cSJim Jagielski SalGraphics::SalGraphics()
76*b1cdbd2cSJim Jagielski :   m_nLayout( 0 ),
77*b1cdbd2cSJim Jagielski     m_bAntiAliasB2DDraw(false)
78*b1cdbd2cSJim Jagielski {
79*b1cdbd2cSJim Jagielski     // read global RTL settings
80*b1cdbd2cSJim Jagielski     if( Application::GetSettings().GetLayoutRTL() )
81*b1cdbd2cSJim Jagielski 	    m_nLayout = SAL_LAYOUT_BIDI_RTL;
82*b1cdbd2cSJim Jagielski }
83*b1cdbd2cSJim Jagielski 
~SalGraphics()84*b1cdbd2cSJim Jagielski SalGraphics::~SalGraphics()
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski }
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
89*b1cdbd2cSJim Jagielski 
drawAlphaBitmap(const SalTwoRect &,const SalBitmap &,const SalBitmap &)90*b1cdbd2cSJim Jagielski bool SalGraphics::drawAlphaBitmap( const SalTwoRect&,
91*b1cdbd2cSJim Jagielski     const SalBitmap&, const SalBitmap& )
92*b1cdbd2cSJim Jagielski {
93*b1cdbd2cSJim Jagielski     return false;
94*b1cdbd2cSJim Jagielski }
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
97*b1cdbd2cSJim Jagielski 
drawTransformedBitmap(const basegfx::B2DPoint &,const basegfx::B2DPoint &,const basegfx::B2DPoint &,const SalBitmap &,const SalBitmap *)98*b1cdbd2cSJim Jagielski bool SalGraphics::drawTransformedBitmap(
99*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& /* rNull */,
100*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& /* rX */,
101*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& /* rY */,
102*b1cdbd2cSJim Jagielski     const SalBitmap& /* rSourceBitmap */,
103*b1cdbd2cSJim Jagielski     const SalBitmap* /* pAlphaBitmap */)
104*b1cdbd2cSJim Jagielski {
105*b1cdbd2cSJim Jagielski     // here direct support for transformed bitmaps can be impemented
106*b1cdbd2cSJim Jagielski     return false;
107*b1cdbd2cSJim Jagielski }
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
110*b1cdbd2cSJim Jagielski 
mirror(long & x,const OutputDevice * pOutDev,bool bBack) const111*b1cdbd2cSJim Jagielski void SalGraphics::mirror( long& x, const OutputDevice *pOutDev, bool bBack ) const
112*b1cdbd2cSJim Jagielski {
113*b1cdbd2cSJim Jagielski 	long w;
114*b1cdbd2cSJim Jagielski     if( pOutDev && pOutDev->GetOutDevType() == OUTDEV_VIRDEV )
115*b1cdbd2cSJim Jagielski         w = pOutDev->GetOutputWidthPixel();
116*b1cdbd2cSJim Jagielski     else
117*b1cdbd2cSJim Jagielski         w = GetGraphicsWidth();
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski 	if( w )
120*b1cdbd2cSJim Jagielski     {
121*b1cdbd2cSJim Jagielski         if( pOutDev && pOutDev->ImplIsAntiparallel() )
122*b1cdbd2cSJim Jagielski         {
123*b1cdbd2cSJim Jagielski             OutputDevice *pOutDevRef = (OutputDevice*) pOutDev;
124*b1cdbd2cSJim Jagielski             // mirror this window back
125*b1cdbd2cSJim Jagielski             if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) )
126*b1cdbd2cSJim Jagielski             {
127*b1cdbd2cSJim Jagielski                 long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
128*b1cdbd2cSJim Jagielski                 if( bBack )
129*b1cdbd2cSJim Jagielski                     x = x - devX + pOutDevRef->GetOutOffXPixel();
130*b1cdbd2cSJim Jagielski                 else
131*b1cdbd2cSJim Jagielski                     x = devX + (x - pOutDevRef->GetOutOffXPixel());
132*b1cdbd2cSJim Jagielski             }
133*b1cdbd2cSJim Jagielski             else
134*b1cdbd2cSJim Jagielski             {
135*b1cdbd2cSJim Jagielski                 long devX = pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
136*b1cdbd2cSJim Jagielski                 if( bBack )
137*b1cdbd2cSJim Jagielski                     x = x - pOutDevRef->GetOutputWidthPixel() + devX - pOutDevRef->GetOutOffXPixel() + 1;
138*b1cdbd2cSJim Jagielski                 else
139*b1cdbd2cSJim Jagielski                     x = pOutDevRef->GetOutputWidthPixel() - (x - devX) + pOutDevRef->GetOutOffXPixel() - 1;
140*b1cdbd2cSJim Jagielski             }
141*b1cdbd2cSJim Jagielski         }
142*b1cdbd2cSJim Jagielski         else if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) )
143*b1cdbd2cSJim Jagielski 		    x = w-1-x;
144*b1cdbd2cSJim Jagielski     }
145*b1cdbd2cSJim Jagielski }
146*b1cdbd2cSJim Jagielski 
mirror(long & x,long & nWidth,const OutputDevice * pOutDev,bool bBack) const147*b1cdbd2cSJim Jagielski void SalGraphics::mirror( long& x, long& nWidth, const OutputDevice *pOutDev, bool bBack ) const
148*b1cdbd2cSJim Jagielski {
149*b1cdbd2cSJim Jagielski 	long w;
150*b1cdbd2cSJim Jagielski     if( pOutDev && pOutDev->GetOutDevType() == OUTDEV_VIRDEV )
151*b1cdbd2cSJim Jagielski         w = pOutDev->GetOutputWidthPixel();
152*b1cdbd2cSJim Jagielski     else
153*b1cdbd2cSJim Jagielski         w = GetGraphicsWidth();
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski 	if( w )
156*b1cdbd2cSJim Jagielski     {
157*b1cdbd2cSJim Jagielski         if( pOutDev && pOutDev->ImplIsAntiparallel() )
158*b1cdbd2cSJim Jagielski         {
159*b1cdbd2cSJim Jagielski             OutputDevice *pOutDevRef = (OutputDevice*) pOutDev;
160*b1cdbd2cSJim Jagielski             // mirror this window back
161*b1cdbd2cSJim Jagielski             if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) )
162*b1cdbd2cSJim Jagielski             {
163*b1cdbd2cSJim Jagielski                 long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
164*b1cdbd2cSJim Jagielski                 if( bBack )
165*b1cdbd2cSJim Jagielski                     x = x - devX + pOutDevRef->GetOutOffXPixel();
166*b1cdbd2cSJim Jagielski                 else
167*b1cdbd2cSJim Jagielski                     x = devX + (x - pOutDevRef->GetOutOffXPixel());
168*b1cdbd2cSJim Jagielski             }
169*b1cdbd2cSJim Jagielski             else
170*b1cdbd2cSJim Jagielski             {
171*b1cdbd2cSJim Jagielski                 long devX = pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
172*b1cdbd2cSJim Jagielski                 if( bBack )
173*b1cdbd2cSJim Jagielski                     x = x - pOutDevRef->GetOutputWidthPixel() + devX - pOutDevRef->GetOutOffXPixel() + nWidth;
174*b1cdbd2cSJim Jagielski                 else
175*b1cdbd2cSJim Jagielski                     x = pOutDevRef->GetOutputWidthPixel() - (x - devX) + pOutDevRef->GetOutOffXPixel() - nWidth;
176*b1cdbd2cSJim Jagielski             }
177*b1cdbd2cSJim Jagielski         }
178*b1cdbd2cSJim Jagielski         else if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) )
179*b1cdbd2cSJim Jagielski 		    x = w-nWidth-x;
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski     }
182*b1cdbd2cSJim Jagielski }
183*b1cdbd2cSJim Jagielski 
mirror(sal_uInt32 nPoints,const SalPoint * pPtAry,SalPoint * pPtAry2,const OutputDevice * pOutDev,bool bBack) const184*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::mirror( sal_uInt32 nPoints, const SalPoint *pPtAry, SalPoint *pPtAry2, const OutputDevice *pOutDev, bool bBack ) const
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	long w;
187*b1cdbd2cSJim Jagielski     if( pOutDev && pOutDev->GetOutDevType() == OUTDEV_VIRDEV )
188*b1cdbd2cSJim Jagielski         w = pOutDev->GetOutputWidthPixel();
189*b1cdbd2cSJim Jagielski     else
190*b1cdbd2cSJim Jagielski         w = GetGraphicsWidth();
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 	if( w )
193*b1cdbd2cSJim Jagielski 	{
194*b1cdbd2cSJim Jagielski 		sal_uInt32 i, j;
195*b1cdbd2cSJim Jagielski 
196*b1cdbd2cSJim Jagielski         if( pOutDev && pOutDev->ImplIsAntiparallel() )
197*b1cdbd2cSJim Jagielski         {
198*b1cdbd2cSJim Jagielski             OutputDevice *pOutDevRef = (OutputDevice*) pOutDev;
199*b1cdbd2cSJim Jagielski             // mirror this window back
200*b1cdbd2cSJim Jagielski             if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) )
201*b1cdbd2cSJim Jagielski             {
202*b1cdbd2cSJim Jagielski                 long devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
203*b1cdbd2cSJim Jagielski                 if( bBack )
204*b1cdbd2cSJim Jagielski                 {
205*b1cdbd2cSJim Jagielski                     for( i=0, j=nPoints-1; i<nPoints; i++,j-- )
206*b1cdbd2cSJim Jagielski                     {
207*b1cdbd2cSJim Jagielski                         //long x = w-1-pPtAry[i].mnX;
208*b1cdbd2cSJim Jagielski                         //pPtAry2[j].mnX = devX + ( pOutDevRef->mnOutWidth - 1 - (x - devX) );
209*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnX = pOutDevRef->GetOutOffXPixel() + (pPtAry[i].mnX - devX);
210*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnY = pPtAry[i].mnY;
211*b1cdbd2cSJim Jagielski                     }
212*b1cdbd2cSJim Jagielski                 }
213*b1cdbd2cSJim Jagielski                 else
214*b1cdbd2cSJim Jagielski                 {
215*b1cdbd2cSJim Jagielski                     for( i=0, j=nPoints-1; i<nPoints; i++,j-- )
216*b1cdbd2cSJim Jagielski                     {
217*b1cdbd2cSJim Jagielski                         //long x = w-1-pPtAry[i].mnX;
218*b1cdbd2cSJim Jagielski                         //pPtAry2[j].mnX = devX + ( pOutDevRef->mnOutWidth - 1 - (x - devX) );
219*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnX = devX + (pPtAry[i].mnX - pOutDevRef->GetOutOffXPixel());
220*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnY = pPtAry[i].mnY;
221*b1cdbd2cSJim Jagielski                     }
222*b1cdbd2cSJim Jagielski                 }
223*b1cdbd2cSJim Jagielski             }
224*b1cdbd2cSJim Jagielski             else
225*b1cdbd2cSJim Jagielski             {
226*b1cdbd2cSJim Jagielski                 long devX = pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
227*b1cdbd2cSJim Jagielski                 if( bBack )
228*b1cdbd2cSJim Jagielski                 {
229*b1cdbd2cSJim Jagielski                     for( i=0, j=nPoints-1; i<nPoints; i++,j-- )
230*b1cdbd2cSJim Jagielski                     {
231*b1cdbd2cSJim Jagielski                         //long x = w-1-pPtAry[i].mnX;
232*b1cdbd2cSJim Jagielski                         //pPtAry2[j].mnX = devX + ( pOutDevRef->mnOutWidth - 1 - (x - devX) );
233*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnX = pPtAry[i].mnX - pOutDevRef->GetOutputWidthPixel() + devX - pOutDevRef->GetOutOffXPixel() + 1;
234*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnY = pPtAry[i].mnY;
235*b1cdbd2cSJim Jagielski                     }
236*b1cdbd2cSJim Jagielski                 }
237*b1cdbd2cSJim Jagielski                 else
238*b1cdbd2cSJim Jagielski                 {
239*b1cdbd2cSJim Jagielski                     for( i=0, j=nPoints-1; i<nPoints; i++,j-- )
240*b1cdbd2cSJim Jagielski                     {
241*b1cdbd2cSJim Jagielski                         //long x = w-1-pPtAry[i].mnX;
242*b1cdbd2cSJim Jagielski                         //pPtAry2[j].mnX = devX + ( pOutDevRef->mnOutWidth - 1 - (x - devX) );
243*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnX = pOutDevRef->GetOutputWidthPixel() - (pPtAry[i].mnX - devX) + pOutDevRef->GetOutOffXPixel() - 1;
244*b1cdbd2cSJim Jagielski                         pPtAry2[j].mnY = pPtAry[i].mnY;
245*b1cdbd2cSJim Jagielski                     }
246*b1cdbd2cSJim Jagielski                 }
247*b1cdbd2cSJim Jagielski             }
248*b1cdbd2cSJim Jagielski         }
249*b1cdbd2cSJim Jagielski         else if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) )
250*b1cdbd2cSJim Jagielski         {
251*b1cdbd2cSJim Jagielski 		    for( i=0, j=nPoints-1; i<nPoints; i++,j-- )
252*b1cdbd2cSJim Jagielski 		    {
253*b1cdbd2cSJim Jagielski 			    pPtAry2[j].mnX = w-1-pPtAry[i].mnX;
254*b1cdbd2cSJim Jagielski 			    pPtAry2[j].mnY = pPtAry[i].mnY;
255*b1cdbd2cSJim Jagielski 		    }
256*b1cdbd2cSJim Jagielski         }
257*b1cdbd2cSJim Jagielski 		return sal_True;
258*b1cdbd2cSJim Jagielski 	}
259*b1cdbd2cSJim Jagielski 	else
260*b1cdbd2cSJim Jagielski 		return sal_False;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski 
mirror(Region & rRgn,const OutputDevice * pOutDev,bool bBack) const263*b1cdbd2cSJim Jagielski void SalGraphics::mirror( Region& rRgn, const OutputDevice *pOutDev, bool bBack ) const
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski     if( rRgn.HasPolyPolygonOrB2DPolyPolygon() )
266*b1cdbd2cSJim Jagielski     {
267*b1cdbd2cSJim Jagielski         const basegfx::B2DPolyPolygon aPolyPoly(mirror(rRgn.GetAsB2DPolyPolygon(), pOutDev, bBack));
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski         rRgn = Region(aPolyPoly);
270*b1cdbd2cSJim Jagielski     }
271*b1cdbd2cSJim Jagielski     else
272*b1cdbd2cSJim Jagielski     {
273*b1cdbd2cSJim Jagielski         RectangleVector aRectangles;
274*b1cdbd2cSJim Jagielski         rRgn.GetRegionRectangles(aRectangles);
275*b1cdbd2cSJim Jagielski         rRgn.SetEmpty();
276*b1cdbd2cSJim Jagielski 
277*b1cdbd2cSJim Jagielski         for(RectangleVector::iterator aRectIter(aRectangles.begin()); aRectIter != aRectangles.end(); aRectIter++)
278*b1cdbd2cSJim Jagielski         {
279*b1cdbd2cSJim Jagielski             mirror(*aRectIter, pOutDev, bBack);
280*b1cdbd2cSJim Jagielski             rRgn.Union(*aRectIter);
281*b1cdbd2cSJim Jagielski         }
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski         //ImplRegionInfo		aInfo;
284*b1cdbd2cSJim Jagielski         //bool				bRegionRect;
285*b1cdbd2cSJim Jagielski         //Region              aMirroredRegion;
286*b1cdbd2cSJim Jagielski         //long nX, nY, nWidth, nHeight;
287*b1cdbd2cSJim Jagielski         //
288*b1cdbd2cSJim Jagielski         //bRegionRect = rRgn.ImplGetFirstRect( aInfo, nX, nY, nWidth, nHeight );
289*b1cdbd2cSJim Jagielski         //while ( bRegionRect )
290*b1cdbd2cSJim Jagielski         //{
291*b1cdbd2cSJim Jagielski         //    Rectangle aRect( Point(nX, nY), Size(nWidth, nHeight) );
292*b1cdbd2cSJim Jagielski         //    mirror( aRect, pOutDev, bBack );
293*b1cdbd2cSJim Jagielski         //    aMirroredRegion.Union( aRect );
294*b1cdbd2cSJim Jagielski         //    bRegionRect = rRgn.ImplGetNextRect( aInfo, nX, nY, nWidth, nHeight );
295*b1cdbd2cSJim Jagielski         //}
296*b1cdbd2cSJim Jagielski         //rRgn = aMirroredRegion;
297*b1cdbd2cSJim Jagielski     }
298*b1cdbd2cSJim Jagielski }
299*b1cdbd2cSJim Jagielski 
mirror(Rectangle & rRect,const OutputDevice * pOutDev,bool bBack) const300*b1cdbd2cSJim Jagielski void SalGraphics::mirror( Rectangle& rRect, const OutputDevice *pOutDev, bool bBack ) const
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski     long nWidth = rRect.GetWidth();
303*b1cdbd2cSJim Jagielski     long x      = rRect.Left();
304*b1cdbd2cSJim Jagielski     long x_org = x;
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     mirror( x, nWidth, pOutDev, bBack );
307*b1cdbd2cSJim Jagielski     rRect.Move( x - x_org, 0 );
308*b1cdbd2cSJim Jagielski }
309*b1cdbd2cSJim Jagielski 
mirror(const basegfx::B2DPoint & i_rPoint,const OutputDevice * i_pOutDev,bool i_bBack) const310*b1cdbd2cSJim Jagielski basegfx::B2DPoint SalGraphics::mirror( const basegfx::B2DPoint& i_rPoint, const OutputDevice *i_pOutDev, bool i_bBack ) const
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski 	long w;
313*b1cdbd2cSJim Jagielski     if( i_pOutDev && i_pOutDev->GetOutDevType() == OUTDEV_VIRDEV )
314*b1cdbd2cSJim Jagielski         w = i_pOutDev->GetOutputWidthPixel();
315*b1cdbd2cSJim Jagielski     else
316*b1cdbd2cSJim Jagielski         w = GetGraphicsWidth();
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski     DBG_ASSERT( w, "missing graphics width" );
319*b1cdbd2cSJim Jagielski 
320*b1cdbd2cSJim Jagielski     basegfx::B2DPoint aRet( i_rPoint );
321*b1cdbd2cSJim Jagielski 	if( w )
322*b1cdbd2cSJim Jagielski     {
323*b1cdbd2cSJim Jagielski         if( i_pOutDev && !i_pOutDev->IsRTLEnabled() )
324*b1cdbd2cSJim Jagielski         {
325*b1cdbd2cSJim Jagielski             OutputDevice *pOutDevRef = (OutputDevice*)i_pOutDev;
326*b1cdbd2cSJim Jagielski             // mirror this window back
327*b1cdbd2cSJim Jagielski             double devX = w-pOutDevRef->GetOutputWidthPixel()-pOutDevRef->GetOutOffXPixel();   // re-mirrored mnOutOffX
328*b1cdbd2cSJim Jagielski             if( i_bBack )
329*b1cdbd2cSJim Jagielski                 aRet.setX( i_rPoint.getX() - devX + pOutDevRef->GetOutOffXPixel() );
330*b1cdbd2cSJim Jagielski             else
331*b1cdbd2cSJim Jagielski                 aRet.setX( devX + (i_rPoint.getX() - pOutDevRef->GetOutOffXPixel()) );
332*b1cdbd2cSJim Jagielski         }
333*b1cdbd2cSJim Jagielski         else
334*b1cdbd2cSJim Jagielski 		    aRet.setX( w-1-i_rPoint.getX() );
335*b1cdbd2cSJim Jagielski     }
336*b1cdbd2cSJim Jagielski     return aRet;
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski 
mirror(const basegfx::B2DPolygon & i_rPoly,const OutputDevice * i_pOutDev,bool i_bBack) const339*b1cdbd2cSJim Jagielski basegfx::B2DPolygon SalGraphics::mirror( const basegfx::B2DPolygon& i_rPoly, const OutputDevice *i_pOutDev, bool i_bBack ) const
340*b1cdbd2cSJim Jagielski {
341*b1cdbd2cSJim Jagielski 	long w;
342*b1cdbd2cSJim Jagielski     if( i_pOutDev && i_pOutDev->GetOutDevType() == OUTDEV_VIRDEV )
343*b1cdbd2cSJim Jagielski         w = i_pOutDev->GetOutputWidthPixel();
344*b1cdbd2cSJim Jagielski     else
345*b1cdbd2cSJim Jagielski         w = GetGraphicsWidth();
346*b1cdbd2cSJim Jagielski 
347*b1cdbd2cSJim Jagielski     DBG_ASSERT( w, "missing graphics width" );
348*b1cdbd2cSJim Jagielski 
349*b1cdbd2cSJim Jagielski     basegfx::B2DPolygon aRet;
350*b1cdbd2cSJim Jagielski 	if( w )
351*b1cdbd2cSJim Jagielski     {
352*b1cdbd2cSJim Jagielski         sal_Int32 nPoints = i_rPoly.count();
353*b1cdbd2cSJim Jagielski         for( sal_Int32 i = 0; i < nPoints; i++ )
354*b1cdbd2cSJim Jagielski         {
355*b1cdbd2cSJim Jagielski             aRet.append( mirror( i_rPoly.getB2DPoint( i ), i_pOutDev, i_bBack ) );
356*b1cdbd2cSJim Jagielski             if( i_rPoly.isPrevControlPointUsed( i ) )
357*b1cdbd2cSJim Jagielski                 aRet.setPrevControlPoint( i, mirror( i_rPoly.getPrevControlPoint( i ), i_pOutDev, i_bBack ) );
358*b1cdbd2cSJim Jagielski             if( i_rPoly.isNextControlPointUsed( i ) )
359*b1cdbd2cSJim Jagielski                 aRet.setNextControlPoint( i, mirror( i_rPoly.getNextControlPoint( i ), i_pOutDev, i_bBack ) );
360*b1cdbd2cSJim Jagielski         }
361*b1cdbd2cSJim Jagielski         aRet.setClosed( i_rPoly.isClosed() );
362*b1cdbd2cSJim Jagielski         aRet.flip();
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski     else
365*b1cdbd2cSJim Jagielski         aRet = i_rPoly;
366*b1cdbd2cSJim Jagielski     return aRet;
367*b1cdbd2cSJim Jagielski }
368*b1cdbd2cSJim Jagielski 
mirror(const basegfx::B2DPolyPolygon & i_rPoly,const OutputDevice * i_pOutDev,bool i_bBack) const369*b1cdbd2cSJim Jagielski basegfx::B2DPolyPolygon SalGraphics::mirror( const basegfx::B2DPolyPolygon& i_rPoly, const OutputDevice *i_pOutDev, bool i_bBack ) const
370*b1cdbd2cSJim Jagielski {
371*b1cdbd2cSJim Jagielski 	long w;
372*b1cdbd2cSJim Jagielski     if( i_pOutDev && i_pOutDev->GetOutDevType() == OUTDEV_VIRDEV )
373*b1cdbd2cSJim Jagielski         w = i_pOutDev->GetOutputWidthPixel();
374*b1cdbd2cSJim Jagielski     else
375*b1cdbd2cSJim Jagielski         w = GetGraphicsWidth();
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski     DBG_ASSERT( w, "missing graphics width" );
378*b1cdbd2cSJim Jagielski 
379*b1cdbd2cSJim Jagielski     basegfx::B2DPolyPolygon aRet;
380*b1cdbd2cSJim Jagielski 	if( w )
381*b1cdbd2cSJim Jagielski     {
382*b1cdbd2cSJim Jagielski         sal_Int32 nPoly = i_rPoly.count();
383*b1cdbd2cSJim Jagielski         for( sal_Int32 i = 0; i < nPoly; i++ )
384*b1cdbd2cSJim Jagielski             aRet.append( mirror( i_rPoly.getB2DPolygon( i ), i_pOutDev, i_bBack ) );
385*b1cdbd2cSJim Jagielski         aRet.setClosed( i_rPoly.isClosed() );
386*b1cdbd2cSJim Jagielski         aRet.flip();
387*b1cdbd2cSJim Jagielski     }
388*b1cdbd2cSJim Jagielski     else
389*b1cdbd2cSJim Jagielski         aRet = i_rPoly;
390*b1cdbd2cSJim Jagielski     return aRet;
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
394*b1cdbd2cSJim Jagielski 
SetClipRegion(const Region & i_rClip,const OutputDevice * pOutDev)395*b1cdbd2cSJim Jagielski bool SalGraphics::SetClipRegion( const Region& i_rClip, const OutputDevice *pOutDev )
396*b1cdbd2cSJim Jagielski {
397*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
398*b1cdbd2cSJim Jagielski 	{
399*b1cdbd2cSJim Jagielski 	    Region aMirror( i_rClip );
400*b1cdbd2cSJim Jagielski 		mirror( aMirror, pOutDev );
401*b1cdbd2cSJim Jagielski 		return setClipRegion( aMirror );
402*b1cdbd2cSJim Jagielski 	}
403*b1cdbd2cSJim Jagielski 	return setClipRegion( i_rClip );
404*b1cdbd2cSJim Jagielski }
405*b1cdbd2cSJim Jagielski 
DrawPixel(long nX,long nY,const OutputDevice * pOutDev)406*b1cdbd2cSJim Jagielski void	SalGraphics::DrawPixel( long nX, long nY, const OutputDevice *pOutDev )
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
409*b1cdbd2cSJim Jagielski 		mirror( nX, pOutDev );
410*b1cdbd2cSJim Jagielski 	drawPixel( nX, nY );
411*b1cdbd2cSJim Jagielski }
DrawPixel(long nX,long nY,SalColor nSalColor,const OutputDevice * pOutDev)412*b1cdbd2cSJim Jagielski void	SalGraphics::DrawPixel( long nX, long nY, SalColor nSalColor, const OutputDevice *pOutDev )
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
415*b1cdbd2cSJim Jagielski 		mirror( nX, pOutDev );
416*b1cdbd2cSJim Jagielski 	drawPixel( nX, nY, nSalColor );
417*b1cdbd2cSJim Jagielski }
DrawLine(long nX1,long nY1,long nX2,long nY2,const OutputDevice * pOutDev)418*b1cdbd2cSJim Jagielski void	SalGraphics::DrawLine( long nX1, long nY1, long nX2, long nY2, const OutputDevice *pOutDev )
419*b1cdbd2cSJim Jagielski {
420*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
421*b1cdbd2cSJim Jagielski 	{
422*b1cdbd2cSJim Jagielski 		mirror( nX1, pOutDev );
423*b1cdbd2cSJim Jagielski 		mirror( nX2, pOutDev );
424*b1cdbd2cSJim Jagielski 	}
425*b1cdbd2cSJim Jagielski 	drawLine( nX1, nY1, nX2, nY2 );
426*b1cdbd2cSJim Jagielski }
DrawRect(long nX,long nY,long nWidth,long nHeight,const OutputDevice * pOutDev)427*b1cdbd2cSJim Jagielski void	SalGraphics::DrawRect( long nX, long nY, long nWidth, long nHeight, const OutputDevice *pOutDev )
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
430*b1cdbd2cSJim Jagielski 		mirror( nX, nWidth, pOutDev );
431*b1cdbd2cSJim Jagielski 	drawRect( nX, nY, nWidth, nHeight );
432*b1cdbd2cSJim Jagielski }
drawPolyLine(const basegfx::B2DPolygon &,double,const basegfx::B2DVector &,basegfx::B2DLineJoin,com::sun::star::drawing::LineCap)433*b1cdbd2cSJim Jagielski bool SalGraphics::drawPolyLine(
434*b1cdbd2cSJim Jagielski     const basegfx::B2DPolygon& /*rPolyPolygon*/,
435*b1cdbd2cSJim Jagielski     double /*fTransparency*/,
436*b1cdbd2cSJim Jagielski     const basegfx::B2DVector& /*rLineWidths*/,
437*b1cdbd2cSJim Jagielski     basegfx::B2DLineJoin /*eLineJoin*/,
438*b1cdbd2cSJim Jagielski     com::sun::star::drawing::LineCap /*eLineCap*/)
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski     return false;
441*b1cdbd2cSJim Jagielski }
442*b1cdbd2cSJim Jagielski 
DrawPolyLine(sal_uInt32 nPoints,const SalPoint * pPtAry,const OutputDevice * pOutDev)443*b1cdbd2cSJim Jagielski void SalGraphics::DrawPolyLine( sal_uInt32 nPoints, const SalPoint* pPtAry, const OutputDevice *pOutDev )
444*b1cdbd2cSJim Jagielski {
445*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
446*b1cdbd2cSJim Jagielski 	{
447*b1cdbd2cSJim Jagielski 		SalPoint* pPtAry2 = new SalPoint[nPoints];
448*b1cdbd2cSJim Jagielski 		sal_Bool bCopied = mirror( nPoints, pPtAry, pPtAry2, pOutDev );
449*b1cdbd2cSJim Jagielski 		drawPolyLine( nPoints, bCopied ? pPtAry2 : pPtAry );
450*b1cdbd2cSJim Jagielski 		delete [] pPtAry2;
451*b1cdbd2cSJim Jagielski 	}
452*b1cdbd2cSJim Jagielski 	else
453*b1cdbd2cSJim Jagielski 		drawPolyLine( nPoints, pPtAry );
454*b1cdbd2cSJim Jagielski }
455*b1cdbd2cSJim Jagielski 
DrawPolygon(sal_uInt32 nPoints,const SalPoint * pPtAry,const OutputDevice * pOutDev)456*b1cdbd2cSJim Jagielski void SalGraphics::DrawPolygon( sal_uInt32 nPoints, const SalPoint* pPtAry, const OutputDevice *pOutDev )
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
459*b1cdbd2cSJim Jagielski 	{
460*b1cdbd2cSJim Jagielski 		SalPoint* pPtAry2 = new SalPoint[nPoints];
461*b1cdbd2cSJim Jagielski 		sal_Bool bCopied = mirror( nPoints, pPtAry, pPtAry2, pOutDev );
462*b1cdbd2cSJim Jagielski 		drawPolygon( nPoints, bCopied ? pPtAry2 : pPtAry );
463*b1cdbd2cSJim Jagielski 		delete [] pPtAry2;
464*b1cdbd2cSJim Jagielski 	}
465*b1cdbd2cSJim Jagielski 	else
466*b1cdbd2cSJim Jagielski 		drawPolygon( nPoints, pPtAry );
467*b1cdbd2cSJim Jagielski }
468*b1cdbd2cSJim Jagielski 
DrawPolyPolygon(sal_uInt32 nPoly,const sal_uInt32 * pPoints,PCONSTSALPOINT * pPtAry,const OutputDevice * pOutDev)469*b1cdbd2cSJim Jagielski void SalGraphics::DrawPolyPolygon( sal_uInt32 nPoly, const sal_uInt32* pPoints, PCONSTSALPOINT* pPtAry, const OutputDevice *pOutDev )
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
472*b1cdbd2cSJim Jagielski 	{
473*b1cdbd2cSJim Jagielski         // TODO: optimize, reduce new/delete calls
474*b1cdbd2cSJim Jagielski         SalPoint **pPtAry2 = new SalPoint*[nPoly];
475*b1cdbd2cSJim Jagielski         sal_uLong i;
476*b1cdbd2cSJim Jagielski         for(i=0; i<nPoly; i++)
477*b1cdbd2cSJim Jagielski         {
478*b1cdbd2cSJim Jagielski             sal_uLong nPoints = pPoints[i];
479*b1cdbd2cSJim Jagielski             pPtAry2[i] = new SalPoint[ nPoints ];
480*b1cdbd2cSJim Jagielski 		    mirror( nPoints, pPtAry[i], pPtAry2[i], pOutDev );
481*b1cdbd2cSJim Jagielski         }
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski         drawPolyPolygon( nPoly, pPoints, (PCONSTSALPOINT*)pPtAry2 );
484*b1cdbd2cSJim Jagielski 
485*b1cdbd2cSJim Jagielski         for(i=0; i<nPoly; i++)
486*b1cdbd2cSJim Jagielski             delete [] pPtAry2[i];
487*b1cdbd2cSJim Jagielski         delete [] pPtAry2;
488*b1cdbd2cSJim Jagielski     }
489*b1cdbd2cSJim Jagielski     else
490*b1cdbd2cSJim Jagielski 	    drawPolyPolygon( nPoly, pPoints, pPtAry );
491*b1cdbd2cSJim Jagielski }
492*b1cdbd2cSJim Jagielski 
DrawPolyPolygon(const::basegfx::B2DPolyPolygon & i_rPolyPolygon,double i_fTransparency,const OutputDevice * i_pOutDev)493*b1cdbd2cSJim Jagielski bool SalGraphics::DrawPolyPolygon( const ::basegfx::B2DPolyPolygon& i_rPolyPolygon, double i_fTransparency, const OutputDevice* i_pOutDev )
494*b1cdbd2cSJim Jagielski {
495*b1cdbd2cSJim Jagielski     bool bRet = false;
496*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (i_pOutDev && i_pOutDev->IsRTLEnabled()) )
497*b1cdbd2cSJim Jagielski 	{
498*b1cdbd2cSJim Jagielski         basegfx::B2DPolyPolygon aMirror( mirror( i_rPolyPolygon, i_pOutDev ) );
499*b1cdbd2cSJim Jagielski         bRet = drawPolyPolygon( aMirror, i_fTransparency );
500*b1cdbd2cSJim Jagielski     }
501*b1cdbd2cSJim Jagielski     else
502*b1cdbd2cSJim Jagielski         bRet = drawPolyPolygon( i_rPolyPolygon, i_fTransparency );
503*b1cdbd2cSJim Jagielski     return bRet;
504*b1cdbd2cSJim Jagielski }
505*b1cdbd2cSJim Jagielski 
drawPolyPolygon(const::basegfx::B2DPolyPolygon &,double)506*b1cdbd2cSJim Jagielski bool SalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon&, double /*fTransparency*/)
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski 	return false;
509*b1cdbd2cSJim Jagielski }
510*b1cdbd2cSJim Jagielski 
DrawPolyLineBezier(sal_uInt32 nPoints,const SalPoint * pPtAry,const sal_uInt8 * pFlgAry,const OutputDevice * pOutDev)511*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::DrawPolyLineBezier( sal_uInt32 nPoints, const SalPoint* pPtAry, const sal_uInt8* pFlgAry, const OutputDevice* pOutDev )
512*b1cdbd2cSJim Jagielski {
513*b1cdbd2cSJim Jagielski     sal_Bool bResult = sal_False;
514*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
515*b1cdbd2cSJim Jagielski 	{
516*b1cdbd2cSJim Jagielski 		SalPoint* pPtAry2 = new SalPoint[nPoints];
517*b1cdbd2cSJim Jagielski 		sal_Bool bCopied = mirror( nPoints, pPtAry, pPtAry2, pOutDev );
518*b1cdbd2cSJim Jagielski 		bResult = drawPolyLineBezier( nPoints, bCopied ? pPtAry2 : pPtAry, pFlgAry );
519*b1cdbd2cSJim Jagielski 		delete [] pPtAry2;
520*b1cdbd2cSJim Jagielski 	}
521*b1cdbd2cSJim Jagielski 	else
522*b1cdbd2cSJim Jagielski         bResult = drawPolyLineBezier( nPoints, pPtAry, pFlgAry );
523*b1cdbd2cSJim Jagielski     return bResult;
524*b1cdbd2cSJim Jagielski }
525*b1cdbd2cSJim Jagielski 
DrawPolygonBezier(sal_uInt32 nPoints,const SalPoint * pPtAry,const sal_uInt8 * pFlgAry,const OutputDevice * pOutDev)526*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::DrawPolygonBezier( sal_uInt32 nPoints, const SalPoint* pPtAry, const sal_uInt8* pFlgAry, const OutputDevice* pOutDev )
527*b1cdbd2cSJim Jagielski {
528*b1cdbd2cSJim Jagielski     sal_Bool bResult = sal_False;
529*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
530*b1cdbd2cSJim Jagielski 	{
531*b1cdbd2cSJim Jagielski 		SalPoint* pPtAry2 = new SalPoint[nPoints];
532*b1cdbd2cSJim Jagielski 		sal_Bool bCopied = mirror( nPoints, pPtAry, pPtAry2, pOutDev );
533*b1cdbd2cSJim Jagielski 		bResult = drawPolygonBezier( nPoints, bCopied ? pPtAry2 : pPtAry, pFlgAry );
534*b1cdbd2cSJim Jagielski 		delete [] pPtAry2;
535*b1cdbd2cSJim Jagielski 	}
536*b1cdbd2cSJim Jagielski 	else
537*b1cdbd2cSJim Jagielski         bResult = drawPolygonBezier( nPoints, pPtAry, pFlgAry );
538*b1cdbd2cSJim Jagielski     return bResult;
539*b1cdbd2cSJim Jagielski }
540*b1cdbd2cSJim Jagielski 
DrawPolyPolygonBezier(sal_uInt32 i_nPoly,const sal_uInt32 * i_pPoints,const SalPoint * const * i_pPtAry,const sal_uInt8 * const * i_pFlgAry,const OutputDevice * i_pOutDev)541*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::DrawPolyPolygonBezier( sal_uInt32 i_nPoly, const sal_uInt32* i_pPoints,
542*b1cdbd2cSJim Jagielski                                                    const SalPoint* const* i_pPtAry, const sal_uInt8* const* i_pFlgAry, const OutputDevice* i_pOutDev )
543*b1cdbd2cSJim Jagielski {
544*b1cdbd2cSJim Jagielski     sal_Bool bRet = sal_False;
545*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (i_pOutDev && i_pOutDev->IsRTLEnabled()) )
546*b1cdbd2cSJim Jagielski 	{
547*b1cdbd2cSJim Jagielski         // TODO: optimize, reduce new/delete calls
548*b1cdbd2cSJim Jagielski         SalPoint **pPtAry2 = new SalPoint*[i_nPoly];
549*b1cdbd2cSJim Jagielski         sal_uLong i;
550*b1cdbd2cSJim Jagielski         for(i=0; i<i_nPoly; i++)
551*b1cdbd2cSJim Jagielski         {
552*b1cdbd2cSJim Jagielski             sal_uLong nPoints = i_pPoints[i];
553*b1cdbd2cSJim Jagielski             pPtAry2[i] = new SalPoint[ nPoints ];
554*b1cdbd2cSJim Jagielski 		    mirror( nPoints, i_pPtAry[i], pPtAry2[i], i_pOutDev );
555*b1cdbd2cSJim Jagielski         }
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski         bRet = drawPolyPolygonBezier( i_nPoly, i_pPoints, (PCONSTSALPOINT*)pPtAry2, i_pFlgAry );
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski         for(i=0; i<i_nPoly; i++)
560*b1cdbd2cSJim Jagielski             delete [] pPtAry2[i];
561*b1cdbd2cSJim Jagielski         delete [] pPtAry2;
562*b1cdbd2cSJim Jagielski     }
563*b1cdbd2cSJim Jagielski     else
564*b1cdbd2cSJim Jagielski 	    bRet = drawPolyPolygonBezier( i_nPoly, i_pPoints, i_pPtAry, i_pFlgAry );
565*b1cdbd2cSJim Jagielski     return bRet;
566*b1cdbd2cSJim Jagielski }
567*b1cdbd2cSJim Jagielski 
DrawPolyLine(const::basegfx::B2DPolygon & i_rPolygon,double i_fTransparency,const::basegfx::B2DVector & i_rLineWidth,basegfx::B2DLineJoin i_eLineJoin,com::sun::star::drawing::LineCap i_eLineCap,const OutputDevice * i_pOutDev)568*b1cdbd2cSJim Jagielski bool SalGraphics::DrawPolyLine(
569*b1cdbd2cSJim Jagielski     const ::basegfx::B2DPolygon& i_rPolygon,
570*b1cdbd2cSJim Jagielski     double i_fTransparency,
571*b1cdbd2cSJim Jagielski     const ::basegfx::B2DVector& i_rLineWidth,
572*b1cdbd2cSJim Jagielski     basegfx::B2DLineJoin i_eLineJoin,
573*b1cdbd2cSJim Jagielski     com::sun::star::drawing::LineCap i_eLineCap,
574*b1cdbd2cSJim Jagielski     const OutputDevice* i_pOutDev )
575*b1cdbd2cSJim Jagielski {
576*b1cdbd2cSJim Jagielski     bool bRet = false;
577*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (i_pOutDev && i_pOutDev->IsRTLEnabled()) )
578*b1cdbd2cSJim Jagielski 	{
579*b1cdbd2cSJim Jagielski         basegfx::B2DPolygon aMirror( mirror( i_rPolygon, i_pOutDev ) );
580*b1cdbd2cSJim Jagielski         bRet = drawPolyLine( aMirror, i_fTransparency, i_rLineWidth, i_eLineJoin, i_eLineCap );
581*b1cdbd2cSJim Jagielski     }
582*b1cdbd2cSJim Jagielski     else
583*b1cdbd2cSJim Jagielski         bRet = drawPolyLine( i_rPolygon, i_fTransparency, i_rLineWidth, i_eLineJoin, i_eLineCap );
584*b1cdbd2cSJim Jagielski     return bRet;
585*b1cdbd2cSJim Jagielski }
586*b1cdbd2cSJim Jagielski 
CopyArea(long nDestX,long nDestY,long nSrcX,long nSrcY,long nSrcWidth,long nSrcHeight,sal_uInt16 nFlags,const OutputDevice * pOutDev)587*b1cdbd2cSJim Jagielski void	SalGraphics::CopyArea( long nDestX, long nDestY,
588*b1cdbd2cSJim Jagielski                                long nSrcX, long nSrcY,
589*b1cdbd2cSJim Jagielski                                long nSrcWidth, long nSrcHeight,
590*b1cdbd2cSJim Jagielski                                sal_uInt16 nFlags, const OutputDevice *pOutDev )
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
593*b1cdbd2cSJim Jagielski 	{
594*b1cdbd2cSJim Jagielski 		mirror( nDestX, nSrcWidth, pOutDev );
595*b1cdbd2cSJim Jagielski 		mirror( nSrcX, nSrcWidth, pOutDev );
596*b1cdbd2cSJim Jagielski 	}
597*b1cdbd2cSJim Jagielski 	copyArea( nDestX, nDestY, nSrcX, nSrcY, nSrcWidth, nSrcHeight, nFlags );
598*b1cdbd2cSJim Jagielski }
CopyBits(const SalTwoRect & rPosAry,SalGraphics * pSrcGraphics,const OutputDevice * pOutDev,const OutputDevice * pSrcOutDev)599*b1cdbd2cSJim Jagielski void	SalGraphics::CopyBits( const SalTwoRect& rPosAry,
600*b1cdbd2cSJim Jagielski                                SalGraphics* pSrcGraphics, const OutputDevice *pOutDev, const OutputDevice *pSrcOutDev )
601*b1cdbd2cSJim Jagielski {
602*b1cdbd2cSJim Jagielski 	if( ( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) ) ||
603*b1cdbd2cSJim Jagielski         (pSrcGraphics && ( (pSrcGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL)  || (pSrcOutDev && pSrcOutDev->IsRTLEnabled()) ) ) )
604*b1cdbd2cSJim Jagielski 	{
605*b1cdbd2cSJim Jagielski 		SalTwoRect aPosAry2 = rPosAry;
606*b1cdbd2cSJim Jagielski 		if( (pSrcGraphics && (pSrcGraphics->GetLayout() & SAL_LAYOUT_BIDI_RTL)) || (pSrcOutDev && pSrcOutDev->IsRTLEnabled()) )
607*b1cdbd2cSJim Jagielski 			mirror( aPosAry2.mnSrcX, aPosAry2.mnSrcWidth, pSrcOutDev );
608*b1cdbd2cSJim Jagielski 		if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
609*b1cdbd2cSJim Jagielski 			mirror( aPosAry2.mnDestX, aPosAry2.mnDestWidth, pOutDev );
610*b1cdbd2cSJim Jagielski 		copyBits( aPosAry2, pSrcGraphics );
611*b1cdbd2cSJim Jagielski 	}
612*b1cdbd2cSJim Jagielski 	else
613*b1cdbd2cSJim Jagielski 		copyBits( rPosAry, pSrcGraphics );
614*b1cdbd2cSJim Jagielski }
DrawBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap,const OutputDevice * pOutDev)615*b1cdbd2cSJim Jagielski void	SalGraphics::DrawBitmap( const SalTwoRect& rPosAry,
616*b1cdbd2cSJim Jagielski 									const SalBitmap& rSalBitmap, const OutputDevice *pOutDev )
617*b1cdbd2cSJim Jagielski {
618*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
619*b1cdbd2cSJim Jagielski 	{
620*b1cdbd2cSJim Jagielski 		SalTwoRect aPosAry2 = rPosAry;
621*b1cdbd2cSJim Jagielski 		mirror( aPosAry2.mnDestX, aPosAry2.mnDestWidth, pOutDev );
622*b1cdbd2cSJim Jagielski 		drawBitmap( aPosAry2, rSalBitmap );
623*b1cdbd2cSJim Jagielski 	}
624*b1cdbd2cSJim Jagielski 	else
625*b1cdbd2cSJim Jagielski 		drawBitmap( rPosAry, rSalBitmap );
626*b1cdbd2cSJim Jagielski }
DrawBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap,SalColor nTransparentColor,const OutputDevice * pOutDev)627*b1cdbd2cSJim Jagielski void	SalGraphics::DrawBitmap( const SalTwoRect& rPosAry,
628*b1cdbd2cSJim Jagielski 									const SalBitmap& rSalBitmap,
629*b1cdbd2cSJim Jagielski 									SalColor nTransparentColor, const OutputDevice *pOutDev )
630*b1cdbd2cSJim Jagielski {
631*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
632*b1cdbd2cSJim Jagielski 	{
633*b1cdbd2cSJim Jagielski 		SalTwoRect aPosAry2 = rPosAry;
634*b1cdbd2cSJim Jagielski 		mirror( aPosAry2.mnDestX, aPosAry2.mnDestWidth, pOutDev );
635*b1cdbd2cSJim Jagielski 		drawBitmap( aPosAry2, rSalBitmap, nTransparentColor );
636*b1cdbd2cSJim Jagielski 	}
637*b1cdbd2cSJim Jagielski 	else
638*b1cdbd2cSJim Jagielski 		drawBitmap( rPosAry, rSalBitmap, nTransparentColor );
639*b1cdbd2cSJim Jagielski }
DrawBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap,const SalBitmap & rTransparentBitmap,const OutputDevice * pOutDev)640*b1cdbd2cSJim Jagielski void SalGraphics::DrawBitmap( const SalTwoRect& rPosAry,
641*b1cdbd2cSJim Jagielski                               const SalBitmap& rSalBitmap,
642*b1cdbd2cSJim Jagielski                               const SalBitmap& rTransparentBitmap, const OutputDevice *pOutDev )
643*b1cdbd2cSJim Jagielski {
644*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
645*b1cdbd2cSJim Jagielski 	{
646*b1cdbd2cSJim Jagielski 		SalTwoRect aPosAry2 = rPosAry;
647*b1cdbd2cSJim Jagielski 		mirror( aPosAry2.mnDestX, aPosAry2.mnDestWidth, pOutDev );
648*b1cdbd2cSJim Jagielski 		drawBitmap( aPosAry2, rSalBitmap, rTransparentBitmap );
649*b1cdbd2cSJim Jagielski 	}
650*b1cdbd2cSJim Jagielski 	else
651*b1cdbd2cSJim Jagielski 		drawBitmap( rPosAry, rSalBitmap, rTransparentBitmap );
652*b1cdbd2cSJim Jagielski }
DrawMask(const SalTwoRect & rPosAry,const SalBitmap & rSalBitmap,SalColor nMaskColor,const OutputDevice * pOutDev)653*b1cdbd2cSJim Jagielski void	SalGraphics::DrawMask( const SalTwoRect& rPosAry,
654*b1cdbd2cSJim Jagielski 								  const SalBitmap& rSalBitmap,
655*b1cdbd2cSJim Jagielski 								  SalColor nMaskColor, const OutputDevice *pOutDev )
656*b1cdbd2cSJim Jagielski {
657*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
658*b1cdbd2cSJim Jagielski 	{
659*b1cdbd2cSJim Jagielski 		SalTwoRect aPosAry2 = rPosAry;
660*b1cdbd2cSJim Jagielski 		mirror( aPosAry2.mnDestX, aPosAry2.mnDestWidth, pOutDev );
661*b1cdbd2cSJim Jagielski 		drawMask( aPosAry2, rSalBitmap, nMaskColor );
662*b1cdbd2cSJim Jagielski 	}
663*b1cdbd2cSJim Jagielski 	else
664*b1cdbd2cSJim Jagielski 		drawMask( rPosAry, rSalBitmap, nMaskColor );
665*b1cdbd2cSJim Jagielski }
GetBitmap(long nX,long nY,long nWidth,long nHeight,const OutputDevice * pOutDev)666*b1cdbd2cSJim Jagielski SalBitmap*	SalGraphics::GetBitmap( long nX, long nY, long nWidth, long nHeight, const OutputDevice *pOutDev )
667*b1cdbd2cSJim Jagielski {
668*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
669*b1cdbd2cSJim Jagielski 		mirror( nX, nWidth, pOutDev );
670*b1cdbd2cSJim Jagielski 	return getBitmap( nX, nY, nWidth, nHeight );
671*b1cdbd2cSJim Jagielski }
GetPixel(long nX,long nY,const OutputDevice * pOutDev)672*b1cdbd2cSJim Jagielski SalColor	SalGraphics::GetPixel( long nX, long nY, const OutputDevice *pOutDev )
673*b1cdbd2cSJim Jagielski {
674*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
675*b1cdbd2cSJim Jagielski 		mirror( nX, pOutDev );
676*b1cdbd2cSJim Jagielski 	return getPixel( nX, nY );
677*b1cdbd2cSJim Jagielski }
Invert(long nX,long nY,long nWidth,long nHeight,SalInvert nFlags,const OutputDevice * pOutDev)678*b1cdbd2cSJim Jagielski void	SalGraphics::Invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags, const OutputDevice *pOutDev )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
681*b1cdbd2cSJim Jagielski 		mirror( nX, nWidth, pOutDev );
682*b1cdbd2cSJim Jagielski 	invert( nX, nY, nWidth, nHeight, nFlags );
683*b1cdbd2cSJim Jagielski }
Invert(sal_uInt32 nPoints,const SalPoint * pPtAry,SalInvert nFlags,const OutputDevice * pOutDev)684*b1cdbd2cSJim Jagielski void	SalGraphics::Invert( sal_uInt32 nPoints, const SalPoint* pPtAry, SalInvert nFlags, const OutputDevice *pOutDev )
685*b1cdbd2cSJim Jagielski {
686*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
687*b1cdbd2cSJim Jagielski 	{
688*b1cdbd2cSJim Jagielski 		SalPoint* pPtAry2 = new SalPoint[nPoints];
689*b1cdbd2cSJim Jagielski 		sal_Bool bCopied = mirror( nPoints, pPtAry, pPtAry2, pOutDev );
690*b1cdbd2cSJim Jagielski 		invert( nPoints, bCopied ? pPtAry2 : pPtAry, nFlags );
691*b1cdbd2cSJim Jagielski 		delete [] pPtAry2;
692*b1cdbd2cSJim Jagielski 	}
693*b1cdbd2cSJim Jagielski 	else
694*b1cdbd2cSJim Jagielski 		invert( nPoints, pPtAry, nFlags );
695*b1cdbd2cSJim Jagielski }
696*b1cdbd2cSJim Jagielski 
DrawEPS(long nX,long nY,long nWidth,long nHeight,void * pPtr,sal_uLong nSize,const OutputDevice * pOutDev)697*b1cdbd2cSJim Jagielski sal_Bool	SalGraphics::DrawEPS( long nX, long nY, long nWidth, long nHeight, void* pPtr, sal_uLong nSize, const OutputDevice *pOutDev )
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
700*b1cdbd2cSJim Jagielski 		mirror( nX, nWidth, pOutDev );
701*b1cdbd2cSJim Jagielski 	return drawEPS( nX, nY, nWidth, nHeight,  pPtr, nSize );
702*b1cdbd2cSJim Jagielski }
703*b1cdbd2cSJim Jagielski 
HitTestNativeControl(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,const Point & aPos,sal_Bool & rIsInside,const OutputDevice * pOutDev)704*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::HitTestNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
705*b1cdbd2cSJim Jagielski                                                 const Point& aPos, sal_Bool& rIsInside, const OutputDevice *pOutDev )
706*b1cdbd2cSJim Jagielski {
707*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
708*b1cdbd2cSJim Jagielski     {
709*b1cdbd2cSJim Jagielski         Point pt( aPos );
710*b1cdbd2cSJim Jagielski         Rectangle rgn( rControlRegion );
711*b1cdbd2cSJim Jagielski         mirror( pt.X(), pOutDev );
712*b1cdbd2cSJim Jagielski         mirror( rgn, pOutDev );
713*b1cdbd2cSJim Jagielski         return hitTestNativeControl( nType, nPart, rgn, pt, rIsInside );
714*b1cdbd2cSJim Jagielski     }
715*b1cdbd2cSJim Jagielski     else
716*b1cdbd2cSJim Jagielski         return hitTestNativeControl( nType, nPart, rControlRegion, aPos, rIsInside );
717*b1cdbd2cSJim Jagielski }
718*b1cdbd2cSJim Jagielski 
mirror(ControlType,const ImplControlValue & rVal,const OutputDevice * pOutDev,bool bBack) const719*b1cdbd2cSJim Jagielski void SalGraphics::mirror( ControlType , const ImplControlValue& rVal, const OutputDevice* pOutDev, bool bBack ) const
720*b1cdbd2cSJim Jagielski {
721*b1cdbd2cSJim Jagielski     switch( rVal.getType() )
722*b1cdbd2cSJim Jagielski     {
723*b1cdbd2cSJim Jagielski         case CTRL_SLIDER:
724*b1cdbd2cSJim Jagielski         {
725*b1cdbd2cSJim Jagielski             SliderValue* pSlVal = static_cast<SliderValue*>(const_cast<ImplControlValue*>(&rVal));
726*b1cdbd2cSJim Jagielski             mirror(pSlVal->maThumbRect,pOutDev,bBack);
727*b1cdbd2cSJim Jagielski         }
728*b1cdbd2cSJim Jagielski         break;
729*b1cdbd2cSJim Jagielski         case CTRL_SCROLLBAR:
730*b1cdbd2cSJim Jagielski         {
731*b1cdbd2cSJim Jagielski             ScrollbarValue* pScVal = static_cast<ScrollbarValue*>(const_cast<ImplControlValue*>(&rVal));
732*b1cdbd2cSJim Jagielski             mirror(pScVal->maThumbRect,pOutDev,bBack);
733*b1cdbd2cSJim Jagielski             mirror(pScVal->maButton1Rect,pOutDev,bBack);
734*b1cdbd2cSJim Jagielski             mirror(pScVal->maButton2Rect,pOutDev,bBack);
735*b1cdbd2cSJim Jagielski         }
736*b1cdbd2cSJim Jagielski         break;
737*b1cdbd2cSJim Jagielski         case CTRL_SPINBOX:
738*b1cdbd2cSJim Jagielski         case CTRL_SPINBUTTONS:
739*b1cdbd2cSJim Jagielski         {
740*b1cdbd2cSJim Jagielski             SpinbuttonValue* pSpVal = static_cast<SpinbuttonValue*>(const_cast<ImplControlValue*>(&rVal));
741*b1cdbd2cSJim Jagielski             mirror(pSpVal->maUpperRect,pOutDev,bBack);
742*b1cdbd2cSJim Jagielski             mirror(pSpVal->maLowerRect,pOutDev,bBack);
743*b1cdbd2cSJim Jagielski         }
744*b1cdbd2cSJim Jagielski         break;
745*b1cdbd2cSJim Jagielski         case CTRL_TOOLBAR:
746*b1cdbd2cSJim Jagielski         {
747*b1cdbd2cSJim Jagielski             ToolbarValue* pTVal = static_cast<ToolbarValue*>(const_cast<ImplControlValue*>(&rVal));
748*b1cdbd2cSJim Jagielski             mirror(pTVal->maGripRect,pOutDev,bBack);
749*b1cdbd2cSJim Jagielski         }
750*b1cdbd2cSJim Jagielski         break;
751*b1cdbd2cSJim Jagielski     }
752*b1cdbd2cSJim Jagielski }
753*b1cdbd2cSJim Jagielski 
DrawNativeControl(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue & aValue,const OUString & aCaption,const OutputDevice * pOutDev)754*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::DrawNativeControl( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
755*b1cdbd2cSJim Jagielski                                                 ControlState nState, const ImplControlValue& aValue,
756*b1cdbd2cSJim Jagielski                                                 const OUString& aCaption, const OutputDevice *pOutDev )
757*b1cdbd2cSJim Jagielski {
758*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
759*b1cdbd2cSJim Jagielski     {
760*b1cdbd2cSJim Jagielski         Rectangle rgn( rControlRegion );
761*b1cdbd2cSJim Jagielski         mirror( rgn, pOutDev );
762*b1cdbd2cSJim Jagielski         mirror( nType, aValue, pOutDev );
763*b1cdbd2cSJim Jagielski         sal_Bool bRet = drawNativeControl( nType, nPart, rgn, nState, aValue, aCaption );
764*b1cdbd2cSJim Jagielski         mirror( nType, aValue, pOutDev, true );
765*b1cdbd2cSJim Jagielski         return bRet;
766*b1cdbd2cSJim Jagielski     }
767*b1cdbd2cSJim Jagielski     else
768*b1cdbd2cSJim Jagielski         return drawNativeControl( nType, nPart, rControlRegion, nState, aValue, aCaption );
769*b1cdbd2cSJim Jagielski }
770*b1cdbd2cSJim Jagielski 
DrawNativeControlText(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue & aValue,const OUString & aCaption,const OutputDevice * pOutDev)771*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::DrawNativeControlText( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion,
772*b1cdbd2cSJim Jagielski                                                 ControlState nState, const ImplControlValue& aValue,
773*b1cdbd2cSJim Jagielski                                                 const OUString& aCaption, const OutputDevice *pOutDev )
774*b1cdbd2cSJim Jagielski {
775*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
776*b1cdbd2cSJim Jagielski     {
777*b1cdbd2cSJim Jagielski         Rectangle rgn( rControlRegion );
778*b1cdbd2cSJim Jagielski         mirror( rgn, pOutDev );
779*b1cdbd2cSJim Jagielski         mirror( nType, aValue, pOutDev );
780*b1cdbd2cSJim Jagielski         sal_Bool bRet = drawNativeControlText( nType, nPart, rgn, nState, aValue, aCaption );
781*b1cdbd2cSJim Jagielski         mirror( nType, aValue, pOutDev, true );
782*b1cdbd2cSJim Jagielski         return bRet;
783*b1cdbd2cSJim Jagielski     }
784*b1cdbd2cSJim Jagielski     else
785*b1cdbd2cSJim Jagielski         return drawNativeControlText( nType, nPart, rControlRegion, nState, aValue, aCaption );
786*b1cdbd2cSJim Jagielski }
787*b1cdbd2cSJim Jagielski 
GetNativeControlRegion(ControlType nType,ControlPart nPart,const Rectangle & rControlRegion,ControlState nState,const ImplControlValue & aValue,const OUString & aCaption,Rectangle & rNativeBoundingRegion,Rectangle & rNativeContentRegion,const OutputDevice * pOutDev)788*b1cdbd2cSJim Jagielski sal_Bool SalGraphics::GetNativeControlRegion( ControlType nType, ControlPart nPart, const Rectangle& rControlRegion, ControlState nState,
789*b1cdbd2cSJim Jagielski                                                 const ImplControlValue& aValue, const OUString& aCaption,
790*b1cdbd2cSJim Jagielski                                                 Rectangle &rNativeBoundingRegion, Rectangle &rNativeContentRegion, const OutputDevice *pOutDev )
791*b1cdbd2cSJim Jagielski {
792*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
793*b1cdbd2cSJim Jagielski     {
794*b1cdbd2cSJim Jagielski         Rectangle rgn( rControlRegion );
795*b1cdbd2cSJim Jagielski         mirror( rgn, pOutDev );
796*b1cdbd2cSJim Jagielski         mirror( nType, aValue, pOutDev );
797*b1cdbd2cSJim Jagielski         if( getNativeControlRegion( nType, nPart, rgn, nState, aValue, aCaption,
798*b1cdbd2cSJim Jagielski                                                 rNativeBoundingRegion, rNativeContentRegion ) )
799*b1cdbd2cSJim Jagielski         {
800*b1cdbd2cSJim Jagielski             mirror( rNativeBoundingRegion, pOutDev, true );
801*b1cdbd2cSJim Jagielski             mirror( rNativeContentRegion, pOutDev, true );
802*b1cdbd2cSJim Jagielski             mirror( nType, aValue, pOutDev, true );
803*b1cdbd2cSJim Jagielski             return sal_True;
804*b1cdbd2cSJim Jagielski         }
805*b1cdbd2cSJim Jagielski         else
806*b1cdbd2cSJim Jagielski         {
807*b1cdbd2cSJim Jagielski             mirror( nType, aValue, pOutDev, true );
808*b1cdbd2cSJim Jagielski             return sal_False;
809*b1cdbd2cSJim Jagielski         }
810*b1cdbd2cSJim Jagielski     }
811*b1cdbd2cSJim Jagielski     else
812*b1cdbd2cSJim Jagielski         return getNativeControlRegion( nType, nPart, rControlRegion, nState, aValue, aCaption,
813*b1cdbd2cSJim Jagielski                                                 rNativeBoundingRegion, rNativeContentRegion );
814*b1cdbd2cSJim Jagielski }
815*b1cdbd2cSJim Jagielski 
DrawAlphaBitmap(const SalTwoRect & rPosAry,const SalBitmap & rSourceBitmap,const SalBitmap & rAlphaBitmap,const OutputDevice * pOutDev)816*b1cdbd2cSJim Jagielski bool SalGraphics::DrawAlphaBitmap( const SalTwoRect& rPosAry,
817*b1cdbd2cSJim Jagielski                                    const SalBitmap& rSourceBitmap,
818*b1cdbd2cSJim Jagielski                                    const SalBitmap& rAlphaBitmap,
819*b1cdbd2cSJim Jagielski                                    const OutputDevice *pOutDev )
820*b1cdbd2cSJim Jagielski {
821*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
822*b1cdbd2cSJim Jagielski 	{
823*b1cdbd2cSJim Jagielski 		SalTwoRect aPosAry2 = rPosAry;
824*b1cdbd2cSJim Jagielski 		mirror( aPosAry2.mnDestX, aPosAry2.mnDestWidth, pOutDev );
825*b1cdbd2cSJim Jagielski 		return drawAlphaBitmap( aPosAry2, rSourceBitmap, rAlphaBitmap );
826*b1cdbd2cSJim Jagielski 	}
827*b1cdbd2cSJim Jagielski 	else
828*b1cdbd2cSJim Jagielski 		return drawAlphaBitmap( rPosAry, rSourceBitmap, rAlphaBitmap );
829*b1cdbd2cSJim Jagielski }
830*b1cdbd2cSJim Jagielski 
DrawTransformedBitmap(const basegfx::B2DPoint & rNull,const basegfx::B2DPoint & rX,const basegfx::B2DPoint & rY,const SalBitmap & rSourceBitmap,const SalBitmap * pAlphaBitmap,const OutputDevice * pOutDev)831*b1cdbd2cSJim Jagielski bool SalGraphics::DrawTransformedBitmap(
832*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& rNull,
833*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& rX,
834*b1cdbd2cSJim Jagielski     const basegfx::B2DPoint& rY,
835*b1cdbd2cSJim Jagielski     const SalBitmap& rSourceBitmap,
836*b1cdbd2cSJim Jagielski     const SalBitmap* pAlphaBitmap,
837*b1cdbd2cSJim Jagielski     const OutputDevice* pOutDev)
838*b1cdbd2cSJim Jagielski {
839*b1cdbd2cSJim Jagielski     if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
840*b1cdbd2cSJim Jagielski     {
841*b1cdbd2cSJim Jagielski         basegfx::B2DPoint aNull(rNull);
842*b1cdbd2cSJim Jagielski         basegfx::B2DPoint aX(rX);
843*b1cdbd2cSJim Jagielski         basegfx::B2DPoint aY(rY);
844*b1cdbd2cSJim Jagielski 
845*b1cdbd2cSJim Jagielski         mirror(aNull, pOutDev);
846*b1cdbd2cSJim Jagielski         mirror(aX, pOutDev);
847*b1cdbd2cSJim Jagielski         mirror(aY, pOutDev);
848*b1cdbd2cSJim Jagielski 
849*b1cdbd2cSJim Jagielski         return drawTransformedBitmap(aNull, aX, aY, rSourceBitmap, pAlphaBitmap);
850*b1cdbd2cSJim Jagielski     }
851*b1cdbd2cSJim Jagielski     else
852*b1cdbd2cSJim Jagielski     {
853*b1cdbd2cSJim Jagielski         return drawTransformedBitmap(rNull, rX, rY, rSourceBitmap, pAlphaBitmap);
854*b1cdbd2cSJim Jagielski     }
855*b1cdbd2cSJim Jagielski }
856*b1cdbd2cSJim Jagielski 
DrawAlphaRect(long nX,long nY,long nWidth,long nHeight,sal_uInt8 nTransparency,const OutputDevice * pOutDev)857*b1cdbd2cSJim Jagielski bool SalGraphics::DrawAlphaRect( long nX, long nY, long nWidth, long nHeight,
858*b1cdbd2cSJim Jagielski                                  sal_uInt8 nTransparency, const OutputDevice *pOutDev )
859*b1cdbd2cSJim Jagielski {
860*b1cdbd2cSJim Jagielski 	if( (m_nLayout & SAL_LAYOUT_BIDI_RTL) || (pOutDev && pOutDev->IsRTLEnabled()) )
861*b1cdbd2cSJim Jagielski 		mirror( nX, nWidth, pOutDev );
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski 	return drawAlphaRect( nX, nY, nWidth, nHeight, nTransparency );
864*b1cdbd2cSJim Jagielski }
865*b1cdbd2cSJim Jagielski 
filterText(const String &,String &,xub_StrLen,xub_StrLen &,xub_StrLen &,xub_StrLen &)866*b1cdbd2cSJim Jagielski bool SalGraphics::filterText( const String&, String&, xub_StrLen, xub_StrLen&, xub_StrLen&, xub_StrLen& )
867*b1cdbd2cSJim Jagielski {
868*b1cdbd2cSJim Jagielski     return false;
869*b1cdbd2cSJim Jagielski }
870*b1cdbd2cSJim Jagielski 
AddDevFontSubstitute(OutputDevice * pOutDev,const String & rFontName,const String & rReplaceFontName,sal_uInt16 nFlags)871*b1cdbd2cSJim Jagielski void SalGraphics::AddDevFontSubstitute( OutputDevice* pOutDev,
872*b1cdbd2cSJim Jagielski                                         const String& rFontName,
873*b1cdbd2cSJim Jagielski                                         const String& rReplaceFontName,
874*b1cdbd2cSJim Jagielski                                         sal_uInt16 nFlags )
875*b1cdbd2cSJim Jagielski {
876*b1cdbd2cSJim Jagielski     pOutDev->ImplAddDevFontSubstitute( rFontName, rReplaceFontName, nFlags );
877*b1cdbd2cSJim Jagielski }
878*b1cdbd2cSJim Jagielski 
879