From 5883300439287ab46559231ce8aed11e92bbc97c Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Fri, 26 Oct 2018 22:52:48 +0000 Subject: Replace int flags with struct FXDIB_ResampleOptions. Using bit values in an int may not be reliable, since different parts of the code can interpret the bits differently. e.g. FXDIB_DOWNSAMPLE and RENDER_FORCE_DOWNSAMPLE are defined in different places, but can be used interchangeably because they just happen to have the same value. It works but is rather fragile. Instead, use a struct of bools to explicitly define what different bits mean. Remove FXDIB_DOWNSAMPLE and friends. Change-Id: I9cf0c8f94d1ed27edf8dba22b0ab0ee67f2722cc Reviewed-on: https://pdfium-review.googlesource.com/c/44650 Commit-Queue: Lei Zhang Reviewed-by: Tom Sepez --- core/fpdfapi/render/cpdf_imagerenderer.cpp | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) (limited to 'core/fpdfapi/render/cpdf_imagerenderer.cpp') diff --git a/core/fpdfapi/render/cpdf_imagerenderer.cpp b/core/fpdfapi/render/cpdf_imagerenderer.cpp index c937ee68bb..4ab3e25a3e 100644 --- a/core/fpdfapi/render/cpdf_imagerenderer.cpp +++ b/core/fpdfapi/render/cpdf_imagerenderer.cpp @@ -97,19 +97,19 @@ bool CPDF_ImageRenderer::StartRenderDIBBase() { pClone->ConvertColorScale(0xffffff, 0); m_pDIBBase = pClone; } - m_Flags = 0; + m_ResampleOptions = FXDIB_ResampleOptions(); if (GetRenderOptions().HasFlag(RENDER_FORCE_DOWNSAMPLE)) - m_Flags |= RENDER_FORCE_DOWNSAMPLE; + m_ResampleOptions.bInterpolateDownsample = true; else if (GetRenderOptions().HasFlag(RENDER_FORCE_HALFTONE)) - m_Flags |= RENDER_FORCE_HALFTONE; + m_ResampleOptions.bHalftone = true; if (m_pRenderStatus->GetRenderDevice()->GetDeviceClass() != FXDC_DISPLAY) HandleFilters(); if (GetRenderOptions().HasFlag(RENDER_NOIMAGESMOOTH)) - m_Flags |= FXDIB_NOSMOOTH; + m_ResampleOptions.bNoSmoothing = true; else if (m_pImageObject->GetImage()->IsInterpol()) - m_Flags |= FXDIB_INTERPOL; + m_ResampleOptions.bInterpolateBilinear = true; if (m_Loader.GetMask()) return DrawMaskedImage(); @@ -176,7 +176,7 @@ bool CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, FX_ARGB bitmap_argb, int bitmap_alpha, const CFX_Matrix* pImage2Device, - uint32_t flags, + const FXDIB_ResampleOptions& options, bool bStdCS, BlendMode blendType) { m_pRenderStatus = pStatus; @@ -184,7 +184,7 @@ bool CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, m_FillArgb = bitmap_argb; m_BitmapAlpha = bitmap_alpha; m_ImageMatrix = *pImage2Device; - m_Flags = flags; + m_ResampleOptions = options; m_bStdCS = bStdCS; m_BlendType = blendType; return StartDIBBase(); @@ -222,7 +222,7 @@ void CPDF_ImageRenderer::CalculateDrawImage( CPDF_ImageRenderer image_render; if (image_render.Start(&bitmap_render, pDIBBase, 0xffffffff, 255, pNewMatrix, - m_Flags, true, BlendMode::kNormal)) { + m_ResampleOptions, true, BlendMode::kNormal)) { image_render.Continue(nullptr); } if (m_Loader.MatteColor() == 0xffffffff) @@ -333,7 +333,7 @@ bool CPDF_ImageRenderer::DrawMaskedImage() { bitmap_render.Initialize(nullptr, nullptr); CPDF_ImageRenderer image_render; if (image_render.Start(&bitmap_render, m_pDIBBase, 0, 255, &new_matrix, - m_Flags, true, BlendMode::kNormal)) { + m_ResampleOptions, true, BlendMode::kNormal)) { image_render.Continue(nullptr); } CFX_DefaultRenderDevice bitmap_device2; @@ -364,7 +364,7 @@ bool CPDF_ImageRenderer::DrawMaskedImage() { } bool CPDF_ImageRenderer::StartDIBBase() { - if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBBase->GetBPP() > 1) { + if (!m_ResampleOptions.bInterpolateDownsample && m_pDIBBase->GetBPP() > 1) { FX_SAFE_SIZE_T image_size = m_pDIBBase->GetBPP(); image_size /= 8; image_size *= m_pDIBBase->GetWidth(); @@ -373,8 +373,8 @@ bool CPDF_ImageRenderer::StartDIBBase() { return false; if (image_size.ValueOrDie() > FPDF_HUGE_IMAGE_SIZE && - !(m_Flags & RENDER_FORCE_HALFTONE)) { - m_Flags |= RENDER_FORCE_DOWNSAMPLE; + !m_ResampleOptions.bHalftone) { + m_ResampleOptions.bInterpolateDownsample = true; } } #ifdef _SKIA_SUPPORT_ @@ -382,8 +382,8 @@ bool CPDF_ImageRenderer::StartDIBBase() { if (m_pDIBBase->HasAlpha()) CFX_SkiaDeviceDriver::PreMultiply(premultiplied); if (m_pRenderStatus->GetRenderDevice()->StartDIBitsWithBlend( - premultiplied, m_BitmapAlpha, m_FillArgb, m_ImageMatrix, m_Flags, - &m_DeviceHandle, m_BlendType)) { + premultiplied, m_BitmapAlpha, m_FillArgb, m_ImageMatrix, + m_ResampleOptions, &m_DeviceHandle, m_BlendType)) { if (m_DeviceHandle) { m_Status = 3; return true; @@ -392,8 +392,8 @@ bool CPDF_ImageRenderer::StartDIBBase() { } #else if (m_pRenderStatus->GetRenderDevice()->StartDIBitsWithBlend( - m_pDIBBase, m_BitmapAlpha, m_FillArgb, m_ImageMatrix, m_Flags, - &m_DeviceHandle, m_BlendType)) { + m_pDIBBase, m_BitmapAlpha, m_FillArgb, m_ImageMatrix, + m_ResampleOptions, &m_DeviceHandle, m_BlendType)) { if (m_DeviceHandle) { m_Status = 3; return true; @@ -416,7 +416,7 @@ bool CPDF_ImageRenderer::StartDIBBase() { clip_box.Intersect(image_rect); m_Status = 2; m_pTransformer = pdfium::MakeUnique( - m_pDIBBase, m_ImageMatrix, m_Flags, &clip_box); + m_pDIBBase, m_ImageMatrix, m_ResampleOptions, &clip_box); return true; } if (m_ImageMatrix.a < 0) @@ -429,8 +429,8 @@ bool CPDF_ImageRenderer::StartDIBBase() { int dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom; if (m_pDIBBase->IsOpaqueImage() && m_BitmapAlpha == 255) { if (m_pRenderStatus->GetRenderDevice()->StretchDIBitsWithFlagsAndBlend( - m_pDIBBase, dest_left, dest_top, dest_width, dest_height, m_Flags, - m_BlendType)) { + m_pDIBBase, dest_left, dest_top, dest_width, dest_height, + m_ResampleOptions, m_BlendType)) { return false; } } @@ -439,7 +439,7 @@ bool CPDF_ImageRenderer::StartDIBBase() { m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); if (m_pRenderStatus->GetRenderDevice()->StretchBitMaskWithFlags( m_pDIBBase, dest_left, dest_top, dest_width, dest_height, - m_FillArgb, m_Flags)) { + m_FillArgb, m_ResampleOptions)) { return false; } } @@ -454,8 +454,8 @@ bool CPDF_ImageRenderer::StartDIBBase() { FX_RECT dest_clip( dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); - RetainPtr pStretched = - m_pDIBBase->StretchTo(dest_width, dest_height, m_Flags, &dest_clip); + RetainPtr pStretched = m_pDIBBase->StretchTo( + dest_width, dest_height, m_ResampleOptions, &dest_clip); if (pStretched) { m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, dest_rect.top, m_FillArgb, m_BitmapAlpha, @@ -557,7 +557,7 @@ void CPDF_ImageRenderer::HandleFilters() { if (pFilters->IsName()) { ByteString bsDecodeType = pFilters->GetString(); if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") - m_Flags |= FXRENDER_IMAGE_LOSSY; + m_ResampleOptions.bLossy = true; return; } @@ -568,7 +568,7 @@ void CPDF_ImageRenderer::HandleFilters() { for (size_t i = 0; i < pArray->size(); i++) { ByteString bsDecodeType = pArray->GetStringAt(i); if (bsDecodeType == "DCTDecode" || bsDecodeType == "JPXDecode") { - m_Flags |= FXRENDER_IMAGE_LOSSY; + m_ResampleOptions.bLossy = true; break; } } -- cgit v1.2.3