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 2917 : ImplMapMode::ImplMapMode() :
32 : maOrigin( 0, 0 ),
33 : maScaleX( 1, 1 ),
34 2917 : maScaleY( 1, 1 )
35 : {
36 2917 : mnRefCount = 1;
37 2917 : meUnit = MAP_PIXEL;
38 2917 : mbSimple = sal_False;
39 2917 : }
40 :
41 : // -----------------------------------------------------------------------
42 :
43 6575 : ImplMapMode::ImplMapMode( const ImplMapMode& rImplMapMode ) :
44 : maOrigin( rImplMapMode.maOrigin ),
45 : maScaleX( rImplMapMode.maScaleX ),
46 6575 : maScaleY( rImplMapMode.maScaleY )
47 : {
48 6575 : mnRefCount = 1;
49 6575 : meUnit = rImplMapMode.meUnit;
50 6575 : mbSimple = sal_False;
51 6575 : }
52 :
53 : // -----------------------------------------------------------------------
54 :
55 2289 : SvStream& operator>>( SvStream& rIStm, ImplMapMode& rImplMapMode )
56 : {
57 2289 : VersionCompat aCompat( rIStm, STREAM_READ );
58 : sal_uInt16 nTmp16;
59 :
60 2289 : rIStm >> nTmp16; rImplMapMode.meUnit = (MapUnit) nTmp16;
61 2289 : rIStm >> rImplMapMode.maOrigin >> rImplMapMode.maScaleX >>
62 4578 : rImplMapMode.maScaleY >> rImplMapMode.mbSimple;
63 :
64 2289 : return rIStm;
65 : }
66 :
67 : // -----------------------------------------------------------------------
68 :
69 2454 : SvStream& operator<<( SvStream& rOStm, const ImplMapMode& rImplMapMode )
70 : {
71 2454 : VersionCompat aCompat( rOStm, STREAM_WRITE, 1 );
72 :
73 2454 : rOStm << (sal_uInt16) rImplMapMode.meUnit <<
74 4908 : rImplMapMode.maOrigin <<
75 4908 : rImplMapMode.maScaleX <<
76 4908 : rImplMapMode.maScaleY <<
77 4908 : rImplMapMode.mbSimple;
78 :
79 2454 : return rOStm;
80 : }
81 :
82 : // -----------------------------------------------------------------------
83 :
84 221306 : 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 221306 : if( eUnit >= MAP_LASTENUMDUMMY )
90 0 : return (ImplMapMode*)aStaticImplMapModeAry;
91 :
92 221306 : ImplMapMode* pImplMapMode = ((ImplMapMode*)aStaticImplMapModeAry)+eUnit;
93 221306 : if ( !pImplMapMode->mbSimple )
94 : {
95 86 : Fraction aDefFraction( 1, 1 );
96 86 : pImplMapMode->maScaleX = aDefFraction;
97 86 : pImplMapMode->maScaleY = aDefFraction;
98 86 : pImplMapMode->meUnit = eUnit;
99 86 : pImplMapMode->mbSimple = sal_True;
100 : }
101 :
102 221306 : return pImplMapMode;
103 : }
104 :
105 : // -----------------------------------------------------------------------
106 :
107 11987 : inline void MapMode::ImplMakeUnique()
108 : {
109 : // Falls noch andere Referenzen bestehen, dann kopieren
110 11987 : if ( mpImplMapMode->mnRefCount != 1 )
111 : {
112 6575 : if ( mpImplMapMode->mnRefCount )
113 575 : mpImplMapMode->mnRefCount--;
114 6575 : mpImplMapMode = new ImplMapMode( *mpImplMapMode );
115 : }
116 11987 : }
117 :
118 : // -----------------------------------------------------------------------
119 :
120 124442 : MapMode::MapMode()
121 : {
122 : DBG_CTOR( MapMode, NULL );
123 :
124 124442 : mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
125 124442 : }
126 :
127 : // -----------------------------------------------------------------------
128 :
129 99880 : 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 99880 : mpImplMapMode = rMapMode.mpImplMapMode;
137 : // RefCount == 0 fuer statische Objekte
138 99880 : if ( mpImplMapMode->mnRefCount )
139 26271 : mpImplMapMode->mnRefCount++;
140 99880 : }
141 :
142 : // -----------------------------------------------------------------------
143 :
144 18103 : MapMode::MapMode( MapUnit eUnit )
145 : {
146 : DBG_CTOR( MapMode, NULL );
147 :
148 18103 : mpImplMapMode = ImplMapMode::ImplGetStaticMapMode( eUnit );
149 18103 : }
150 :
151 : // -----------------------------------------------------------------------
152 :
153 2917 : MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg,
154 : const Fraction& rScaleX, const Fraction& rScaleY )
155 : {
156 : DBG_CTOR( MapMode, NULL );
157 :
158 2917 : mpImplMapMode = new ImplMapMode;
159 2917 : mpImplMapMode->meUnit = eUnit;
160 2917 : mpImplMapMode->maOrigin = rLogicOrg;
161 2917 : mpImplMapMode->maScaleX = rScaleX;
162 2917 : mpImplMapMode->maScaleY = rScaleY;
163 2917 : }
164 :
165 : // -----------------------------------------------------------------------
166 :
167 233902 : 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 233902 : if ( mpImplMapMode->mnRefCount )
174 : {
175 38796 : if ( mpImplMapMode->mnRefCount == 1 )
176 8477 : delete mpImplMapMode;
177 : else
178 30319 : mpImplMapMode->mnRefCount--;
179 : }
180 233902 : }
181 :
182 : // -----------------------------------------------------------------------
183 :
184 1185 : void MapMode::SetMapUnit( MapUnit eUnit )
185 : {
186 : DBG_CHKTHIS( MapMode, NULL );
187 :
188 1185 : ImplMakeUnique();
189 1185 : mpImplMapMode->meUnit = eUnit;
190 1185 : }
191 :
192 : // -----------------------------------------------------------------------
193 :
194 3353 : void MapMode::SetOrigin( const Point& rLogicOrg )
195 : {
196 : DBG_CHKTHIS( MapMode, NULL );
197 :
198 3353 : ImplMakeUnique();
199 3353 : mpImplMapMode->maOrigin = rLogicOrg;
200 3353 : }
201 :
202 : // -----------------------------------------------------------------------
203 :
204 2580 : void MapMode::SetScaleX( const Fraction& rScaleX )
205 : {
206 : DBG_CHKTHIS( MapMode, NULL );
207 :
208 2580 : ImplMakeUnique();
209 2580 : mpImplMapMode->maScaleX = rScaleX;
210 2580 : }
211 :
212 : // -----------------------------------------------------------------------
213 :
214 2580 : void MapMode::SetScaleY( const Fraction& rScaleY )
215 : {
216 : DBG_CHKTHIS( MapMode, NULL );
217 :
218 2580 : ImplMakeUnique();
219 2580 : mpImplMapMode->maScaleY = rScaleY;
220 2580 : }
221 :
222 : // -----------------------------------------------------------------------
223 :
224 62253 : 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 62253 : if ( rMapMode.mpImplMapMode->mnRefCount )
233 6045 : rMapMode.mpImplMapMode->mnRefCount++;
234 :
235 : // Wenn es keine statischen ImpDaten sind, dann loeschen, wenn es
236 : // die letzte Referenz ist, sonst Referenzcounter decrementieren
237 62253 : if ( mpImplMapMode->mnRefCount )
238 : {
239 1749 : if ( mpImplMapMode->mnRefCount == 1 )
240 374 : delete mpImplMapMode;
241 : else
242 1375 : mpImplMapMode->mnRefCount--;
243 : }
244 :
245 62253 : mpImplMapMode = rMapMode.mpImplMapMode;
246 :
247 62253 : return *this;
248 : }
249 :
250 : // -----------------------------------------------------------------------
251 :
252 73165 : sal_Bool MapMode::operator==( const MapMode& rMapMode ) const
253 : {
254 : DBG_CHKTHIS( MapMode, NULL );
255 : DBG_CHKOBJ( &rMapMode, MapMode, NULL );
256 :
257 73165 : if ( mpImplMapMode == rMapMode.mpImplMapMode )
258 52636 : return sal_True;
259 :
260 46340 : if ( (mpImplMapMode->meUnit == rMapMode.mpImplMapMode->meUnit) &&
261 8660 : (mpImplMapMode->maOrigin == rMapMode.mpImplMapMode->maOrigin) &&
262 8592 : (mpImplMapMode->maScaleX == rMapMode.mpImplMapMode->maScaleX) &&
263 8559 : (mpImplMapMode->maScaleY == rMapMode.mpImplMapMode->maScaleY) )
264 8559 : return sal_True;
265 : else
266 11970 : return sal_False;
267 : }
268 :
269 : // -----------------------------------------------------------------------
270 :
271 78761 : sal_Bool MapMode::IsDefault() const
272 : {
273 : DBG_CHKTHIS( MapMode, NULL );
274 :
275 78761 : ImplMapMode* pDefMapMode = ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL );
276 78761 : if ( mpImplMapMode == pDefMapMode )
277 129 : return sal_True;
278 :
279 78632 : if ( (mpImplMapMode->meUnit == pDefMapMode->meUnit) &&
280 0 : (mpImplMapMode->maOrigin == pDefMapMode->maOrigin) &&
281 0 : (mpImplMapMode->maScaleX == pDefMapMode->maScaleX) &&
282 0 : (mpImplMapMode->maScaleY == pDefMapMode->maScaleY) )
283 0 : return sal_True;
284 : else
285 78632 : return sal_False;
286 : }
287 :
288 : // -----------------------------------------------------------------------
289 :
290 2289 : SvStream& operator>>( SvStream& rIStm, MapMode& rMapMode )
291 : {
292 2289 : rMapMode.ImplMakeUnique();
293 2289 : return (rIStm >> *rMapMode.mpImplMapMode);
294 : }
295 :
296 : // -----------------------------------------------------------------------
297 :
298 2454 : SvStream& operator<<( SvStream& rOStm, const MapMode& rMapMode )
299 : {
300 2454 : return (rOStm << *rMapMode.mpImplMapMode);
301 : }
302 :
303 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|