Index: xfa/fwl/core/cfwl_widgetmgr.cpp |
diff --git a/xfa/fwl/core/cfwl_widgetmgr.cpp b/xfa/fwl/core/cfwl_widgetmgr.cpp |
deleted file mode 100644 |
index 5bcef7b7df5ab6366812f653dd7f5f67ba04530e..0000000000000000000000000000000000000000 |
--- a/xfa/fwl/core/cfwl_widgetmgr.cpp |
+++ /dev/null |
@@ -1,732 +0,0 @@ |
-// Copyright 2014 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 "xfa/fwl/core/cfwl_widgetmgr.h" |
- |
-#include <utility> |
- |
-#include "third_party/base/ptr_util.h" |
-#include "xfa/fwl/core/cfwl_app.h" |
-#include "xfa/fwl/core/cfwl_form.h" |
-#include "xfa/fwl/core/cfwl_notedriver.h" |
-#include "xfa/fxfa/app/xfa_fwladapter.h" |
-#include "xfa/fxfa/xfa_ffapp.h" |
- |
-namespace { |
- |
-const int kNeedRepaintHitPoints = 12; |
-const int kNeedRepaintHitPiece = 3; |
- |
-struct FWL_NEEDREPAINTHITDATA { |
- CFX_PointF hitPoint; |
- bool bNotNeedRepaint; |
- bool bNotContainByDirty; |
-}; |
- |
-} // namespace |
- |
-bool FWL_UseOffscreen(CFWL_Widget* pWidget) { |
-#if (_FX_OS_ == _FX_MACOSX_) |
- return false; |
-#else |
- return !!(pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen); |
-#endif |
-} |
- |
-CFWL_WidgetMgr::CFWL_WidgetMgr(CXFA_FFApp* pAdapterNative) |
- : m_dwCapability(0), m_pAdapter(pAdapterNative->GetWidgetMgr(this)) { |
- ASSERT(m_pAdapter); |
- m_mapWidgetItem[nullptr] = pdfium::MakeUnique<Item>(); |
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) |
- m_rtScreen.Reset(); |
-#endif |
-} |
- |
-CFWL_WidgetMgr::~CFWL_WidgetMgr() {} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetParentWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- return pItem && pItem->pParent ? pItem->pParent->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetOwnerWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- return pItem && pItem->pOwner ? pItem->pOwner->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetFirstSiblingWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (!pItem) |
- return nullptr; |
- |
- pItem = pItem->pPrevious; |
- while (pItem && pItem->pPrevious) |
- pItem = pItem->pPrevious; |
- return pItem ? pItem->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetPriorSiblingWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- return pItem && pItem->pPrevious ? pItem->pPrevious->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetNextSiblingWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- return pItem && pItem->pNext ? pItem->pNext->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetFirstChildWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- return pItem && pItem->pChild ? pItem->pChild->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetLastChildWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (!pItem) |
- return nullptr; |
- |
- pItem = pItem->pChild; |
- while (pItem && pItem->pNext) |
- pItem = pItem->pNext; |
- return pItem ? pItem->pWidget : nullptr; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetSystemFormWidget(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- while (pItem) { |
- if (IsAbleNative(pItem->pWidget)) |
- return pItem->pWidget; |
- pItem = pItem->pParent; |
- } |
- return nullptr; |
-} |
- |
-void CFWL_WidgetMgr::AppendWidget(CFWL_Widget* pWidget) { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (!pItem) |
- return; |
- if (!pItem->pParent) |
- return; |
- |
- Item* pChild = pItem->pParent->pChild; |
- int32_t i = 0; |
- while (pChild) { |
- if (pChild == pItem) { |
- if (pChild->pPrevious) |
- pChild->pPrevious->pNext = pChild->pNext; |
- if (pChild->pNext) |
- pChild->pNext->pPrevious = pChild->pPrevious; |
- if (pItem->pParent->pChild == pItem) |
- pItem->pParent->pChild = pItem->pNext; |
- |
- pItem->pNext = nullptr; |
- pItem->pPrevious = nullptr; |
- break; |
- } |
- if (!pChild->pNext) |
- break; |
- |
- pChild = pChild->pNext; |
- ++i; |
- } |
- |
- pChild = pItem->pParent->pChild; |
- if (pChild) { |
- while (pChild->pNext) |
- pChild = pChild->pNext; |
- |
- pChild->pNext = pItem; |
- pItem->pPrevious = pChild; |
- } else { |
- pItem->pParent->pChild = pItem; |
- pItem->pPrevious = nullptr; |
- } |
- pItem->pNext = nullptr; |
-} |
- |
-void CFWL_WidgetMgr::RepaintWidget(CFWL_Widget* pWidget, |
- const CFX_RectF* pRect) { |
- if (!m_pAdapter) |
- return; |
- |
- CFWL_Widget* pNative = pWidget; |
- CFX_RectF rect(*pRect); |
- if (IsFormDisabled()) { |
- CFWL_Widget* pOuter = pWidget->GetOuter(); |
- while (pOuter) { |
- CFX_RectF rtTemp = pNative->GetWidgetRect(); |
- rect.left += rtTemp.left; |
- rect.top += rtTemp.top; |
- pNative = pOuter; |
- pOuter = pOuter->GetOuter(); |
- } |
- } else if (!IsAbleNative(pWidget)) { |
- pNative = GetSystemFormWidget(pWidget); |
- if (!pNative) |
- return; |
- |
- pWidget->TransformTo(pNative, rect.left, rect.top); |
- } |
- AddRedrawCounts(pNative); |
- m_pAdapter->RepaintWidget(pNative, &rect); |
-} |
- |
-void CFWL_WidgetMgr::InsertWidget(CFWL_Widget* pParent, CFWL_Widget* pChild) { |
- Item* pParentItem = GetWidgetMgrItem(pParent); |
- if (!pParentItem) { |
- auto item = pdfium::MakeUnique<Item>(pParent); |
- pParentItem = item.get(); |
- m_mapWidgetItem[pParent] = std::move(item); |
- |
- pParentItem->pParent = GetWidgetMgrItem(nullptr); |
- AppendWidget(pParent); |
- } |
- |
- Item* pItem = GetWidgetMgrItem(pChild); |
- if (!pItem) { |
- auto item = pdfium::MakeUnique<Item>(pChild); |
- pItem = item.get(); |
- m_mapWidgetItem[pChild] = std::move(item); |
- } |
- if (pItem->pParent && pItem->pParent != pParentItem) { |
- if (pItem->pPrevious) |
- pItem->pPrevious->pNext = pItem->pNext; |
- if (pItem->pNext) |
- pItem->pNext->pPrevious = pItem->pPrevious; |
- if (pItem->pParent->pChild == pItem) |
- pItem->pParent->pChild = pItem->pNext; |
- } |
- pItem->pParent = pParentItem; |
- AppendWidget(pChild); |
-} |
- |
-void CFWL_WidgetMgr::RemoveWidget(CFWL_Widget* pWidget) { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (!pItem) |
- return; |
- if (pItem->pPrevious) |
- pItem->pPrevious->pNext = pItem->pNext; |
- if (pItem->pNext) |
- pItem->pNext->pPrevious = pItem->pPrevious; |
- if (pItem->pParent && pItem->pParent->pChild == pItem) |
- pItem->pParent->pChild = pItem->pNext; |
- |
- Item* pChild = pItem->pChild; |
- while (pChild) { |
- Item* pNext = pChild->pNext; |
- RemoveWidget(pChild->pWidget); |
- pChild = pNext; |
- } |
- m_mapWidgetItem.erase(pWidget); |
-} |
- |
-void CFWL_WidgetMgr::SetOwner(CFWL_Widget* pOwner, CFWL_Widget* pOwned) { |
- Item* pParentItem = GetWidgetMgrItem(pOwner); |
- if (!pParentItem) { |
- auto item = pdfium::MakeUnique<Item>(pOwner); |
- pParentItem = item.get(); |
- m_mapWidgetItem[pOwner] = std::move(item); |
- |
- pParentItem->pParent = GetWidgetMgrItem(nullptr); |
- AppendWidget(pOwner); |
- } |
- |
- Item* pItem = GetWidgetMgrItem(pOwned); |
- if (!pItem) { |
- auto item = pdfium::MakeUnique<Item>(pOwned); |
- pItem = item.get(); |
- m_mapWidgetItem[pOwned] = std::move(item); |
- } |
- pItem->pOwner = pParentItem; |
-} |
-void CFWL_WidgetMgr::SetParent(CFWL_Widget* pParent, CFWL_Widget* pChild) { |
- Item* pParentItem = GetWidgetMgrItem(pParent); |
- Item* pItem = GetWidgetMgrItem(pChild); |
- if (!pItem) |
- return; |
- if (pItem->pParent && pItem->pParent != pParentItem) { |
- if (pItem->pPrevious) |
- pItem->pPrevious->pNext = pItem->pNext; |
- if (pItem->pNext) |
- pItem->pNext->pPrevious = pItem->pPrevious; |
- if (pItem->pParent->pChild == pItem) |
- pItem->pParent->pChild = pItem->pNext; |
- |
- pItem->pNext = nullptr; |
- pItem->pPrevious = nullptr; |
- } |
- pItem->pParent = pParentItem; |
- AppendWidget(pChild); |
-} |
- |
-void CFWL_WidgetMgr::SetWidgetRect_Native(CFWL_Widget* pWidget, |
- const CFX_RectF& rect) { |
- if (!FWL_UseOffscreen(pWidget)) |
- return; |
- |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- pItem->iRedrawCounter++; |
- if (pItem->pOffscreen) { |
- CFX_RenderDevice* pDevice = pItem->pOffscreen->GetRenderDevice(); |
- if (pDevice && pDevice->GetBitmap()) { |
- CFX_DIBitmap* pBitmap = pDevice->GetBitmap(); |
- if (pBitmap->GetWidth() - rect.width > 1 || |
- pBitmap->GetHeight() - rect.height > 1) { |
- pItem->pOffscreen.reset(); |
- } |
- } |
- } |
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) |
- pItem->bOutsideChanged = !m_rtScreen.Contains(rect); |
-#endif |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetWidgetAtPoint(CFWL_Widget* parent, |
- FX_FLOAT x, |
- FX_FLOAT y) { |
- if (!parent) |
- return nullptr; |
- |
- FX_FLOAT x1; |
- FX_FLOAT y1; |
- CFWL_Widget* child = GetLastChildWidget(parent); |
- while (child) { |
- if ((child->GetStates() & FWL_WGTSTATE_Invisible) == 0) { |
- x1 = x; |
- y1 = y; |
- CFX_Matrix matrixOnParent; |
- child->GetMatrix(matrixOnParent, false); |
- CFX_Matrix m; |
- m.SetIdentity(); |
- m.SetReverse(matrixOnParent); |
- m.TransformPoint(x1, y1); |
- CFX_RectF bounds = child->GetWidgetRect(); |
- if (bounds.Contains(x1, y1)) { |
- x1 -= bounds.left; |
- y1 -= bounds.top; |
- return GetWidgetAtPoint(child, x1, y1); |
- } |
- } |
- child = GetPriorSiblingWidget(child); |
- } |
- return parent; |
-} |
- |
-void CFWL_WidgetMgr::NotifySizeChanged(CFWL_Widget* pForm, |
- FX_FLOAT fx, |
- FX_FLOAT fy) { |
- if (FWL_UseOffscreen(pForm)) |
- GetWidgetMgrItem(pForm)->pOffscreen.reset(); |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::NextTab(CFWL_Widget* parent, |
- CFWL_Widget* focus, |
- bool& bFind) { |
- CFWL_WidgetMgr* pMgr = parent->GetOwnerApp()->GetWidgetMgr(); |
- CFWL_Widget* child = pMgr->GetFirstChildWidget(parent); |
- while (child) { |
- if (focus == child) |
- bFind = true; |
- |
- if ((child->GetStyles() & FWL_WGTSTYLE_TabStop) && |
- (!focus || (focus != child && bFind))) { |
- return child; |
- } |
- CFWL_Widget* bRet = NextTab(child, focus, bFind); |
- if (bRet) |
- return bRet; |
- |
- child = pMgr->GetNextSiblingWidget(child); |
- } |
- return nullptr; |
-} |
- |
-int32_t CFWL_WidgetMgr::CountRadioButtonGroup(CFWL_Widget* pFirst) const { |
- int32_t iRet = 0; |
- CFWL_Widget* pChild = pFirst; |
- while (pChild) { |
- pChild = GetNextSiblingWidget(pChild); |
- ++iRet; |
- } |
- return iRet; |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetRadioButtonGroupHeader( |
- CFWL_Widget* pRadioButton) const { |
- CFWL_Widget* pNext = pRadioButton; |
- if (pNext && (pNext->GetStyles() & FWL_WGTSTYLE_Group)) |
- return pNext; |
- return nullptr; |
-} |
- |
-void CFWL_WidgetMgr::GetSameGroupRadioButton( |
- CFWL_Widget* pRadioButton, |
- CFX_ArrayTemplate<CFWL_Widget*>& group) const { |
- CFWL_Widget* pFirst = GetFirstSiblingWidget(pRadioButton); |
- if (!pFirst) |
- pFirst = pRadioButton; |
- |
- int32_t iGroup = CountRadioButtonGroup(pFirst); |
- if (iGroup < 2) |
- return; |
- group.Add(GetRadioButtonGroupHeader(pRadioButton)); |
-} |
- |
-CFWL_Widget* CFWL_WidgetMgr::GetDefaultButton(CFWL_Widget* pParent) const { |
- if ((pParent->GetClassID() == FWL_Type::PushButton) && |
- (pParent->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) { |
- return pParent; |
- } |
- |
- CFWL_Widget* child = |
- pParent->GetOwnerApp()->GetWidgetMgr()->GetFirstChildWidget(pParent); |
- while (child) { |
- if ((child->GetClassID() == FWL_Type::PushButton) && |
- (child->GetStates() & (1 << (FWL_WGTSTATE_MAX + 2)))) { |
- return child; |
- } |
- if (CFWL_Widget* find = GetDefaultButton(child)) |
- return find; |
- |
- child = child->GetOwnerApp()->GetWidgetMgr()->GetNextSiblingWidget(child); |
- } |
- return nullptr; |
-} |
- |
-void CFWL_WidgetMgr::AddRedrawCounts(CFWL_Widget* pWidget) { |
- GetWidgetMgrItem(pWidget)->iRedrawCounter++; |
-} |
- |
-void CFWL_WidgetMgr::ResetRedrawCounts(CFWL_Widget* pWidget) { |
- GetWidgetMgrItem(pWidget)->iRedrawCounter = 0; |
-} |
- |
-CFWL_WidgetMgr::Item* CFWL_WidgetMgr::GetWidgetMgrItem( |
- CFWL_Widget* pWidget) const { |
- auto it = m_mapWidgetItem.find(pWidget); |
- return it != m_mapWidgetItem.end() ? static_cast<Item*>(it->second.get()) |
- : nullptr; |
-} |
- |
-bool CFWL_WidgetMgr::IsAbleNative(CFWL_Widget* pWidget) const { |
- if (!pWidget) |
- return false; |
- if (!pWidget->IsInstance(FX_WSTRC(FWL_CLASS_Form))) |
- return false; |
- |
- uint32_t dwStyles = pWidget->GetStyles(); |
- return ((dwStyles & FWL_WGTSTYLE_WindowTypeMask) == |
- FWL_WGTSTYLE_OverLapper) || |
- (dwStyles & FWL_WGTSTYLE_Popup); |
-} |
- |
-void CFWL_WidgetMgr::GetAdapterPopupPos(CFWL_Widget* pWidget, |
- FX_FLOAT fMinHeight, |
- FX_FLOAT fMaxHeight, |
- const CFX_RectF& rtAnchor, |
- CFX_RectF& rtPopup) const { |
- m_pAdapter->GetPopupPos(pWidget, fMinHeight, fMaxHeight, rtAnchor, rtPopup); |
-} |
- |
-void CFWL_WidgetMgr::OnSetCapability(uint32_t dwCapability) { |
- m_dwCapability = dwCapability; |
-} |
- |
-void CFWL_WidgetMgr::OnProcessMessageToForm(CFWL_Message* pMessage) { |
- if (!pMessage) |
- return; |
- if (!pMessage->m_pDstTarget) |
- return; |
- |
- CFWL_Widget* pDstWidget = pMessage->m_pDstTarget; |
- const CFWL_App* pApp = pDstWidget->GetOwnerApp(); |
- if (!pApp) |
- return; |
- |
- CFWL_NoteDriver* pNoteDriver = |
- static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver()); |
- if (!pNoteDriver) |
- return; |
- |
- std::unique_ptr<CFWL_Message> pClonedMessage = pMessage->Clone(); |
- if (IsFormDisabled()) |
- pNoteDriver->ProcessMessage(pClonedMessage.get()); |
- else |
- pNoteDriver->QueueMessage(std::move(pClonedMessage)); |
- |
-#if (_FX_OS_ == _FX_MACOSX_) |
- CFWL_NoteLoop* pTopLoop = pNoteDriver->GetTopLoop(); |
- if (pTopLoop) |
- pNoteDriver->UnqueueMessage(pTopLoop); |
-#endif |
-} |
- |
-void CFWL_WidgetMgr::OnDrawWidget(CFWL_Widget* pWidget, |
- CFX_Graphics* pGraphics, |
- const CFX_Matrix* pMatrix) { |
- if (!pWidget || !pGraphics) |
- return; |
- |
- CFX_Graphics* pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix); |
- CFX_RectF clipCopy = pWidget->GetWidgetRect(); |
- clipCopy.left = clipCopy.top = 0; |
- |
- if (UseOffscreenDirect(pWidget)) { |
- DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix); |
- return; |
- } |
- CFX_RectF clipBounds; |
- |
-#if _FX_OS_ == _FX_WIN32_DESKTOP_ || _FX_OS_ == _FX_WIN64_ || \ |
- _FX_OS_ == _FX_LINUX_DESKTOP_ || _FX_OS_ == _FX_ANDROID_ |
- pWidget->GetDelegate()->OnDrawWidget(pTemp, pMatrix); |
- pGraphics->GetClipRect(clipBounds); |
- clipCopy = clipBounds; |
-#elif _FX_OS_ == _FX_MACOSX_ |
- if (IsFormDisabled()) { |
- pWidget->GetDelegate()->OnDrawWidget(pTemp, pMatrix); |
- pGraphics->GetClipRect(clipBounds); |
- clipCopy = clipBounds; |
- } else { |
- clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d); |
- const_cast<CFX_Matrix*>(pMatrix)->SetIdentity(); // FIXME: const cast. |
- pWidget->GetDelegate()->OnDrawWidget(pTemp, pMatrix); |
- } |
-#endif // _FX_OS_ == _FX_MACOSX_ |
- |
- if (!IsFormDisabled()) { |
- CFX_RectF rtClient; |
- pWidget->GetClientRect(rtClient); |
- clipBounds.Intersect(rtClient); |
- } |
- if (!clipBounds.IsEmpty()) |
- DrawChild(pWidget, clipBounds, pTemp, pMatrix); |
- |
- DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix); |
- ResetRedrawCounts(pWidget); |
-} |
- |
-void CFWL_WidgetMgr::DrawChild(CFWL_Widget* parent, |
- const CFX_RectF& rtClip, |
- CFX_Graphics* pGraphics, |
- const CFX_Matrix* pMatrix) { |
- if (!parent) |
- return; |
- |
- bool bFormDisable = IsFormDisabled(); |
- CFWL_Widget* pNextChild = GetFirstChildWidget(parent); |
- while (pNextChild) { |
- CFWL_Widget* child = pNextChild; |
- pNextChild = GetNextSiblingWidget(child); |
- if (child->GetStates() & FWL_WGTSTATE_Invisible) |
- continue; |
- |
- CFX_RectF rtWidget = child->GetWidgetRect(); |
- if (rtWidget.IsEmpty()) |
- continue; |
- |
- CFX_Matrix widgetMatrix; |
- CFX_RectF clipBounds(rtWidget); |
- if (!bFormDisable) |
- child->GetMatrix(widgetMatrix, true); |
- if (pMatrix) |
- widgetMatrix.Concat(*pMatrix); |
- |
- if (!bFormDisable) { |
- widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top); |
- clipBounds.Intersect(rtClip); |
- if (clipBounds.IsEmpty()) |
- continue; |
- |
- pGraphics->SaveGraphState(); |
- pGraphics->SetClipRect(clipBounds); |
- } |
- widgetMatrix.Translate(rtWidget.left, rtWidget.top, true); |
- |
- if (IFWL_WidgetDelegate* pDelegate = child->GetDelegate()) { |
- if (IsFormDisabled() || IsNeedRepaint(child, &widgetMatrix, rtClip)) |
- pDelegate->OnDrawWidget(pGraphics, &widgetMatrix); |
- } |
- if (!bFormDisable) |
- pGraphics->RestoreGraphState(); |
- |
- DrawChild(child, clipBounds, pGraphics, |
- bFormDisable ? &widgetMatrix : pMatrix); |
- child = GetNextSiblingWidget(child); |
- } |
-} |
- |
-CFX_Graphics* CFWL_WidgetMgr::DrawWidgetBefore(CFWL_Widget* pWidget, |
- CFX_Graphics* pGraphics, |
- const CFX_Matrix* pMatrix) { |
- if (!FWL_UseOffscreen(pWidget)) |
- return pGraphics; |
- |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (!pItem->pOffscreen) { |
- pItem->pOffscreen.reset(new CFX_Graphics); |
- CFX_RectF rect = pWidget->GetWidgetRect(); |
- pItem->pOffscreen->Create((int32_t)rect.width, (int32_t)rect.height, |
- FXDIB_Argb); |
- } |
- CFX_RectF rect; |
- pGraphics->GetClipRect(rect); |
- pItem->pOffscreen->SetClipRect(rect); |
- return pItem->pOffscreen.get(); |
-} |
- |
-void CFWL_WidgetMgr::DrawWidgetAfter(CFWL_Widget* pWidget, |
- CFX_Graphics* pGraphics, |
- CFX_RectF& rtClip, |
- const CFX_Matrix* pMatrix) { |
- if (FWL_UseOffscreen(pWidget)) { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- pGraphics->Transfer(pItem->pOffscreen.get(), rtClip.left, rtClip.top, |
- rtClip, pMatrix); |
-#ifdef _WIN32 |
- pItem->pOffscreen->ClearClip(); |
-#endif |
- } |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- pItem->iRedrawCounter = 0; |
-} |
- |
-bool CFWL_WidgetMgr::IsNeedRepaint(CFWL_Widget* pWidget, |
- CFX_Matrix* pMatrix, |
- const CFX_RectF& rtDirty) { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (pItem && pItem->iRedrawCounter > 0) { |
- pItem->iRedrawCounter = 0; |
- return true; |
- } |
- |
- CFX_RectF rtWidget = pWidget->GetWidgetRect(); |
- rtWidget.left = rtWidget.top = 0; |
- pMatrix->TransformRect(rtWidget); |
- if (!rtWidget.IntersectWith(rtDirty)) |
- return false; |
- |
- CFWL_Widget* pChild = |
- pWidget->GetOwnerApp()->GetWidgetMgr()->GetFirstChildWidget(pWidget); |
- if (!pChild) |
- return true; |
- |
- CFX_RectF rtChilds; |
- rtChilds.Empty(); |
- bool bChildIntersectWithDirty = false; |
- bool bOrginPtIntersectWidthChild = false; |
- bool bOrginPtIntersectWidthDirty = |
- rtDirty.Contains(rtWidget.left, rtWidget.top); |
- static FWL_NEEDREPAINTHITDATA hitPoint[kNeedRepaintHitPoints]; |
- FXSYS_memset(hitPoint, 0, sizeof(hitPoint)); |
- FX_FLOAT fxPiece = rtWidget.width / kNeedRepaintHitPiece; |
- FX_FLOAT fyPiece = rtWidget.height / kNeedRepaintHitPiece; |
- hitPoint[2].hitPoint.x = hitPoint[6].hitPoint.x = rtWidget.left; |
- hitPoint[0].hitPoint.x = hitPoint[3].hitPoint.x = hitPoint[7].hitPoint.x = |
- hitPoint[10].hitPoint.x = fxPiece + rtWidget.left; |
- hitPoint[1].hitPoint.x = hitPoint[4].hitPoint.x = hitPoint[8].hitPoint.x = |
- hitPoint[11].hitPoint.x = fxPiece * 2 + rtWidget.left; |
- hitPoint[5].hitPoint.x = hitPoint[9].hitPoint.x = |
- rtWidget.width + rtWidget.left; |
- hitPoint[0].hitPoint.y = hitPoint[1].hitPoint.y = rtWidget.top; |
- hitPoint[2].hitPoint.y = hitPoint[3].hitPoint.y = hitPoint[4].hitPoint.y = |
- hitPoint[5].hitPoint.y = fyPiece + rtWidget.top; |
- hitPoint[6].hitPoint.y = hitPoint[7].hitPoint.y = hitPoint[8].hitPoint.y = |
- hitPoint[9].hitPoint.y = fyPiece * 2 + rtWidget.top; |
- hitPoint[10].hitPoint.y = hitPoint[11].hitPoint.y = |
- rtWidget.height + rtWidget.top; |
- do { |
- CFX_RectF rect = pChild->GetWidgetRect(); |
- CFX_RectF r = rect; |
- r.left += rtWidget.left; |
- r.top += rtWidget.top; |
- if (r.IsEmpty()) |
- continue; |
- if (r.Contains(rtDirty)) |
- return false; |
- if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) |
- bChildIntersectWithDirty = true; |
- if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) |
- bOrginPtIntersectWidthChild = rect.Contains(0, 0); |
- |
- if (rtChilds.IsEmpty()) |
- rtChilds = rect; |
- else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) |
- rtChilds.Union(rect); |
- |
- for (int32_t i = 0; i < kNeedRepaintHitPoints; i++) { |
- if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) |
- continue; |
- if (!rtDirty.Contains(hitPoint[i].hitPoint)) { |
- hitPoint[i].bNotContainByDirty = true; |
- continue; |
- } |
- if (r.Contains(hitPoint[i].hitPoint)) |
- hitPoint[i].bNotNeedRepaint = true; |
- } |
- pChild = |
- pChild->GetOwnerApp()->GetWidgetMgr()->GetNextSiblingWidget(pChild); |
- } while (pChild); |
- |
- if (!bChildIntersectWithDirty) |
- return true; |
- if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) |
- return true; |
- if (rtChilds.IsEmpty()) |
- return true; |
- |
- int32_t repaintPoint = kNeedRepaintHitPoints; |
- for (int32_t i = 0; i < kNeedRepaintHitPoints; i++) { |
- if (hitPoint[i].bNotNeedRepaint) |
- repaintPoint--; |
- } |
- if (repaintPoint > 0) |
- return true; |
- |
- pMatrix->TransformRect(rtChilds); |
- if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) |
- return false; |
- return true; |
-} |
- |
-bool CFWL_WidgetMgr::UseOffscreenDirect(CFWL_Widget* pWidget) const { |
- Item* pItem = GetWidgetMgrItem(pWidget); |
- if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) |
- return false; |
- |
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) |
- if (pItem->bOutsideChanged) { |
- CFX_RectF r = pWidget->GetWidgetRect(); |
- CFX_RectF temp(m_rtScreen); |
- temp.Deflate(50, 50); |
- if (!temp.Contains(r)) |
- return false; |
- |
- pItem->bOutsideChanged = false; |
- } |
-#endif |
- |
- return pItem->iRedrawCounter == 0; |
-} |
- |
-CFWL_WidgetMgr::Item::Item() : CFWL_WidgetMgr::Item(nullptr) {} |
- |
-CFWL_WidgetMgr::Item::Item(CFWL_Widget* widget) |
- : pParent(nullptr), |
- pOwner(nullptr), |
- pChild(nullptr), |
- pPrevious(nullptr), |
- pNext(nullptr), |
- pWidget(widget), |
- iRedrawCounter(0) |
-#if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) |
- , |
- bOutsideChanged(false) |
-#endif |
-{ |
-} |
- |
-CFWL_WidgetMgr::Item::~Item() {} |