npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 1 | // Copyright 2016 PDFium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
| 6 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 7 | #ifndef CORE_FXGE_CFX_PATH_H_ |
| 8 | #define CORE_FXGE_CFX_PATH_H_ |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 9 | |
Tom Sepez | 1e7fd16 | 2021-07-27 20:44:31 +0000 | [diff] [blame] | 10 | #include <stdint.h> |
| 11 | |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 12 | #include <vector> |
| 13 | |
dsinclair | a52ab74 | 2016-09-29 13:59:29 -0700 | [diff] [blame] | 14 | #include "core/fxcrt/fx_coordinates.h" |
Lei Zhang | 87d2021 | 2019-06-20 22:32:10 +0000 | [diff] [blame] | 15 | #include "core/fxcrt/retain_ptr.h" |
Lei Zhang | 455cf86 | 2021-10-08 01:01:50 +0000 | [diff] [blame] | 16 | #include "third_party/abseil-cpp/absl/types/optional.h" |
Lei Zhang | 87d2021 | 2019-06-20 22:32:10 +0000 | [diff] [blame] | 17 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 18 | class CFX_Path { |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 19 | public: |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 20 | class Point { |
| 21 | public: |
Lei Zhang | 9b4b8df | 2021-06-12 06:38:48 +0000 | [diff] [blame] | 22 | enum class Type : uint8_t { kLine, kBezier, kMove }; |
| 23 | |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 24 | Point(); |
Lei Zhang | 9b4b8df | 2021-06-12 06:38:48 +0000 | [diff] [blame] | 25 | Point(const CFX_PointF& point, Type type, bool close); |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 26 | Point(const Point& other); |
| 27 | ~Point(); |
| 28 | |
Lei Zhang | 9b4b8df | 2021-06-12 06:38:48 +0000 | [diff] [blame] | 29 | bool IsTypeAndOpen(Type type) const { |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 30 | return m_Type == type && !m_CloseFigure; |
| 31 | } |
| 32 | |
| 33 | CFX_PointF m_Point; |
Lei Zhang | 9b4b8df | 2021-06-12 06:38:48 +0000 | [diff] [blame] | 34 | Type m_Type; |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 35 | bool m_CloseFigure; |
| 36 | }; |
| 37 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 38 | CFX_Path(); |
| 39 | CFX_Path(const CFX_Path& src); |
| 40 | CFX_Path(CFX_Path&& src) noexcept; |
| 41 | ~CFX_Path(); |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 42 | |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 43 | void Clear(); |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 44 | |
Tom Sepez | 690f389 | 2021-12-21 01:44:08 +0000 | [diff] [blame] | 45 | Point::Type GetType(size_t index) const { return m_Points[index].m_Type; } |
| 46 | bool IsClosingFigure(size_t index) const { |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 47 | return m_Points[index].m_CloseFigure; |
| 48 | } |
Tom Sepez | 690f389 | 2021-12-21 01:44:08 +0000 | [diff] [blame] | 49 | CFX_PointF GetPoint(size_t index) const { return m_Points[index].m_Point; } |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 50 | const std::vector<Point>& GetPoints() const { return m_Points; } |
| 51 | std::vector<Point>& GetPoints() { return m_Points; } |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 52 | |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 53 | CFX_FloatRect GetBoundingBox() const; |
Lei Zhang | ced8cbe | 2021-05-25 03:18:13 +0000 | [diff] [blame] | 54 | CFX_FloatRect GetBoundingBoxForStrokePath(float line_width, |
| 55 | float miter_limit) const; |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 56 | |
Tom Sepez | 23078b5 | 2018-12-20 18:07:53 +0000 | [diff] [blame] | 57 | void Transform(const CFX_Matrix& matrix); |
tsepez | 12f3e4a | 2016-11-02 15:17:29 -0700 | [diff] [blame] | 58 | bool IsRect() const; |
Lei Zhang | 2c49530 | 2021-10-07 23:13:30 +0000 | [diff] [blame] | 59 | absl::optional<CFX_FloatRect> GetRect(const CFX_Matrix* matrix) const; |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 60 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 61 | void Append(const CFX_Path& src, const CFX_Matrix* matrix); |
Lei Zhang | 5b79f16 | 2019-09-19 13:19:05 +0000 | [diff] [blame] | 62 | void AppendFloatRect(const CFX_FloatRect& rect); |
Dan Sinclair | 05df075 | 2017-03-14 14:43:42 -0400 | [diff] [blame] | 63 | void AppendRect(float left, float bottom, float right, float top); |
Dan Sinclair | 7ffb59f | 2017-08-10 10:16:06 -0400 | [diff] [blame] | 64 | void AppendLine(const CFX_PointF& pt1, const CFX_PointF& pt2); |
Lei Zhang | 9b4b8df | 2021-06-12 06:38:48 +0000 | [diff] [blame] | 65 | void AppendPoint(const CFX_PointF& point, Point::Type type); |
| 66 | void AppendPointAndClose(const CFX_PointF& point, Point::Type type); |
Dan Sinclair | e460232 | 2017-02-15 11:07:32 -0500 | [diff] [blame] | 67 | void ClosePath(); |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 68 | |
| 69 | private: |
Lei Zhang | 92bc692 | 2021-06-12 02:45:37 +0000 | [diff] [blame] | 70 | std::vector<Point> m_Points; |
npm | 660de3c | 2016-08-08 08:18:29 -0700 | [diff] [blame] | 71 | }; |
| 72 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 73 | class CFX_RetainablePath final : public Retainable, public CFX_Path { |
Tom Sepez | ca4a5ff | 2019-01-29 00:06:20 +0000 | [diff] [blame] | 74 | public: |
Tom Sepez | b9d9b61 | 2020-06-17 20:47:22 +0000 | [diff] [blame] | 75 | CONSTRUCT_VIA_MAKE_RETAIN; |
Tom Sepez | ca4a5ff | 2019-01-29 00:06:20 +0000 | [diff] [blame] | 76 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 77 | RetainPtr<CFX_RetainablePath> Clone() const; |
Tom Sepez | d26eeec | 2019-06-21 18:47:02 +0000 | [diff] [blame] | 78 | |
Tom Sepez | ca4a5ff | 2019-01-29 00:06:20 +0000 | [diff] [blame] | 79 | private: |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 80 | CFX_RetainablePath(); |
| 81 | CFX_RetainablePath(const CFX_RetainablePath& src); |
| 82 | ~CFX_RetainablePath() override; |
Tom Sepez | ca4a5ff | 2019-01-29 00:06:20 +0000 | [diff] [blame] | 83 | }; |
| 84 | |
Lei Zhang | 3686576 | 2021-06-12 01:07:37 +0000 | [diff] [blame] | 85 | #endif // CORE_FXGE_CFX_PATH_H_ |