1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <tools/stream.hxx>
21 #include <tools/vcompat.hxx>
22 #include <tools/debug.hxx>
23 #include <vcl/mapmod.hxx>
27 ImplMapMode::ImplMapMode() :
37 ImplMapMode::ImplMapMode( const ImplMapMode
& rImplMapMode
) :
38 maOrigin( rImplMapMode
.maOrigin
),
39 maScaleX( rImplMapMode
.maScaleX
),
40 maScaleY( rImplMapMode
.maScaleY
)
43 meUnit
= rImplMapMode
.meUnit
;
47 SvStream
& operator>>( SvStream
& rIStm
, ImplMapMode
& rImplMapMode
)
49 VersionCompat
aCompat( rIStm
, STREAM_READ
);
52 rIStm
>> nTmp16
; rImplMapMode
.meUnit
= (MapUnit
) nTmp16
;
53 rIStm
>> rImplMapMode
.maOrigin
>> rImplMapMode
.maScaleX
>>
54 rImplMapMode
.maScaleY
>> rImplMapMode
.mbSimple
;
59 SvStream
& operator<<( SvStream
& rOStm
, const ImplMapMode
& rImplMapMode
)
61 VersionCompat
aCompat( rOStm
, STREAM_WRITE
, 1 );
63 rOStm
<< (sal_uInt16
) rImplMapMode
.meUnit
<<
64 rImplMapMode
.maOrigin
<<
65 rImplMapMode
.maScaleX
<<
66 rImplMapMode
.maScaleY
<<
67 rImplMapMode
.mbSimple
;
72 ImplMapMode
* ImplMapMode::ImplGetStaticMapMode( MapUnit eUnit
)
74 static long aStaticImplMapModeAry
[(MAP_LASTENUMDUMMY
)*sizeof(ImplMapMode
)/sizeof(long)];
76 // #i19496 check for out-of-bounds
77 if( eUnit
>= MAP_LASTENUMDUMMY
)
78 return (ImplMapMode
*)aStaticImplMapModeAry
;
80 ImplMapMode
* pImplMapMode
= ((ImplMapMode
*)aStaticImplMapModeAry
)+eUnit
;
81 if ( !pImplMapMode
->mbSimple
)
83 Fraction
aDefFraction( 1, 1 );
84 pImplMapMode
->maScaleX
= aDefFraction
;
85 pImplMapMode
->maScaleY
= aDefFraction
;
86 pImplMapMode
->meUnit
= eUnit
;
87 pImplMapMode
->mbSimple
= sal_True
;
93 inline void MapMode::ImplMakeUnique()
95 // If there are other references, copy
96 if ( mpImplMapMode
->mnRefCount
!= 1 )
98 if ( mpImplMapMode
->mnRefCount
)
99 mpImplMapMode
->mnRefCount
--;
100 mpImplMapMode
= new ImplMapMode( *mpImplMapMode
);
106 DBG_CTOR( MapMode
, NULL
);
108 mpImplMapMode
= ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL
);
111 MapMode::MapMode( const MapMode
& rMapMode
)
113 DBG_CTOR( MapMode
, NULL
);
114 DBG_CHKOBJ( &rMapMode
, MapMode
, NULL
);
115 DBG_ASSERT( rMapMode
.mpImplMapMode
->mnRefCount
< 0xFFFFFFFE, "MapMode: RefCount overflow" );
117 // Take over Shared Instance Data and increment refcount
118 mpImplMapMode
= rMapMode
.mpImplMapMode
;
119 // RefCount == 0 for static objects
120 if ( mpImplMapMode
->mnRefCount
)
121 mpImplMapMode
->mnRefCount
++;
124 MapMode::MapMode( MapUnit eUnit
)
126 DBG_CTOR( MapMode
, NULL
);
128 mpImplMapMode
= ImplMapMode::ImplGetStaticMapMode( eUnit
);
131 MapMode::MapMode( MapUnit eUnit
, const Point
& rLogicOrg
,
132 const Fraction
& rScaleX
, const Fraction
& rScaleY
)
134 DBG_CTOR( MapMode
, NULL
);
136 mpImplMapMode
= new ImplMapMode
;
137 mpImplMapMode
->meUnit
= eUnit
;
138 mpImplMapMode
->maOrigin
= rLogicOrg
;
139 mpImplMapMode
->maScaleX
= rScaleX
;
140 mpImplMapMode
->maScaleY
= rScaleY
;
145 DBG_DTOR( MapMode
, NULL
);
147 // If it's not static ImpData and it's the last reference, delete it,
148 // else decrement refcounter
149 if ( mpImplMapMode
->mnRefCount
)
151 if ( mpImplMapMode
->mnRefCount
== 1 )
152 delete mpImplMapMode
;
154 mpImplMapMode
->mnRefCount
--;
158 void MapMode::SetMapUnit( MapUnit eUnit
)
160 DBG_CHKTHIS( MapMode
, NULL
);
163 mpImplMapMode
->meUnit
= eUnit
;
166 void MapMode::SetOrigin( const Point
& rLogicOrg
)
168 DBG_CHKTHIS( MapMode
, NULL
);
171 mpImplMapMode
->maOrigin
= rLogicOrg
;
174 void MapMode::SetScaleX( const Fraction
& rScaleX
)
176 DBG_CHKTHIS( MapMode
, NULL
);
179 mpImplMapMode
->maScaleX
= rScaleX
;
182 void MapMode::SetScaleY( const Fraction
& rScaleY
)
184 DBG_CHKTHIS( MapMode
, NULL
);
187 mpImplMapMode
->maScaleY
= rScaleY
;
190 MapMode
& MapMode::operator=( const MapMode
& rMapMode
)
192 DBG_CHKTHIS( MapMode
, NULL
);
193 DBG_CHKOBJ( &rMapMode
, MapMode
, NULL
);
194 DBG_ASSERT( rMapMode
.mpImplMapMode
->mnRefCount
< 0xFFFFFFFE, "MapMode: RefCount overflow" );
196 // First increment refcount so that we can reference ourselves
197 // RefCount == 0 for static objects
198 if ( rMapMode
.mpImplMapMode
->mnRefCount
)
199 rMapMode
.mpImplMapMode
->mnRefCount
++;
201 // If it's not static ImpData and it's the last reference, delete it,
202 // else decrement refcounter
203 if ( mpImplMapMode
->mnRefCount
)
205 if ( mpImplMapMode
->mnRefCount
== 1 )
206 delete mpImplMapMode
;
208 mpImplMapMode
->mnRefCount
--;
211 mpImplMapMode
= rMapMode
.mpImplMapMode
;
216 sal_Bool
MapMode::operator==( const MapMode
& rMapMode
) const
218 DBG_CHKTHIS( MapMode
, NULL
);
219 DBG_CHKOBJ( &rMapMode
, MapMode
, NULL
);
221 if ( mpImplMapMode
== rMapMode
.mpImplMapMode
)
224 if ( (mpImplMapMode
->meUnit
== rMapMode
.mpImplMapMode
->meUnit
) &&
225 (mpImplMapMode
->maOrigin
== rMapMode
.mpImplMapMode
->maOrigin
) &&
226 (mpImplMapMode
->maScaleX
== rMapMode
.mpImplMapMode
->maScaleX
) &&
227 (mpImplMapMode
->maScaleY
== rMapMode
.mpImplMapMode
->maScaleY
) )
233 sal_Bool
MapMode::IsDefault() const
235 DBG_CHKTHIS( MapMode
, NULL
);
237 ImplMapMode
* pDefMapMode
= ImplMapMode::ImplGetStaticMapMode( MAP_PIXEL
);
238 if ( mpImplMapMode
== pDefMapMode
)
241 if ( (mpImplMapMode
->meUnit
== pDefMapMode
->meUnit
) &&
242 (mpImplMapMode
->maOrigin
== pDefMapMode
->maOrigin
) &&
243 (mpImplMapMode
->maScaleX
== pDefMapMode
->maScaleX
) &&
244 (mpImplMapMode
->maScaleY
== pDefMapMode
->maScaleY
) )
250 SvStream
& operator>>( SvStream
& rIStm
, MapMode
& rMapMode
)
252 rMapMode
.ImplMakeUnique();
253 return (rIStm
>> *rMapMode
.mpImplMapMode
);
256 SvStream
& operator<<( SvStream
& rOStm
, const MapMode
& rMapMode
)
258 return (rOStm
<< *rMapMode
.mpImplMapMode
);
261 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */