Make CPDF_Path have a CFX_Path rather than inheriting

Review-Url: https://codereview.chromium.org/2305103002
diff --git a/BUILD.gn b/BUILD.gn
index 44040a9..2f4ea34 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -442,6 +442,7 @@
     "core/fpdfapi/fpdf_page/cpdf_pageobjectholder.cpp",
     "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.cpp",
     "core/fpdfapi/fpdf_page/cpdf_pageobjectlist.h",
+    "core/fpdfapi/fpdf_page/cpdf_path.cpp",
     "core/fpdfapi/fpdf_page/cpdf_pathobject.cpp",
     "core/fpdfapi/fpdf_page/cpdf_pattern.cpp",
     "core/fpdfapi/fpdf_page/cpdf_pattern.h",
diff --git a/core/fpdfapi/fpdf_page/cpdf_path.cpp b/core/fpdfapi/fpdf_page/cpdf_path.cpp
new file mode 100644
index 0000000..6fcc7d3
--- /dev/null
+++ b/core/fpdfapi/fpdf_page/cpdf_path.cpp
@@ -0,0 +1,73 @@
+// Copyright 2016 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.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "core/fpdfapi/fpdf_page/include/cpdf_path.h"
+
+CPDF_Path::CPDF_Path() {}
+
+CPDF_Path::CPDF_Path(const CPDF_Path& that) : m_Ref(that.m_Ref) {}
+
+CPDF_Path::~CPDF_Path() {}
+
+int CPDF_Path::GetPointCount() const {
+  return m_Ref.GetObject()->GetPointCount();
+}
+
+void CPDF_Path::SetPointCount(int count) {
+  m_Ref.GetPrivateCopy()->SetPointCount(count);
+}
+
+const FX_PATHPOINT* CPDF_Path::GetPoints() const {
+  return m_Ref.GetObject()->GetPoints();
+}
+
+FX_PATHPOINT* CPDF_Path::GetMutablePoints() {
+  return m_Ref.GetPrivateCopy()->GetPoints();
+}
+
+int CPDF_Path::GetFlag(int index) const {
+  return m_Ref.GetObject()->GetFlag(index);
+}
+
+FX_FLOAT CPDF_Path::GetPointX(int index) const {
+  return m_Ref.GetObject()->GetPointX(index);
+}
+
+FX_FLOAT CPDF_Path::GetPointY(int index) const {
+  return m_Ref.GetObject()->GetPointY(index);
+}
+
+CFX_FloatRect CPDF_Path::GetBoundingBox() const {
+  return m_Ref.GetObject()->GetBoundingBox();
+}
+
+CFX_FloatRect CPDF_Path::GetBoundingBox(FX_FLOAT line_width,
+                                        FX_FLOAT miter_limit) const {
+  return m_Ref.GetObject()->GetBoundingBox(line_width, miter_limit);
+}
+
+FX_BOOL CPDF_Path::IsRect() const {
+  return m_Ref.GetObject()->IsRect();
+}
+
+void CPDF_Path::Transform(const CFX_Matrix* pMatrix) {
+  m_Ref.GetPrivateCopy()->Transform(pMatrix);
+}
+
+void CPDF_Path::Append(const CPDF_Path& other, const CFX_Matrix* pMatrix) {
+  m_Ref.GetPrivateCopy()->Append(other.GetObject(), pMatrix);
+}
+
+void CPDF_Path::Append(const CFX_PathData* pData, const CFX_Matrix* pMatrix) {
+  m_Ref.GetPrivateCopy()->Append(pData, pMatrix);
+}
+
+void CPDF_Path::AppendRect(FX_FLOAT left,
+                           FX_FLOAT bottom,
+                           FX_FLOAT right,
+                           FX_FLOAT top) {
+  m_Ref.GetPrivateCopy()->AppendRect(left, bottom, right, top);
+}
diff --git a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
index cf77de1..83e66ea 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -1459,7 +1459,7 @@
   if (PathPointCount <= 1) {
     if (PathPointCount && PathClipType) {
       CPDF_Path path;
-      path.Emplace()->AppendRect(0, 0, 0, 0);
+      path.AppendRect(0, 0, 0, 0);
       m_pCurStates->m_ClipPath.AppendPath(path, FXFILL_WINDING, TRUE);
     }
     return;
@@ -1469,9 +1469,8 @@
     PathPointCount--;
   }
   CPDF_Path Path;
