| Index: xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| diff --git a/xfa/fwl/core/fwl_widgetmgrimp.cpp b/xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| index 02b63862e50bae575557e5967e89b8563d44dd8d..730cf57aaa7b3b27ddead61c923b423f16e8f81d 100644
|
| --- a/xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| +++ b/xfa/fwl/core/fwl_widgetmgrimp.cpp
|
| @@ -15,6 +15,19 @@
|
| #include "xfa/fwl/core/ifwl_app.h"
|
| #include "xfa/fwl/core/ifwl_form.h"
|
|
|
| +namespace {
|
| +
|
| +const int kNeedRepaintHitPoints = 12;
|
| +const int kNeedRepaintHitPiece = 3;
|
| +
|
| +struct FWL_NEEDREPAINTHITDATA {
|
| + CFX_PointF hitPoint;
|
| + bool bNotNeedRepaint;
|
| + bool bNotContainByDirty;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
|
| #if (_FX_OS_ == _FX_MACOSX_)
|
| return FALSE;
|
| @@ -22,12 +35,14 @@ FX_BOOL FWL_UseOffscreen(IFWL_Widget* pWidget) {
|
| return pWidget->GetStyles() & FWL_WGTSTYLE_Offscreen;
|
| #endif
|
| }
|
| +
|
| IFWL_WidgetMgr* FWL_GetWidgetMgr() {
|
| IFWL_App* pApp = FWL_GetApp();
|
| if (!pApp)
|
| return NULL;
|
| return pApp->GetWidgetMgr();
|
| }
|
| +
|
| CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative)
|
| : m_dwCapability(0) {
|
| m_pDelegate = new CFWL_WidgetMgrDelegate(this);
|
| @@ -35,6 +50,7 @@ CFWL_WidgetMgr::CFWL_WidgetMgr(IFWL_AdapterNative* pAdapterNative)
|
| ASSERT(m_pAdapter);
|
| CFWL_WidgetMgrItem* pRoot = new CFWL_WidgetMgrItem;
|
| m_mapWidgetItem.SetAt(NULL, pRoot);
|
| +
|
| #if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_)
|
| m_rtScreen.Reset();
|
| #endif
|
| @@ -722,6 +738,7 @@ int32_t CFWL_WidgetMgrDelegate::OnProcessMessageToForm(CFWL_Message* pMessage) {
|
| }
|
| return FWL_ERR_Succeeded;
|
| }
|
| +
|
| FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
|
| CFX_Graphics* pGraphics,
|
| const CFX_Matrix* pMatrix) {
|
| @@ -729,6 +746,7 @@ FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
|
| return FWL_ERR_Indefinite;
|
| if (!pGraphics)
|
| return FWL_ERR_Indefinite;
|
| +
|
| CFX_Graphics* pTemp = DrawWidgetBefore(pWidget, pGraphics, pMatrix);
|
| CFX_RectF clipCopy;
|
| pWidget->GetWidgetRect(clipCopy);
|
| @@ -738,6 +756,7 @@ FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
|
| return FWL_ERR_Succeeded;
|
| }
|
| CFX_RectF clipBounds;
|
| +
|
| #if (_FX_OS_ == _FX_WIN32_DESKTOP_) || (_FX_OS_ == _FX_WIN64_) || \
|
| (_FX_OS_ == _FX_LINUX_DESKTOP_) || (_FX_OS_ == _FX_ANDROID_)
|
| IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
|
| @@ -753,61 +772,58 @@ FWL_ERR CFWL_WidgetMgrDelegate::OnDrawWidget(IFWL_Widget* pWidget,
|
| } else {
|
| clipBounds.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d);
|
| const_cast<CFX_Matrix*>(pMatrix)->SetIdentity(); // FIXME: const cast.
|
| -#ifdef FWL_UseMacSystemBorder
|
| -#else
|
| -#endif
|
| - {
|
| - IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
|
| - pDelegate->OnDrawWidget(pTemp, pMatrix);
|
| - }
|
| + IFWL_WidgetDelegate* pDelegate = pWidget->SetDelegate(NULL);
|
| + pDelegate->OnDrawWidget(pTemp, pMatrix);
|
| }
|
| -#endif
|
| +#endif // _FX_OS_ == _FX_MACOSX_
|
| +
|
| if (!m_pWidgetMgr->IsFormDisabled()) {
|
| CFX_RectF rtClient;
|
| pWidget->GetClientRect(rtClient);
|
| clipBounds.Intersect(rtClient);
|
| }
|
| - if (!clipBounds.IsEmpty()) {
|
| + if (!clipBounds.IsEmpty())
|
| DrawChild(pWidget, clipBounds, pTemp, pMatrix);
|
| - }
|
| +
|
| DrawWidgetAfter(pWidget, pGraphics, clipCopy, pMatrix);
|
| m_pWidgetMgr->ResetRedrawCounts(pWidget);
|
| return FWL_ERR_Succeeded;
|
| }
|
| +
|
| void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
|
| const CFX_RectF& rtClip,
|
| CFX_Graphics* pGraphics,
|
| const CFX_Matrix* pMatrix) {
|
| if (!parent)
|
| return;
|
| +
|
| FX_BOOL bFormDisable = m_pWidgetMgr->IsFormDisabled();
|
| IFWL_Widget* pNextChild =
|
| m_pWidgetMgr->GetWidget(parent, FWL_WGTRELATION_FirstChild);
|
| while (pNextChild) {
|
| IFWL_Widget* child = pNextChild;
|
| pNextChild = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
|
| - if (child->GetStates() & FWL_WGTSTATE_Invisible) {
|
| + if (child->GetStates() & FWL_WGTSTATE_Invisible)
|
| continue;
|
| - }
|
| +
|
| CFX_RectF rtWidget;
|
| child->GetWidgetRect(rtWidget);
|
| - if (rtWidget.IsEmpty()) {
|
| + if (rtWidget.IsEmpty())
|
| continue;
|
| - }
|
| +
|
| CFX_Matrix widgetMatrix;
|
| CFX_RectF clipBounds(rtWidget);
|
| - if (!bFormDisable) {
|
| + if (!bFormDisable)
|
| child->GetMatrix(widgetMatrix, TRUE);
|
| - }
|
| - if (pMatrix) {
|
| + if (pMatrix)
|
| widgetMatrix.Concat(*pMatrix);
|
| - }
|
| +
|
| if (!bFormDisable) {
|
| widgetMatrix.TransformPoint(clipBounds.left, clipBounds.top);
|
| clipBounds.Intersect(rtClip);
|
| - if (clipBounds.IsEmpty()) {
|
| + if (clipBounds.IsEmpty())
|
| continue;
|
| - }
|
| +
|
| pGraphics->SaveGraphState();
|
| pGraphics->SetClipRect(clipBounds);
|
| }
|
| @@ -819,21 +835,22 @@ void CFWL_WidgetMgrDelegate::DrawChild(IFWL_Widget* parent,
|
| pDelegate->OnDrawWidget(pGraphics, &widgetMatrix);
|
| }
|
| }
|
| - if (!bFormDisable) {
|
| + if (!bFormDisable)
|
| pGraphics->RestoreGraphState();
|
| - }
|
| +
|
| DrawChild(child, clipBounds, pGraphics,
|
| bFormDisable ? &widgetMatrix : pMatrix);
|
| child = m_pWidgetMgr->GetWidget(child, FWL_WGTRELATION_NextSibling);
|
| }
|
| }
|
| +
|
| CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(
|
| IFWL_Widget* pWidget,
|
| CFX_Graphics* pGraphics,
|
| const CFX_Matrix* pMatrix) {
|
| - if (!FWL_UseOffscreen(pWidget)) {
|
| + if (!FWL_UseOffscreen(pWidget))
|
| return pGraphics;
|
| - }
|
| +
|
| CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
|
| if (!pItem->pOffscreen) {
|
| pItem->pOffscreen = new CFX_Graphics;
|
| @@ -847,6 +864,7 @@ CFX_Graphics* CFWL_WidgetMgrDelegate::DrawWidgetBefore(
|
| pItem->pOffscreen->SetClipRect(rect);
|
| return pItem->pOffscreen;
|
| }
|
| +
|
| void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
|
| CFX_Graphics* pGraphics,
|
| CFX_RectF& rtClip,
|
| @@ -863,14 +881,6 @@ void CFWL_WidgetMgrDelegate::DrawWidgetAfter(IFWL_Widget* pWidget,
|
| pItem->iRedrawCounter = 0;
|
| }
|
|
|
| -#define FWL_NEEDREPAINTHIT_Point 12
|
| -#define FWL_NEEDREPAINTHIT_Piece 3
|
| -struct FWL_NEEDREPAINTHITDATA {
|
| - CFX_PointF hitPoint;
|
| - FX_BOOL bNotNeedRepaint;
|
| - FX_BOOL bNotContainByDirty;
|
| -};
|
| -
|
| FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
|
| CFX_Matrix* pMatrix,
|
| const CFX_RectF& rtDirty) {
|
| @@ -883,23 +893,21 @@ FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
|
| pWidget->GetWidgetRect(rtWidget);
|
| rtWidget.left = rtWidget.top = 0;
|
| pMatrix->TransformRect(rtWidget);
|
| - if (!rtWidget.IntersectWith(rtDirty)) {
|
| + if (!rtWidget.IntersectWith(rtDirty))
|
| return FALSE;
|
| - }
|
| +
|
| IFWL_Widget* pChild =
|
| FWL_GetWidgetMgr()->GetWidget(pWidget, FWL_WGTRELATION_FirstChild);
|
| - if (!pChild) {
|
| + if (!pChild)
|
| return TRUE;
|
| - }
|
| if (pChild->GetClassID() == 3150298670) {
|
| CFX_RectF rtTemp;
|
| pChild->GetWidgetRect(rtTemp);
|
| if (rtTemp.width >= rtWidget.width && rtTemp.height >= rtWidget.height) {
|
| pChild =
|
| FWL_GetWidgetMgr()->GetWidget(pChild, FWL_WGTRELATION_FirstChild);
|
| - if (!pChild) {
|
| + if (!pChild)
|
| return TRUE;
|
| - }
|
| }
|
| }
|
| CFX_RectF rtChilds;
|
| @@ -908,11 +916,11 @@ FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
|
| FX_BOOL bOrginPtIntersectWidthChild = FALSE;
|
| FX_BOOL bOrginPtIntersectWidthDirty =
|
| rtDirty.Contains(rtWidget.left, rtWidget.top);
|
| - static FWL_NEEDREPAINTHITDATA hitPoint[FWL_NEEDREPAINTHIT_Point];
|
| + static FWL_NEEDREPAINTHITDATA hitPoint[kNeedRepaintHitPoints];
|
| int32_t iSize = sizeof(FWL_NEEDREPAINTHITDATA);
|
| FXSYS_memset(hitPoint, 0, iSize);
|
| - FX_FLOAT fxPiece = rtWidget.width / FWL_NEEDREPAINTHIT_Piece;
|
| - FX_FLOAT fyPiece = rtWidget.height / FWL_NEEDREPAINTHIT_Piece;
|
| + 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;
|
| @@ -933,77 +941,71 @@ FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget,
|
| CFX_RectF r = rect;
|
| r.left += rtWidget.left;
|
| r.top += rtWidget.top;
|
| - if (r.IsEmpty()) {
|
| + if (r.IsEmpty())
|
| continue;
|
| - }
|
| - if (r.Contains(rtDirty)) {
|
| + if (r.Contains(rtDirty))
|
| return FALSE;
|
| - }
|
| - if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty)) {
|
| + if (!bChildIntersectWithDirty && r.IntersectWith(rtDirty))
|
| bChildIntersectWithDirty = TRUE;
|
| - }
|
| - if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
|
| + if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild)
|
| bOrginPtIntersectWidthChild = rect.Contains(0, 0);
|
| - }
|
| - if (rtChilds.IsEmpty()) {
|
| +
|
| + if (rtChilds.IsEmpty())
|
| rtChilds = rect;
|
| - } else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible)) {
|
| + else if (!(pChild->GetStates() & FWL_WGTSTATE_Invisible))
|
| rtChilds.Union(rect);
|
| - }
|
| - for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
|
| - if (hitPoint[i].bNotContainByDirty || hitPoint[i].bNotNeedRepaint) {
|
| +
|
| + 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;
|
| + hitPoint[i].bNotContainByDirty = true;
|
| continue;
|
| }
|
| - if (r.Contains(hitPoint[i].hitPoint)) {
|
| - hitPoint[i].bNotNeedRepaint = TRUE;
|
| - }
|
| + if (r.Contains(hitPoint[i].hitPoint))
|
| + hitPoint[i].bNotNeedRepaint = true;
|
| }
|
| } while ((pChild = FWL_GetWidgetMgr()->GetWidget(
|
| pChild, FWL_WGTRELATION_NextSibling)) != NULL);
|
| - if (!bChildIntersectWithDirty) {
|
| +
|
| + if (!bChildIntersectWithDirty)
|
| return TRUE;
|
| - }
|
| - if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild) {
|
| + if (bOrginPtIntersectWidthDirty && !bOrginPtIntersectWidthChild)
|
| return TRUE;
|
| - }
|
| - if (rtChilds.IsEmpty()) {
|
| + if (rtChilds.IsEmpty())
|
| return TRUE;
|
| - }
|
| - int32_t repaintPoint = FWL_NEEDREPAINTHIT_Point;
|
| - for (int32_t i = 0; i < FWL_NEEDREPAINTHIT_Point; i++) {
|
| - if (hitPoint[i].bNotNeedRepaint) {
|
| +
|
| + int32_t repaintPoint = kNeedRepaintHitPoints;
|
| + for (int32_t i = 0; i < kNeedRepaintHitPoints; i++) {
|
| + if (hitPoint[i].bNotNeedRepaint)
|
| repaintPoint--;
|
| - }
|
| }
|
| - if (repaintPoint > 0) {
|
| + if (repaintPoint > 0)
|
| return TRUE;
|
| - }
|
| +
|
| pMatrix->TransformRect(rtChilds);
|
| - if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget)) {
|
| + if (rtChilds.Contains(rtDirty) || rtChilds.Contains(rtWidget))
|
| return FALSE;
|
| - }
|
| return TRUE;
|
| }
|
| +
|
| FX_BOOL CFWL_WidgetMgrDelegate::bUseOffscreenDirect(IFWL_Widget* pWidget) {
|
| CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget);
|
| - if (!FWL_UseOffscreen(pWidget) || !(pItem->pOffscreen)) {
|
| + 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(r);
|
| CFX_RectF temp(m_pWidgetMgr->m_rtScreen);
|
| temp.Deflate(50, 50);
|
| - if (!temp.Contains(r)) {
|
| + if (!temp.Contains(r))
|
| return FALSE;
|
| - }
|
| +
|
| pItem->bOutsideChanged = FALSE;
|
| }
|
| #endif
|
| +
|
| return pItem->iRedrawCounter == 0;
|
| }
|
|
|