xref: /aoo41x/main/vcl/source/gdi/mapmod.cxx (revision 9f62ea84)
1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*9f62ea84SAndrew Rist  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*9f62ea84SAndrew Rist  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19*9f62ea84SAndrew Rist  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir #include <tools/stream.hxx>
27cdf0e10cSrcweir #include <tools/vcompat.hxx>
28cdf0e10cSrcweir #include <tools/debug.hxx>
29cdf0e10cSrcweir #include <vcl/mapmod.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir // =======================================================================
32cdf0e10cSrcweir 
DBG_NAME(MapMode)33cdf0e10cSrcweir DBG_NAME( MapMode )
34cdf0e10cSrcweir 
35cdf0e10cSrcweir // -----------------------------------------------------------------------
36cdf0e10cSrcweir 
37cdf0e10cSrcweir ImplMapMode::ImplMapMode() :
38cdf0e10cSrcweir     maOrigin( 0, 0 ),
39cdf0e10cSrcweir     maScaleX( 1, 1 ),
40cdf0e10cSrcweir     maScaleY( 1, 1 )
41cdf0e10cSrcweir {
42cdf0e10cSrcweir     mnRefCount  = 1;
43cdf0e10cSrcweir     meUnit      = MAP_PIXEL;
44cdf0e10cSrcweir     mbSimple    = sal_False;
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
47cdf0e10cSrcweir // -----------------------------------------------------------------------
48cdf0e10cSrcweir 
ImplMapMode(const ImplMapMode & rImplMapMode)49cdf0e10cSrcweir ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) :
50cdf0e10cSrcweir     maOrigin( rImplMapMode.maOrigin ),
51cdf0e10cSrcweir     maScaleX( rImplMapMode.maScaleX ),
52cdf0e10cSrcweir     maScaleY( rImplMapMode.maScaleY )
53cdf0e10cSrcweir {
54cdf0e10cSrcweir     mnRefCount      = 1;
55cdf0e10cSrcweir     meUnit          = rImplMapMode.meUnit;
56cdf0e10cSrcweir     mbSimple        = sal_False;
57cdf0e10cSrcweir }
58cdf0e10cSrcweir 
59cdf0e10cSrcweir // -----------------------------------------------------------------------
60cdf0e10cSrcweir 
operator >>(SvStream & rIStm,ImplMapMode & rImplMapMode)61cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, ImplMapMode& rImplMapMode )
62cdf0e10cSrcweir {
63cdf0e10cSrcweir     VersionCompat	aCompat( rIStm, STREAM_READ );
64cdf0e10cSrcweir     sal_uInt16			nTmp16;
65cdf0e10cSrcweir 
66cdf0e10cSrcweir     rIStm >> nTmp16; rImplMapMode.meUnit = (MapUnit) nTmp16;
67cdf0e10cSrcweir     rIStm >> rImplMapMode.maOrigin >> rImplMapMode.maScaleX >>
68cdf0e10cSrcweir              rImplMapMode.maScaleY >> rImplMapMode.mbSimple;
69cdf0e10cSrcweir 
70cdf0e10cSrcweir     return rIStm;
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir // -----------------------------------------------------------------------
74cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const ImplMapMode & rImplMapMode)75cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const ImplMapMode& rImplMapMode )
76cdf0e10cSrcweir {
77cdf0e10cSrcweir     VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
78cdf0e10cSrcweir 
79cdf0e10cSrcweir     rOStm << (sal_uInt16) rImplMapMode.meUnit <<
80cdf0e10cSrcweir              rImplMapMode.maOrigin <<
81cdf0e10cSrcweir              rImplMapMode.maScaleX <<
82cdf0e10cSrcweir              rImplMapMode.maScaleY <<
83cdf0e10cSrcweir              rImplMapMode.mbSimple;
84cdf0e10cSrcweir 
85cdf0e10cSrcweir     return rOStm;
86cdf0e10cSrcweir }
87cdf0e10cSrcweir 
88cdf0e10cSrcweir // -----------------------------------------------------------------------
89cdf0e10cSrcweir 
ImplGetStaticMapMode(MapUnit eUnit)90cdf0e10cSrcweir ImplMapMode* ImplMapMode::ImplGetStaticMapMode( MapUnit eUnit )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir     static long aStaticImplMapModeAry[(MAP_LASTENUMDUMMY)*sizeof(ImplMapMode)/sizeof(long)];
93cdf0e10cSrcweir 
94cdf0e10cSrcweir     // #i19496 check for out-of-bounds
95cdf0e10cSrcweir      if( eUnit >= MAP_LASTENUMDUMMY )
96cdf0e10cSrcweir         return (ImplMapMode*)aStaticImplMapModeAry;
97cdf0e10cSrcweir 
98cdf0e10cSrcweir     ImplMapMode* pImplMapMode = ((ImplMapMode*)aStaticImplMapModeAry)+eUnit;
99cdf0e10cSrcweir     if ( !pImplMapMode->mbSimple )
100cdf0e10cSrcweir     {
101cdf0e10cSrcweir         Fraction aDefFraction( 1, 1 );
102cdf0e10cSrcweir         pImplMapMode->maScaleX  = aDefFraction;
103cdf0e10cSrcweir         pImplMapMode->maScaleY  = aDefFraction;
104cdf0e10cSrcweir         pImplMapMode->meUnit    = eUnit;
105cdf0e10cSrcweir         pImplMapMode->mbSimple  = sal_True;
106cdf0e10cSrcweir     }
107cdf0e10cSrcweir 
108cdf0e10cSrcweir     return pImplMapMode;
109cdf0e10cSrcweir }
110cdf0e10cSrcweir 
111cdf0e10cSrcweir // -----------------------------------------------------------------------
112cdf0e10cSrcweir 
ImplMakeUnique()113cdf0e10cSrcweir inline void MapMode::ImplMakeUnique()
114cdf0e10cSrcweir {
115cdf0e10cSrcweir     // Falls noch andere Referenzen bestehen, dann kopieren
116cdf0e10cSrcweir     if ( mpImplMapMode->mnRefCount != 1 )
117cdf0e10cSrcweir     {
118cdf0e10cSrcweir         if ( mpImplMapMode->mnRefCount )
119cdf0e10cSrcweir             mpImplMapMode->mnRefCount--;
120cdf0e10cSrcweir         mpImplMapMode = new ImplMapMode( *mpImplMapMode );
121cdf0e10cSrcweir     }
122cdf0e10cSrcweir }
123cdf0e10cSrcweir 
124cdf0e10cSrcweir // -----------------------------------------------------------------------
125cdf0e10cSrcweir 
MapMode()126cdf0e10cSrcweir MapMode::MapMode()
127cdf0e10cSrcweir {
128cdf0e10cSrcweir     DBG_CTOR( MapMode, NULL );
129cdf0e10cSrcweir 
130cdf0e10cSrcweir     mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
131cdf0e10cSrcweir }
132cdf0e10cSrcweir 
133cdf0e10cSrcweir // -----------------------------------------------------------------------
134cdf0e10cSrcweir 
MapMode(const MapMode & rMapMode)135cdf0e10cSrcweir MapMode::MapMode( const MapMode& rMapMode )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir     DBG_CTOR( MapMode, NULL );
138cdf0e10cSrcweir     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
139cdf0e10cSrcweir     DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     // shared Instance Daten uebernehmen und Referenzcounter erhoehen
142cdf0e10cSrcweir     mpImplMapMode = rMapMode.mpImplMapMode;
143cdf0e10cSrcweir     // RefCount == 0 fuer statische Objekte
144cdf0e10cSrcweir     if ( mpImplMapMode->mnRefCount )
145cdf0e10cSrcweir         mpImplMapMode->mnRefCount++;
146cdf0e10cSrcweir }
147cdf0e10cSrcweir 
148cdf0e10cSrcweir // -----------------------------------------------------------------------
149cdf0e10cSrcweir 
MapMode(MapUnit eUnit)150cdf0e10cSrcweir MapMode::MapMode( MapUnit eUnit )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir     DBG_CTOR( MapMode, NULL );
153cdf0e10cSrcweir 
154cdf0e10cSrcweir     mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( eUnit );
155cdf0e10cSrcweir }
156cdf0e10cSrcweir 
157cdf0e10cSrcweir // -----------------------------------------------------------------------
158cdf0e10cSrcweir 
MapMode(MapUnit eUnit,const Point & rLogicOrg,const Fraction & rScaleX,const Fraction & rScaleY)159cdf0e10cSrcweir MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
160cdf0e10cSrcweir                   const Fraction& rScaleX, const Fraction& rScaleY )
161cdf0e10cSrcweir {
162cdf0e10cSrcweir     DBG_CTOR( MapMode, NULL );
163cdf0e10cSrcweir 
164cdf0e10cSrcweir     mpImplMapMode           = new ImplMapMode;
165cdf0e10cSrcweir     mpImplMapMode->meUnit   = eUnit;
166cdf0e10cSrcweir     mpImplMapMode->maOrigin = rLogicOrg;
167cdf0e10cSrcweir     mpImplMapMode->maScaleX = rScaleX;
168cdf0e10cSrcweir     mpImplMapMode->maScaleY = rScaleY;
169cdf0e10cSrcweir }
170cdf0e10cSrcweir 
171cdf0e10cSrcweir // -----------------------------------------------------------------------
172cdf0e10cSrcweir 
~MapMode()173cdf0e10cSrcweir MapMode::~MapMode()
174cdf0e10cSrcweir {
175cdf0e10cSrcweir     DBG_DTOR( MapMode, NULL );
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
178cdf0e10cSrcweir     // die letzte Referenz ist, sonst Referenzcounter decrementieren
179cdf0e10cSrcweir     if ( mpImplMapMode->mnRefCount )
180cdf0e10cSrcweir     {
181cdf0e10cSrcweir         if ( mpImplMapMode->mnRefCount == 1 )
182cdf0e10cSrcweir             delete mpImplMapMode;
183cdf0e10cSrcweir         else
184cdf0e10cSrcweir             mpImplMapMode->mnRefCount--;
185cdf0e10cSrcweir     }
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
188cdf0e10cSrcweir // -----------------------------------------------------------------------
189cdf0e10cSrcweir 
SetMapUnit(MapUnit eUnit)190cdf0e10cSrcweir void MapMode::SetMapUnit( MapUnit eUnit )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     ImplMakeUnique();
195cdf0e10cSrcweir     mpImplMapMode->meUnit = eUnit;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir 
198cdf0e10cSrcweir // -----------------------------------------------------------------------
199cdf0e10cSrcweir 
SetOrigin(const Point & rLogicOrg)200cdf0e10cSrcweir void MapMode::SetOrigin( const Point& rLogicOrg )
201cdf0e10cSrcweir {
202cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     ImplMakeUnique();
205cdf0e10cSrcweir     mpImplMapMode->maOrigin = rLogicOrg;
206cdf0e10cSrcweir }
207cdf0e10cSrcweir 
208cdf0e10cSrcweir // -----------------------------------------------------------------------
209cdf0e10cSrcweir 
SetScaleX(const Fraction & rScaleX)210cdf0e10cSrcweir void MapMode::SetScaleX( const Fraction& rScaleX )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
213cdf0e10cSrcweir 
214cdf0e10cSrcweir     ImplMakeUnique();
215cdf0e10cSrcweir     mpImplMapMode->maScaleX = rScaleX;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir 
218cdf0e10cSrcweir // -----------------------------------------------------------------------
219cdf0e10cSrcweir 
SetScaleY(const Fraction & rScaleY)220cdf0e10cSrcweir void MapMode::SetScaleY( const Fraction& rScaleY )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
223cdf0e10cSrcweir 
224cdf0e10cSrcweir     ImplMakeUnique();
225cdf0e10cSrcweir     mpImplMapMode->maScaleY = rScaleY;
226cdf0e10cSrcweir }
227cdf0e10cSrcweir 
228cdf0e10cSrcweir // -----------------------------------------------------------------------
229cdf0e10cSrcweir 
operator =(const MapMode & rMapMode)230cdf0e10cSrcweir MapMode& MapMode::operator=( const MapMode& rMapMode )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
233cdf0e10cSrcweir     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
234cdf0e10cSrcweir     DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
235cdf0e10cSrcweir 
236cdf0e10cSrcweir     // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
237cdf0e10cSrcweir     // RefCount == 0 fuer statische Objekte
238cdf0e10cSrcweir     if ( rMapMode.mpImplMapMode->mnRefCount )
239cdf0e10cSrcweir         rMapMode.mpImplMapMode->mnRefCount++;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
242cdf0e10cSrcweir     // die letzte Referenz ist, sonst Referenzcounter decrementieren
243cdf0e10cSrcweir     if ( mpImplMapMode->mnRefCount )
244cdf0e10cSrcweir     {
245cdf0e10cSrcweir         if ( mpImplMapMode->mnRefCount == 1 )
246cdf0e10cSrcweir             delete mpImplMapMode;
247cdf0e10cSrcweir         else
248cdf0e10cSrcweir             mpImplMapMode->mnRefCount--;
249cdf0e10cSrcweir     }
250cdf0e10cSrcweir 
251cdf0e10cSrcweir     mpImplMapMode = rMapMode.mpImplMapMode;
252cdf0e10cSrcweir 
253cdf0e10cSrcweir     return *this;
254cdf0e10cSrcweir }
255cdf0e10cSrcweir 
256cdf0e10cSrcweir // -----------------------------------------------------------------------
257cdf0e10cSrcweir 
operator ==(const MapMode & rMapMode) const258cdf0e10cSrcweir sal_Bool MapMode::operator==( const MapMode& rMapMode ) const
259cdf0e10cSrcweir {
260cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
261cdf0e10cSrcweir     DBG_CHKOBJ( &rMapMode, MapMode, NULL );
262cdf0e10cSrcweir 
263cdf0e10cSrcweir     if ( mpImplMapMode == rMapMode.mpImplMapMode )
264cdf0e10cSrcweir         return sal_True;
265cdf0e10cSrcweir 
266cdf0e10cSrcweir     if ( (mpImplMapMode->meUnit   == rMapMode.mpImplMapMode->meUnit)   &&
267cdf0e10cSrcweir          (mpImplMapMode->maOrigin == rMapMode.mpImplMapMode->maOrigin) &&
268cdf0e10cSrcweir          (mpImplMapMode->maScaleX == rMapMode.mpImplMapMode->maScaleX) &&
269cdf0e10cSrcweir          (mpImplMapMode->maScaleY == rMapMode.mpImplMapMode->maScaleY) )
270cdf0e10cSrcweir         return sal_True;
271cdf0e10cSrcweir     else
272cdf0e10cSrcweir         return sal_False;
273cdf0e10cSrcweir }
274cdf0e10cSrcweir 
275cdf0e10cSrcweir // -----------------------------------------------------------------------
276cdf0e10cSrcweir 
IsDefault() const277cdf0e10cSrcweir sal_Bool MapMode::IsDefault() const
278cdf0e10cSrcweir {
279cdf0e10cSrcweir     DBG_CHKTHIS( MapMode, NULL );
280cdf0e10cSrcweir 
281cdf0e10cSrcweir     ImplMapMode* pDefMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
282cdf0e10cSrcweir     if ( mpImplMapMode == pDefMapMode )
283cdf0e10cSrcweir         return sal_True;
284cdf0e10cSrcweir 
285cdf0e10cSrcweir     if ( (mpImplMapMode->meUnit   == pDefMapMode->meUnit)   &&
286cdf0e10cSrcweir          (mpImplMapMode->maOrigin == pDefMapMode->maOrigin) &&
287cdf0e10cSrcweir          (mpImplMapMode->maScaleX == pDefMapMode->maScaleX) &&
288cdf0e10cSrcweir          (mpImplMapMode->maScaleY == pDefMapMode->maScaleY) )
289cdf0e10cSrcweir         return sal_True;
290cdf0e10cSrcweir     else
291cdf0e10cSrcweir         return sal_False;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
294cdf0e10cSrcweir // -----------------------------------------------------------------------
295cdf0e10cSrcweir 
operator >>(SvStream & rIStm,MapMode & rMapMode)296cdf0e10cSrcweir SvStream& operator>>( SvStream& rIStm, MapMode& rMapMode )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir     rMapMode.ImplMakeUnique();
299cdf0e10cSrcweir     return (rIStm >> *rMapMode.mpImplMapMode);
300cdf0e10cSrcweir }
301cdf0e10cSrcweir 
302cdf0e10cSrcweir // -----------------------------------------------------------------------
303cdf0e10cSrcweir 
operator <<(SvStream & rOStm,const MapMode & rMapMode)304cdf0e10cSrcweir SvStream& operator<<( SvStream& rOStm, const MapMode& rMapMode )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir     return (rOStm << *rMapMode.mpImplMapMode);
307cdf0e10cSrcweir }
308