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