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