blob: f085ed34818ebe6c55be05673164be1327bc2bf4 [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
69DLLEXPORT FPDF_BOOL FPDFPath_MoveTo(FPDF_PAGEOBJECT path, float x, float y) {
70 if (!path)
71 return false;
72
Lei Zhang375c2762017-03-10 14:37:14 -080073 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
dan sinclairb147e072017-02-22 19:56:15 -050074 pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::MoveTo, false);
Nicolas Pena55e026b2017-02-07 14:59:23 -050075 return true;
76}
77
78DLLEXPORT FPDF_BOOL FPDFPath_LineTo(FPDF_PAGEOBJECT path, float x, float y) {
79 if (!path)
80 return false;
81
Lei Zhang375c2762017-03-10 14:37:14 -080082 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
dan sinclairb147e072017-02-22 19:56:15 -050083 pPathObj->m_Path.AppendPoint(CFX_PointF(x, y), FXPT_TYPE::LineTo, false);
Nicolas Pena55e026b2017-02-07 14:59:23 -050084 return true;
85}
86
87DLLEXPORT FPDF_BOOL FPDFPath_BezierTo(FPDF_PAGEOBJECT path,
88 float x1,
89 float y1,
90 float x2,
91 float y2,
92 float x3,
93 float y3) {
94 if (!path)
95 return false;
96
Lei Zhang375c2762017-03-10 14:37:14 -080097 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
dan sinclairb147e072017-02-22 19:56:15 -050098 pPathObj->m_Path.AppendPoint(CFX_PointF(x1, y1), FXPT_TYPE::BezierTo, false);
99 pPathObj->m_Path.AppendPoint(CFX_PointF(x2, y2), FXPT_TYPE::BezierTo, false);
100 pPathObj->m_Path.AppendPoint(CFX_PointF(x3, y3), FXPT_TYPE::BezierTo, false);
Nicolas Pena55e026b2017-02-07 14:59:23 -0500101 return true;
102}
103
104DLLEXPORT FPDF_BOOL FPDFPath_Close(FPDF_PAGEOBJECT path) {
105 if (!path)
106 return false;
107
Lei Zhang375c2762017-03-10 14:37:14 -0800108 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Dan Sinclaire4602322017-02-15 11:07:32 -0500109 if (pPathObj->m_Path.GetPoints().empty())
Nicolas Pena55e026b2017-02-07 14:59:23 -0500110 return false;
111
Dan Sinclaire4602322017-02-15 11:07:32 -0500112 pPathObj->m_Path.ClosePath();
Nicolas Pena55e026b2017-02-07 14:59:23 -0500113 return true;
114}
115
116DLLEXPORT FPDF_BOOL FPDFPath_SetDrawMode(FPDF_PAGEOBJECT path,
117 int fillmode,
118 FPDF_BOOL stroke) {
119 if (!path)
120 return false;
121
Lei Zhang375c2762017-03-10 14:37:14 -0800122 auto* pPathObj = reinterpret_cast<CPDF_PathObject*>(path);
Nicolas Pena55e026b2017-02-07 14:59:23 -0500123
124 if (fillmode == FPDF_FILLMODE_ALTERNATE)
125 pPathObj->m_FillType = FXFILL_ALTERNATE;
126 else if (fillmode == FPDF_FILLMODE_WINDING)
127 pPathObj->m_FillType = FXFILL_WINDING;
128 else
129 pPathObj->m_FillType = 0;
130 pPathObj->m_bStroke = stroke != 0;
131 return true;
132}