Coverage Report

Created: 2025-12-08 09:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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: */