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