-  CFX_PathData* pPathData = Path.Emplace();
-  pPathData->SetPointCount(PathPointCount);
-  FXSYS_memcpy(pPathData->GetPoints(), m_pPathPoints,
+  Path.SetPointCount(PathPointCount);
+  FXSYS_memcpy(Path.GetMutablePoints(), m_pPathPoints,
                sizeof(FX_PATHPOINT) * PathPointCount);
   CFX_Matrix matrix = m_pCurStates->m_CTM;
   matrix.Concat(m_mtContentToUser);
diff --git a/core/fpdfapi/fpdf_page/include/cpdf_path.h b/core/fpdfapi/fpdf_page/include/cpdf_path.h
index e0ffa8c..a9b0a7f 100644
--- a/core/fpdfapi/fpdf_page/include/cpdf_path.h
+++ b/core/fpdfapi/fpdf_page/include/cpdf_path.h
@@ -7,38 +7,44 @@
 #ifndef CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PATH_H_
 #define CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PATH_H_
 
+#include "core/fxcrt/include/cfx_count_ref.h"
 #include "core/fxcrt/include/fx_system.h"
 #include "core/fxge/include/cfx_fxgedevice.h"
 #include "core/fxge/include/cfx_pathdata.h"
 #include "core/fxge/include/cfx_renderdevice.h"
 
-class CPDF_Path : public CFX_CountRef<CFX_PathData> {
+class CPDF_Path {
  public:
-  int GetPointCount() const { return GetObject()->GetPointCount(); }
-  int GetFlag(int index) const { return GetObject()->GetFlag(index); }
-  FX_FLOAT GetPointX(int index) const { return GetObject()->GetPointX(index); }
-  FX_FLOAT GetPointY(int index) const { return GetObject()->GetPointY(index); }
-  FX_PATHPOINT* GetPoints() const { return GetObject()->GetPoints(); }
-  CFX_FloatRect GetBoundingBox() const { return GetObject()->GetBoundingBox(); }
-  CFX_FloatRect GetBoundingBox(FX_FLOAT line_width,
-                               FX_FLOAT miter_limit) const {
-    return GetObject()->GetBoundingBox(line_width, miter_limit);
-  }
+  CPDF_Path();
+  CPDF_Path(const CPDF_Path& that);
+  ~CPDF_Path();
 
-  FX_BOOL IsRect() const { return GetObject()->IsRect(); }
-  void Transform(const CFX_Matrix* pMatrix) {
-    GetPrivateCopy()->Transform(pMatrix);
-  }
-  void Append(const CPDF_Path& other, const CFX_Matrix* pMatrix) {
-    GetPrivateCopy()->Append(other.GetObject(), pMatrix);
-  }
+  void Emplace() { m_Ref.Emplace(); }
+  operator bool() const { return !!m_Ref; }
 
-  void AppendRect(FX_FLOAT left,
-                  FX_FLOAT bottom,
-                  FX_FLOAT right,
-                  FX_FLOAT top) {
-    GetPrivateCopy()->AppendRect(left, bottom, right, top);
-  }
+  int GetPointCount() const;
+  void SetPointCount(int count);
+  const FX_PATHPOINT* GetPoints() const;
+  FX_PATHPOINT* GetMutablePoints();
+
+  int GetFlag(int index) const;
+  FX_FLOAT GetPointX(int index) const;
+  FX_FLOAT GetPointY(int index) const;
+  CFX_FloatRect GetBoundingBox() const;
+  CFX_FloatRect GetBoundingBox(FX_FLOAT line_width, FX_FLOAT miter_limit) const;
+
+  FX_BOOL IsRect() const;
+  void Transform(const CFX_Matrix* pMatrix);
+
+  void Append(const CPDF_Path& other, const CFX_Matrix* pMatrix);
+  void Append(const CFX_PathData* pData, const CFX_Matrix* pMatrix);
+  void AppendRect(FX_FLOAT left, FX_FLOAT bottom, FX_FLOAT right, FX_FLOAT top);
+
+  // TODO(tsepez): Remove when all access thru this class.
+  const CFX_PathData* GetObject() const { return m_Ref.GetObject(); }
+
+ private:
+  CFX_CountRef<CFX_PathData> m_Ref;
 };
 
 #endif  // CORE_FPDFAPI_FPDF_PAGE_INCLUDE_CPDF_PATH_H_
diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
index 7499702..7bfed90 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -618,8 +618,8 @@
     path.m_FillType = FXFILL_WINDING;
     path.m_ClipPath.AppendTexts(&pCopy);
     path.m_ColorState = textobj->m_ColorState;
-    path.m_Path.Emplace()->AppendRect(textobj->m_Left, textobj->m_Bottom,
-                                      textobj->m_Right, textobj->m_Top);
+    path.m_Path.AppendRect(textobj->m_Left, textobj->m_Bottom, textobj->m_Right,
+                           textobj->m_Top);
     path.m_Left = textobj->m_Left;
     path.m_Bottom = textobj->m_Bottom;
     path.m_Right = textobj->m_Right;
@@ -665,7 +665,7 @@
                  charpos.m_AdjustMatrix[2], charpos.m_AdjustMatrix[3], 0, 0);
     matrix.Concat(font_size, 0, 0, font_size, charpos.m_OriginX,
                   charpos.m_OriginY);
-    path.m_Path.Emplace()->Append(pPath, &matrix);
+    path.m_Path.Append(pPath, &matrix);
     path.m_Matrix = *pTextMatrix;
     path.m_bStroke = bStroke;
     path.m_FillType = bFill ? FXFILL_WINDING : 0;
diff --git a/fpdfsdk/fpdf_transformpage.cpp b/fpdfsdk/fpdf_transformpage.cpp
index 712080a..f76cc2b 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -219,11 +219,11 @@
                                                     float bottom,
                                                     float right,
                                                     float top) {
+  CPDF_Path Path;
+  Path.AppendRect(left, bottom, right, top);
+
   CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath();
   pNewClipPath->GetPrivateCopy();
-  CPDF_Path Path;
-  Path.GetPrivateCopy();
-  Path.AppendRect(left, bottom, right, top);
   pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE);
   return pNewClipPath;
 }
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index 098ef7f..7d207a8 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -137,8 +137,8 @@
                           FX_COLORREF crFill,
                           const CFX_FloatRect& rcFill) {
   std::unique_ptr<CPDF_PathObject> pPathObj(new CPDF_PathObject);
-  CFX_PathData* pPathData = pPathObj->m_Path.GetPrivateCopy();
-  pPathData->AppendRect(rcFill.left, rcFill.bottom, rcFill.right, rcFill.top);
+  pPathObj->m_Path.AppendRect(rcFill.left, rcFill.bottom, rcFill.right,
+                              rcFill.top);
 
   FX_FLOAT rgb[3];
   rgb[0] = FXARGB_R(crFill) / 255.0f;