blob: 155dda5c7de2f5de8d25fa18ba0d7b89edb60db6 [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;
dan sinclairb147e072017-02-22 19:56:15 -050013 pPathObj->m_Path.AppendPoint(CFX_PointF(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
Lei Zhang375c2762017-03-10 14:37:14 -080036 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Nicolas Pena55e026b2017-02-07 14:59:23 -050037 pPathObj->m_GeneralState.SetStrokeAlpha(A / 255.f);
Dan Sinclair05df0752017-03-14 14:43:42 -040038 float rgb[3] = {R / 255.f, G / 255.f, B / 255.f};
Nicolas Pena55e026b2017-02-07 14:59:23 -050039 pPathObj->m_ColorState.SetStrokeColor(
40 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
41 return true;
42}
43
Nicolas Pena2eb1a702017-02-09 18:17:33 -050044DLLEXPORT FPDF_BOOL FPDFPath_SetStrokeWidth(FPDF_PAGEOBJECT path, float width) {
45 if (!path || width < 0.0f)
46 return false;
47
Lei Zhang375c2762017-03-10 14:37:14 -080048 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Nicolas Pena2eb1a702017-02-09 18:17:33 -050049 pPathObj->m_GraphState.SetLineWidth(width);
50 return true;
51}
52
Nicolas Pena55e026b2017-02-07 14:59:23 -050053DLLEXPORT FPDF_BOOL FPDFPath_SetFillColor(FPDF_PAGEOBJECT path,
54 unsigned int R,
55 unsigned int G,
56 unsigned int B,
57 unsigned int A) {
58 if (!path || R > 255 || G > 255 || B > 255 || A > 255)
59 return false;
60
Lei Zhang375c2762017-03-10 14:37:14 -080061 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Nicolas Pena55e026b2017-02-07 14:59:23 -050062 pPathObj->m_GeneralState.SetFillAlpha(A / 255.f);
Dan Sinclair05df0752017-03-14 14:43:42 -040063 float rgb[3] = {R / 255.f, G / 255.f, B / 255.f};
Nicolas Pena55e026b2017-02-07 14:59:23 -050064 pPathObj->m_ColorState.SetFillColor(
65 CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb, 3);
66 return true;
67}
68
Miklos Vajnaed4705b2017-04-05 09:24:50 +020069DLLEXPORT FPDF_BOOL FPDFPath_GetFillColor(FPDF_PAGEOBJECT path,
70 unsigned int* R,
71 unsigned int* G,
72 unsigned int* B,
73 unsigned int* A) {
74 if (!path || !R || !G || !B || !A)
75 return false;
76
77 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
78 uint32_t fillRGB = pPathObj->m_ColorState.GetFillRGB();
79 *R = FXSYS_GetRValue(fillRGB);
80 *G = FXSYS_GetGValue(fillRGB);
81 *B = FXSYS_GetBValue(fillRGB);
82 *A = static_cast<unsigned int>(pPathObj->m_GeneralState.GetFillAlpha() *
83 255.f);
84 return true;
85}
86
Nicolas Pena55e026b2017-02-07 14:59:23 -050087DLLEXPORT FPDF_BOOL FPDFPath_MoveTo(FPDF_PAGEOBJECT path, float x, float y) {
88 if (!path)
89 return false;
90
Lei Zhang375c2762017-03-10 14:37:14 -080091 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
dan sinclairb147e072017-02-22 19:56:15 -050092 pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::MoveTo, false);
Nicolas Pena55e026b2017-02-07 14:59:23 -050093 return true;
94}
95
96DLLEXPORT FPDF_BOOL FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y) {
97 if (!path)
98 return false;
99
Lei Zhang375c2762017-03-10 14:37:14 -0800100 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
dan sinclairb147e072017-02-22 19:56:15 -0500101 pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::LineTo, false);
Nicolas Pena55e026b2017-02-07 14:59:23 -0500102 return true;
103}
104
105DLLEXPORT FPDF_BOOL FPDFPath_BezierTo(FPDF_PAGEOBJECT path,
106 float x1,
107 float y1,
108 float x2,
109 float y2,
110 float x3,
111 float y3) {
112 if (!path)
113 return false;
114
Lei Zhang375c2762017-03-10 14:37:14 -0800115 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
dan sinclairb147e072017-02-22 19:56:15 -0500116 pPathObj->m_Path.AppendPoint(CFX_PointF(x1, y1), FXPT_TYPE::BezierTo, false);
117 pPathObj->m_Path.AppendPoint(CFX_PointF(x2, y2), FXPT_TYPE::BezierTo, false);
118 pPathObj->m_Path.AppendPoint(CFX_PointF(x3, y3), FXPT_TYPE::BezierTo, false);
Nicolas Pena55e026b2017-02-07 14:59:23 -0500119 return true;
120}
121
122DLLEXPORT FPDF_BOOL FPDFPath_Close(FPDF_PAGEOBJECT path) {
123 if (!path)
124 return false;
125
Lei Zhang375c2762017-03-10 14:37:14 -0800126 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Dan Sinclaire4602322017-02-15 11:07:32 -0500127 if (pPathObj->m_Path.GetPoints().empty())
Nicolas Pena55e026b2017-02-07 14:59:23 -0500128 return false;
129
Dan Sinclaire4602322017-02-15 11:07:32 -0500130 pPathObj->m_Path.ClosePath();
Nicolas Pena55e026b2017-02-07 14:59:23 -0500131 return true;
132}
133
134DLLEXPORT FPDF_BOOL FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path,
135 int fillmode,
136 FPDF_BOOL stroke) {
137 if (!path)
138 return false;
139
Lei Zhang375c2762017-03-10 14:37:14 -0800140 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Nicolas Pena55e026b2017-02-07 14:59:23 -0500141
142 if (fillmode == FPDF_FILLMODE_ALTERNATE)
143 pPathObj->m_FillType = FXFILL_ALTERNATE;
144 else if (fillmode == FPDF_FILLMODE_WINDING)
145 pPathObj->m_FillType = FXFILL_WINDING;
146 else
147 pPathObj->m_FillType = 0;
148 pPathObj->m_bStroke = stroke != 0;
149 return true;
150}