Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(351)

Side by Side Diff: core/src/fpdfapi/fpdf_render/fpdf_render_image.cpp

Issue 1406933007: Merge to XFA: Use unique_ptr and initializer lists in various render files. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « core/src/fpdfapi/fpdf_render/fpdf_render.cpp ('k') | core/src/fpdfapi/fpdf_render/render_int.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 PDFium Authors. All rights reserved. 1 // Copyright 2014 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 6
7 #include "render_int.h" 7 #include "render_int.h"
8 8
9 #include "../fpdf_page/pageint.h" 9 #include "../fpdf_page/pageint.h"
10 #include "core/include/fpdfapi/fpdf_module.h" 10 #include "core/include/fpdfapi/fpdf_module.h"
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
97 } 97 }
98 if (bClone) { 98 if (bClone) {
99 delete pClone; 99 delete pClone;
100 } 100 }
101 } 101 }
102 return; 102 return;
103 } 103 }
104 int back_left, back_top; 104 int back_left, back_top;
105 FX_RECT rect(left, top, left + pDIBitmap->GetWidth(), 105 FX_RECT rect(left, top, left + pDIBitmap->GetWidth(),
106 top + pDIBitmap->GetHeight()); 106 top + pDIBitmap->GetHeight());
107 CFX_DIBitmap* pBackdrop = 107 nonstd::unique_ptr<CFX_DIBitmap> pBackdrop(
108 GetBackdrop(m_pCurObj, rect, back_left, back_top, 108 GetBackdrop(m_pCurObj, rect, back_left, back_top,
109 blend_mode > FXDIB_BLEND_NORMAL && bIsolated); 109 blend_mode > FXDIB_BLEND_NORMAL && bIsolated));
110 if (!pBackdrop) { 110 if (!pBackdrop)
111 return; 111 return;
112 } 112
113 if (!pDIBitmap->IsAlphaMask()) 113 if (!pDIBitmap->IsAlphaMask()) {
114 pBackdrop->CompositeBitmap(left - back_left, top - back_top, 114 pBackdrop->CompositeBitmap(left - back_left, top - back_top,
115 pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), 115 pDIBitmap->GetWidth(), pDIBitmap->GetHeight(),
116 pDIBitmap, 0, 0, blend_mode); 116 pDIBitmap, 0, 0, blend_mode);
117 else 117 } else {
118 pBackdrop->CompositeMask(left - back_left, top - back_top, 118 pBackdrop->CompositeMask(left - back_left, top - back_top,
119 pDIBitmap->GetWidth(), pDIBitmap->GetHeight(), 119 pDIBitmap->GetWidth(), pDIBitmap->GetHeight(),
120 pDIBitmap, mask_argb, 0, 0, blend_mode); 120 pDIBitmap, mask_argb, 0, 0, blend_mode);
121 CFX_DIBitmap* pBackdrop1 = new CFX_DIBitmap; 121 }
122
123 nonstd::unique_ptr<CFX_DIBitmap> pBackdrop1(new CFX_DIBitmap);
122 pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(), 124 pBackdrop1->Create(pBackdrop->GetWidth(), pBackdrop->GetHeight(),
123 FXDIB_Rgb32); 125 FXDIB_Rgb32);
124 pBackdrop1->Clear((FX_DWORD)-1); 126 pBackdrop1->Clear((FX_DWORD)-1);
125 pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(), 127 pBackdrop1->CompositeBitmap(0, 0, pBackdrop->GetWidth(),
126 pBackdrop->GetHeight(), pBackdrop, 0, 0); 128 pBackdrop->GetHeight(), pBackdrop.get(), 0, 0);
127 delete pBackdrop; 129 pBackdrop = nonstd::move(pBackdrop1);
128 pBackdrop = pBackdrop1; 130 m_pDevice->SetDIBits(pBackdrop.get(), back_left, back_top);
129 m_pDevice->SetDIBits(pBackdrop, back_left, back_top);
130 delete pBackdrop;
131 } 131 }
132 FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) { 132
133 CPDF_TransferFunc::CPDF_TransferFunc(CPDF_Document* pDoc) : m_pPDFDoc(pDoc) {}
134
135 FX_COLORREF CPDF_TransferFunc::TranslateColor(FX_COLORREF rgb) const {
133 return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)], 136 return FXSYS_RGB(m_Samples[FXSYS_GetRValue(rgb)],
134 m_Samples[256 + FXSYS_GetGValue(rgb)], 137 m_Samples[256 + FXSYS_GetGValue(rgb)],
135 m_Samples[512 + FXSYS_GetBValue(rgb)]); 138 m_Samples[512 + FXSYS_GetBValue(rgb)]);
136 } 139 }
140
137 CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc, 141 CFX_DIBSource* CPDF_TransferFunc::TranslateImage(const CFX_DIBSource* pSrc,
138 FX_BOOL bAutoDropSrc) { 142 FX_BOOL bAutoDropSrc) {
139 CPDF_DIBTransferFunc* pDest = new CPDF_DIBTransferFunc(this); 143 CPDF_DIBTransferFunc* pDest = new CPDF_DIBTransferFunc(this);
140 pDest->LoadSrc(pSrc, bAutoDropSrc); 144 pDest->LoadSrc(pSrc, bAutoDropSrc);
141 return pDest; 145 return pDest;
142 } 146 }
143 147
144 CPDF_DIBTransferFunc::~CPDF_DIBTransferFunc() { 148 CPDF_DIBTransferFunc::~CPDF_DIBTransferFunc() {
145 } 149 }
146 150
(...skipping 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
763 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { 767 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) {
764 m_Result = FALSE; 768 m_Result = FALSE;
765 return TRUE; 769 return TRUE;
766 } 770 }
767 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox(); 771 FX_RECT clip_box = m_pRenderStatus->m_pDevice->GetClipBox();
768 FX_RECT dest_rect = clip_box; 772 FX_RECT dest_rect = clip_box;
769 dest_rect.Intersect(image_rect); 773 dest_rect.Intersect(image_rect);
770 FX_RECT dest_clip( 774 FX_RECT dest_clip(
771 dest_rect.left - image_rect.left, dest_rect.top - image_rect.top, 775 dest_rect.left - image_rect.left, dest_rect.top - image_rect.top,
772 dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top); 776 dest_rect.right - image_rect.left, dest_rect.bottom - image_rect.top);
773 CFX_DIBitmap* pStretched = 777 nonstd::unique_ptr<CFX_DIBitmap> pStretched(
774 m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip); 778 m_pDIBSource->StretchTo(dest_width, dest_height, m_Flags, &dest_clip));
775 if (pStretched) { 779 if (pStretched) {
776 m_pRenderStatus->CompositeDIBitmap(pStretched, dest_rect.left, 780 m_pRenderStatus->CompositeDIBitmap(pStretched.get(), dest_rect.left,
777 dest_rect.top, m_FillArgb, m_BitmapAlpha, 781 dest_rect.top, m_FillArgb, m_BitmapAlpha,
778 m_BlendType, FALSE); 782 m_BlendType, FALSE);
779 delete pStretched;
780 pStretched = NULL;
781 } 783 }
782 return FALSE; 784 return FALSE;
783 } 785 }
784 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() { 786 FX_BOOL CPDF_ImageRenderer::StartBitmapAlpha() {
785 if (m_pDIBSource->IsOpaqueImage()) { 787 if (m_pDIBSource->IsOpaqueImage()) {
786 CFX_PathData path; 788 CFX_PathData path;
787 path.AppendRect(0, 0, 1, 1); 789 path.AppendRect(0, 0, 1, 1);
788 path.Transform(&m_ImageMatrix); 790 path.Transform(&m_ImageMatrix);
789 FX_DWORD fill_color = 791 FX_DWORD fill_color =
790 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha); 792 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha);
791 m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0, 793 m_pRenderStatus->m_pDevice->DrawPath(&path, NULL, NULL, fill_color, 0,
792 FXFILL_WINDING); 794 FXFILL_WINDING);
793 } else { 795 } else {
794 const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask() 796 const CFX_DIBSource* pAlphaMask = m_pDIBSource->IsAlphaMask()
795 ? m_pDIBSource 797 ? m_pDIBSource
796 : m_pDIBSource->GetAlphaMask(); 798 : m_pDIBSource->GetAlphaMask();
797 if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f || 799 if (FXSYS_fabs(m_ImageMatrix.b) >= 0.5f ||
798 FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) { 800 FXSYS_fabs(m_ImageMatrix.c) >= 0.5f) {
799 int left, top; 801 int left, top;
800 CFX_DIBitmap* pTransformed = 802 nonstd::unique_ptr<CFX_DIBitmap> pTransformed(
801 pAlphaMask->TransformTo(&m_ImageMatrix, left, top); 803 pAlphaMask->TransformTo(&m_ImageMatrix, left, top));
802 if (pTransformed == NULL) { 804 if (!pTransformed)
803 return TRUE; 805 return TRUE;
804 } 806
805 m_pRenderStatus->m_pDevice->SetBitMask( 807 m_pRenderStatus->m_pDevice->SetBitMask(
806 pTransformed, left, top, 808 pTransformed.get(), left, top,
807 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha)); 809 ArgbEncode(0xff, m_BitmapAlpha, m_BitmapAlpha, m_BitmapAlpha));
808 delete pTransformed;
809 } else { 810 } else {
810 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect(); 811 CFX_FloatRect image_rect_f = m_ImageMatrix.GetUnitRect();
811 FX_RECT image_rect = image_rect_f.GetOutterRect(); 812 FX_RECT image_rect = image_rect_f.GetOutterRect();
812 int dest_width = 813 int dest_width =
813 m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width(); 814 m_ImageMatrix.a > 0 ? image_rect.Width() : -image_rect.Width();
814 int dest_height = 815 int dest_height =
815 m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height(); 816 m_ImageMatrix.d > 0 ? -image_rect.Height() : image_rect.Height();
816 int left = dest_width > 0 ? image_rect.left : image_rect.right; 817 int left = dest_width > 0 ? image_rect.left : image_rect.right;
817 int top = dest_height > 0 ? image_rect.top : image_rect.bottom; 818 int top = dest_height > 0 ? image_rect.top : image_rect.bottom;
818 m_pRenderStatus->m_pDevice->StretchBitMask( 819 m_pRenderStatus->m_pDevice->StretchBitMask(
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1038 } 1039 }
1039 } 1040 }
1040 return FALSE; 1041 return FALSE;
1041 } 1042 }
1042 CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, 1043 CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict,
1043 FX_RECT* pClipRect, 1044 FX_RECT* pClipRect,
1044 const CFX_AffineMatrix* pMatrix) { 1045 const CFX_AffineMatrix* pMatrix) {
1045 if (pSMaskDict == NULL) { 1046 if (pSMaskDict == NULL) {
1046 return NULL; 1047 return NULL;
1047 } 1048 }
1048 CFX_DIBitmap* pMask = NULL;
1049 int width = pClipRect->right - pClipRect->left; 1049 int width = pClipRect->right - pClipRect->left;
1050 int height = pClipRect->bottom - pClipRect->top; 1050 int height = pClipRect->bottom - pClipRect->top;
1051 FX_BOOL bLuminosity = FALSE; 1051 FX_BOOL bLuminosity = FALSE;
1052 bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha"); 1052 bLuminosity = pSMaskDict->GetConstString(FX_BSTRC("S")) != FX_BSTRC("Alpha");
1053 CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G")); 1053 CPDF_Stream* pGroup = pSMaskDict->GetStream(FX_BSTRC("G"));
1054 if (pGroup == NULL) { 1054 if (pGroup == NULL) {
1055 return NULL; 1055 return NULL;
1056 } 1056 }
1057 CPDF_Function* pFunc = NULL; 1057 nonstd::unique_ptr<CPDF_Function> pFunc;
1058 CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR")); 1058 CPDF_Object* pFuncObj = pSMaskDict->GetElementValue(FX_BSTRC("TR"));
1059 if (pFuncObj && (pFuncObj->IsDictionary() || pFuncObj->IsStream())) 1059 if (pFuncObj && (pFuncObj->IsDictionary() || pFuncObj->IsStream()))
1060 pFunc = CPDF_Function::Load(pFuncObj); 1060 pFunc.reset(CPDF_Function::Load(pFuncObj));
1061 1061
1062 CFX_AffineMatrix matrix = *pMatrix; 1062 CFX_AffineMatrix matrix = *pMatrix;
1063 matrix.TranslateI(-pClipRect->left, -pClipRect->top); 1063 matrix.TranslateI(-pClipRect->left, -pClipRect->top);
1064 CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup); 1064 CPDF_Form form(m_pContext->m_pDocument, m_pContext->m_pPageResources, pGroup);
1065 form.ParseContent(NULL, NULL, NULL, NULL); 1065 form.ParseContent(NULL, NULL, NULL, NULL);
1066 CFX_FxgeDevice bitmap_device; 1066 CFX_FxgeDevice bitmap_device;
1067 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_ 1067 #if _FXM_PLATFORM_ == _FXM_PLATFORM_APPLE_
1068 if (!bitmap_device.Create(width, height, 1068 if (!bitmap_device.Create(width, height,
1069 bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) { 1069 bLuminosity ? FXDIB_Rgb32 : FXDIB_8bppMask)) {
1070 return NULL; 1070 return NULL;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1121 if (form.m_pFormDict) { 1121 if (form.m_pFormDict) {
1122 pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources")); 1122 pFormResource = form.m_pFormDict->GetDict(FX_BSTRC("Resources"));
1123 } 1123 }
1124 CPDF_RenderOptions options; 1124 CPDF_RenderOptions options;
1125 options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA; 1125 options.m_ColorMode = bLuminosity ? RENDER_COLOR_NORMAL : RENDER_COLOR_ALPHA;
1126 CPDF_RenderStatus status; 1126 CPDF_RenderStatus status;
1127 status.Initialize(m_pContext, &bitmap_device, NULL, NULL, NULL, NULL, 1127 status.Initialize(m_pContext, &bitmap_device, NULL, NULL, NULL, NULL,
1128 &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0, 1128 &options, 0, m_bDropObjects, pFormResource, TRUE, NULL, 0,
1129 pCS ? pCS->GetFamily() : 0, bLuminosity); 1129 pCS ? pCS->GetFamily() : 0, bLuminosity);
1130 status.RenderObjectList(&form, &matrix); 1130 status.RenderObjectList(&form, &matrix);
1131 pMask = new CFX_DIBitmap; 1131 nonstd::unique_ptr<CFX_DIBitmap> pMask(new CFX_DIBitmap);
1132 if (!pMask->Create(width, height, FXDIB_8bppMask)) { 1132 if (!pMask->Create(width, height, FXDIB_8bppMask))
1133 delete pMask; 1133 return nullptr;
1134 return NULL; 1134
1135 }
1136 uint8_t* dest_buf = pMask->GetBuffer(); 1135 uint8_t* dest_buf = pMask->GetBuffer();
1137 int dest_pitch = pMask->GetPitch(); 1136 int dest_pitch = pMask->GetPitch();
1138 uint8_t* src_buf = bitmap.GetBuffer(); 1137 uint8_t* src_buf = bitmap.GetBuffer();
1139 int src_pitch = bitmap.GetPitch(); 1138 int src_pitch = bitmap.GetPitch();
1140 uint8_t* pTransfer = FX_Alloc(uint8_t, 256); 1139 std::vector<uint8_t> transfers(256);
1141 if (pFunc) { 1140 if (pFunc) {
1142 CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs()); 1141 CFX_FixedBufGrow<FX_FLOAT, 16> results(pFunc->CountOutputs());
1143 for (int i = 0; i < 256; i++) { 1142 for (int i = 0; i < 256; i++) {
1144 FX_FLOAT input = (FX_FLOAT)i / 255.0f; 1143 FX_FLOAT input = (FX_FLOAT)i / 255.0f;
1145 int nresult; 1144 int nresult;
1146 pFunc->Call(&input, 1, results, nresult); 1145 pFunc->Call(&input, 1, results, nresult);
1147 pTransfer[i] = FXSYS_round(results[0] * 255); 1146 transfers[i] = FXSYS_round(results[0] * 255);
1148 } 1147 }
1149 } else { 1148 } else {
1150 for (int i = 0; i < 256; i++) { 1149 for (int i = 0; i < 256; i++) {
1151 pTransfer[i] = i; 1150 transfers[i] = i;
1152 } 1151 }
1153 } 1152 }
1154 if (bLuminosity) { 1153 if (bLuminosity) {
1155 int Bpp = bitmap.GetBPP() / 8; 1154 int Bpp = bitmap.GetBPP() / 8;
1156 for (int row = 0; row < height; row++) { 1155 for (int row = 0; row < height; row++) {
1157 uint8_t* dest_pos = dest_buf + row * dest_pitch; 1156 uint8_t* dest_pos = dest_buf + row * dest_pitch;
1158 uint8_t* src_pos = src_buf + row * src_pitch; 1157 uint8_t* src_pos = src_buf + row * src_pitch;
1159 for (int col = 0; col < width; col++) { 1158 for (int col = 0; col < width; col++) {
1160 *dest_pos++ = pTransfer[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)]; 1159 *dest_pos++ = transfers[FXRGB2GRAY(src_pos[2], src_pos[1], *src_pos)];
1161 src_pos += Bpp; 1160 src_pos += Bpp;
1162 } 1161 }
1163 } 1162 }
1164 } else if (pFunc) { 1163 } else if (pFunc) {
1165 int size = dest_pitch * height; 1164 int size = dest_pitch * height;
1166 for (int i = 0; i < size; i++) { 1165 for (int i = 0; i < size; i++) {
1167 dest_buf[i] = pTransfer[src_buf[i]]; 1166 dest_buf[i] = transfers[src_buf[i]];
1168 } 1167 }
1169 } else { 1168 } else {
1170 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); 1169 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height);
1171 } 1170 }
1172 delete pFunc; 1171 return pMask.release();
1173 FX_Free(pTransfer);
1174 return pMask;
1175 } 1172 }
OLDNEW
« no previous file with comments | « core/src/fpdfapi/fpdf_render/fpdf_render.cpp ('k') | core/src/fpdfapi/fpdf_render/render_int.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698