/src/libreoffice/vcl/source/gdi/mapmod.cxx
Line | Count | Source |
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 <vcl/mapmod.hxx> |
21 | | |
22 | | #include <o3tl/hash_combine.hxx> |
23 | | #include <tools/gen.hxx> |
24 | | #include <tools/fract.hxx> |
25 | | #include <tools/stream.hxx> |
26 | | #include <tools/vcompat.hxx> |
27 | | #include <vcl/TypeSerializer.hxx> |
28 | | |
29 | | struct MapMode::ImplMapMode |
30 | | { |
31 | | MapUnit meUnit; |
32 | | bool mbSimple; |
33 | | Point maOrigin; |
34 | | // NOTE: these Fraction must NOT have more than 32 bits precision |
35 | | // because ReadFraction / WriteFraction do only 32 bits, so more than |
36 | | // that cannot be stored in MetaFiles! |
37 | | // => call ReduceInaccurate whenever setting these |
38 | | Fraction maScaleX; |
39 | | Fraction maScaleY; |
40 | | |
41 | | ImplMapMode(); |
42 | | ImplMapMode(MapUnit eMapUnit); |
43 | | ImplMapMode(const ImplMapMode& rImpMapMode); |
44 | | |
45 | | bool operator==( const ImplMapMode& rImpMapMode ) const; |
46 | | }; |
47 | | |
48 | | MapMode::ImplMapMode::ImplMapMode() : |
49 | 559k | maOrigin( 0, 0 ), |
50 | 559k | maScaleX( 1, 1 ), |
51 | 559k | maScaleY( 1, 1 ) |
52 | 559k | { |
53 | 559k | meUnit = MapUnit::MapPixel; |
54 | 559k | mbSimple = true; |
55 | 559k | } |
56 | | |
57 | | MapMode::ImplMapMode::ImplMapMode(MapUnit eMapUnit) : |
58 | 588 | maOrigin( 0, 0 ), |
59 | 588 | maScaleX( 1, 1 ), |
60 | 588 | maScaleY( 1, 1 ) |
61 | 588 | { |
62 | 588 | meUnit = eMapUnit; |
63 | 588 | mbSimple = true; |
64 | 588 | } |
65 | | |
66 | 531k | MapMode::ImplMapMode::ImplMapMode( const ImplMapMode& ) = default; |
67 | | |
68 | | bool MapMode::ImplMapMode::operator==( const ImplMapMode& rImpMapMode ) const |
69 | 7.52M | { |
70 | 7.52M | return meUnit == rImpMapMode.meUnit |
71 | 1.79M | && maOrigin == rImpMapMode.maOrigin |
72 | 1.51M | && maScaleX == rImpMapMode.maScaleX |
73 | 1.51M | && maScaleY == rImpMapMode.maScaleY; |
74 | 7.52M | } |
75 | | |
76 | | namespace |
77 | | { |
78 | | |
79 | | MapMode::ImplType& GetGlobalDefault() |
80 | 28.7M | { |
81 | 28.7M | static MapMode::ImplType gDefault; |
82 | 28.7M | return gDefault; |
83 | 28.7M | } |
84 | | MapMode::ImplType GetUnitDefault(MapUnit mapUnit) |
85 | 12.5M | { |
86 | 12.5M | static const MapMode::ImplType defaults[] |
87 | 12.5M | { |
88 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map100thMM) ), |
89 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map10thMM) ), |
90 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapMM) ), |
91 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapCM) ), |
92 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map1000thInch) ), |
93 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map100thInch) ), |
94 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::Map10thInch) ), |
95 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapInch) ), |
96 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapPoint) ), |
97 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapTwip) ), |
98 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapPixel) ), |
99 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapSysFont) ), |
100 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapAppFont) ), |
101 | 12.5M | MapMode::ImplType( MapMode::ImplMapMode(MapUnit::MapRelative) ), |
102 | 12.5M | }; |
103 | 12.5M | if (mapUnit <= MapUnit::MapRelative) { |
104 | 12.5M | return MapMode::ImplType(defaults[static_cast<int>(mapUnit)]); // [-loplugin:redundantfcast] false positive |
105 | 12.5M | } |
106 | | // sometimes the SvmReader stuff will generate a bogus mapunit value |
107 | 0 | return MapMode::ImplType(MapMode::ImplMapMode(mapUnit)); |
108 | 12.5M | } |
109 | | } |
110 | | |
111 | 17.7M | MapMode::MapMode() : mpImplMapMode(GetGlobalDefault()) |
112 | 17.7M | { |
113 | 17.7M | } |
114 | | |
115 | 45.0M | MapMode::MapMode( const MapMode& ) = default; |
116 | | |
117 | 12.5M | MapMode::MapMode( MapUnit eUnit ) : mpImplMapMode(GetUnitDefault(eUnit)) |
118 | 12.5M | { |
119 | 12.5M | } |
120 | | |
121 | | MapMode::MapMode( MapUnit eUnit, const Point& rLogicOrg, |
122 | | const Fraction& rScaleX, const Fraction& rScaleY ) |
123 | 559k | { |
124 | 559k | mpImplMapMode->meUnit = eUnit; |
125 | 559k | mpImplMapMode->maOrigin = rLogicOrg; |
126 | 559k | mpImplMapMode->maScaleX = rScaleX; |
127 | 559k | mpImplMapMode->maScaleY = rScaleY; |
128 | 559k | mpImplMapMode->mbSimple = false; |
129 | 559k | } |
130 | | |
131 | 75.8M | MapMode::~MapMode() = default; |
132 | | |
133 | | void MapMode::SetMapUnit( MapUnit eUnit ) |
134 | 377k | { |
135 | 377k | mpImplMapMode->meUnit = eUnit; |
136 | 377k | } |
137 | | |
138 | | void MapMode::SetOrigin( const Point& rLogicOrg ) |
139 | 169k | { |
140 | 169k | mpImplMapMode->maOrigin = rLogicOrg; |
141 | 169k | mpImplMapMode->mbSimple = false; |
142 | 169k | } |
143 | | |
144 | | void MapMode::SetScaleX( const Fraction& rScaleX ) |
145 | 22.2k | { |
146 | 22.2k | mpImplMapMode->maScaleX = rScaleX; |
147 | 22.2k | mpImplMapMode->mbSimple = false; |
148 | 22.2k | } |
149 | | |
150 | | void MapMode::SetScaleY( const Fraction& rScaleY ) |
151 | 22.2k | { |
152 | 22.2k | mpImplMapMode->maScaleY = rScaleY; |
153 | 22.2k | mpImplMapMode->mbSimple = false; |
154 | 22.2k | } |
155 | | |
156 | 12.7M | MapMode& MapMode::operator=( const MapMode& ) = default; |
157 | | |
158 | 1.73M | MapMode& MapMode::operator=( MapMode&& ) = default; |
159 | | |
160 | | bool MapMode::operator==( const MapMode& rMapMode ) const |
161 | 29.4M | { |
162 | 29.4M | return mpImplMapMode == rMapMode.mpImplMapMode; |
163 | 29.4M | } |
164 | | |
165 | | bool MapMode::IsDefault() const |
166 | 10.9M | { |
167 | 10.9M | return mpImplMapMode.same_object(GetGlobalDefault()); |
168 | 10.9M | } |
169 | | |
170 | | size_t MapMode::GetHashValue() const |
171 | 13.0M | { |
172 | 13.0M | size_t hash = 0; |
173 | 13.0M | o3tl::hash_combine( hash, mpImplMapMode->meUnit ); |
174 | 13.0M | o3tl::hash_combine( hash, mpImplMapMode->maOrigin.GetHashValue()); |
175 | 13.0M | o3tl::hash_combine( hash, mpImplMapMode->maScaleX.GetHashValue()); |
176 | 13.0M | o3tl::hash_combine( hash, mpImplMapMode->maScaleY.GetHashValue()); |
177 | 13.0M | o3tl::hash_combine( hash, mpImplMapMode->mbSimple ); |
178 | 13.0M | return hash; |
179 | 13.0M | } |
180 | | |
181 | 57.6M | MapUnit MapMode::GetMapUnit() const { return mpImplMapMode->meUnit; } |
182 | | |
183 | 13.3M | const Point& MapMode::GetOrigin() const { return mpImplMapMode->maOrigin; } |
184 | | |
185 | 14.0M | const Fraction& MapMode::GetScaleX() const { return mpImplMapMode->maScaleX; } |
186 | | |
187 | 14.0M | const Fraction& MapMode::GetScaleY() const { return mpImplMapMode->maScaleY; } |
188 | | |
189 | 2.53M | bool MapMode::IsSimple() const { return mpImplMapMode->mbSimple; } |
190 | | |
191 | | /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |