blob: fe956d3fcc3e8a938c449778871d8854d0f57f18 [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
9#include "xfa/fxgraphics/cfx_path_generator.h"
10
11CFX_Path::CFX_Path() {
12 m_generator = nullptr;
13}
14
dsinclairc777f482016-05-04 17:57:03 -070015FWL_Error CFX_Path::Create() {
Dan Sinclair811b8a42016-03-17 08:59:42 -040016 if (m_generator)
dsinclairc777f482016-05-04 17:57:03 -070017 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040018
19 m_generator = new CFX_PathGenerator;
20 m_generator->Create();
dsinclairc777f482016-05-04 17:57:03 -070021 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040022}
23
24CFX_Path::~CFX_Path() {
25 delete m_generator;
26}
27
dsinclairc777f482016-05-04 17:57:03 -070028FWL_Error CFX_Path::MoveTo(FX_FLOAT x, FX_FLOAT y) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040029 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070030 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040031 m_generator->MoveTo(x, y);
dsinclairc777f482016-05-04 17:57:03 -070032 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040033}
34
dsinclairc777f482016-05-04 17:57:03 -070035FWL_Error CFX_Path::LineTo(FX_FLOAT x, FX_FLOAT y) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040036 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070037 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040038 m_generator->LineTo(x, y);
dsinclairc777f482016-05-04 17:57:03 -070039 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040040}
41
dsinclairc777f482016-05-04 17:57:03 -070042FWL_Error CFX_Path::BezierTo(FX_FLOAT ctrlX1,
43 FX_FLOAT ctrlY1,
44 FX_FLOAT ctrlX2,
45 FX_FLOAT ctrlY2,
46 FX_FLOAT toX,
47 FX_FLOAT toY) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040048 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070049 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040050 m_generator->BezierTo(ctrlX1, ctrlY1, ctrlX2, ctrlY2, toX, toY);
dsinclairc777f482016-05-04 17:57:03 -070051 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040052}
53
dsinclairc777f482016-05-04 17:57:03 -070054FWL_Error CFX_Path::ArcTo(FX_FLOAT left,
55 FX_FLOAT top,
56 FX_FLOAT width,
57 FX_FLOAT height,
58 FX_FLOAT startAngle,
59 FX_FLOAT sweepAngle) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040060 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070061 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040062 m_generator->ArcTo(left + width / 2, top + height / 2, width / 2, height / 2,
63 startAngle, sweepAngle);
dsinclairc777f482016-05-04 17:57:03 -070064 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040065}
66
dsinclairc777f482016-05-04 17:57:03 -070067FWL_Error CFX_Path::Close() {
Dan Sinclair811b8a42016-03-17 08:59:42 -040068 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070069 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040070 m_generator->Close();
dsinclairc777f482016-05-04 17:57:03 -070071 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040072}
73
dsinclairc777f482016-05-04 17:57:03 -070074FWL_Error CFX_Path::AddLine(FX_FLOAT x1,
75 FX_FLOAT y1,
76 FX_FLOAT x2,
77 FX_FLOAT y2) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040078 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070079 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040080 m_generator->AddLine(x1, y1, x2, y2);
dsinclairc777f482016-05-04 17:57:03 -070081 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040082}
83
dsinclairc777f482016-05-04 17:57:03 -070084FWL_Error CFX_Path::AddBezier(FX_FLOAT startX,
85 FX_FLOAT startY,
86 FX_FLOAT ctrlX1,
87 FX_FLOAT ctrlY1,
88 FX_FLOAT ctrlX2,
89 FX_FLOAT ctrlY2,
90 FX_FLOAT endX,
91 FX_FLOAT endY) {
Dan Sinclair811b8a42016-03-17 08:59:42 -040092 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -070093 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -040094 m_generator->AddBezier(startX, startY, ctrlX1, ctrlY1, ctrlX2, ctrlY2, endX,
95 endY);
dsinclairc777f482016-05-04 17:57:03 -070096 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -040097}
98
dsinclairc777f482016-05-04 17:57:03 -070099FWL_Error CFX_Path::AddRectangle(FX_FLOAT left,
100 FX_FLOAT top,
101 FX_FLOAT width,
102 FX_FLOAT height) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400103 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700104 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400105 m_generator->AddRectangle(left, top, left + width, top + height);
dsinclairc777f482016-05-04 17:57:03 -0700106 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400107}
108
dsinclairc777f482016-05-04 17:57:03 -0700109FWL_Error CFX_Path::AddEllipse(FX_FLOAT left,
110 FX_FLOAT top,
111 FX_FLOAT width,
112 FX_FLOAT height) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400113 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700114 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400115 m_generator->AddEllipse(left + width / 2, top + height / 2, width / 2,
116 height / 2);
dsinclairc777f482016-05-04 17:57:03 -0700117 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400118}
119
dsinclairc777f482016-05-04 17:57:03 -0700120FWL_Error CFX_Path::AddEllipse(const CFX_RectF& rect) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400121 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700122 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400123 m_generator->AddEllipse(rect.left + rect.Width() / 2,
124 rect.top + rect.Height() / 2, rect.Width() / 2,
125 rect.Height() / 2);
dsinclairc777f482016-05-04 17:57:03 -0700126 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400127}
128
dsinclairc777f482016-05-04 17:57:03 -0700129FWL_Error CFX_Path::AddArc(FX_FLOAT left,
130 FX_FLOAT top,
131 FX_FLOAT width,
132 FX_FLOAT height,
133 FX_FLOAT startAngle,
134 FX_FLOAT sweepAngle) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400135 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700136 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400137 m_generator->AddArc(left + width / 2, top + height / 2, width / 2, height / 2,
138 startAngle, sweepAngle);
dsinclairc777f482016-05-04 17:57:03 -0700139 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400140}
141
dsinclairc777f482016-05-04 17:57:03 -0700142FWL_Error CFX_Path::AddPie(FX_FLOAT left,
143 FX_FLOAT top,
144 FX_FLOAT width,
145 FX_FLOAT height,
146 FX_FLOAT startAngle,
147 FX_FLOAT sweepAngle) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400148 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700149 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400150 m_generator->AddPie(left + width / 2, top + height / 2, width / 2, height / 2,
151 startAngle, sweepAngle);
dsinclairc777f482016-05-04 17:57:03 -0700152 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400153}
154
dsinclairc777f482016-05-04 17:57:03 -0700155FWL_Error CFX_Path::AddSubpath(CFX_Path* path) {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400156 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700157 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400158 m_generator->AddPathData(path->GetPathData());
dsinclairc777f482016-05-04 17:57:03 -0700159 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400160}
161
dsinclairc777f482016-05-04 17:57:03 -0700162FWL_Error CFX_Path::Clear() {
Dan Sinclair811b8a42016-03-17 08:59:42 -0400163 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700164 return FWL_Error::PropertyInvalid;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400165 m_generator->GetPathData()->SetPointCount(0);
dsinclairc777f482016-05-04 17:57:03 -0700166 return FWL_Error::Succeeded;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400167}
168
169FX_BOOL CFX_Path::IsEmpty() {
170 if (!m_generator)
dsinclairc777f482016-05-04 17:57:03 -0700171 return FALSE;
172 if (m_generator->GetPathData()->GetPointCount() == 0)
Dan Sinclair811b8a42016-03-17 08:59:42 -0400173 return TRUE;
Dan Sinclair811b8a42016-03-17 08:59:42 -0400174 return FALSE;
175}
176
177CFX_PathData* CFX_Path::GetPathData() {
178 if (!m_generator)
179 return nullptr;
180 return m_generator->GetPathData();
181}