From fc1d16f76f173b8437edc93dde8f9f82abb51298 Mon Sep 17 00:00:00 2001 From: tsepez Date: Fri, 2 Sep 2016 15:45:22 -0700 Subject: Make CPDF_Path have a CFX_Path rather than inheriting Review-Url: https://codereview.chromium.org/2305103002 --- BUILD.gn | 1 + core/fpdfapi/fpdf_page/cpdf_path.cpp | 73 +++++++++++++++++++++++++++ core/fpdfapi/fpdf_page/fpdf_page_parser.cpp | 7 ++- core/fpdfapi/fpdf_page/include/cpdf_path.h | 58 +++++++++++---------- core/fpdfapi/fpdf_render/fpdf_render_text.cpp | 6 +-- fpdfsdk/fpdf_transformpage.cpp | 6 +-- fpdfsdk/fxedit/fxet_edit.cpp | 4 +- 7 files changed, 117 insertions(+), 38 deletions(-) create mode 100644 core/fpdfapi/fpdf_page/cpdf_path.cpp 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 { +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 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 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; -- cgit v1.2.3