Implement FPDFPageObj_GetLineJoin().

Add unit tests for FPDFPageObj_[GS]etLineJoin().

BUG=pdfium:1185

Change-Id: I10c6f0ad5cc06b2b0ac11c1142353e7a275fc79e
Reviewed-on: https://pdfium-review.googlesource.com/c/44515
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn
index ea44f0d..3b1a04b 100644
--- a/fpdfsdk/BUILD.gn
+++ b/fpdfsdk/BUILD.gn
@@ -95,6 +95,7 @@
   sources = [
     "fpdf_catalog_unittest.cpp",
     "fpdf_doc_unittest.cpp",
+    "fpdf_edit_unittest.cpp",
     "fpdf_editimg_unittest.cpp",
   ]
   deps = [
diff --git a/fpdfsdk/fpdf_edit_unittest.cpp b/fpdfsdk/fpdf_edit_unittest.cpp
new file mode 100644
index 0000000..7171f30
--- /dev/null
+++ b/fpdfsdk/fpdf_edit_unittest.cpp
@@ -0,0 +1,41 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "public/fpdf_edit.h"
+
+#include "core/fpdfapi/cpdf_modulemgr.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class PDFEditTest : public testing::Test {
+  void SetUp() override { CPDF_ModuleMgr::Get()->Init(); }
+
+  void TearDown() override { CPDF_ModuleMgr::Destroy(); }
+};
+
+TEST_F(PDFEditTest, LineJoin) {
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(nullptr, -1));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(nullptr, FPDF_LINEJOIN_MITER));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(nullptr, FPDF_LINEJOIN_ROUND));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(nullptr, FPDF_LINEJOIN_BEVEL));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(nullptr, 3));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(nullptr, 1000));
+
+  FPDF_PAGEOBJECT path = FPDFPageObj_CreateNewPath(0, 0);
+  EXPECT_EQ(FPDF_LINEJOIN_MITER, FPDFPageObj_GetLineJoin(path));
+
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(path, -1));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(path, 3));
+  EXPECT_FALSE(FPDFPageObj_SetLineJoin(path, 1000));
+
+  EXPECT_TRUE(FPDFPageObj_SetLineJoin(path, FPDF_LINEJOIN_BEVEL));
+  EXPECT_EQ(FPDF_LINEJOIN_BEVEL, FPDFPageObj_GetLineJoin(path));
+
+  EXPECT_TRUE(FPDFPageObj_SetLineJoin(path, FPDF_LINEJOIN_ROUND));
+  EXPECT_EQ(FPDF_LINEJOIN_ROUND, FPDFPageObj_GetLineJoin(path));
+
+  EXPECT_TRUE(FPDFPageObj_SetLineJoin(path, FPDF_LINEJOIN_MITER));
+  EXPECT_EQ(FPDF_LINEJOIN_MITER, FPDFPageObj_GetLineJoin(path));
+
+  FPDFPageObj_Destroy(path);
+}
diff --git a/fpdfsdk/fpdf_editimg_unittest.cpp b/fpdfsdk/fpdf_editimg_unittest.cpp
index fcc081a..48bd7f1 100644
--- a/fpdfsdk/fpdf_editimg_unittest.cpp
+++ b/fpdfsdk/fpdf_editimg_unittest.cpp
@@ -7,13 +7,13 @@
 #include "core/fpdfapi/cpdf_modulemgr.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-class PDFEditTest : public testing::Test {
+class PDFEditImgTest : public testing::Test {
   void SetUp() override { CPDF_ModuleMgr::Get()->Init(); }
 
   void TearDown() override { CPDF_ModuleMgr::Destroy(); }
 };
 
-TEST_F(PDFEditTest, InsertObjectWithInvalidPage) {
+TEST_F(PDFEditImgTest, InsertObjectWithInvalidPage) {
   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
   FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
   EXPECT_EQ(0, FPDFPage_CountObjects(page));
@@ -32,7 +32,7 @@
   FPDF_CloseDocument(doc);
 }
 
-TEST_F(PDFEditTest, NewImageObj) {
+TEST_F(PDFEditImgTest, NewImageObj) {
   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
   FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
   EXPECT_EQ(0, FPDFPage_CountObjects(page));
@@ -46,7 +46,7 @@
   FPDF_CloseDocument(doc);
 }
 
-TEST_F(PDFEditTest, NewImageObjGenerateContent) {
+TEST_F(PDFEditImgTest, NewImageObjGenerateContent) {
   FPDF_DOCUMENT doc = FPDF_CreateNewDocument();
   FPDF_PAGE page = FPDFPage_New(doc, 0, 100, 100);
   EXPECT_EQ(0, FPDFPage_CountObjects(page));
diff --git a/fpdfsdk/fpdf_editpage.cpp b/fpdfsdk/fpdf_editpage.cpp
index d0ff962..2776746 100644
--- a/fpdfsdk/fpdf_editpage.cpp
+++ b/fpdfsdk/fpdf_editpage.cpp
@@ -793,6 +793,12 @@
   return true;
 }
 
+FPDF_EXPORT int FPDF_CALLCONV
+FPDFPageObj_GetLineJoin(FPDF_PAGEOBJECT page_object) {
+  auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
+  return pPageObj ? pPageObj->m_GraphState.GetLineJoin() : -1;
+}
+
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFPageObj_SetLineJoin(FPDF_PAGEOBJECT page_object, int line_join) {
   auto* pPageObj = CPDFPageObjectFromFPDFPageObject(page_object);
diff --git a/fpdfsdk/fpdf_view_c_api_test.c b/fpdfsdk/fpdf_view_c_api_test.c
index 9cf0376..eb66e14 100644
--- a/fpdfsdk/fpdf_view_c_api_test.c
+++ b/fpdfsdk/fpdf_view_c_api_test.c
@@ -157,6 +157,7 @@
     CHK(FPDFPageObj_Destroy);
     CHK(FPDFPageObj_GetBounds);
     CHK(FPDFPageObj_GetFillColor);
+    CHK(FPDFPageObj_GetLineJoin);
     CHK(FPDFPageObj_GetMark);
     CHK(FPDFPageObj_GetStrokeColor);
     CHK(FPDFPageObj_GetStrokeWidth);
diff --git a/public/fpdf_edit.h b/public/fpdf_edit.h
index 180d502..4babd7e 100644
--- a/public/fpdf_edit.h
+++ b/public/fpdf_edit.h
@@ -835,6 +835,16 @@
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FPDFPageObj_GetStrokeWidth(FPDF_PAGEOBJECT page_object, float* width);
 
+// Get the line join of |page_object|.
+//
+// page_object  - handle to a page object.
+//
+// Returns the line join, or -1 on failure.
+// Line join can be one of following: FPDF_LINEJOIN_MITER, FPDF_LINEJOIN_ROUND,
+// FPDF_LINEJOIN_BEVEL
+FPDF_EXPORT int FPDF_CALLCONV
+FPDFPageObj_GetLineJoin(FPDF_PAGEOBJECT page_object);
+
 // DEPRECATED as of May 2018. This API will be removed in the future. Please
 // use FPDFPageObj_SetLineJoin instead.
 //