Make CPDF_RenderOptions::m_Flags a struct of booleans.
Change-Id: I4abb6fcd1e7af5701fffc200bf1af7efdfca17f1
Reviewed-on: https://pdfium-review.googlesource.com/c/44911
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp
index ceca944..d1b9268 100644
--- a/core/fpdfapi/render/cpdf_imagerenderer.cpp
+++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp
@@ -98,15 +98,15 @@
m_pDIBBase = pClone;
}
m_ResampleOptions = FXDIB_ResampleOptions();
- if (GetRenderOptions().HasFlag(RENDER_FORCE_DOWNSAMPLE))
+ if (GetRenderOptions().GetOptions().bForceDownsample)
m_ResampleOptions.bInterpolateDownsample = true;
- else if (GetRenderOptions().HasFlag(RENDER_FORCE_HALFTONE))
+ else if (GetRenderOptions().GetOptions().bForceDownsample)
m_ResampleOptions.bHalftone = true;
if (m_pRenderStatus->GetRenderDevice()->GetDeviceClass() != FXDC_DISPLAY)
HandleFilters();
- if (GetRenderOptions().HasFlag(RENDER_NOIMAGESMOOTH))
+ if (GetRenderOptions().GetOptions().bNoImageSmooth)
m_ResampleOptions.bNoSmoothing = true;
else if (m_pImageObject->GetImage()->IsInterpol())
m_ResampleOptions.bInterpolateBilinear = true;
diff --git a/core/fpdfapi/render/cpdf_progressiverenderer.cpp b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
index 74b2613..4d1fed7 100644
--- a/core/fpdfapi/render/cpdf_progressiverenderer.cpp
+++ b/core/fpdfapi/render/cpdf_progressiverenderer.cpp
@@ -82,7 +82,7 @@
pCurObj->GetRect().right >= m_ClipRect.left &&
pCurObj->GetRect().bottom <= m_ClipRect.top &&
pCurObj->GetRect().top >= m_ClipRect.bottom) {
- if (m_pOptions->HasFlag(RENDER_BREAKFORMASKS) && pCurObj->IsImage() &&
+ if (m_pOptions->GetOptions().bBreakForMasks && pCurObj->IsImage() &&
pCurObj->AsImage()->GetImage()->IsMask()) {
if (m_pDevice->GetDeviceCaps(FXDC_DEVICE_CLASS) == FXDC_PRINTER) {
m_LastObjectRendered = iter;
@@ -96,8 +96,9 @@
pCurObj, m_pCurrentLayer->m_Matrix, pPause)) {
return;
}
- if (pCurObj->IsImage() && m_pRenderStatus->GetRenderOptions().HasFlag(
- RENDER_LIMITEDIMAGECACHE)) {
+ if (pCurObj->IsImage() && m_pRenderStatus->GetRenderOptions()
+ .GetOptions()
+ .bLimitedImageCache) {
m_pContext->GetPageCache()->CacheOptimization(
m_pRenderStatus->GetRenderOptions().GetCacheSizeLimit());
}
diff --git a/core/fpdfapi/render/cpdf_rendercontext.cpp b/core/fpdfapi/render/cpdf_rendercontext.cpp
index be61188..ed684a4 100644
--- a/core/fpdfapi/render/cpdf_rendercontext.cpp
+++ b/core/fpdfapi/render/cpdf_rendercontext.cpp
@@ -81,7 +81,7 @@
status.Initialize(nullptr, nullptr);
status.RenderObjectList(layer.m_pObjectHolder.Get(), layer.m_Matrix);
}
- if (status.GetRenderOptions().HasFlag(RENDER_LIMITEDIMAGECACHE)) {
+ if (status.GetRenderOptions().GetOptions().bLimitedImageCache) {
m_pPageCache->CacheOptimization(
status.GetRenderOptions().GetCacheSizeLimit());
}
diff --git a/core/fpdfapi/render/cpdf_renderoptions.cpp b/core/fpdfapi/render/cpdf_renderoptions.cpp
index 2731ffb..11efe9e 100644
--- a/core/fpdfapi/render/cpdf_renderoptions.cpp
+++ b/core/fpdfapi/render/cpdf_renderoptions.cpp
@@ -12,7 +12,16 @@
} // namespace
-CPDF_RenderOptions::CPDF_RenderOptions() = default;
+CPDF_RenderOptions::Options::Options() = default;
+
+CPDF_RenderOptions::Options::Options(const CPDF_RenderOptions::Options& rhs) =
+ default;
+
+CPDF_RenderOptions::CPDF_RenderOptions() {
+ // TODO(thestig): Make constexpr to initialize |m_Options| once C++14 is
+ // available.
+ m_Options.bClearType = true;
+}
CPDF_RenderOptions::CPDF_RenderOptions(const CPDF_RenderOptions& rhs) = default;
diff --git a/core/fpdfapi/render/cpdf_renderoptions.h b/core/fpdfapi/render/cpdf_renderoptions.h
index 8e3a70c..a8b86d6 100644
--- a/core/fpdfapi/render/cpdf_renderoptions.h
+++ b/core/fpdfapi/render/cpdf_renderoptions.h
@@ -34,6 +34,29 @@
public:
enum Type : uint8_t { kNormal = 0, kGray, kAlpha };
+ struct Options {
+ Options();
+ Options(const Options& rhs);
+
+ bool bClearType = false;
+ bool bPrintGraphicText = false;
+ bool bForceDownsample = false;
+ bool bPrintPreview = false;
+ bool bBGRStripe = false;
+ bool bNoNativeText = false;
+ bool bForceHalftone = false;
+ bool bRectAA = false;
+ bool bFillFullcover = false;
+ bool bPrintImageText = false;
+ bool bOverprint = false;
+ bool bThinLine = false;
+ bool bBreakForMasks = false;
+ bool bNoTextSmooth = false;
+ bool bNoPathSmooth = false;
+ bool bNoImageSmooth = false;
+ bool bLimitedImageCache = false;
+ };
+
CPDF_RenderOptions();
CPDF_RenderOptions(const CPDF_RenderOptions& rhs);
~CPDF_RenderOptions();
@@ -43,9 +66,8 @@
void SetColorMode(Type mode) { m_ColorMode = mode; }
bool ColorModeIs(Type mode) const { return m_ColorMode == mode; }
- bool HasFlag(uint32_t flag) const { return !!(m_Flags & flag); }
- uint32_t GetFlags() const { return m_Flags; }
- void SetFlags(uint32_t flags) { m_Flags = flags; }
+ const Options& GetOptions() const { return m_Options; }
+ Options& GetOptions() { return m_Options; }
uint32_t GetCacheSizeLimit() const;
@@ -60,7 +82,7 @@
private:
Type m_ColorMode = kNormal;
bool m_bDrawAnnots = false;
- uint32_t m_Flags = RENDER_CLEARTYPE;
+ Options m_Options;
RetainPtr<CPDF_OCContext> m_pOCContext;
};
diff --git a/core/fpdfapi/render/cpdf_renderstatus.cpp b/core/fpdfapi/render/cpdf_renderstatus.cpp
index 9bbd298..ce0fa48 100644
--- a/core/fpdfapi/render/cpdf_renderstatus.cpp
+++ b/core/fpdfapi/render/cpdf_renderstatus.cpp
@@ -776,9 +776,8 @@
C2.GetPointsReverse(pPoints, 6);
D1.GetPointsReverse(pPoints, 9);
int fillFlags = FXFILL_WINDING | FXFILL_FULLCOVER;
- if (fill_mode & RENDER_NOPATHSMOOTH) {
+ if (bNoPathSmooth)
fillFlags |= FXFILL_NOPATHSMOOTH;
- }
pDevice->DrawPath(
&path, nullptr, nullptr,
ArgbEncode(alpha, div_colors[0].comp[0], div_colors[0].comp[1],
@@ -831,7 +830,7 @@
int max_delta;
CFX_PathData path;
CFX_RenderDevice* pDevice;
- int fill_mode;
+ int bNoPathSmooth;
int alpha;
Coon_Color patch_colors[4];
};
@@ -843,7 +842,7 @@
const CPDF_Stream* pShadingStream,
const std::vector<std::unique_ptr<CPDF_Function>>& funcs,
const CPDF_ColorSpace* pCS,
- int fill_mode,
+ bool bNoPathSmooth,
int alpha) {
ASSERT(pBitmap->GetFormat() == FXDIB_Argb);
ASSERT(type == kCoonsPatchMeshShading ||
@@ -858,7 +857,7 @@
CPDF_PatchDrawer patch;
patch.alpha = alpha;
patch.pDevice = &device;
- patch.fill_mode = fill_mode;
+ patch.bNoPathSmooth = bNoPathSmooth;
for (int i = 0; i < 13; i++) {
patch.path.AppendPoint(
@@ -922,13 +921,14 @@
}
}
-RetainPtr<CFX_DIBitmap> DrawPatternBitmap(CPDF_Document* pDoc,
- CPDF_PageRenderCache* pCache,
- CPDF_TilingPattern* pPattern,
- const CFX_Matrix& mtObject2Device,
- int width,
- int height,
- int flags) {
+RetainPtr<CFX_DIBitmap> DrawPatternBitmap(
+ CPDF_Document* pDoc,
+ CPDF_PageRenderCache* pCache,
+ CPDF_TilingPattern* pPattern,
+ const CFX_Matrix& mtObject2Device,
+ int width,
+ int height,
+ const CPDF_RenderOptions::Options& draw_options) {
auto pBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
if (!pBitmap->Create(width, height,
pPattern->colored() ? FXDIB_Argb : FXDIB_8bppMask)) {
@@ -950,8 +950,8 @@
if (!pPattern->colored())
options.SetColorMode(CPDF_RenderOptions::kAlpha);
- flags |= RENDER_FORCE_HALFTONE;
- options.SetFlags(flags);
+ options.GetOptions() = draw_options;
+ options.GetOptions().bForceHalftone = true;
CPDF_RenderContext context(pDoc, pCache);
context.AppendLayer(pPattern->form(), &mtPattern2Bitmap);
@@ -1257,11 +1257,11 @@
if (!IsAvailableMatrix(path_matrix))
return true;
- if (FillType && (m_Options.HasFlag(RENDER_RECT_AA)))
+ if (FillType && m_Options.GetOptions().bRectAA)
FillType |= FXFILL_RECT_AA;
- if (m_Options.HasFlag(RENDER_FILL_FULLCOVER))
+ if (m_Options.GetOptions().bFillFullcover)
FillType |= FXFILL_FULLCOVER;
- if (m_Options.HasFlag(RENDER_NOPATHSMOOTH))
+ if (m_Options.GetOptions().bNoPathSmooth)
FillType |= FXFILL_NOPATHSMOOTH;
if (bStroke)
FillType |= FX_FILL_STROKE;
@@ -1274,7 +1274,7 @@
FillType |= FX_FILL_TEXT_MODE;
CFX_GraphState graphState = pPathObj->m_GraphState;
- if (m_Options.HasFlag(RENDER_THINLINE))
+ if (m_Options.GetOptions().bThinLine)
graphState.SetLineWidth(0);
return m_pDevice->DrawPathWithBlend(
pPathObj->path().GetObject(), &path_matrix, graphState.GetObject(),
@@ -1394,7 +1394,7 @@
continue;
int fill_mode = FXFILL_WINDING;
- if (m_Options.HasFlag(RENDER_NOTEXTSMOOTH))
+ if (m_Options.GetOptions().bNoTextSmooth)
fill_mode |= FXFILL_NOPATHSMOOTH;
m_pDevice->SetClip_PathFill(pTextClippingPath.get(), nullptr, fill_mode);
pTextClippingPath.reset();
@@ -1420,13 +1420,13 @@
path_matrix.Concat(mtObj2Device);
if (bStroke) {
CFX_GraphState graphState = pPathObj->m_GraphState;
- if (m_Options.HasFlag(RENDER_THINLINE))
+ if (m_Options.GetOptions().bThinLine)
graphState.SetLineWidth(0);
return m_pDevice->SetClip_PathStroke(pPathObj->path().GetObject(),
&path_matrix, graphState.GetObject());
}
int fill_mode = pPathObj->filltype();
- if (m_Options.HasFlag(RENDER_NOPATHSMOOTH)) {
+ if (m_Options.GetOptions().bNoPathSmooth) {
fill_mode |= FXFILL_NOPATHSMOOTH;
}
return m_pDevice->SetClip_PathFill(pPathObj->path().GetObject(), &path_matrix,
@@ -1465,7 +1465,7 @@
pPageObj->m_ClipPath.GetTextCount() > 0 &&
m_pDevice->GetDeviceClass() == FXDC_DISPLAY &&
!(m_pDevice->GetDeviceCaps(FXDC_RENDER_CAPS) & FXRC_SOFT_CLIP));
- if ((m_Options.HasFlag(RENDER_OVERPRINT)) && pPageObj->IsImage() &&
+ if (m_Options.GetOptions().bOverprint && pPageObj->IsImage() &&
pPageObj->m_GeneralState.GetFillOP() &&
pPageObj->m_GeneralState.GetStrokeOP()) {
CPDF_Document* pDocument = nullptr;
@@ -1767,7 +1767,7 @@
}
if (textobj->m_GeneralState.GetStrokeAdjust())
flag |= FX_STROKE_ADJUST;
- if (m_Options.HasFlag(RENDER_NOTEXTSMOOTH))
+ if (m_Options.GetOptions().bNoTextSmooth)
flag |= FXFILL_NOPATHSMOOTH;
return CPDF_TextRenderer::DrawTextPath(
m_pDevice, textobj->GetCharCodes(), textobj->GetCharPositions(), pFont,
@@ -1843,10 +1843,9 @@
std::unique_ptr<CPDF_GraphicStates> pStates =
CloneObjStates(textobj, false);
CPDF_RenderOptions options = m_Options;
- uint32_t option_flags = options.GetFlags();
- option_flags |= RENDER_FORCE_HALFTONE | RENDER_RECT_AA;
- option_flags &= ~RENDER_FORCE_DOWNSAMPLE;
- options.SetFlags(option_flags);
+ options.GetOptions().bForceHalftone = true;
+ options.GetOptions().bRectAA = true;
+ options.GetOptions().bForceDownsample = false;
const CPDF_Dictionary* pFormResource = nullptr;
if (pType3Char->form() && pType3Char->form()->GetDict()) {
@@ -2095,8 +2094,8 @@
// the case of dictionary at the moment.
if (const CPDF_Stream* pStream = ToStream(pPattern->GetShadingObject())) {
DrawCoonPatchMeshes(pPattern->GetShadingType(), pBitmap, FinalMatrix,
- pStream, funcs, pColorSpace, m_Options.GetFlags(),
- alpha);
+ pStream, funcs, pColorSpace,
+ m_Options.GetOptions().bNoPathSmooth, alpha);
}
} break;
}
@@ -2257,13 +2256,13 @@
if (width * height < 16) {
RetainPtr<CFX_DIBitmap> pEnlargedBitmap =
DrawPatternBitmap(m_pContext->GetDocument(), m_pContext->GetPageCache(),
- pPattern, mtObj2Device, 8, 8, m_Options.GetFlags());
+ pPattern, mtObj2Device, 8, 8, m_Options.GetOptions());
pPatternBitmap = pEnlargedBitmap->StretchTo(
width, height, FXDIB_ResampleOptions(), nullptr);
} else {
pPatternBitmap = DrawPatternBitmap(
m_pContext->GetDocument(), m_pContext->GetPageCache(), pPattern,
- mtObj2Device, width, height, m_Options.GetFlags());
+ mtObj2Device, width, height, m_Options.GetOptions());
}
if (!pPatternBitmap)
return;
diff --git a/core/fpdfapi/render/cpdf_textrenderer.cpp b/core/fpdfapi/render/cpdf_textrenderer.cpp
index 0580732..a33a58e 100644
--- a/core/fpdfapi/render/cpdf_textrenderer.cpp
+++ b/core/fpdfapi/render/cpdf_textrenderer.cpp
@@ -121,18 +121,18 @@
return true;
int FXGE_flags = 0;
if (pOptions) {
- if (pOptions->HasFlag(RENDER_CLEARTYPE)) {
+ if (pOptions->GetOptions().bClearType) {
FXGE_flags |= FXTEXT_CLEARTYPE;
- if (pOptions->HasFlag(RENDER_BGR_STRIPE))
+ if (pOptions->GetOptions().bBGRStripe)
FXGE_flags |= FXTEXT_BGR_STRIPE;
}
- if (pOptions->HasFlag(RENDER_NOTEXTSMOOTH))
+ if (pOptions->GetOptions().bNoTextSmooth)
FXGE_flags |= FXTEXT_NOSMOOTH;
- if (pOptions->HasFlag(RENDER_PRINTGRAPHICTEXT))
+ if (pOptions->GetOptions().bPrintGraphicText)
FXGE_flags |= FXTEXT_PRINTGRAPHICTEXT;
- if (pOptions->HasFlag(RENDER_NO_NATIVETEXT))
+ if (pOptions->GetOptions().bNoNativeText)
FXGE_flags |= FXTEXT_NO_NATIVETEXT;
- if (pOptions->HasFlag(RENDER_PRINTIMAGETEXT))
+ if (pOptions->GetOptions().bPrintImageText)
FXGE_flags |= FXTEXT_PRINTIMAGETEXT;
} else {
FXGE_flags = FXTEXT_CLEARTYPE;
diff --git a/core/fpdfdoc/cpdf_annot.cpp b/core/fpdfdoc/cpdf_annot.cpp
index 8e703d5..597e5fb 100644
--- a/core/fpdfdoc/cpdf_annot.cpp
+++ b/core/fpdfdoc/cpdf_annot.cpp
@@ -444,7 +444,7 @@
return;
}
bool bPrinting = pDevice->GetDeviceClass() == FXDC_PRINTER ||
- (pOptions && (pOptions->HasFlag(RENDER_PRINTPREVIEW)));
+ (pOptions && pOptions->GetOptions().bPrintPreview);
if (bPrinting && (annot_flags & ANNOTFLAG_PRINT) == 0) {
return;
}
@@ -525,7 +525,7 @@
path.AppendRect(rect);
int fill_type = 0;
- if (pOptions && (pOptions->HasFlag(RENDER_NOPATHSMOOTH)))
+ if (pOptions && pOptions->GetOptions().bNoPathSmooth)
fill_type |= FXFILL_NOPATHSMOOTH;
pDevice->DrawPath(&path, pUser2Device, &graph_state, argb, argb, fill_type);
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 54cfa2b..5e2fab6 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -211,12 +211,7 @@
pDevice->SetClip_Rect(rect);
CPDF_RenderOptions options;
- uint32_t option_flags = options.GetFlags();
- if (flags & FPDF_LCD_TEXT)
- option_flags |= RENDER_CLEARTYPE;
- else
- option_flags &= ~RENDER_CLEARTYPE;
- options.SetFlags(option_flags);
+ options.GetOptions().bClearType = !!(flags & FPDF_LCD_TEXT);
// Grayscale output
if (flags & FPDF_GRAYSCALE)
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index f924a36..769ff2a 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -84,26 +84,14 @@
if (!pContext->m_pOptions)
pContext->m_pOptions = pdfium::MakeUnique<CPDF_RenderOptions>();
- uint32_t option_flags = pContext->m_pOptions->GetFlags();
- if (flags & FPDF_LCD_TEXT)
- option_flags |= RENDER_CLEARTYPE;
- else
- option_flags &= ~RENDER_CLEARTYPE;
-
- if (flags & FPDF_NO_NATIVETEXT)
- option_flags |= RENDER_NO_NATIVETEXT;
- if (flags & FPDF_RENDER_LIMITEDIMAGECACHE)
- option_flags |= RENDER_LIMITEDIMAGECACHE;
- if (flags & FPDF_RENDER_FORCEHALFTONE)
- option_flags |= RENDER_FORCE_HALFTONE;
- if (flags & FPDF_RENDER_NO_SMOOTHTEXT)
- option_flags |= RENDER_NOTEXTSMOOTH;
- if (flags & FPDF_RENDER_NO_SMOOTHIMAGE)
- option_flags |= RENDER_NOIMAGESMOOTH;
- if (flags & FPDF_RENDER_NO_SMOOTHPATH)
- option_flags |= RENDER_NOPATHSMOOTH;
-
- pContext->m_pOptions->SetFlags(option_flags);
+ auto& options = pContext->m_pOptions->GetOptions();
+ options.bClearType = !!(flags & FPDF_LCD_TEXT);
+ options.bNoNativeText = !!(flags & FPDF_NO_NATIVETEXT);
+ options.bLimitedImageCache = !!(flags & FPDF_RENDER_LIMITEDIMAGECACHE);
+ options.bForceHalftone = !!(flags & FPDF_RENDER_FORCEHALFTONE);
+ options.bNoTextSmooth = !!(flags & FPDF_RENDER_NO_SMOOTHTEXT);
+ options.bNoImageSmooth = !!(flags & FPDF_RENDER_NO_SMOOTHIMAGE);
+ options.bNoPathSmooth = !!(flags & FPDF_RENDER_NO_SMOOTHPATH);
// Grayscale output
if (flags & FPDF_GRAYSCALE)
@@ -547,9 +535,7 @@
pDevice->Attach(pBitmap, false, nullptr, false);
if (bHasMask) {
pContext->m_pOptions = pdfium::MakeUnique<CPDF_RenderOptions>();
- uint32_t option_flags = pContext->m_pOptions->GetFlags();
- option_flags |= RENDER_BREAKFORMASKS;
- pContext->m_pOptions->SetFlags(option_flags);
+ pContext->m_pOptions->GetOptions().bBreakForMasks = true;
}
} else {
pContext->m_pDevice = pdfium::MakeUnique<CFX_WindowsRenderDevice>(dc);
@@ -581,10 +567,7 @@
pContext = pPage->GetRenderContext();
pContext->m_pDevice = pdfium::MakeUnique<CFX_WindowsRenderDevice>(dc);
pContext->m_pOptions = pdfium::MakeUnique<CPDF_RenderOptions>();
-
- uint32_t option_flags = pContext->m_pOptions->GetFlags();
- option_flags |= RENDER_BREAKFORMASKS;
- pContext->m_pOptions->SetFlags(option_flags);
+ pContext->m_pOptions->GetOptions().bBreakForMasks = true;
RenderPageWithContext(pContext, page, start_x, start_y, size_x, size_y,
rotate, flags, true, nullptr);
diff --git a/fpdfsdk/pwl/cpwl_edit_impl.cpp b/fpdfsdk/pwl/cpwl_edit_impl.cpp
index b5df28f..efdd49e 100644
--- a/fpdfsdk/pwl/cpwl_edit_impl.cpp
+++ b/fpdfsdk/pwl/cpwl_edit_impl.cpp
@@ -48,7 +48,7 @@
CFX_PointF pos = mtUser2Device.Transform(pt);
CPDF_RenderOptions ro;
- ro.SetFlags(RENDER_CLEARTYPE);
+ ASSERT(ro.GetOptions().bClearType);
ro.SetColorMode(CPDF_RenderOptions::kNormal);
CPDF_TextRenderer::DrawTextString(pDevice, pos.x, pos.y, pFont, fFontSize,
mtUser2Device, str, crTextFill, nullptr,