diff options
-rw-r--r-- | fpdfsdk/pwl/cpwl_edit_impl.cpp | 93 | ||||
-rw-r--r-- | fpdfsdk/pwl/cpwl_edit_impl.h | 40 |
2 files changed, 26 insertions, 107 deletions
diff --git a/fpdfsdk/pwl/cpwl_edit_impl.cpp b/fpdfsdk/pwl/cpwl_edit_impl.cpp index 1b324dc2fc..a2a7b1dddf 100644 --- a/fpdfsdk/pwl/cpwl_edit_impl.cpp +++ b/fpdfsdk/pwl/cpwl_edit_impl.cpp @@ -175,35 +175,38 @@ CPWL_EditImpl_Refresh::CPWL_EditImpl_Refresh() {} CPWL_EditImpl_Refresh::~CPWL_EditImpl_Refresh() {} void CPWL_EditImpl_Refresh::BeginRefresh() { - m_RefreshRects.Clear(); + m_RefreshRects.clear(); m_OldLineRects = std::move(m_NewLineRects); } void CPWL_EditImpl_Refresh::Push(const CPVT_WordRange& linerange, const CFX_FloatRect& rect) { - m_NewLineRects.Add(linerange, rect); + m_NewLineRects.emplace_back(CPWL_EditImpl_LineRect(linerange, rect)); } void CPWL_EditImpl_Refresh::NoAnalyse() { - { - for (int32_t i = 0, sz = m_OldLineRects.GetSize(); i < sz; i++) - if (CPWL_EditImpl_LineRect* pOldRect = m_OldLineRects.GetAt(i)) - m_RefreshRects.Add(pOldRect->m_rcLine); - } + for (const auto& lineRect : m_OldLineRects) + Add(lineRect.m_rcLine); - { - for (int32_t i = 0, sz = m_NewLineRects.GetSize(); i < sz; i++) - if (CPWL_EditImpl_LineRect* pNewRect = m_NewLineRects.GetAt(i)) - m_RefreshRects.Add(pNewRect->m_rcLine); - } + for (const auto& lineRect : m_NewLineRects) + Add(lineRect.m_rcLine); } -const CPWL_EditImpl_RectArray* CPWL_EditImpl_Refresh::GetRefreshRects() const { +std::vector<CFX_FloatRect>* CPWL_EditImpl_Refresh::GetRefreshRects() { return &m_RefreshRects; } void CPWL_EditImpl_Refresh::EndRefresh() { - m_RefreshRects.Clear(); + m_RefreshRects.clear(); +} + +void CPWL_EditImpl_Refresh::Add(const CFX_FloatRect& new_rect) { + // Check for overlapped area. + for (const auto& rect : m_RefreshRects) { + if (rect.Contains(new_rect)) + return; + } + m_RefreshRects.emplace_back(CFX_FloatRect(new_rect)); } CPWL_EditImpl_Undo::CPWL_EditImpl_Undo() @@ -1137,10 +1140,9 @@ void CPWL_EditImpl::Refresh() { if (!m_bNotifyFlag) { AutoRestorer<bool> restorer(&m_bNotifyFlag); m_bNotifyFlag = true; - if (const CPWL_EditImpl_RectArray* pRects = - m_Refresh.GetRefreshRects()) { - for (int32_t i = 0, sz = pRects->GetSize(); i < sz; i++) - m_pNotify->InvalidateRect(pRects->GetAt(i)); + if (std::vector<CFX_FloatRect>* pRects = m_Refresh.GetRefreshRects()) { + for (auto& rect : *pRects) + m_pNotify->InvalidateRect(&rect); } } } @@ -1867,33 +1869,6 @@ ByteString CPWL_EditImpl::GetPDFWordString(int32_t nFontIndex, return sWord; } -CPWL_EditImpl_LineRectArray::CPWL_EditImpl_LineRectArray() {} - -CPWL_EditImpl_LineRectArray::~CPWL_EditImpl_LineRectArray() {} - -void CPWL_EditImpl_LineRectArray::operator=( - CPWL_EditImpl_LineRectArray&& that) { - m_LineRects = std::move(that.m_LineRects); -} - -void CPWL_EditImpl_LineRectArray::Add(const CPVT_WordRange& wrLine, - const CFX_FloatRect& rcLine) { - m_LineRects.push_back( - pdfium::MakeUnique<CPWL_EditImpl_LineRect>(wrLine, rcLine)); -} - -int32_t CPWL_EditImpl_LineRectArray::GetSize() const { - return pdfium::CollectionSize<int32_t>(m_LineRects); -} - -CPWL_EditImpl_LineRect* CPWL_EditImpl_LineRectArray::GetAt( - int32_t nIndex) const { - if (nIndex < 0 || nIndex >= GetSize()) - return nullptr; - - return m_LineRects[nIndex].get(); -} - CPWL_EditImpl_Select::CPWL_EditImpl_Select() {} CPWL_EditImpl_Select::CPWL_EditImpl_Select(const CPVT_WordRange& range) { @@ -1922,31 +1897,3 @@ void CPWL_EditImpl_Select::SetEndPos(const CPVT_WordPlace& end) { bool CPWL_EditImpl_Select::IsEmpty() const { return BeginPos == EndPos; } - -CPWL_EditImpl_RectArray::CPWL_EditImpl_RectArray() {} - -CPWL_EditImpl_RectArray::~CPWL_EditImpl_RectArray() {} - -void CPWL_EditImpl_RectArray::Clear() { - m_Rects.clear(); -} - -void CPWL_EditImpl_RectArray::Add(const CFX_FloatRect& rect) { - // check for overlapped area - for (const auto& pRect : m_Rects) { - if (pRect && pRect->Contains(rect)) - return; - } - m_Rects.push_back(pdfium::MakeUnique<CFX_FloatRect>(rect)); -} - -int32_t CPWL_EditImpl_RectArray::GetSize() const { - return pdfium::CollectionSize<int32_t>(m_Rects); -} - -CFX_FloatRect* CPWL_EditImpl_RectArray::GetAt(int32_t nIndex) const { - if (nIndex < 0 || nIndex >= GetSize()) - return nullptr; - - return m_Rects[nIndex].get(); -} diff --git a/fpdfsdk/pwl/cpwl_edit_impl.h b/fpdfsdk/pwl/cpwl_edit_impl.h index 387f6e700d..e0d8324a4c 100644 --- a/fpdfsdk/pwl/cpwl_edit_impl.h +++ b/fpdfsdk/pwl/cpwl_edit_impl.h @@ -38,36 +38,6 @@ struct CPWL_EditImpl_LineRect { CFX_FloatRect m_rcLine; }; -class CPWL_EditImpl_LineRectArray { - public: - CPWL_EditImpl_LineRectArray(); - ~CPWL_EditImpl_LineRectArray(); - - void operator=(CPWL_EditImpl_LineRectArray&& rects); - void Add(const CPVT_WordRange& wrLine, const CFX_FloatRect& rcLine); - - int32_t GetSize() const; - CPWL_EditImpl_LineRect* GetAt(int32_t nIndex) const; - - private: - std::vector<std::unique_ptr<CPWL_EditImpl_LineRect>> m_LineRects; -}; - -class CPWL_EditImpl_RectArray { - public: - CPWL_EditImpl_RectArray(); - ~CPWL_EditImpl_RectArray(); - - void Clear(); - void Add(const CFX_FloatRect& rect); - - int32_t GetSize() const; - CFX_FloatRect* GetAt(int32_t nIndex) const; - - private: - std::vector<std::unique_ptr<CFX_FloatRect>> m_Rects; -}; - class CPWL_EditImpl_Refresh { public: CPWL_EditImpl_Refresh(); @@ -76,13 +46,15 @@ class CPWL_EditImpl_Refresh { void BeginRefresh(); void Push(const CPVT_WordRange& linerange, const CFX_FloatRect& rect); void NoAnalyse(); - const CPWL_EditImpl_RectArray* GetRefreshRects() const; + std::vector<CFX_FloatRect>* GetRefreshRects(); void EndRefresh(); private: - CPWL_EditImpl_LineRectArray m_NewLineRects; - CPWL_EditImpl_LineRectArray m_OldLineRects; - CPWL_EditImpl_RectArray m_RefreshRects; + void Add(const CFX_FloatRect& new_rect); + + std::vector<CPWL_EditImpl_LineRect> m_NewLineRects; + std::vector<CPWL_EditImpl_LineRect> m_OldLineRects; + std::vector<CFX_FloatRect> m_RefreshRects; }; class CPWL_EditImpl_Select { |