Make FX_LAYOUTSTYLE a nested enum class
-- Use Mask<>.
-- reset the values (old values were an artifact from deleting unused
flags some time ago).
-- move one unrelated class to anon namespace because it was encountered
while reading this code.
-- pack tighter.
Change-Id: I7f2c903cfec8fc36bb1f6ae925d3bb4378b5c140
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/84470
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/testing/fuzzers/pdf_bidi_fuzzer.cc b/testing/fuzzers/pdf_bidi_fuzzer.cc
index 3c77b76..9b10eae 100644
--- a/testing/fuzzers/pdf_bidi_fuzzer.cc
+++ b/testing/fuzzers/pdf_bidi_fuzzer.cc
@@ -22,7 +22,7 @@
0);
assert(font);
- CFGAS_RTFBreak rtf_break(FX_LAYOUTSTYLE_ExpandTab);
+ CFGAS_RTFBreak rtf_break(CFGAS_Break::LayoutStyle::kExpandTab);
rtf_break.SetLineBreakTolerance(1);
rtf_break.SetFont(CFGAS_GEFont::LoadFont(std::move(font)));
rtf_break.SetFontSize(12);
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index aae12e4..ce950a3 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -667,11 +667,11 @@
return;
is_multiline_ = val;
- uint32_t style = text_break_.GetLayoutStyles();
+ Mask<CFGAS_Break::LayoutStyle> style = text_break_.GetLayoutStyles();
if (is_multiline_)
- style &= ~FX_LAYOUTSTYLE_SingleLine;
+ style.Clear(CFGAS_Break::LayoutStyle::kSingleLine);
else
- style |= FX_LAYOUTSTYLE_SingleLine;
+ style |= CFGAS_Break::LayoutStyle::kSingleLine;
text_break_.SetLayoutStyles(style);
is_dirty_ = true;
@@ -693,12 +693,12 @@
is_comb_text_ = enable;
- uint32_t style = text_break_.GetLayoutStyles();
+ Mask<CFGAS_Break::LayoutStyle> style = text_break_.GetLayoutStyles();
if (enable) {
- style |= FX_LAYOUTSTYLE_CombText;
+ style |= CFGAS_Break::LayoutStyle::kCombText;
SetCombTextWidth();
} else {
- style &= ~FX_LAYOUTSTYLE_CombText;
+ style.Clear(CFGAS_Break::LayoutStyle::kCombText);
}
text_break_.SetLayoutStyles(style);
is_dirty_ = true;
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 0d77522..8fdbc03 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -149,10 +149,9 @@
void CFDE_TextOut::SetStyles(const FDE_TextStyle& dwStyles) {
m_Styles = dwStyles;
-
- m_dwTxtBkStyles = 0;
- if (m_Styles.single_line_)
- m_dwTxtBkStyles |= FX_LAYOUTSTYLE_SingleLine;
+ m_dwTxtBkStyles = m_Styles.single_line_
+ ? CFGAS_Break::LayoutStyle::kSingleLine
+ : CFGAS_Break::LayoutStyle::kNone;
m_pTxtBreak->SetLayoutStyles(m_dwTxtBkStyles);
}
diff --git a/xfa/fde/cfde_textout.h b/xfa/fde/cfde_textout.h
index 3d443da..db9be7f 100644
--- a/xfa/fde/cfde_textout.h
+++ b/xfa/fde/cfde_textout.h
@@ -16,6 +16,7 @@
#include "core/fxge/dib/fx_dib.h"
#include "third_party/base/span.h"
#include "xfa/fde/cfde_data.h"
+#include "xfa/fgas/layout/cfgas_break.h"
#include "xfa/fgas/layout/cfgas_char.h"
class CFGAS_GEFont;
@@ -110,7 +111,7 @@
FDE_TextStyle m_Styles;
std::vector<int32_t> m_CharWidths;
FX_ARGB m_TxtColor = 0xFF000000;
- uint32_t m_dwTxtBkStyles = 0;
+ Mask<CFGAS_Break::LayoutStyle> m_dwTxtBkStyles;
WideString m_wsText;
CFX_Matrix m_Matrix;
std::deque<Line> m_ttoLines;
diff --git a/xfa/fgas/layout/cfgas_break.cpp b/xfa/fgas/layout/cfgas_break.cpp
index 363a7c5..e89a44e 100644
--- a/xfa/fgas/layout/cfgas_break.cpp
+++ b/xfa/fgas/layout/cfgas_break.cpp
@@ -16,7 +16,7 @@
const float CFGAS_Break::kConversionFactor = 20000.0f;
const int CFGAS_Break::kMinimumTabWidth = 160000;
-CFGAS_Break::CFGAS_Break(uint32_t dwLayoutStyles)
+CFGAS_Break::CFGAS_Break(Mask<LayoutStyle> dwLayoutStyles)
: m_dwLayoutStyles(dwLayoutStyles), m_pCurLine(&m_Lines[0]) {}
CFGAS_Break::~CFGAS_Break() = default;
@@ -27,10 +27,10 @@
line.Clear();
}
-void CFGAS_Break::SetLayoutStyles(uint32_t dwLayoutStyles) {
+void CFGAS_Break::SetLayoutStyles(Mask<LayoutStyle> dwLayoutStyles) {
m_dwLayoutStyles = dwLayoutStyles;
- m_bSingleLine = (m_dwLayoutStyles & FX_LAYOUTSTYLE_SingleLine) != 0;
- m_bCombText = (m_dwLayoutStyles & FX_LAYOUTSTYLE_CombText) != 0;
+ m_bSingleLine = !!(m_dwLayoutStyles & LayoutStyle::kSingleLine);
+ m_bCombText = !!(m_dwLayoutStyles & LayoutStyle::kCombText);
}
void CFGAS_Break::SetHorizontalScale(int32_t iScale) {
diff --git a/xfa/fgas/layout/cfgas_break.h b/xfa/fgas/layout/cfgas_break.h
index 5f38795..f6aa670 100644
--- a/xfa/fgas/layout/cfgas_break.h
+++ b/xfa/fgas/layout/cfgas_break.h
@@ -9,28 +9,29 @@
#include <stdint.h>
+#include "core/fxcrt/mask.h"
#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
#include "xfa/fgas/layout/cfgas_breakline.h"
class CFGAS_GEFont;
-enum FX_LAYOUTSTYLE {
- FX_LAYOUTSTYLE_None = 0,
- FX_LAYOUTSTYLE_Pagination = 0x01,
- FX_LAYOUTSTYLE_ExpandTab = 0x10,
- FX_LAYOUTSTYLE_SingleLine = 0x200,
- FX_LAYOUTSTYLE_CombText = 0x400
-};
-
class CFGAS_Break {
public:
+ enum class LayoutStyle : uint8_t {
+ kNone = 0,
+ kPagination = 1 << 0,
+ kExpandTab = 1 << 1,
+ kSingleLine = 1 << 2,
+ kCombText = 1 << 3,
+ };
+
virtual ~CFGAS_Break();
void Reset();
- void SetLayoutStyles(uint32_t dwLayoutStyles);
- uint32_t GetLayoutStyles() const { return m_dwLayoutStyles; }
+ void SetLayoutStyles(Mask<LayoutStyle> dwLayoutStyles);
+ Mask<LayoutStyle> GetLayoutStyles() const { return m_dwLayoutStyles; }
void SetFont(const RetainPtr<CFGAS_GEFont>& pFont);
void SetFontSize(float fFontSize);
@@ -65,7 +66,7 @@
static const int kMinimumTabWidth;
static const float kConversionFactor;
- explicit CFGAS_Break(uint32_t dwLayoutStyles);
+ explicit CFGAS_Break(Mask<LayoutStyle> dwLayoutStyles);
void SetBreakStatus();
bool HasLine() const { return m_iReadyLineIndex >= 0; }
@@ -75,8 +76,8 @@
FX_CHARTYPE m_eCharType = FX_CHARTYPE::kUnknown;
bool m_bSingleLine = false;
bool m_bCombText = false;
+ Mask<LayoutStyle> m_dwLayoutStyles = LayoutStyle::kNone;
uint32_t m_dwIdentity = 0;
- uint32_t m_dwLayoutStyles = 0;
int32_t m_iLineStart = 0;
int32_t m_iLineWidth = 2000000;
wchar_t m_wParagraphBreakChar = L'\n';
diff --git a/xfa/fgas/layout/cfgas_rtfbreak.cpp b/xfa/fgas/layout/cfgas_rtfbreak.cpp
index 87bbbea..401bdfa 100644
--- a/xfa/fgas/layout/cfgas_rtfbreak.cpp
+++ b/xfa/fgas/layout/cfgas_rtfbreak.cpp
@@ -23,10 +23,10 @@
#include "xfa/fgas/layout/fgas_arabic.h"
#include "xfa/fgas/layout/fgas_linebreak.h"
-CFGAS_RTFBreak::CFGAS_RTFBreak(uint32_t dwLayoutStyles)
+CFGAS_RTFBreak::CFGAS_RTFBreak(Mask<LayoutStyle> dwLayoutStyles)
: CFGAS_Break(dwLayoutStyles) {
SetBreakStatus();
- m_bPagination = !!(m_dwLayoutStyles & FX_LAYOUTSTYLE_Pagination);
+ m_bPagination = !!(m_dwLayoutStyles & LayoutStyle::kPagination);
}
CFGAS_RTFBreak::~CFGAS_RTFBreak() = default;
@@ -150,7 +150,7 @@
}
void CFGAS_RTFBreak::AppendChar_Tab(CFGAS_Char* pCurChar) {
- if (!(m_dwLayoutStyles & FX_LAYOUTSTYLE_ExpandTab))
+ if (!(m_dwLayoutStyles & LayoutStyle::kExpandTab))
return;
int32_t& iLineWidth = m_pCurLine->m_iWidth;
diff --git a/xfa/fgas/layout/cfgas_rtfbreak.h b/xfa/fgas/layout/cfgas_rtfbreak.h
index e944516..b1b52e9 100644
--- a/xfa/fgas/layout/cfgas_rtfbreak.h
+++ b/xfa/fgas/layout/cfgas_rtfbreak.h
@@ -29,7 +29,7 @@
Distributed
};
- explicit CFGAS_RTFBreak(uint32_t dwLayoutStyles);
+ explicit CFGAS_RTFBreak(Mask<LayoutStyle> dwLayoutStyles);
~CFGAS_RTFBreak() override;
void SetLineStartPos(float fLinePos);
diff --git a/xfa/fgas/layout/cfgas_rtfbreak_unittest.cpp b/xfa/fgas/layout/cfgas_rtfbreak_unittest.cpp
index 4279146..5860add 100644
--- a/xfa/fgas/layout/cfgas_rtfbreak_unittest.cpp
+++ b/xfa/fgas/layout/cfgas_rtfbreak_unittest.cpp
@@ -24,7 +24,8 @@
ASSERT_TRUE(font_);
}
- std::unique_ptr<CFGAS_RTFBreak> CreateBreak(uint32_t layout_styles) {
+ std::unique_ptr<CFGAS_RTFBreak> CreateBreak(
+ Mask<CFGAS_Break::LayoutStyle> layout_styles) {
auto rtf_break = std::make_unique<CFGAS_RTFBreak>(layout_styles);
rtf_break->SetFont(font_);
return rtf_break;
@@ -38,8 +39,7 @@
// and must be consumed before you get any more characters ....
TEST_F(CFGAS_RTFBreakTest, AddChars) {
- auto rtf_break = CreateBreak(FX_LAYOUTSTYLE_ExpandTab);
-
+ auto rtf_break = CreateBreak(CFGAS_Break::LayoutStyle::kExpandTab);
WideString str(L"Input String.");
for (wchar_t ch : str)
EXPECT_EQ(CFGAS_Char::BreakType::kNone, rtf_break->AppendChar(ch));
@@ -63,7 +63,7 @@
}
TEST_F(CFGAS_RTFBreakTest, ControlCharacters) {
- auto rtf_break = CreateBreak(FX_LAYOUTSTYLE_ExpandTab);
+ auto rtf_break = CreateBreak(CFGAS_Break::LayoutStyle::kExpandTab);
EXPECT_EQ(CFGAS_Char::BreakType::kLine, rtf_break->AppendChar(L'\v'));
EXPECT_EQ(CFGAS_Char::BreakType::kPage, rtf_break->AppendChar(L'\f'));
EXPECT_EQ(CFGAS_Char::BreakType::kParagraph,
@@ -75,7 +75,7 @@
}
TEST_F(CFGAS_RTFBreakTest, BidiLine) {
- auto rtf_break = CreateBreak(FX_LAYOUTSTYLE_ExpandTab);
+ auto rtf_break = CreateBreak(CFGAS_Break::LayoutStyle::kExpandTab);
rtf_break->SetLineBreakTolerance(1);
rtf_break->SetFontSize(12);
diff --git a/xfa/fgas/layout/cfgas_txtbreak.cpp b/xfa/fgas/layout/cfgas_txtbreak.cpp
index aee9575..3845f11 100644
--- a/xfa/fgas/layout/cfgas_txtbreak.cpp
+++ b/xfa/fgas/layout/cfgas_txtbreak.cpp
@@ -23,6 +23,12 @@
namespace {
+struct FX_FORMCHAR {
+ uint16_t wch;
+ uint16_t wForm;
+ int32_t iWidth;
+};
+
bool IsCtrlCode(wchar_t wch) {
FX_CHARTYPE dwRet = pdfium::unicode::GetCharType(wch);
return dwRet == FX_CHARTYPE::kTab || dwRet == FX_CHARTYPE::kControl;
@@ -30,7 +36,7 @@
} // namespace
-CFGAS_TxtBreak::CFGAS_TxtBreak() : CFGAS_Break(FX_LAYOUTSTYLE_None) {}
+CFGAS_TxtBreak::CFGAS_TxtBreak() : CFGAS_Break(LayoutStyle::kNone) {}
CFGAS_TxtBreak::~CFGAS_TxtBreak() = default;
@@ -621,12 +627,6 @@
pNextLine->m_iWidth = iWidth;
}
-struct FX_FORMCHAR {
- uint16_t wch;
- uint16_t wForm;
- int32_t iWidth;
-};
-
size_t CFGAS_TxtBreak::GetDisplayPos(const Run& run,
TextCharPos* pCharPos) const {
if (run.iLength < 1)
@@ -637,7 +637,7 @@
int32_t* pWidths = run.pWidths;
int32_t iLength = run.iLength - 1;
RetainPtr<CFGAS_GEFont> pFont = run.pFont;
- uint32_t dwStyles = run.dwStyles;
+ Mask<LayoutStyle> dwStyles = run.dwStyles;
CFX_RectF rtText(*run.pRect);
bool bRTLPiece = (run.dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel) != 0;
float fFontSize = run.fFontSize;
@@ -827,7 +827,7 @@
if (!bEmptyChar || (bEmptyChar && !bSkipSpace)) {
pCharPos->m_Origin = CFX_PointF(fX, fY);
- if ((dwStyles & FX_LAYOUTSTYLE_CombText) != 0) {
+ if (!!(dwStyles & LayoutStyle::kCombText)) {
int32_t iFormWidth = pFont->GetCharWidth(wForm).value_or(iCharWidth);
float fOffset = fFontSize * (iCharWidth - iFormWidth) / 2000.0f;
pCharPos->m_Origin.x += fOffset;
@@ -893,7 +893,7 @@
CFX_RectF rect(*run.pRect);
float fFontSize = run.fFontSize;
bool bRTLPiece = !!(run.dwCharStyles & FX_TXTCHARSTYLE_OddBidiLevel);
- bool bSingleLine = !!(run.dwStyles & FX_LAYOUTSTYLE_SingleLine);
+ bool bSingleLine = !!(run.dwStyles & LayoutStyle::kSingleLine);
float fStart = bRTLPiece ? rect.right() : rect.left;
std::vector<CFX_RectF> rtArray(iLength);
diff --git a/xfa/fgas/layout/cfgas_txtbreak.h b/xfa/fgas/layout/cfgas_txtbreak.h
index ecb397b..283e8c6 100644
--- a/xfa/fgas/layout/cfgas_txtbreak.h
+++ b/xfa/fgas/layout/cfgas_txtbreak.h
@@ -56,7 +56,7 @@
int32_t iLength = 0;
RetainPtr<CFGAS_GEFont> pFont;
float fFontSize = 12.0f;
- uint32_t dwStyles = 0;
+ Mask<LayoutStyle> dwStyles = LayoutStyle::kNone;
int32_t iHorizontalScale = 100;
int32_t iVerticalScale = 100;
uint32_t dwCharStyles = 0;
diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 7fef9ea..bc29013 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -148,9 +148,9 @@
}
std::unique_ptr<CFGAS_RTFBreak> CXFA_TextLayout::CreateBreak(bool bDefault) {
- uint32_t dwStyle = FX_LAYOUTSTYLE_ExpandTab;
+ Mask<CFGAS_Break::LayoutStyle> dwStyle = CFGAS_Break::LayoutStyle::kExpandTab;
if (!bDefault)
- dwStyle |= FX_LAYOUTSTYLE_Pagination;
+ dwStyle |= CFGAS_Break::LayoutStyle::kPagination;
auto pBreak = std::make_unique<CFGAS_RTFBreak>(dwStyle);
pBreak->SetLineBreakTolerance(1);