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,