Add ScopedFPDFClipPath.

Scoper to call FPDF_DestroyClipPath() for a FPDF_CLIPPATH.

Change-Id: I9781e14fcbb29087b340b2ecb0785b7bf41583c1
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/54770
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/fpdfsdk/fpdf_transformpage_embeddertest.cpp b/fpdfsdk/fpdf_transformpage_embeddertest.cpp
index bb9b620..212649c 100644
--- a/fpdfsdk/fpdf_transformpage_embeddertest.cpp
+++ b/fpdfsdk/fpdf_transformpage_embeddertest.cpp
@@ -341,18 +341,19 @@
   FPDF_PAGE page = LoadPage(0);
   ASSERT_TRUE(page);
 
-  FPDF_CLIPPATH clip = FPDF_CreateClipPath(10.0f, 10.0f, 90.0f, 90.0f);
-  EXPECT_TRUE(clip);
+  {
+    ScopedFPDFClipPath clip(FPDF_CreateClipPath(10.0f, 10.0f, 90.0f, 90.0f));
+    EXPECT_TRUE(clip);
 
-  // NULL arg call is a no-op.
-  FPDFPage_InsertClipPath(nullptr, clip);
+    // NULL arg call is a no-op.
+    FPDFPage_InsertClipPath(nullptr, clip.get());
 
-  // Do actual work.
-  FPDFPage_InsertClipPath(page, clip);
+    // Do actual work.
+    FPDFPage_InsertClipPath(page, clip.get());
 
-  // TODO(tsepez): test how inserting path affects page rendering.
+    // TODO(tsepez): test how inserting path affects page rendering.
+  }
 
-  FPDF_DestroyClipPath(clip);
   UnloadPage(page);
 }
 
diff --git a/public/cpp/fpdf_deleters.h b/public/cpp/fpdf_deleters.h
index 5cc0fb6..9a700e3 100644
--- a/public/cpp/fpdf_deleters.h
+++ b/public/cpp/fpdf_deleters.h
@@ -11,6 +11,7 @@
 #include "public/fpdf_formfill.h"
 #include "public/fpdf_structtree.h"
 #include "public/fpdf_text.h"
+#include "public/fpdf_transformpage.h"
 #include "public/fpdfview.h"
 
 // Custom deleters for using FPDF_* types with std::unique_ptr<>.
@@ -27,6 +28,12 @@
   inline void operator()(FPDF_BITMAP bitmap) { FPDFBitmap_Destroy(bitmap); }
 };
 
+struct FPDFClipPathDeleter {
+  inline void operator()(FPDF_CLIPPATH clip_path) {
+    FPDF_DestroyClipPath(clip_path);
+  }
+};
+
 struct FPDFDocumentDeleter {
   inline void operator()(FPDF_DOCUMENT doc) { FPDF_CloseDocument(doc); }
 };
diff --git a/public/cpp/fpdf_scopers.h b/public/cpp/fpdf_scopers.h
index 7d9cbc0..ebae107 100644
--- a/public/cpp/fpdf_scopers.h
+++ b/public/cpp/fpdf_scopers.h
@@ -29,6 +29,10 @@
 using ScopedFPDFBitmap =
     std::unique_ptr<std::remove_pointer<FPDF_BITMAP>::type, FPDFBitmapDeleter>;
 
+using ScopedFPDFClipPath =
+    std::unique_ptr<std::remove_pointer<FPDF_CLIPPATH>::type,
+                    FPDFClipPathDeleter>;
+
 using ScopedFPDFDocument =
     std::unique_ptr<std::remove_pointer<FPDF_DOCUMENT>::type,
                     FPDFDocumentDeleter>;