From 39fbb7e1c2282a46d9bd3adfd030916dcb0155ef Mon Sep 17 00:00:00 2001 From: thestig Date: Thu, 12 May 2016 15:35:00 -0700 Subject: Clean up CFX_ImageTransformer. Review-Url: https://codereview.chromium.org/1973913002 --- core/fpdfapi/fpdf_font/cpdf_type3char.cpp | 38 +++++++-------- core/fpdfapi/fpdf_font/cpdf_type3char.h | 6 ++- core/fpdfapi/fpdf_font/cpdf_type3font.cpp | 6 +-- core/fpdfapi/fpdf_render/fpdf_render_image.cpp | 66 +++++++++++++------------- core/fpdfapi/fpdf_render/fpdf_render_text.cpp | 31 ++++++------ 5 files changed, 71 insertions(+), 76 deletions(-) (limited to 'core/fpdfapi') diff --git a/core/fpdfapi/fpdf_font/cpdf_type3char.cpp b/core/fpdfapi/fpdf_font/cpdf_type3char.cpp index 44219ee02d..9bfda99fd1 100644 --- a/core/fpdfapi/fpdf_font/cpdf_type3char.cpp +++ b/core/fpdfapi/fpdf_font/cpdf_type3char.cpp @@ -13,31 +13,27 @@ #include "core/fxge/include/fx_dib.h" CPDF_Type3Char::CPDF_Type3Char(CPDF_Form* pForm) - : m_pForm(pForm), m_pBitmap(nullptr), m_bColored(FALSE) {} + : m_pForm(pForm), m_bColored(FALSE) {} CPDF_Type3Char::~CPDF_Type3Char() { - delete m_pForm; - delete m_pBitmap; } FX_BOOL CPDF_Type3Char::LoadBitmap(CPDF_RenderContext* pContext) { - if (m_pBitmap || !m_pForm) { + if (m_pBitmap || !m_pForm) return TRUE; - } - if (m_pForm->GetPageObjectList()->size() == 1 && !m_bColored) { - auto& pPageObj = m_pForm->GetPageObjectList()->front(); - if (pPageObj->IsImage()) { - m_ImageMatrix = pPageObj->AsImage()->m_Matrix; - const CFX_DIBSource* pSource = - pPageObj->AsImage()->m_pImage->LoadDIBSource(); - if (pSource) { - m_pBitmap = pSource->Clone(); - delete pSource; - } - delete m_pForm; - m_pForm = NULL; - return TRUE; - } - } - return FALSE; + + if (m_pForm->GetPageObjectList()->size() != 1 || m_bColored) + return FALSE; + + auto& pPageObj = m_pForm->GetPageObjectList()->front(); + if (!pPageObj->IsImage()) + return FALSE; + + m_ImageMatrix = pPageObj->AsImage()->m_Matrix; + std::unique_ptr pSource( + pPageObj->AsImage()->m_pImage->LoadDIBSource()); + if (pSource) + m_pBitmap.reset(pSource->Clone()); + m_pForm.reset(); + return TRUE; } diff --git a/core/fpdfapi/fpdf_font/cpdf_type3char.h b/core/fpdfapi/fpdf_font/cpdf_type3char.h index c67620b5f6..7b101d3172 100644 --- a/core/fpdfapi/fpdf_font/cpdf_type3char.h +++ b/core/fpdfapi/fpdf_font/cpdf_type3char.h @@ -7,6 +7,8 @@ #ifndef CORE_FPDFAPI_FPDF_FONT_CPDF_TYPE3CHAR_H_ #define CORE_FPDFAPI_FPDF_FONT_CPDF_TYPE3CHAR_H_ +#include + #include "core/fxcrt/include/fx_coordinates.h" #include "core/fxcrt/include/fx_system.h" @@ -22,8 +24,8 @@ class CPDF_Type3Char { FX_BOOL LoadBitmap(CPDF_RenderContext* pContext); - CPDF_Form* m_pForm; - CFX_DIBitmap* m_pBitmap; + std::unique_ptr m_pForm; + std::unique_ptr m_pBitmap; FX_BOOL m_bColored; int m_Width; CFX_Matrix m_ImageMatrix; diff --git a/core/fpdfapi/fpdf_font/cpdf_type3font.cpp b/core/fpdfapi/fpdf_font/cpdf_type3font.cpp index be280948ae..6c339ea5a7 100644 --- a/core/fpdfapi/fpdf_font/cpdf_type3font.cpp +++ b/core/fpdfapi/fpdf_font/cpdf_type3font.cpp @@ -136,10 +136,8 @@ CPDF_Type3Char* CPDF_Type3Font::LoadChar(uint32_t charcode, int level) { ASSERT(!pdfium::ContainsKey(m_CacheMap, charcode)); CPDF_Type3Char* pCachedChar = pNewChar.release(); m_CacheMap[charcode] = pCachedChar; - if (pCachedChar->m_pForm->GetPageObjectList()->empty()) { - delete pCachedChar->m_pForm; - pCachedChar->m_pForm = nullptr; - } + if (pCachedChar->m_pForm->GetPageObjectList()->empty()) + pCachedChar->m_pForm.reset(); return pCachedChar; } diff --git a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp index 17851b8b4b..53c40b66ee 100644 --- a/core/fpdfapi/fpdf_render/fpdf_render_image.cpp +++ b/core/fpdfapi/fpdf_render/fpdf_render_image.cpp @@ -699,6 +699,7 @@ FX_BOOL CPDF_ImageRenderer::DrawMaskedImage() { rect.top, m_BlendType); return FALSE; } + FX_BOOL CPDF_ImageRenderer::StartDIBSource() { if (!(m_Flags & RENDER_FORCE_DOWNSAMPLE) && m_pDIBSource->GetBPP() > 1) { int image_size = m_pDIBSource->GetBPP() / 8 * m_pDIBSource->GetWidth() * @@ -710,7 +711,7 @@ FX_BOOL CPDF_ImageRenderer::StartDIBSource() { } if (m_pRenderStatus->m_pDevice->StartDIBits( m_pDIBSource, m_BitmapAlpha, m_FillArgb, &m_ImageMatrix, m_Flags, - m_DeviceHandle, 0, NULL, m_BlendType)) { + m_DeviceHandle, 0, nullptr, m_BlendType)) { if (m_DeviceHandle) { m_Status = 3; return TRUE; @@ -731,30 +732,29 @@ FX_BOOL CPDF_ImageRenderer::StartDIBSource() { FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); clip_box.Intersect(image_rect); m_Status = 2; - m_pTransformer = new CFX_ImageTransformer; - m_pTransformer->Start(m_pDIBSource, &m_ImageMatrix, m_Flags, &clip_box); + m_pTransformer = new CFX_ImageTransformer(m_pDIBSource, &m_ImageMatrix, + m_Flags, &clip_box); + m_pTransformer->Start(); return TRUE; } - if (m_ImageMatrix.a < 0) { + if (m_ImageMatrix.a < 0) dest_width = -dest_width; - } - if (m_ImageMatrix.d > 0) { + + if (m_ImageMatrix.d > 0) dest_height = -dest_height; - } - int dest_left, dest_top; - dest_left = dest_width > 0 ? image_rect.left : image_rect.right; - dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom; + + int dest_left = dest_width > 0 ? image_rect.left : image_rect.right; + int dest_top = dest_height > 0 ? image_rect.top : image_rect.bottom; if (m_pDIBSource->IsOpaqueImage() && m_BitmapAlpha == 255) { if (m_pRenderStatus->m_pDevice->StretchDIBits( m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_Flags, - NULL, m_BlendType)) { + nullptr, m_BlendType)) { return FALSE; } } if (m_pDIBSource->IsAlphaMask()) { - if (m_BitmapAlpha != 255) { + if (m_BitmapAlpha != 255) m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); - } if (m_pRenderStatus->m_pDevice->StretchBitMask( m_pDIBSource, dest_left, dest_top, dest_width, dest_height, m_FillArgb, m_Flags)) { @@ -766,6 +766,7 @@ FX_BOOL CPDF_ImageRenderer::StartDIBSource() { m_Result = FALSE; return TRUE; } + FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); FX_RECT dest_rect = clip_box; dest_rect.Intersect(image_rect); @@ -781,6 +782,7 @@ FX_BOOL CPDF_ImageRenderer::StartDIBSource() { } return FALSE; } + FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() { if (m_pDIBSource->IsOpaqueImage()) { CFX_PathData path; @@ -824,46 +826,44 @@ FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() { } return FALSE; } + FX_BOOL CPDF_ImageRenderer::Continue(IFX_Pause* pPause) { if (m_Status == 2) { - if (m_pTransformer->Continue(pPause)) { + if (m_pTransformer->Continue(pPause)) return TRUE; - } - CFX_DIBitmap* pBitmap = m_pTransformer->m_Storer.Detach(); - if (!pBitmap) { + + std::unique_ptr pBitmap(m_pTransformer->DetachBitmap()); + if (!pBitmap) return FALSE; - } + if (pBitmap->IsAlphaMask()) { - if (m_BitmapAlpha != 255) { + if (m_BitmapAlpha != 255) m_FillArgb = FXARGB_MUL_ALPHA(m_FillArgb, m_BitmapAlpha); - } m_Result = m_pRenderStatus->m_pDevice->SetBitMask( - pBitmap, m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, - m_FillArgb); + pBitmap.get(), m_pTransformer->result().left, + m_pTransformer->result().top, m_FillArgb); } else { - if (m_BitmapAlpha != 255) { + if (m_BitmapAlpha != 255) pBitmap->MultiplyAlpha(m_BitmapAlpha); - } m_Result = m_pRenderStatus->m_pDevice->SetDIBits( - pBitmap, m_pTransformer->m_ResultLeft, m_pTransformer->m_ResultTop, - m_BlendType); + pBitmap.get(), m_pTransformer->result().left, + m_pTransformer->result().top, m_BlendType); } - delete pBitmap; return FALSE; } - if (m_Status == 3) { + if (m_Status == 3) return m_pRenderStatus->m_pDevice->ContinueDIBits(m_DeviceHandle, pPause); - } + if (m_Status == 4) { - if (m_Loader.Continue(m_LoadHandle, pPause)) { + if (m_Loader.Continue(m_LoadHandle, pPause)) return TRUE; - } - if (StartRenderDIBSource()) { + + if (StartRenderDIBSource()) return Continue(pPause); - } } return FALSE; } + CCodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( const uint8_t* src_buf, uint32_t src_size, diff --git a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp index acc70c001e..33ad21351e 100644 --- a/core/fpdfapi/fpdf_render/fpdf_render_text.cpp +++ b/core/fpdfapi/fpdf_render/fpdf_render_text.cpp @@ -149,6 +149,7 @@ static int _DetectFirstLastScan(const CFX_DIBitmap* pBitmap, FX_BOOL bFirst) { } return -1; } + CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, uint32_t charcode, const CFX_Matrix* pMatrix, @@ -158,12 +159,12 @@ CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, if (!pChar || !pChar->m_pBitmap) return nullptr; - CFX_DIBitmap* pBitmap = pChar->m_pBitmap; + CFX_DIBitmap* pBitmap = pChar->m_pBitmap.get(); CFX_Matrix image_matrix, text_matrix; image_matrix = pChar->m_ImageMatrix; text_matrix.Set(pMatrix->a, pMatrix->b, pMatrix->c, pMatrix->d, 0, 0); image_matrix.Concat(text_matrix); - CFX_DIBitmap* pResBitmap = NULL; + std::unique_ptr pResBitmap; int left = 0; int top = 0; if (FXSYS_fabs(image_matrix.b) < FXSYS_fabs(image_matrix.a) / 100 && @@ -180,10 +181,10 @@ CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, bottom_y = temp; } pSize->AdjustBlue(top_y, bottom_y, top_line, bottom_line); - pResBitmap = pBitmap->StretchTo( + pResBitmap.reset(pBitmap->StretchTo( (int)(FXSYS_round(image_matrix.a) * retinaScaleX), (int)((bFlipped ? top_line - bottom_line : bottom_line - top_line) * - retinaScaleY)); + retinaScaleY))); top = top_line; if (image_matrix.a < 0) { image_matrix.Scale(retinaScaleX, retinaScaleY); @@ -195,16 +196,15 @@ CFX_GlyphBitmap* CPDF_Type3Cache::RenderGlyph(CPDF_Type3Glyphs* pSize, } if (!pResBitmap) { image_matrix.Scale(retinaScaleX, retinaScaleY); - pResBitmap = pBitmap->TransformTo(&image_matrix, left, top); - } - if (!pResBitmap) { - return NULL; + pResBitmap.reset(pBitmap->TransformTo(&image_matrix, left, top)); } + if (!pResBitmap) + return nullptr; + CFX_GlyphBitmap* pGlyph = new CFX_GlyphBitmap; pGlyph->m_Left = left; pGlyph->m_Top = -top; - pGlyph->m_Bitmap.TakeOver(pResBitmap); - delete pResBitmap; + pGlyph->m_Bitmap.TakeOver(pResBitmap.get()); return pGlyph; } @@ -423,7 +423,7 @@ FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, status.m_Type3FontCache.Append(m_Type3FontCache); status.m_Type3FontCache.Add(pType3Font); m_pDevice->SaveState(); - status.RenderObjectList(pType3Char->m_pForm, &matrix); + status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); m_pDevice->RestoreState(); } else { CFX_FloatRect rect_f = pType3Char->m_pForm->CalcBoundingBox(); @@ -444,7 +444,7 @@ FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, status.m_Type3FontCache.Add(pType3Font); matrix.TranslateI(-rect.left, -rect.top); matrix.Scale(sa, sd); - status.RenderObjectList(pType3Char->m_pForm, &matrix); + status.RenderObjectList(pType3Char->m_pForm.get(), &matrix); m_pDevice->SetDIBits(bitmap_device.GetBitmap(), rect.left, rect.top); } delete pStates; @@ -470,13 +470,12 @@ FX_BOOL CPDF_RenderStatus::ProcessType3Text(const CPDF_TextObject* textobj, CFX_Matrix image_matrix = pType3Char->m_ImageMatrix; image_matrix.Concat(matrix); CPDF_ImageRenderer renderer; - if (renderer.Start(this, pType3Char->m_pBitmap, fill_argb, 255, + if (renderer.Start(this, pType3Char->m_pBitmap.get(), fill_argb, 255, &image_matrix, 0, FALSE)) { - renderer.Continue(NULL); + renderer.Continue(nullptr); } - if (!renderer.m_Result) { + if (!renderer.m_Result) return FALSE; - } } } } -- cgit v1.2.3