From 5cc24654fb345189140acb4711ff981e1c720951 Mon Sep 17 00:00:00 2001 From: thestig Date: Tue, 26 Apr 2016 11:46:02 -0700 Subject: Clean up CPDF_Page. - Merge CPDF_Page::Load() into ctor. - Remove always nullptr param for CPDF_Page::ParseContent(). - Remove unneeded indirection in IPDF_RenderModule. - Delete CPDF_ParseOptions. - Fix up CPDF_Pattern. Review URL: https://codereview.chromium.org/1918113002 --- core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp | 91 ++++++++++++------------ 1 file changed, 44 insertions(+), 47 deletions(-) (limited to 'core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp') diff --git a/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp b/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp index c235fd98cb..0af1175c8e 100644 --- a/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp +++ b/core/fpdfapi/fpdf_render/fpdf_render_pattern.cpp @@ -8,7 +8,6 @@ #include "core/fpdfapi/fpdf_page/cpdf_graphicstates.h" #include "core/fpdfapi/fpdf_page/cpdf_meshstream.h" -#include "core/fpdfapi/fpdf_page/cpdf_parseoptions.h" #include "core/fpdfapi/fpdf_page/cpdf_shadingpattern.h" #include "core/fpdfapi/fpdf_page/cpdf_tilingpattern.h" #include "core/fpdfapi/fpdf_page/include/cpdf_form.h" @@ -947,7 +946,7 @@ void CPDF_RenderStatus::DrawShadingPattern(CPDF_ShadingPattern* pattern, m_pDevice->RestoreState(); return; } - CFX_Matrix matrix = pattern->m_Pattern2Form; + CFX_Matrix matrix = *pattern->pattern_to_form(); matrix.Concat(*pObj2Device); GetScaledMatrix(matrix); int alpha = pPageObj->m_GeneralState.GetAlpha(bStroke); @@ -979,15 +978,15 @@ static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, int flags) { CFX_DIBitmap* pBitmap = new CFX_DIBitmap; if (!pBitmap->Create(width, height, - pPattern->m_bColored ? FXDIB_Argb : FXDIB_8bppMask)) { + pPattern->colored() ? FXDIB_Argb : FXDIB_8bppMask)) { delete pBitmap; return NULL; } CFX_FxgeDevice bitmap_device; bitmap_device.Attach(pBitmap); pBitmap->Clear(0); - CFX_FloatRect cell_bbox = pPattern->m_BBox; - pPattern->m_Pattern2Form.TransformRect(cell_bbox); + CFX_FloatRect cell_bbox = pPattern->bbox(); + pPattern->pattern_to_form()->TransformRect(cell_bbox); pObject2Device->TransformRect(cell_bbox); CFX_FloatRect bitmap_rect(0.0f, 0.0f, (FX_FLOAT)width, (FX_FLOAT)height); CFX_Matrix mtAdjust; @@ -995,13 +994,13 @@ static CFX_DIBitmap* DrawPatternBitmap(CPDF_Document* pDoc, CFX_Matrix mtPattern2Bitmap = *pObject2Device; mtPattern2Bitmap.Concat(mtAdjust); CPDF_RenderOptions options; - if (!pPattern->m_bColored) { + if (!pPattern->colored()) options.m_ColorMode = RENDER_COLOR_ALPHA; - } + flags |= RENDER_FORCE_HALFTONE; options.m_Flags = flags; CPDF_RenderContext context(pDoc, pCache); - context.AppendLayer(pPattern->m_pForm, &mtPattern2Bitmap); + context.AppendLayer(pPattern->form(), &mtPattern2Bitmap); context.Render(&bitmap_device, &options, nullptr); return pBitmap; } @@ -1033,17 +1032,17 @@ void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, FX_FLOAT sd = FXSYS_fabs(dCTM.d); clip_box.right = clip_box.left + (int32_t)FXSYS_ceil(clip_box.Width() * sa); clip_box.bottom = clip_box.top + (int32_t)FXSYS_ceil(clip_box.Height() * sd); - CFX_Matrix mtPattern2Device = pPattern->m_Pattern2Form; + CFX_Matrix mtPattern2Device = *pPattern->pattern_to_form(); mtPattern2Device.Concat(*pObj2Device); GetScaledMatrix(mtPattern2Device); FX_BOOL bAligned = FALSE; - if (pPattern->m_BBox.left == 0 && pPattern->m_BBox.bottom == 0 && - pPattern->m_BBox.right == pPattern->m_XStep && - pPattern->m_BBox.top == pPattern->m_YStep && + if (pPattern->bbox().left == 0 && pPattern->bbox().bottom == 0 && + pPattern->bbox().right == pPattern->x_step() && + pPattern->bbox().top == pPattern->y_step() && (mtPattern2Device.IsScaled() || mtPattern2Device.Is90Rotated())) { bAligned = TRUE; } - CFX_FloatRect cell_bbox = pPattern->m_BBox; + CFX_FloatRect cell_bbox = pPattern->bbox(); mtPattern2Device.TransformRect(cell_bbox); int width = (int)FXSYS_ceil(cell_bbox.Width()); int height = (int)FXSYS_ceil(cell_bbox.Height()); @@ -1059,40 +1058,40 @@ void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, CFX_FloatRect clip_box_p(clip_box); clip_box_p.Transform(&mtDevice2Pattern); - min_col = (int)FXSYS_ceil((clip_box_p.left - pPattern->m_BBox.right) / - pPattern->m_XStep); - max_col = (int)FXSYS_floor((clip_box_p.right - pPattern->m_BBox.left) / - pPattern->m_XStep); - min_row = (int)FXSYS_ceil((clip_box_p.bottom - pPattern->m_BBox.top) / - pPattern->m_YStep); - max_row = (int)FXSYS_floor((clip_box_p.top - pPattern->m_BBox.bottom) / - pPattern->m_YStep); + min_col = (int)FXSYS_ceil((clip_box_p.left - pPattern->bbox().right) / + pPattern->x_step()); + max_col = (int)FXSYS_floor((clip_box_p.right - pPattern->bbox().left) / + pPattern->x_step()); + min_row = (int)FXSYS_ceil((clip_box_p.bottom - pPattern->bbox().top) / + pPattern->y_step()); + max_row = (int)FXSYS_floor((clip_box_p.top - pPattern->bbox().bottom) / + pPattern->y_step()); if (width > clip_box.Width() || height > clip_box.Height() || width * height > clip_box.Width() * clip_box.Height()) { CPDF_GraphicStates* pStates = NULL; - if (!pPattern->m_bColored) { + if (!pPattern->colored()) pStates = CloneObjStates(pPageObj, bStroke); - } - CPDF_Dictionary* pFormResource = NULL; - if (pPattern->m_pForm->m_pFormDict) { - pFormResource = pPattern->m_pForm->m_pFormDict->GetDictBy("Resources"); - } + + CPDF_Dictionary* pFormResource = nullptr; + if (pPattern->form()->m_pFormDict) + pFormResource = pPattern->form()->m_pFormDict->GetDictBy("Resources"); + for (int col = min_col; col <= max_col; col++) for (int row = min_row; row <= max_row; row++) { FX_FLOAT orig_x, orig_y; - orig_x = col * pPattern->m_XStep; - orig_y = row * pPattern->m_YStep; + orig_x = col * pPattern->x_step(); + orig_y = row * pPattern->y_step(); mtPattern2Device.Transform(orig_x, orig_y); CFX_Matrix matrix = *pObj2Device; matrix.Translate(orig_x - mtPattern2Device.e, orig_y - mtPattern2Device.f); m_pDevice->SaveState(); CPDF_RenderStatus status; - status.Initialize(m_pContext, m_pDevice, NULL, NULL, this, pStates, - &m_Options, pPattern->m_pForm->m_Transparency, + status.Initialize(m_pContext, m_pDevice, nullptr, nullptr, this, + pStates, &m_Options, pPattern->form()->m_Transparency, m_bDropObjects, pFormResource); - status.RenderObjectList(pPattern->m_pForm, &matrix); + status.RenderObjectList(pPattern->form(), &matrix); m_pDevice->RestoreState(); } m_pDevice->RestoreState(); @@ -1157,8 +1156,8 @@ void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, start_x = FXSYS_round(mtPattern2Device.e) + col * width - clip_box.left; start_y = FXSYS_round(mtPattern2Device.f) + row * height - clip_box.top; } else { - FX_FLOAT orig_x = col * pPattern->m_XStep; - FX_FLOAT orig_y = row * pPattern->m_YStep; + FX_FLOAT orig_x = col * pPattern->x_step(); + FX_FLOAT orig_y = row * pPattern->y_step(); mtPattern2Device.Transform(orig_x, orig_y); start_x = FXSYS_round(orig_x + left_offset) - clip_box.left; start_y = FXSYS_round(orig_y + top_offset) - clip_box.top; @@ -1171,13 +1170,12 @@ void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, uint32_t* dest_buf = (uint32_t*)(screen.GetBuffer() + screen.GetPitch() * start_y + start_x * 4); - if (pPattern->m_bColored) { + if (pPattern->colored()) *dest_buf = *src_buf; - } else { + else *dest_buf = (*(uint8_t*)src_buf << 24) | (fill_argb & 0xffffff); - } } else { - if (pPattern->m_bColored) { + if (pPattern->colored()) { screen.CompositeBitmap(start_x, start_y, width, height, pPatternBitmap, 0, 0); } else { @@ -1192,22 +1190,21 @@ void CPDF_RenderStatus::DrawTilingPattern(CPDF_TilingPattern* pPattern, m_pDevice->RestoreState(); delete pPatternBitmap; } + void CPDF_RenderStatus::DrawPathWithPattern(const CPDF_PathObject* pPathObj, const CFX_Matrix* pObj2Device, CPDF_Color* pColor, FX_BOOL bStroke) { CPDF_Pattern* pattern = pColor->GetPattern(); - if (!pattern) { + if (!pattern) return; - } - if (pattern->m_PatternType == CPDF_Pattern::TILING) { - DrawTilingPattern(static_cast(pattern), pPathObj, - pObj2Device, bStroke); - } else { - DrawShadingPattern(static_cast(pattern), pPathObj, - pObj2Device, bStroke); - } + + if (CPDF_TilingPattern* pTilingPattern = pattern->AsTilingPattern()) + DrawTilingPattern(pTilingPattern, pPathObj, pObj2Device, bStroke); + else if (CPDF_ShadingPattern* pShadingPattern = pattern->AsShadingPattern()) + DrawShadingPattern(pShadingPattern, pPathObj, pObj2Device, bStroke); } + void CPDF_RenderStatus::ProcessPathPattern(const CPDF_PathObject* pPathObj, const CFX_Matrix* pObj2Device, int& filltype, -- cgit v1.2.3