blob: 1d3673c2ae2cf2f9ac3b31a16ec23622c83cc30a [file] [log] [blame]
Nicolas Pena55e026b2017-02-07 14:59:23 -05001// Copyright 2017 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#include "public/fpdf_edit.h"
6
7#include "core/fpdfapi/page/cpdf_path.h"
8#include "core/fpdfapi/page/cpdf_pathobject.h"
9#include "core/fxcrt/fx_system.h"
10
11DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_CreateNewPath(float x, float y) {
12 CPDF_PathObject* pPathObj = new CPDF_PathObject;
13 pPathObj->m_Path.AppendPoint(x, y, FXPT_TYPE::MoveTo, false);
Nicolas Pena0fc185e2017-02-08 12:13:20 -050014 pPathObj->DefaultStates();
Nicolas Pena55e026b2017-02-07 14:59:23 -050015 return pPathObj;
16}
17
18DLLEXPORT FPDF_PAGEOBJECT STDCALL FPDFPageObj_CreateNewRect(float x,
19 float y,
20 float w,
21 float h) {
22 CPDF_PathObject* pPathObj = new CPDF_PathObject;
23 pPathObj->m_Path.AppendRect(x, y, x + w, y + h);
Nicolas Pena0fc185e2017-02-08 12:13:20 -050024 pPathObj->DefaultStates();
Nicolas Pena55e026b2017-02-07 14:59:23 -050025 return pPathObj;
26}
27
28DLLEXPORT FPDF_BOOL FPDFPath_SetStrokeColor(FPDF_PAGEOBJECT path,
29 unsigned int R,
30 unsigned int G,
31 unsigned int B,
32 unsigned int A) {
33 if (!path || R > 255 || G > 255 || B > 255 || A > 255)
34 return false;
35
36 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
37 pPathObj->m_GeneralState.SetStrokeAlpha(A / 255.f);
38 FX_FLOAT rgb[3] = {R / 255.f, G / 255.f, B / 255.f};
39 pPathObj->m_ColorState.SetStrokeColor(
40 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
41 return true;
42}
43
44DLLEXPORT FPDF_BOOL FPDFPath_SetFillColor(FPDF_PAGEOBJECT path,
45 unsigned int R,
46 unsigned int G,
47 unsigned int B,
48 unsigned int A) {
49 if (!path || R > 255 || G > 255 || B > 255 || A > 255)
50 return false;
51
52 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
53 pPathObj->m_GeneralState.SetFillAlpha(A / 255.f);
54 FX_FLOAT rgb[3] = {R / 255.f, G / 255.f, B / 255.f};
55 pPathObj->m_ColorState.SetFillColor(
56 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
57 return true;
58}
59
60DLLEXPORT FPDF_BOOL FPDFPath_MoveTo(FPDF_PAGEOBJECT path, float x, float y) {
61 if (!path)
62 return false;
63
64 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
65 pPathObj->m_Path.AppendPoint(x, y, FXPT_TYPE::MoveTo, false);
66 return true;
67}
68
69DLLEXPORT FPDF_BOOL FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y) {
70 if (!path)
71 return false;
72
73 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
74 pPathObj->m_Path.AppendPoint(x, y, FXPT_TYPE::LineTo, false);
75 return true;
76}
77
78DLLEXPORT FPDF_BOOL FPDFPath_BezierTo(FPDF_PAGEOBJECT path,
79 float x1,
80 float y1,
81 float x2,
82 float y2,
83 float x3,
84 float y3) {
85 if (!path)
86 return false;
87
88 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
89 pPathObj->m_Path.AppendPoint(x1, y1, FXPT_TYPE::BezierTo, false);
90 pPathObj->m_Path.AppendPoint(x2, y2, FXPT_TYPE::BezierTo, false);
91 pPathObj->m_Path.AppendPoint(x3, y3, FXPT_TYPE::BezierTo, false);
92 return true;
93}
94
95DLLEXPORT FPDF_BOOL FPDFPath_Close(FPDF_PAGEOBJECT path) {
96 if (!path)
97 return false;
98
99 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
100 int numPoints = pPathObj->m_Path.GetPointCount();
101 if (numPoints == 0)
102 return false;
103
104 FX_PATHPOINT* pPoints = pPathObj->m_Path.GetMutablePoints();
105 if (pPoints[numPoints - 1].m_CloseFigure)
106 return true;
107
108 pPoints[numPoints - 1].m_CloseFigure = true;
109 return true;
110}
111
112DLLEXPORT FPDF_BOOL FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path,
113 int fillmode,
114 FPDF_BOOL stroke) {
115 if (!path)
116 return false;
117
118 auto pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
119
120 if (fillmode == FPDF_FILLMODE_ALTERNATE)
121 pPathObj->m_FillType = FXFILL_ALTERNATE;
122 else if (fillmode == FPDF_FILLMODE_WINDING)
123 pPathObj->m_FillType = FXFILL_WINDING;
124 else
125 pPathObj->m_FillType = 0;
126 pPathObj->m_bStroke = stroke != 0;
127 return true;
128}