| Index: 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 c235fd98cb0757d59caaa6a0811c2c7c172dd95e..0af1175c8e69037ea8f829cc5ba3a32b6f657546 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<CPDF_TilingPattern*>(pattern), pPathObj,
|
| - pObj2Device, bStroke);
|
| - } else {
|
| - DrawShadingPattern(static_cast<CPDF_ShadingPattern*>(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,
|
|
|