From df1298a228abb59eb167d0be43d46a50c0333497 Mon Sep 17 00:00:00 2001 From: Nicolas Pena Date: Tue, 8 May 2018 22:22:41 +0000 Subject: Add several FPDFPageObj_* APIs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL adds the following APIs: FPDFPageObj_SetStrokeColor FPDFPageObj_GetStrokeColor FPDFPageObj_SetStrokeWidth FPDFPageObj_SetLineJoin FPDFPageObj_SetLineCap FPDFPageObj_SetFillColor FPDFPageObj_GetFillColor Bug: pdfium:980 Change-Id: I19f9abb6756314ba8bd2f66a6c38e2e722cd8473 Reviewed-on: https://pdfium-review.googlesource.com/32192 Reviewed-by: Lei Zhang Commit-Queue: Nicolás Peña Moreno --- fpdfsdk/cpdfsdk_helpers.h | 7 --- fpdfsdk/fpdf_editpage.cpp | 103 +++++++++++++++++++++++++++++++++++++++++ fpdfsdk/fpdf_view_c_api_test.c | 7 +++ 3 files changed, 110 insertions(+), 7 deletions(-) (limited to 'fpdfsdk') 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(alpha * 255.f + 0.5f); +} + } // namespace FPDF_EXPORT FPDF_DOCUMENT FPDF_CALLCONV FPDF_CreateNewDocument() { @@ -504,6 +508,24 @@ FPDF_BOOL FPDFPageObj_SetFillColor(FPDF_PAGEOBJECT page_object, return true; } +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, @@ -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 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(CFX_GraphStateData::LineJoin::LineJoinMiter) || + line_join > + static_cast(CFX_GraphStateData::LineJoin::LineJoinBevel)) { + return false; + } + auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object); + CFX_GraphStateData::LineJoin lineJoin = + static_cast(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(CFX_GraphStateData::LineCap::LineCapButt) || + line_cap > static_cast(CFX_GraphStateData::LineCap::LineCapSquare)) { + return false; + } + auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object); + CFX_GraphStateData::LineCap lineCap = + static_cast(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); -- cgit v1.2.3