blob: 892a3394693ae0a5554874860ce61059a9986dd7 [file] [log] [blame]
Dan Sinclair811b8a42016-03-17 08:59:42 -04001// 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
7#include "xfa/fxgraphics/cfx_path.h"
8
npm660de3c2016-08-08 08:18:29 -07009#include "core/fxge/include/cfx_pathdata.h"
Dan Sinclair811b8a42016-03-17 08:59:42 -040010#include "xfa/fxgraphics/cfx_path_generator.h"
11
12CFX_Path::CFX_Path() {
13 m_generator = nullptr;
14}
15
dsinclairc777f482016-05-04 17:57:03 -070016FWL_Error CFX_Path::Create() {
Dan Sinclair811b8a42016-03-17 08:59:42 -040017 if (m_generator)
dsinclairc777f482016-05-04 17:57:03 -070018 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040019
20 m_generator = new CFX_PathGenerator;
21 m_generator->Create();
dsinclairc777f482016-05-04 17:57:03 -070022 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040023}
24
25CFX_Path::~CFX_Path() {
26 delete m_generator;
27}
28
dsinclairc777f482016-05-04 17:57:03 -070029FWL_Error CFX_Path::MoveTo(FX_FLOAT x, FX_FLOAT y) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040030 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070031 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040032 m_generator->MoveTo(x, y);
dsinclairc777f482016-05-04 17:57:03 -070033 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040034}
35
dsinclairc777f482016-05-04 17:57:03 -070036FWL_Error CFX_Path::LineTo(FX_FLOAT x, FX_FLOAT y) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040037 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070038 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040039 m_generator->LineTo(x, y);
dsinclairc777f482016-05-04 17:57:03 -070040 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040041}
42
dsinclairc777f482016-05-04 17:57:03 -070043FWL_Error CFX_Path::BezierTo(FX_FLOAT ctrlX1,
44 FX_FLOAT ctrlY1,
45 FX_FLOAT ctrlX2,
46 FX_FLOAT ctrlY2,
47 FX_FLOAT toX,
48 FX_FLOAT toY) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040049 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070050 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040051 m_generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY);
dsinclairc777f482016-05-04 17:57:03 -070052 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040053}
54
dsinclairc777f482016-05-04 17:57:03 -070055FWL_Error CFX_Path::ArcTo(FX_FLOAT left,
56 FX_FLOAT top,
57 FX_FLOAT width,
58 FX_FLOAT height,
59 FX_FLOAT startAngle,
60 FX_FLOAT sweepAngle) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040061 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070062 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040063 m_generator->ArcTo(left + width / 2, top + height / 2, width / 2, height / 2,
64 startAngle, sweepAngle);
dsinclairc777f482016-05-04 17:57:03 -070065 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040066}
67
dsinclairc777f482016-05-04 17:57:03 -070068FWL_Error CFX_Path::Close() {
Dan Sinclair811b8a42016-03-17 08:59:42 -040069 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070070 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040071 m_generator->Close();
dsinclairc777f482016-05-04 17:57:03 -070072 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040073}
74
dsinclairc777f482016-05-04 17:57:03 -070075FWL_Error CFX_Path::AddLine(FX_FLOAT x1,
76 FX_FLOAT y1,
77 FX_FLOAT x2,
78 FX_FLOAT y2) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040079 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070080 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040081 m_generator->AddLine(x1, y1, x2, y2);
dsinclairc777f482016-05-04 17:57:03 -070082 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040083}
84
dsinclairc777f482016-05-04 17:57:03 -070085FWL_Error CFX_Path::AddBezier(FX_FLOAT startX,
86 FX_FLOAT startY,
87 FX_FLOAT ctrlX1,
88 FX_FLOAT ctrlY1,
89 FX_FLOAT ctrlX2,
90 FX_FLOAT ctrlY2,
91 FX_FLOAT endX,
92 FX_FLOAT endY) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040093 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070094 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040095 m_generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX,
96 endY);
dsinclairc777f482016-05-04 17:57:03 -070097 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040098}
99
dsinclairc777f482016-05-04 17:57:03 -0700100FWL_Error CFX_Path::AddRectangle(FX_FLOAT left,
101 FX_FLOAT top,
102 FX_FLOAT width,
103 FX_FLOAT height) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400104 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700105 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400106 m_generator->AddRectangle(left, top, left + width, top + height);
dsinclairc777f482016-05-04 17:57:03 -0700107 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400108}
109
dsinclairc777f482016-05-04 17:57:03 -0700110FWL_Error CFX_Path::AddEllipse(FX_FLOAT left,
111 FX_FLOAT top,
112 FX_FLOAT width,
113 FX_FLOAT height) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400114 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700115 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400116 m_generator->AddEllipse(left + width / 2, top + height / 2, width / 2,
117 height / 2);
dsinclairc777f482016-05-04 17:57:03 -0700118 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400119}
120
dsinclairc777f482016-05-04 17:57:03 -0700121FWL_Error CFX_Path::AddEllipse(const CFX_RectF& rect) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400122 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700123 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400124 m_generator->AddEllipse(rect.left + rect.Width() / 2,
125 rect.top + rect.Height() / 2, rect.Width() / 2,
126 rect.Height() / 2);
dsinclairc777f482016-05-04 17:57:03 -0700127 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400128}
129
dsinclairc777f482016-05-04 17:57:03 -0700130FWL_Error CFX_Path::AddArc(FX_FLOAT left,
131 FX_FLOAT top,
132 FX_FLOAT width,
133 FX_FLOAT height,
134 FX_FLOAT startAngle,
135 FX_FLOAT sweepAngle) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400136 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700137 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400138 m_generator->AddArc(left + width / 2, top + height / 2, width / 2, height / 2,
139 startAngle, sweepAngle);
dsinclairc777f482016-05-04 17:57:03 -0700140 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400141}
142
dsinclairc777f482016-05-04 17:57:03 -0700143FWL_Error CFX_Path::AddPie(FX_FLOAT left,
144 FX_FLOAT top,
145 FX_FLOAT width,
146 FX_FLOAT height,
147 FX_FLOAT startAngle,
148 FX_FLOAT sweepAngle) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400149 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700150 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400151 m_generator->AddPie(left + width / 2, top + height / 2, width / 2, height / 2,
152 startAngle, sweepAngle);
dsinclairc777f482016-05-04 17:57:03 -0700153 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400154}
155
dsinclairc777f482016-05-04 17:57:03 -0700156FWL_Error CFX_Path::AddSubpath(CFX_Path* path) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400157 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700158 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400159 m_generator->AddPathData(path->GetPathData());
dsinclairc777f482016-05-04 17:57:03 -0700160 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400161}
162
dsinclairc777f482016-05-04 17:57:03 -0700163FWL_Error CFX_Path::Clear() {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400164 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700165 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400166 m_generator->GetPathData()->SetPointCount(0);
dsinclairc777f482016-05-04 17:57:03 -0700167 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400168}
169
170FX_BOOL CFX_Path::IsEmpty() {
171 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700172 return FALSE;
173 if (m_generator->GetPathData()->GetPointCount() == 0)
Dan Sinclair811b8a42016-03-17 08:59:42 -0400174 return TRUE;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400175 return FALSE;
176}
177
178CFX_PathData* CFX_Path::GetPathData() {
179 if (!m_generator)
180 return nullptr;
181 return m_generator->GetPathData();
182}