Change-Id: Ieb32e5e6103261fadbf4287d4e6f82353414caac
for (auto &i : m_points) {
i = m.map(i);
}
for (auto &i : m_points) {
i = m.map(i);
}
}
float VPath::VPathData::length() const
{
}
float VPath::VPathData::length() const
{
+ if (!mLengthDirty) return mLength;
+
+ mLengthDirty = false;
+ mLength = 0.0;
+
int i = 0;
for (auto e : m_elements) {
switch (e) {
int i = 0;
for (auto e : m_elements) {
switch (e) {
i++;
break;
case VPath::Element::LineTo: {
i++;
break;
case VPath::Element::LineTo: {
- len += VLine( m_points[i-1], m_points[i]).length();
+ mLength += VLine( m_points[i-1], m_points[i]).length();
i++;
break;
}
case VPath::Element::CubicTo: {
i++;
break;
}
case VPath::Element::CubicTo: {
- len += VBezier::fromPoints(m_points[i-1], m_points[i],
+ mLength += VBezier::fromPoints(m_points[i-1], m_points[i],
m_points[i+1], m_points[i+2]).length();
i += 3;
break;
m_points[i+1], m_points[i+2]).length();
i += 3;
break;
}
void VPath::VPathData::checkNewSegment()
}
void VPath::VPathData::checkNewSegment()
m_elements.emplace_back(VPath::Element::MoveTo);
m_points.emplace_back(x,y);
m_segments++;
m_elements.emplace_back(VPath::Element::MoveTo);
m_points.emplace_back(x,y);
m_segments++;
}
void VPath::VPathData::lineTo(float x, float y)
}
void VPath::VPathData::lineTo(float x, float y)
checkNewSegment();
m_elements.emplace_back(VPath::Element::LineTo);
m_points.emplace_back(x,y);
checkNewSegment();
m_elements.emplace_back(VPath::Element::LineTo);
m_points.emplace_back(x,y);
}
void VPath::VPathData::cubicTo(float cx1, float cy1, float cx2, float cy2,
}
void VPath::VPathData::cubicTo(float cx1, float cy1, float cx2, float cy2,
m_points.emplace_back(cx1, cy1);
m_points.emplace_back(cx2, cy2);
m_points.emplace_back(ex, ey);
m_points.emplace_back(cx1, cy1);
m_points.emplace_back(cx2, cy2);
m_points.emplace_back(ex, ey);
}
void VPath::VPathData::close()
}
void VPath::VPathData::close()
}
m_elements.push_back(VPath::Element::Close);
mNewSegment = true;
}
m_elements.push_back(VPath::Element::Close);
mNewSegment = true;
}
void VPath::VPathData::reset()
}
void VPath::VPathData::reset()
m_elements.clear();
m_points.clear();
m_segments = 0;
m_elements.clear();
m_points.clear();
m_segments = 0;
+ mLength = 0;
+ mLengthDirty = false;
}
int VPath::VPathData::segments() const
}
int VPath::VPathData::segments() const
std::copy(path.m_elements.begin(), path.m_elements.end(), back_inserter(m_elements));
m_segments += segment;
std::copy(path.m_elements.begin(), path.m_elements.end(), back_inserter(m_elements));
m_segments += segment;
std::vector<VPath::Element> m_elements;
int m_segments;
VPointF mStartPoint;
std::vector<VPath::Element> m_elements;
int m_segments;
VPointF mStartPoint;
+ mutable float mLength{0};
+ mutable bool mLengthDirty{true};