summaryrefslogtreecommitdiff
path: root/fpdfsdk
diff options
context:
space:
mode:
Diffstat (limited to 'fpdfsdk')
-rw-r--r--fpdfsdk/cpdfsdk_helpers.h7
-rw-r--r--fpdfsdk/fpdf_editpage.cpp103
-rw-r--r--fpdfsdk/fpdf_view_c_api_test.c7
3 files changed, 110 insertions, 7 deletions
diff --git a/fpdfsdk/cpdfsdk_helpers.h b/fpdfsdk/cpdfsdk_helpers.h
index 214fa72ab1..d93ecfc89b 100644
--- a/fpdfsdk/cpdfsdk_helpers.h
+++ b/fpdfsdk/cpdfsdk_helpers.h
@@ -262,11 +262,4 @@ int GetLastError();
void ProcessParseError(CPDF_Parser::Error err);
-// TODO(dsinclair): This seems like it should be a public API?
-FPDF_BOOL FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object,
- unsigned int R,
- unsigned int G,
- unsigned int B,
- unsigned int A);
-
#endif // FPDFSDK_CPDFSDK_HELPERS_H_
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index ce597d6d6e..ec29891fdf 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -120,6 +120,10 @@ GetMarkParamPairAtIndex(FPDF_PAGEOBJECTMARK mark, unsigned long index) {
return nullptr;
}
+unsigned int GetUnsignedAlpha(float alpha) {
+ return static_cast<unsigned int>(alpha * 255.f + 0.5f);
+}
+
} // namespace
FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_CreateNewDocument() {
@@ -505,6 +509,24 @@ FPDF_BOOL FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object,
}
FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_GetFillColor(FPDF_PAGEOBJECT page_object,
+ unsigned int* R,
+ unsigned int* G,
+ unsigned int* B,
+ unsigned int* A) {
+ auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ if (!pPageObj || !R || !G || !B || !A)
+ return false;
+
+ FX_COLORREF fillColor = pPageObj->m_ColorState.GetFillColorRef();
+ *R = FXSYS_GetRValue(fillColor);
+ *G = FXSYS_GetGValue(fillColor);
+ *B = FXSYS_GetBValue(fillColor);
+ *A = GetUnsignedAlpha(pPageObj->m_GeneralState.GetFillAlpha());
+ return true;
+}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
float* left,
float* bottom,
@@ -521,3 +543,84 @@ FPDFPageObj_GetBounds(FPDF_PAGEOBJECT pageObject,
*top = bbox.top;
return true;
}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_SetStrokeColor(FPDF_PAGEOBJECT page_object,
+ unsigned int R,
+ unsigned int G,
+ unsigned int B,
+ unsigned int A) {
+ auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ if (!pPageObj || R > 255 || G > 255 || B > 255 || A > 255)
+ return false;
+
+ std::vector<float> rgb = {R / 255.f, G / 255.f, B / 255.f};
+ pPageObj->m_GeneralState.SetStrokeAlpha(A / 255.f);
+ pPageObj->m_ColorState.SetStrokeColor(
+ CPDF_ColorSpace::GetStockCS(PDFCS_DEVICERGB), rgb);
+ pPageObj->SetDirty(true);
+ return true;
+}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_GetStrokeColor(FPDF_PAGEOBJECT page_object,
+ unsigned int* R,
+ unsigned int* G,
+ unsigned int* B,
+ unsigned int* A) {
+ auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ if (!pPageObj || !R || !G || !B || !A)
+ return false;
+
+ FX_COLORREF strokeColor = pPageObj->m_ColorState.GetStrokeColorRef();
+ *R = FXSYS_GetRValue(strokeColor);
+ *G = FXSYS_GetGValue(strokeColor);
+ *B = FXSYS_GetBValue(strokeColor);
+ *A = GetUnsignedAlpha(pPageObj->m_GeneralState.GetStrokeAlpha());
+ return true;
+}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_SetStrokeWidth(FPDF_PAGEOBJECT page_object, float width) {
+ auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ if (!pPageObj || width < 0.0f)
+ return false;
+
+ pPageObj->m_GraphState.SetLineWidth(width);
+ pPageObj->SetDirty(true);
+ return true;
+}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_SetLineJoin(FPDF_PAGEOBJECT page_object, int line_join) {
+ if (!page_object)
+ return false;
+ if (line_join <
+ static_cast<int>(CFX_GraphStateData::LineJoin::LineJoinMiter) ||
+ line_join >
+ static_cast<int>(CFX_GraphStateData::LineJoin::LineJoinBevel)) {
+ return false;
+ }
+ auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ CFX_GraphStateData::LineJoin lineJoin =
+ static_cast<CFX_GraphStateData::LineJoin>(line_join);
+ pPageObj->m_GraphState.SetLineJoin(lineJoin);
+ pPageObj->SetDirty(true);
+ return true;
+}
+
+FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
+FPDFPageObj_SetLineCap(FPDF_PAGEOBJECT page_object, int line_cap) {
+ if (!page_object)
+ return false;
+ if (line_cap < static_cast<int>(CFX_GraphStateData::LineCap::LineCapButt) ||
+ line_cap > static_cast<int>(CFX_GraphStateData::LineCap::LineCapSquare)) {
+ return false;
+ }
+ auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+ CFX_GraphStateData::LineCap lineCap =
+ static_cast<CFX_GraphStateData::LineCap>(line_cap);
+ pPageObj->m_GraphState.SetLineCap(lineCap);
+ pPageObj->SetDirty(true);
+ return true;
+}
diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c
index 782d35d702..15d893d77c 100644
--- a/fpdfsdk/fpdf_view_c_api_test.c
+++ b/fpdfsdk/fpdf_view_c_api_test.c
@@ -166,10 +166,15 @@ int CheckPDFiumCApi() {
CHK(FPDFPageObj_CreateNewPath);
CHK(FPDFPageObj_CreateNewRect);
CHK(FPDFPath_SetStrokeColor);
+ CHK(FPDFPageObj_SetStrokeColor);
CHK(FPDFPath_GetStrokeColor);
+ CHK(FPDFPageObj_GetStrokeColor);
CHK(FPDFPath_SetStrokeWidth);
+ CHK(FPDFPageObj_SetStrokeWidth);
CHK(FPDFPath_SetFillColor);
+ CHK(FPDFPageObj_SetFillColor);
CHK(FPDFPath_GetFillColor);
+ CHK(FPDFPageObj_GetFillColor);
CHK(FPDFPath_CountSegments);
CHK(FPDFPath_GetPathSegment);
CHK(FPDFPathSegment_GetPoint);
@@ -181,7 +186,9 @@ int CheckPDFiumCApi() {
CHK(FPDFPath_Close);
CHK(FPDFPath_SetDrawMode);
CHK(FPDFPath_SetLineCap);
+ CHK(FPDFPageObj_SetLineCap);
CHK(FPDFPath_SetLineJoin);
+ CHK(FPDFPageObj_SetLineJoin);
CHK(FPDFPageObj_NewTextObj);
CHK(FPDFText_SetText);
CHK(FPDFText_SetFillColor);