summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--BUILD.gn1
-rw-r--r--core/fpdfapi/fpdf_page/cpdf_path.cpp73
-rw-r--r--core/fpdfapi/fpdf_page/fpdf_page_parser.cpp7
-rw-r--r--core/fpdfapi/fpdf_page/include/cpdf_path.h58
-rw-r--r--core/fpdfapi/fpdf_render/fpdf_render_text.cpp6
-rw-r--r--fpdfsdk/fpdf_transformpage.cpp6
-rw-r--r--fpdfsdk/fxedit/fxet_edit.cpp4
7 files changed, 117 insertions, 38 deletions
diff --git a/BUILD.gn b/BUILD.gn
index 44040a9251..2f4ea34130 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -442,6 +442,7 @@ static_library("fpdfapi") {
"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 0000000000..6fcc7d3ec3
--- /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 cf77de15a4..83e66eae61 100644
--- a/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
+++ b/core/fpdfapi/fpdf_page/fpdf_page_parser.cpp
@@ -1459,7 +1459,7 @@ void CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke) {
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 @@ void CPDF_StreamContentParser::AddPathObject(int FillType, FX_BOOL bStroke) {
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 e0ffa8c1dd..a9b0a7fac0 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);
- }
-
- 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 AppendRect(FX_FLOAT left,
- FX_FLOAT bottom,
- FX_FLOAT right,
- FX_FLOAT top) {
- GetPrivateCopy()->AppendRect(left, bottom, right, top);
- }
+ CPDF_Path();
+ CPDF_Path(const CPDF_Path& that);
+ ~CPDF_Path();
+
+ void Emplace() { m_Ref.Emplace(); }
+ operator bool() const { return !!m_Ref; }
+
+ 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 74997027ca..7bfed906ea 100644
--- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
+++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp
@@ -618,8 +618,8 @@ void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj,
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 @@ void CPDF_RenderStatus::DrawTextPathWithPattern(const CPDF_TextObject* textobj,
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 712080a9de..f76cc2be8c 100644
--- a/fpdfsdk/fpdf_transformpage.cpp
+++ b/fpdfsdk/fpdf_transformpage.cpp
@@ -219,11 +219,11 @@ DLLEXPORT FPDF_CLIPPATH STDCALL FPDF_CreateClipPath(float left,
float bottom,
float right,
float top) {
- CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath();
- pNewClipPath->GetPrivateCopy();
CPDF_Path Path;
- Path.GetPrivateCopy();
Path.AppendRect(left, bottom, right, top);
+
+ CPDF_ClipPath* pNewClipPath = new CPDF_ClipPath();
+ pNewClipPath->GetPrivateCopy();
pNewClipPath->AppendPath(Path, FXFILL_ALTERNATE, FALSE);
return pNewClipPath;
}
diff --git a/fpdfsdk/fxedit/fxet_edit.cpp b/fpdfsdk/fxedit/fxet_edit.cpp
index 098ef7f10b..7d207a83ca 100644
--- a/fpdfsdk/fxedit/fxet_edit.cpp
+++ b/fpdfsdk/fxedit/fxet_edit.cpp
@@ -137,8 +137,8 @@ void AddRectToPageObjects(CPDF_PageObjectHolder* pObjectHolder,
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;