Split DATEINFO::dwStates into discrete bools. Here we hit a problem where CFWL_ThemeParam::dwStates is being assigned from DATEINFO::dwStates despite the bits in the fields having different meanings, as well as being tested by flags that have different meanings. Assuming this is a coding error, convert between the two representations when needed. -- add const to some members -- remove Rect from constructor as it is always empty. Change-Id: I14e31fb4404d5ed8b4fd0b9cc9a74bc13f3f0424 Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/83230 Commit-Queue: Tom Sepez <tsepez@chromium.org> Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fwl/cfwl_monthcalendar.cpp b/xfa/fwl/cfwl_monthcalendar.cpp index 307e6e1..42f7b9b 100644 --- a/xfa/fwl/cfwl_monthcalendar.cpp +++ b/xfa/fwl/cfwl_monthcalendar.cpp
@@ -220,14 +220,14 @@ int32_t iCount = fxcrt::CollectionSize<int32_t>(m_DateArray); for (int32_t j = 0; j < iCount; j++) { DATEINFO* pDataInfo = m_DateArray[j].get(); - if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Selected) { + if (pDataInfo->bSelected) { params.m_dwStates |= CFWL_PartState_Selected; - if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) { + if (pDataInfo->bFlagged) { params.m_dwStates |= CFWL_PartState_Flagged; } } else if (j == m_iHovered - 1) { params.m_dwStates |= CFWL_PartState_Hovered; - } else if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) { + } else if (pDataInfo->bFlagged) { params.m_dwStates = CFWL_PartState_Flagged; pTheme->DrawBackground(params); } @@ -285,7 +285,7 @@ DATEINFO* pDataInfo = m_DateArray[j].get(); params.m_wsText = pDataInfo->wsDay; params.m_PartRect = pDataInfo->rect; - params.m_dwStates = pDataInfo->dwStates; + params.m_dwStates = pDataInfo->AsPartStateMask(); if (j + 1 == m_iHovered) params.m_dwStates |= CFWL_PartState_Hovered; @@ -469,20 +469,16 @@ int32_t iDays = FX_DaysInMonth(m_iCurYear, m_iCurMonth); int32_t iDayOfWeek = CFX_DateTime(m_iCurYear, m_iCurMonth, 1, 0, 0, 0, 0).GetDayOfWeek(); - for (int32_t i = 0; i < iDays; i++) { + for (int32_t i = 0; i < iDays; ++i, ++iDayOfWeek) { if (iDayOfWeek >= 7) iDayOfWeek = 0; - uint32_t dwStates = 0; - if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1)) - dwStates |= FWL_ITEMSTATE_MCD_Flag; - if (pdfium::Contains(m_SelDayArray, i + 1)) - dwStates |= FWL_ITEMSTATE_MCD_Selected; - - CFX_RectF rtDate; - m_DateArray.push_back(std::make_unique<DATEINFO>( - i + 1, iDayOfWeek, dwStates, rtDate, WideString::Format(L"%d", i + 1))); - iDayOfWeek++; + const bool bFlagged = + m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == i + 1; + const bool bSelected = pdfium::Contains(m_SelDayArray, i + 1); + m_DateArray.push_back( + std::make_unique<DATEINFO>(i + 1, iDayOfWeek, bFlagged, bSelected, + WideString::Format(L"%d", i + 1))); } } @@ -536,7 +532,7 @@ int32_t iDatesCount = fxcrt::CollectionSize<int32_t>(m_DateArray); for (int32_t iSelDay : m_SelDayArray) { if (iSelDay <= iDatesCount) - m_DateArray[iSelDay - 1]->dwStates &= ~FWL_ITEMSTATE_MCD_Selected; + m_DateArray[iSelDay - 1]->bSelected = false; } m_SelDayArray.clear(); } @@ -548,7 +544,7 @@ RemoveSelDay(); if (iDay <= fxcrt::CollectionSize<int32_t>(m_DateArray)) - m_DateArray[iDay - 1]->dwStates |= FWL_ITEMSTATE_MCD_Selected; + m_DateArray[iDay - 1]->bSelected = true; m_SelDayArray.push_back(iDay); } @@ -732,13 +728,22 @@ CFWL_MonthCalendar::DATEINFO::DATEINFO(int32_t day, int32_t dayofweek, - uint32_t dwSt, - CFX_RectF rc, + bool bFlag, + bool bSelect, const WideString& wsday) : iDay(day), iDayOfWeek(dayofweek), - dwStates(dwSt), - rect(rc), + bFlagged(bFlag), + bSelected(bSelect), wsDay(wsday) {} CFWL_MonthCalendar::DATEINFO::~DATEINFO() = default; + +CFWL_PartStateMask CFWL_MonthCalendar::DATEINFO::AsPartStateMask() const { + CFWL_PartStateMask dwStates = 0; + if (bFlagged) + dwStates |= CFWL_PartState_Flagged; + if (bSelected) + dwStates |= CFWL_PartState_Selected; + return dwStates; +}
diff --git a/xfa/fwl/cfwl_monthcalendar.h b/xfa/fwl/cfwl_monthcalendar.h index 7b53850..1e63e3d 100644 --- a/xfa/fwl/cfwl_monthcalendar.h +++ b/xfa/fwl/cfwl_monthcalendar.h
@@ -14,9 +14,6 @@ #include "xfa/fwl/cfwl_event.h" #include "xfa/fwl/cfwl_widget.h" -#define FWL_ITEMSTATE_MCD_Flag (1L << 0) -#define FWL_ITEMSTATE_MCD_Selected (1L << 1) - class CFWL_MessageMouse; class CFWL_MonthCalendar final : public CFWL_Widget { @@ -71,19 +68,23 @@ int32_t iMonth; int32_t iDay; }; + struct DATEINFO { DATEINFO(int32_t day, int32_t dayofweek, - uint32_t dwSt, - CFX_RectF rc, + bool bFlag, + bool bSelect, const WideString& wsday); ~DATEINFO(); - int32_t iDay; - int32_t iDayOfWeek; - uint32_t dwStates; + CFWL_PartStateMask AsPartStateMask() const; + + const int32_t iDay; + const int32_t iDayOfWeek; + bool bFlagged; + bool bSelected; CFX_RectF rect; - WideString wsDay; + const WideString wsDay; }; CFWL_MonthCalendar(CFWL_App* app,
diff --git a/xfa/fwl/theme/cfwl_monthcalendartp.cpp b/xfa/fwl/theme/cfwl_monthcalendartp.cpp index 16aecca..d2f3ed5 100644 --- a/xfa/fwl/theme/cfwl_monthcalendartp.cpp +++ b/xfa/fwl/theme/cfwl_monthcalendartp.cpp
@@ -84,8 +84,8 @@ void CFWL_MonthCalendarTP::DrawText(const CFWL_ThemeText& pParams) { EnsureTTOInitialized(); - if ((pParams.m_iPart == CFWL_ThemePart::Part::kDatesIn) && - !(pParams.m_dwStates & FWL_ITEMSTATE_MCD_Flag) && + if (pParams.m_iPart == CFWL_ThemePart::Part::kDatesIn && + !(pParams.m_dwStates & CFWL_PartState_Flagged) && (pParams.m_dwStates & (CFWL_PartState_Hovered | CFWL_PartState_Selected))) { m_pTextOut->SetTextColor(0xFFFFFFFF);
diff --git a/xfa/fxfa/cxfa_fwltheme.cpp b/xfa/fxfa/cxfa_fwltheme.cpp index f1331a8..ff0d3c1 100644 --- a/xfa/fxfa/cxfa_fwltheme.cpp +++ b/xfa/fxfa/cxfa_fwltheme.cpp
@@ -101,7 +101,7 @@ m_pTextOut->SetFontSize(FWLTHEME_CAPACITY_FontSize); m_pTextOut->SetTextColor(FWLTHEME_CAPACITY_TextColor); if ((pParams.m_iPart == CFWL_ThemePart::Part::kDatesIn) && - !(pParams.m_dwStates & FWL_ITEMSTATE_MCD_Flag) && + !(pParams.m_dwStates & CFWL_PartState_Flagged) && (pParams.m_dwStates & (CFWL_PartState_Hovered | CFWL_PartState_Selected))) { m_pTextOut->SetTextColor(0xFF888888);