void CFWL_ScrollBarImp::CalcMinTrackRect(CFX_RectF& rect) { if (m_bMinSize) { rect.Empty(); return; } FX_FLOAT fBottom = m_rtThumb.bottom(); FX_FLOAT fRight = m_rtThumb.right(); FX_FLOAT ix = (m_rtThumb.left + fRight) / 2; FX_FLOAT iy = (m_rtThumb.top + fBottom) / 2; rect.left = m_rtClient.left; rect.top = m_rtClient.top; FX_BOOL bVertical = IsVertical(); rect.width = bVertical ? m_rtClient.width : ix; rect.height = bVertical ? iy : m_rtClient.height; if (m_bCustomLayout) { if (bVertical) { if (0 == m_rtMinBtn.height && 0 == m_rtMaxBtn.height) { rect.top = m_rtClient.top; } else if (m_rtMinBtn.top < m_rtThumb.top) { rect.top = m_rtMinBtn.bottom(); rect.height -= (m_rtMinBtn.bottom() - m_rtClient.top); } } else { if (0 == m_rtMinBtn.width && 0 == m_rtMaxBtn.width) { rect.left = m_rtClient.left; } else if (m_rtMinBtn.left < m_rtThumb.left) { rect.left = m_rtMinBtn.right(); rect.width -= (m_rtMinBtn.right() - m_rtClient.left); } } } }
void CFWL_ScrollBarImp::CalcMaxTrackRect(CFX_RectF& rect) { if (m_bMinSize) { rect.Empty(); return; } FX_FLOAT ix = (m_rtThumb.left + m_rtThumb.right()) / 2; FX_FLOAT iy = (m_rtThumb.top + m_rtThumb.bottom()) / 2; FX_BOOL bVertical = IsVertical(); rect.left = bVertical ? m_rtClient.left : ix; rect.top = bVertical ? iy : m_rtClient.top; rect.width = bVertical ? m_rtClient.width : m_rtClient.right() - ix; rect.height = bVertical ? m_rtClient.bottom() - iy : m_rtClient.height; if (m_bCustomLayout) { if (bVertical) { if (m_rtMinBtn.top > m_rtThumb.top && m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) { rect.height -= (m_rtClient.bottom() - m_rtMinBtn.top); } else if (m_rtMinBtn.height > 0 && m_rtMaxBtn.height > 0) { rect.height -= (m_rtClient.bottom() - m_rtMaxBtn.top); } } else { if (m_rtMinBtn.left > m_rtThumb.left && m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) { rect.width -= (m_rtClient.right() - m_rtMinBtn.left); } else if (m_rtMinBtn.width > 0 && m_rtMaxBtn.width > 0) { rect.width -= (m_rtClient.right() - m_rtMaxBtn.left); } } } }
FDE_RENDERSTATUS CFDE_RenderContext::DoRender(IFX_Pause* pPause) { if (m_pRenderDevice == NULL) { return FDE_RENDERSTATUS_Failed; } if (m_pIterator == NULL) { return FDE_RENDERSTATUS_Failed; } Lock(); FDE_RENDERSTATUS eStatus = FDE_RENDERSTATUS_Paused; CFX_Matrix rm; rm.SetReverse(m_Transform); CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect(); if (rtDocClip.IsEmpty()) { rtDocClip.left = rtDocClip.top = 0; rtDocClip.width = (FX_FLOAT)m_pRenderDevice->GetWidth(); rtDocClip.height = (FX_FLOAT)m_pRenderDevice->GetHeight(); } rm.TransformRect(rtDocClip); IFDE_VisualSet* pVisualSet; FDE_HVISUALOBJ hVisualObj; CFX_RectF rtObj; int32_t iCount = 0; while (TRUE) { hVisualObj = m_pIterator->GetNext(pVisualSet); if (hVisualObj == NULL || pVisualSet == NULL) { eStatus = FDE_RENDERSTATUS_Done; break; } rtObj.Empty(); pVisualSet->GetRect(hVisualObj, rtObj); if (!rtDocClip.IntersectWith(rtObj)) { continue; } switch (pVisualSet->GetType()) { case FDE_VISUALOBJ_Text: RenderText((IFDE_TextSet*)pVisualSet, hVisualObj); iCount += 5; break; case FDE_VISUALOBJ_Path: RenderPath((IFDE_PathSet*)pVisualSet, hVisualObj); iCount += 20; break; case FDE_VISUALOBJ_Widget: iCount += 10; break; case FDE_VISUALOBJ_Canvas: FXSYS_assert(FALSE); break; default: break; } if (iCount >= 100 && pPause != NULL && pPause->NeedToPauseNow()) { eStatus = FDE_RENDERSTATUS_Paused; break; } } Unlock(); return m_eStatus = eStatus; }
FX_BOOL CFWL_WidgetMgrDelegate::IsNeedRepaint(IFWL_Widget* pWidget, CFX_Matrix* pMatrix, const CFX_RectF& rtDirty) { CFWL_WidgetMgrItem* pItem = m_pWidgetMgr->GetWidgetMgrItem(pWidget); if (pItem && pItem->iRedrawCounter > 0) { pItem->iRedrawCounter = 0; return TRUE; } CFX_RectF rtWidget; pWidget->GetWidgetRect(rtWidget); rtWidget.left = rtWidget.top = 0; pMatrix->TransformRect(rtWidget); if (!rtWidget.IntersectWith(rtDirty)) return FALSE; IFWL_Widget* pChild = CFWL_WidgetMgr::GetInstance()->GetFirstChildWidget(pWidget); if (!pChild) return TRUE; CFX_RectF rtChilds; rtChilds.Empty(); FX_BOOL bChildIntersectWithDirty = FALSE; FX_BOOL bOrginPtIntersectWidthChild = FALSE; FX_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(rect); 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 = CFWL_WidgetMgr::GetInstance()->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; }