/src/libwpg/src/lib/WPGDashArray.cpp
Line | Count | Source |
1 | | /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ |
2 | | /* libwpg |
3 | | * Version: MPL 2.0 / LGPLv2.1+ |
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 | | * Major Contributor(s): |
10 | | * Copyright (C) 2006 Ariya Hidayat (ariya@kde.org) |
11 | | * |
12 | | * For minor contributions see the git repository. |
13 | | * |
14 | | * Alternatively, the contents of this file may be used under the terms |
15 | | * of the GNU Lesser General Public License Version 2.1 or later |
16 | | * (LGPLv2.1+), in which case the provisions of the LGPLv2.1+ are |
17 | | * applicable instead of those above. |
18 | | * |
19 | | * For further information visit http://libwpg.sourceforge.net |
20 | | */ |
21 | | |
22 | | /* "This product is not manufactured, approved, or supported by |
23 | | * Corel Corporation or Corel Corporation Limited." |
24 | | */ |
25 | | |
26 | | #include "WPGDashArray.h" |
27 | | |
28 | | #include <vector> |
29 | | |
30 | | namespace libwpg |
31 | | { |
32 | | class WPGDashArrayPrivate |
33 | | { |
34 | | public: |
35 | 496k | WPGDashArrayPrivate() : dashes(), dots1(0), dots2(0), |
36 | 496k | dots1len(0.0), dots2len(0.0), gap(0.0) {} |
37 | | void _recalculateDots(); |
38 | | std::vector<double> dashes; |
39 | | int dots1; |
40 | | int dots2; |
41 | | double dots1len; |
42 | | double dots2len; |
43 | | double gap; |
44 | | }; |
45 | | } |
46 | | |
47 | | void libwpg::WPGDashArrayPrivate::_recalculateDots() |
48 | 2.82M | { |
49 | 2.82M | dots1 = dots2 = 0, |
50 | 2.82M | dots1len = dots2len = gap = 0.0; |
51 | | |
52 | 2.82M | if (dashes.size() >= 2) |
53 | 2.04M | { |
54 | 2.04M | dots1len = dashes[0]; |
55 | 2.04M | gap = dashes[1]; |
56 | 2.04M | } |
57 | | |
58 | 2.82M | auto count = unsigned(dashes.size() / 2); |
59 | 2.82M | unsigned i = 0; |
60 | 7.17M | for (; i < count;) |
61 | 5.75M | { |
62 | 5.75M | if (dots1len <= dashes[2*i] && dots1len >= dashes[2*i]) |
63 | 4.34M | dots1++; |
64 | 1.40M | else |
65 | 1.40M | break; |
66 | 4.34M | gap = gap < dashes[2*i+1] ? dashes[2*i+1] : gap; |
67 | 4.34M | i++; |
68 | 4.34M | } |
69 | 2.82M | if (i < count) |
70 | 1.40M | { |
71 | 1.40M | dots2len = dashes[2*i]; |
72 | 1.40M | gap = gap < dashes[2*i+1] ? dashes[2*i+1] : gap; |
73 | 1.40M | } |
74 | 4.65M | for (; i < count;) |
75 | 2.90M | { |
76 | 2.90M | if (dots2len <= dashes[2*i] && dots2len >= dashes[2*i]) |
77 | 1.83M | dots2++; |
78 | 1.07M | else |
79 | 1.07M | break; |
80 | 1.83M | gap = gap < dashes[2*i+1] ? dashes[2*i+1] : gap; |
81 | 1.83M | i++; |
82 | 1.83M | } |
83 | 2.82M | if (!dots2) |
84 | 1.42M | { |
85 | 1.42M | dots2 = dots1; |
86 | 1.42M | dots2len = dots1len; |
87 | 1.42M | } |
88 | 2.82M | } |
89 | | |
90 | | |
91 | 496k | libwpg::WPGDashArray::WPGDashArray() : d(new libwpg::WPGDashArrayPrivate()) |
92 | 496k | { |
93 | 496k | d->_recalculateDots(); |
94 | 496k | } |
95 | | |
96 | | libwpg::WPGDashArray::~WPGDashArray() |
97 | 496k | { |
98 | 496k | } |
99 | | |
100 | | libwpg::WPGDashArray::WPGDashArray(const libwpg::WPGDashArray &dash): |
101 | 0 | d(new libwpg::WPGDashArrayPrivate()) |
102 | 0 | { |
103 | 0 | d->dashes = dash.d->dashes; |
104 | 0 | d->_recalculateDots(); |
105 | 0 | } |
106 | | |
107 | | libwpg::WPGDashArray &libwpg::WPGDashArray::operator=(const libwpg::WPGDashArray &dash) |
108 | 300k | { |
109 | 300k | if (this != &dash) |
110 | 300k | { |
111 | 300k | d->dashes = dash.d->dashes; |
112 | 300k | d->_recalculateDots(); |
113 | 300k | } |
114 | 300k | return *this; |
115 | 300k | } |
116 | | |
117 | | int libwpg::WPGDashArray::getDots1() const |
118 | 74.8k | { |
119 | 74.8k | return d->dots1; |
120 | 74.8k | } |
121 | | |
122 | | double libwpg::WPGDashArray::getDots1Length() const |
123 | 38.2k | { |
124 | 38.2k | return d->dots1len; |
125 | 38.2k | } |
126 | | |
127 | | int libwpg::WPGDashArray::getDots2() const |
128 | 51.7k | { |
129 | 51.7k | return d->dots2; |
130 | 51.7k | } |
131 | | |
132 | | double libwpg::WPGDashArray::getDots2Length() const |
133 | 38.2k | { |
134 | 38.2k | return d->dots2len; |
135 | 38.2k | } |
136 | | |
137 | | double libwpg::WPGDashArray::getDistance() const |
138 | 38.2k | { |
139 | 38.2k | return d->gap; |
140 | 38.2k | } |
141 | | |
142 | | void libwpg::WPGDashArray::add(double p) |
143 | 2.02M | { |
144 | 2.02M | d->dashes.push_back(p); |
145 | 2.02M | d->_recalculateDots(); |
146 | 2.02M | } |
147 | | /* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */ |