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);