Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * This file is part of the LibreOffice project.
4 : : *
5 : : * This Source Code Form is subject to the terms of the Mozilla Public
6 : : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : : *
9 : : * This file incorporates work covered by the following license notice:
10 : : *
11 : : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : : * contributor license agreements. See the NOTICE file distributed
13 : : * with this work for additional information regarding copyright
14 : : * ownership. The ASF licenses this file to you under the Apache
15 : : * License, Version 2.0 (the "License"); you may not use this file
16 : : * except in compliance with the License. You may obtain a copy of
17 : : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : : */
19 : :
20 : : #include <tools/stream.hxx>
21 : : #include <tools/vcompat.hxx>
22 : : #include <tools/debug.hxx>
23 : : #include <vcl/mapmod.hxx>
24 : :
25 : : // =======================================================================
26 : :
27 : : DBG_NAME( MapMode )
28 : :
29 : : // -----------------------------------------------------------------------
30 : :
31 : 37555 : ImplMapMode::ImplMapMode() :
32 : : maOrigin( 0, 0 ),
33 : : maScaleX( 1, 1 ),
34 : 37555 : maScaleY( 1, 1 )
35 : : {
36 : 37555 : mnRefCount = 1;
37 : 37555 : meUnit = MAP_PIXEL;
38 : 37555 : mbSimple = sal_False;
39 : 37555 : }
40 : :
41 : : // -----------------------------------------------------------------------
42 : :
43 : 49903 : ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) :
44 : : maOrigin( rImplMapMode.maOrigin ),
45 : : maScaleX( rImplMapMode.maScaleX ),
46 : 49903 : maScaleY( rImplMapMode.maScaleY )
47 : : {
48 : 49903 : mnRefCount = 1;
49 : 49903 : meUnit = rImplMapMode.meUnit;
50 : 49903 : mbSimple = sal_False;
51 : 49903 : }
52 : :
53 : : // -----------------------------------------------------------------------
54 : :
55 : 8845 : SvStream& operator>>( SvStream& rIStm, ImplMapMode& rImplMapMode )
56 : : {
57 [ + - ]: 8845 : VersionCompat aCompat( rIStm, STREAM_READ );
58 : : sal_uInt16 nTmp16;
59 : :
60 [ + - ]: 8845 : rIStm >> nTmp16; rImplMapMode.meUnit = (MapUnit) nTmp16;
61 [ + - ][ + - ]: 8845 : rIStm >> rImplMapMode.maOrigin >> rImplMapMode.maScaleX >>
62 [ + - ][ + - ]: 8845 : rImplMapMode.maScaleY >> rImplMapMode.mbSimple;
63 : :
64 [ + - ]: 8845 : return rIStm;
65 : : }
66 : :
67 : : // -----------------------------------------------------------------------
68 : :
69 : 9422 : SvStream& operator<<( SvStream& rOStm, const ImplMapMode& rImplMapMode )
70 : : {
71 [ + - ]: 9422 : VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
72 : :
73 [ + - ]: 9422 : rOStm << (sal_uInt16) rImplMapMode.meUnit <<
74 [ + - ]: 9422 : rImplMapMode.maOrigin <<
75 [ + - ]: 9422 : rImplMapMode.maScaleX <<
76 [ + - ]: 9422 : rImplMapMode.maScaleY <<
77 [ + - ]: 9422 : rImplMapMode.mbSimple;
78 : :
79 [ + - ]: 9422 : return rOStm;
80 : : }
81 : :
82 : : // -----------------------------------------------------------------------
83 : :
84 : 7159374 : ImplMapMode* ImplMapMode::ImplGetStaticMapMode( MapUnit eUnit )
85 : : {
86 : : static long aStaticImplMapModeAry[(MAP_LASTENUMDUMMY)*sizeof(ImplMapMode)/sizeof(long)];
87 : :
88 : : // #i19496 check for out-of-bounds
89 [ - + ]: 7159374 : if( eUnit >= MAP_LASTENUMDUMMY )
90 : 0 : return (ImplMapMode*)aStaticImplMapModeAry;
91 : :
92 : 7159374 : ImplMapMode* pImplMapMode = ((ImplMapMode*)aStaticImplMapModeAry)+eUnit;
93 [ + + ]: 7159374 : if ( !pImplMapMode->mbSimple )
94 : : {
95 [ + - ]: 911 : Fraction aDefFraction( 1, 1 );
96 [ + - ]: 911 : pImplMapMode->maScaleX = aDefFraction;
97 [ + - ]: 911 : pImplMapMode->maScaleY = aDefFraction;
98 : 911 : pImplMapMode->meUnit = eUnit;
99 : 911 : pImplMapMode->mbSimple = sal_True;
100 : : }
101 : :
102 : 7159374 : return pImplMapMode;
103 : : }
104 : :
105 : : // -----------------------------------------------------------------------
106 : :
107 : 127155 : inline void MapMode::ImplMakeUnique()
108 : : {
109 : : // Falls noch andere Referenzen bestehen, dann kopieren
110 [ + + ]: 127155 : if ( mpImplMapMode->mnRefCount != 1 )
111 : : {
112 [ + + ]: 49903 : if ( mpImplMapMode->mnRefCount )
113 : 18550 : mpImplMapMode->mnRefCount--;
114 [ + - ]: 49903 : mpImplMapMode = new ImplMapMode( *mpImplMapMode );
115 : : }
116 : 127155 : }
117 : :
118 : : // -----------------------------------------------------------------------
119 : :
120 : 6225401 : MapMode::MapMode()
121 : : {
122 : : DBG_CTOR( MapMode, NULL );
123 : :
124 : 6225401 : mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
125 : 6225401 : }
126 : :
127 : : // -----------------------------------------------------------------------
128 : :
129 : 4082122 : MapMode::MapMode( const MapMode& rMapMode )
130 : : {
131 : : DBG_CTOR( MapMode, NULL );
132 : : DBG_CHKOBJ( &rMapMode, MapMode, NULL );
133 : : DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
134 : :
135 : : // shared Instance Daten uebernehmen und Referenzcounter erhoehen
136 : 4082122 : mpImplMapMode = rMapMode.mpImplMapMode;
137 : : // RefCount == 0 fuer statische Objekte
138 [ + + ]: 4082122 : if ( mpImplMapMode->mnRefCount )
139 : 469756 : mpImplMapMode->mnRefCount++;
140 : 4082122 : }
141 : :
142 : : // -----------------------------------------------------------------------
143 : :
144 : 128259 : MapMode::MapMode( MapUnit eUnit )
145 : : {
146 : : DBG_CTOR( MapMode, NULL );
147 : :
148 : 128259 : mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( eUnit );
149 : 128259 : }
150 : :
151 : : // -----------------------------------------------------------------------
152 : :
153 : 37555 : MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
154 : : const Fraction& rScaleX, const Fraction& rScaleY )
155 : : {
156 : : DBG_CTOR( MapMode, NULL );
157 : :
158 [ + - ]: 37555 : mpImplMapMode = new ImplMapMode;
159 : 37555 : mpImplMapMode->meUnit = eUnit;
160 : 37555 : mpImplMapMode->maOrigin = rLogicOrg;
161 : 37555 : mpImplMapMode->maScaleX = rScaleX;
162 : 37555 : mpImplMapMode->maScaleY = rScaleY;
163 : 37555 : }
164 : :
165 : : // -----------------------------------------------------------------------
166 : :
167 : 10461227 : MapMode::~MapMode()
168 : : {
169 : : DBG_DTOR( MapMode, NULL );
170 : :
171 : : // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
172 : : // die letzte Referenz ist, sonst Referenzcounter decrementieren
173 [ + + ]: 10461227 : if ( mpImplMapMode->mnRefCount )
174 : : {
175 [ + + ]: 573347 : if ( mpImplMapMode->mnRefCount == 1 )
176 : 83266 : delete mpImplMapMode;
177 : : else
178 : 490081 : mpImplMapMode->mnRefCount--;
179 : : }
180 : 10461227 : }
181 : :
182 : : // -----------------------------------------------------------------------
183 : :
184 : 8209 : void MapMode::SetMapUnit( MapUnit eUnit )
185 : : {
186 : : DBG_CHKTHIS( MapMode, NULL );
187 : :
188 : 8209 : ImplMakeUnique();
189 : 8209 : mpImplMapMode->meUnit = eUnit;
190 : 8209 : }
191 : :
192 : : // -----------------------------------------------------------------------
193 : :
194 : 60079 : void MapMode::SetOrigin( const Point& rLogicOrg )
195 : : {
196 : : DBG_CHKTHIS( MapMode, NULL );
197 : :
198 : 60079 : ImplMakeUnique();
199 : 60079 : mpImplMapMode->maOrigin = rLogicOrg;
200 : 60079 : }
201 : :
202 : : // -----------------------------------------------------------------------
203 : :
204 : 25011 : void MapMode::SetScaleX( const Fraction& rScaleX )
205 : : {
206 : : DBG_CHKTHIS( MapMode, NULL );
207 : :
208 : 25011 : ImplMakeUnique();
209 : 25011 : mpImplMapMode->maScaleX = rScaleX;
210 : 25011 : }
211 : :
212 : : // -----------------------------------------------------------------------
213 : :
214 : 25011 : void MapMode::SetScaleY( const Fraction& rScaleY )
215 : : {
216 : : DBG_CHKTHIS( MapMode, NULL );
217 : :
218 : 25011 : ImplMakeUnique();
219 : 25011 : mpImplMapMode->maScaleY = rScaleY;
220 : 25011 : }
221 : :
222 : : // -----------------------------------------------------------------------
223 : :
224 : 4552857 : MapMode& MapMode::operator=( const MapMode& rMapMode )
225 : : {
226 : : DBG_CHKTHIS( MapMode, NULL );
227 : : DBG_CHKOBJ( &rMapMode, MapMode, NULL );
228 : : DBG_ASSERT( rMapMode.mpImplMapMode->mnRefCount < 0xFFFFFFFE, "MapMode: RefCount overflow" );
229 : :
230 : : // Zuerst Referenzcounter erhoehen, damit man sich selbst zuweisen kann
231 : : // RefCount == 0 fuer statische Objekte
232 [ + + ]: 4552857 : if ( rMapMode.mpImplMapMode->mnRefCount )
233 : 100348 : rMapMode.mpImplMapMode->mnRefCount++;
234 : :
235 : : // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
236 : : // die letzte Referenz ist, sonst Referenzcounter decrementieren
237 [ + + ]: 4552857 : if ( mpImplMapMode->mnRefCount )
238 : : {
239 [ + + ]: 64948 : if ( mpImplMapMode->mnRefCount == 1 )
240 : 3525 : delete mpImplMapMode;
241 : : else
242 : 61423 : mpImplMapMode->mnRefCount--;
243 : : }
244 : :
245 : 4552857 : mpImplMapMode = rMapMode.mpImplMapMode;
246 : :
247 : 4552857 : return *this;
248 : : }
249 : :
250 : : // -----------------------------------------------------------------------
251 : :
252 : 545547 : sal_Bool MapMode::operator==( const MapMode& rMapMode ) const
253 : : {
254 : : DBG_CHKTHIS( MapMode, NULL );
255 : : DBG_CHKOBJ( &rMapMode, MapMode, NULL );
256 : :
257 [ + + ]: 545547 : if ( mpImplMapMode == rMapMode.mpImplMapMode )
258 : 297978 : return sal_True;
259 : :
260 [ + + + + : 457556 : if ( (mpImplMapMode->meUnit == rMapMode.mpImplMapMode->meUnit) &&
+ + + + ]
[ + + ]
261 : 76760 : (mpImplMapMode->maOrigin == rMapMode.mpImplMapMode->maOrigin) &&
262 : 67190 : (mpImplMapMode->maScaleX == rMapMode.mpImplMapMode->maScaleX) &&
263 : 66037 : (mpImplMapMode->maScaleY == rMapMode.mpImplMapMode->maScaleY) )
264 : 65941 : return sal_True;
265 : : else
266 : 545547 : return sal_False;
267 : : }
268 : :
269 : : // -----------------------------------------------------------------------
270 : :
271 : 805714 : sal_Bool MapMode::IsDefault() const
272 : : {
273 : : DBG_CHKTHIS( MapMode, NULL );
274 : :
275 : 805714 : ImplMapMode* pDefMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
276 [ + + ]: 805714 : if ( mpImplMapMode == pDefMapMode )
277 : 80571 : return sal_True;
278 : :
279 [ + + + + : 731881 : if ( (mpImplMapMode->meUnit == pDefMapMode->meUnit) &&
+ + + - ]
[ + + ]
280 : 6121 : (mpImplMapMode->maOrigin == pDefMapMode->maOrigin) &&
281 : 581 : (mpImplMapMode->maScaleX == pDefMapMode->maScaleX) &&
282 : 36 : (mpImplMapMode->maScaleY == pDefMapMode->maScaleY) )
283 : 36 : return sal_True;
284 : : else
285 : 805714 : return sal_False;
286 : : }
287 : :
288 : : // -----------------------------------------------------------------------
289 : :
290 : 8845 : SvStream& operator>>( SvStream& rIStm, MapMode& rMapMode )
291 : : {
292 : 8845 : rMapMode.ImplMakeUnique();
293 : 8845 : return (rIStm >> *rMapMode.mpImplMapMode);
294 : : }
295 : :
296 : : // -----------------------------------------------------------------------
297 : :
298 : 9422 : SvStream& operator<<( SvStream& rOStm, const MapMode& rMapMode )
299 : : {
300 : 9422 : return (rOStm << *rMapMode.mpImplMapMode);
301 : : }
302 : :
303 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|