OLD | NEW |
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 "core/include/fpdfapi/fpdf_module.h" | 9 #include "core/include/fpdfapi/fpdf_module.h" |
10 #include "core/include/fpdfapi/fpdf_pageobj.h" | 10 #include "core/include/fpdfapi/fpdf_pageobj.h" |
11 #include "core/include/fpdfapi/fpdf_render.h" | 11 #include "core/include/fpdfapi/fpdf_render.h" |
12 #include "core/include/fxcodec/fx_codec.h" | 12 #include "core/include/fxcodec/fx_codec.h" |
13 #include "core/include/fxcrt/fx_safe_types.h" | 13 #include "core/include/fxcrt/fx_safe_types.h" |
14 #include "core/include/fxge/fx_ge.h" | 14 #include "core/include/fxge/fx_ge.h" |
15 #include "core/src/fpdfapi/fpdf_page/pageint.h" | 15 #include "core/src/fpdfapi/fpdf_page/pageint.h" |
16 | 16 |
17 FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, | 17 FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, |
18 const CFX_AffineMatrix* pObj2Device) { | 18 const CFX_Matrix* pObj2Device) { |
19 CPDF_ImageRenderer render; | 19 CPDF_ImageRenderer render; |
20 if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { | 20 if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { |
21 render.Continue(NULL); | 21 render.Continue(NULL); |
22 } | 22 } |
23 return render.m_Result; | 23 return render.m_Result; |
24 } | 24 } |
25 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, | 25 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, |
26 int left, | 26 int left, |
27 int top, | 27 int top, |
28 FX_ARGB mask_argb, | 28 FX_ARGB mask_argb, |
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 format == PDFCS_DEVICEN) { | 464 format == PDFCS_DEVICEN) { |
465 m_BlendType = FXDIB_BLEND_DARKEN; | 465 m_BlendType = FXDIB_BLEND_DARKEN; |
466 } | 466 } |
467 pDocument->GetPageData()->ReleaseColorSpace(pCSObj); | 467 pDocument->GetPageData()->ReleaseColorSpace(pCSObj); |
468 } | 468 } |
469 } | 469 } |
470 return StartDIBSource(); | 470 return StartDIBSource(); |
471 } | 471 } |
472 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, | 472 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, |
473 const CPDF_PageObject* pObj, | 473 const CPDF_PageObject* pObj, |
474 const CFX_AffineMatrix* pObj2Device, | 474 const CFX_Matrix* pObj2Device, |
475 FX_BOOL bStdCS, | 475 FX_BOOL bStdCS, |
476 int blendType) { | 476 int blendType) { |
477 m_pRenderStatus = pStatus; | 477 m_pRenderStatus = pStatus; |
478 m_bStdCS = bStdCS; | 478 m_bStdCS = bStdCS; |
479 m_pImageObject = (CPDF_ImageObject*)pObj; | 479 m_pImageObject = (CPDF_ImageObject*)pObj; |
480 m_BlendType = blendType; | 480 m_BlendType = blendType; |
481 m_pObj2Device = pObj2Device; | 481 m_pObj2Device = pObj2Device; |
482 CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC(); | 482 CPDF_Dictionary* pOC = m_pImageObject->m_pImage->GetOC(); |
483 if (pOC && m_pRenderStatus->m_Options.m_pOCContext && | 483 if (pOC && m_pRenderStatus->m_Options.m_pOCContext && |
484 !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) { | 484 !m_pRenderStatus->m_Options.m_pOCContext->CheckOCGVisible(pOC)) { |
485 return FALSE; | 485 return FALSE; |
486 } | 486 } |
487 m_ImageMatrix = m_pImageObject->m_Matrix; | 487 m_ImageMatrix = m_pImageObject->m_Matrix; |
488 m_ImageMatrix.Concat(*pObj2Device); | 488 m_ImageMatrix.Concat(*pObj2Device); |
489 if (StartLoadDIBSource()) { | 489 if (StartLoadDIBSource()) { |
490 return TRUE; | 490 return TRUE; |
491 } | 491 } |
492 return StartRenderDIBSource(); | 492 return StartRenderDIBSource(); |
493 } | 493 } |
494 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, | 494 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, |
495 const CFX_DIBSource* pDIBSource, | 495 const CFX_DIBSource* pDIBSource, |
496 FX_ARGB bitmap_argb, | 496 FX_ARGB bitmap_argb, |
497 int bitmap_alpha, | 497 int bitmap_alpha, |
498 const CFX_AffineMatrix* pImage2Device, | 498 const CFX_Matrix* pImage2Device, |
499 FX_DWORD flags, | 499 FX_DWORD flags, |
500 FX_BOOL bStdCS, | 500 FX_BOOL bStdCS, |
501 int blendType) { | 501 int blendType) { |
502 m_pRenderStatus = pStatus; | 502 m_pRenderStatus = pStatus; |
503 m_pDIBSource = pDIBSource; | 503 m_pDIBSource = pDIBSource; |
504 m_FillArgb = bitmap_argb; | 504 m_FillArgb = bitmap_argb; |
505 m_BitmapAlpha = bitmap_alpha; | 505 m_BitmapAlpha = bitmap_alpha; |
506 m_ImageMatrix = *pImage2Device; | 506 m_ImageMatrix = *pImage2Device; |
507 m_Flags = flags; | 507 m_Flags = flags; |
508 m_bStdCS = bStdCS; | 508 m_bStdCS = bStdCS; |
509 m_BlendType = blendType; | 509 m_BlendType = blendType; |
510 return StartDIBSource(); | 510 return StartDIBSource(); |
511 } | 511 } |
512 FX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) { | 512 FX_BOOL CPDF_ImageRenderer::DrawPatternImage(const CFX_Matrix* pObj2Device) { |
513 if (m_pRenderStatus->m_bPrint && | 513 if (m_pRenderStatus->m_bPrint && |
514 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | 514 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { |
515 m_Result = FALSE; | 515 m_Result = FALSE; |
516 return FALSE; | 516 return FALSE; |
517 } | 517 } |
518 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); | 518 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); |
519 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); | 519 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); |
520 if (rect.IsEmpty()) { | 520 if (rect.IsEmpty()) { |
521 return FALSE; | 521 return FALSE; |
522 } | 522 } |
523 CFX_AffineMatrix new_matrix = m_ImageMatrix; | 523 CFX_Matrix new_matrix = m_ImageMatrix; |
524 new_matrix.TranslateI(-rect.left, -rect.top); | 524 new_matrix.TranslateI(-rect.left, -rect.top); |
525 int width = rect.Width(); | 525 int width = rect.Width(); |
526 int height = rect.Height(); | 526 int height = rect.Height(); |
527 CFX_FxgeDevice bitmap_device1; | 527 CFX_FxgeDevice bitmap_device1; |
528 if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) { | 528 if (!bitmap_device1.Create(rect.Width(), rect.Height(), FXDIB_Rgb32)) { |
529 return TRUE; | 529 return TRUE; |
530 } | 530 } |
531 bitmap_device1.GetBitmap()->Clear(0xffffff); | 531 bitmap_device1.GetBitmap()->Clear(0xffffff); |
532 { | 532 { |
533 CPDF_RenderStatus bitmap_render; | 533 CPDF_RenderStatus bitmap_render; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
610 if (m_pRenderStatus->m_bPrint && | 610 if (m_pRenderStatus->m_bPrint && |
611 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { | 611 !(m_pRenderStatus->m_pDevice->GetRenderCaps() & FXRC_BLEND_MODE)) { |
612 m_Result = FALSE; | 612 m_Result = FALSE; |
613 return FALSE; | 613 return FALSE; |
614 } | 614 } |
615 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); | 615 FX_RECT rect = m_ImageMatrix.GetUnitRect().GetOutterRect(); |
616 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); | 616 rect.Intersect(m_pRenderStatus->m_pDevice->GetClipBox()); |
617 if (rect.IsEmpty()) { | 617 if (rect.IsEmpty()) { |
618 return FALSE; | 618 return FALSE; |
619 } | 619 } |
620 CFX_AffineMatrix new_matrix = m_ImageMatrix; | 620 CFX_Matrix new_matrix = m_ImageMatrix; |
621 new_matrix.TranslateI(-rect.left, -rect.top); | 621 new_matrix.TranslateI(-rect.left, -rect.top); |
622 int width = rect.Width(); | 622 int width = rect.Width(); |
623 int height = rect.Height(); | 623 int height = rect.Height(); |
624 CFX_FxgeDevice bitmap_device1; | 624 CFX_FxgeDevice bitmap_device1; |
625 if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) { | 625 if (!bitmap_device1.Create(width, height, FXDIB_Rgb32)) { |
626 return TRUE; | 626 return TRUE; |
627 } | 627 } |
628 bitmap_device1.GetBitmap()->Clear(0xffffff); | 628 bitmap_device1.GetBitmap()->Clear(0xffffff); |
629 { | 629 { |
630 CPDF_RenderStatus bitmap_render; | 630 CPDF_RenderStatus bitmap_render; |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
894 } | 894 } |
895 ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( | 895 ICodec_ScanlineDecoder* FPDFAPI_CreateFlateDecoder( |
896 const uint8_t* src_buf, | 896 const uint8_t* src_buf, |
897 FX_DWORD src_size, | 897 FX_DWORD src_size, |
898 int width, | 898 int width, |
899 int height, | 899 int height, |
900 int nComps, | 900 int nComps, |
901 int bpc, | 901 int bpc, |
902 const CPDF_Dictionary* pParams); | 902 const CPDF_Dictionary* pParams); |
903 FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, | 903 FX_BOOL CPDF_QuickStretcher::Start(CPDF_ImageObject* pImageObj, |
904 CFX_AffineMatrix* pImage2Device, | 904 CFX_Matrix* pImage2Device, |
905 const FX_RECT* pClipBox) { | 905 const FX_RECT* pClipBox) { |
906 if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && | 906 if (FXSYS_fabs(pImage2Device->a) < FXSYS_fabs(pImage2Device->b) * 10 && |
907 FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) { | 907 FXSYS_fabs(pImage2Device->d) < FXSYS_fabs(pImage2Device->c) * 10) { |
908 return FALSE; | 908 return FALSE; |
909 } | 909 } |
910 CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect(); | 910 CFX_FloatRect image_rect_f = pImage2Device->GetUnitRect(); |
911 FX_RECT image_rect = image_rect_f.GetOutterRect(); | 911 FX_RECT image_rect = image_rect_f.GetOutterRect(); |
912 m_DestWidth = image_rect.Width(); | 912 m_DestWidth = image_rect.Width(); |
913 m_DestHeight = image_rect.Height(); | 913 m_DestHeight = image_rect.Height(); |
914 m_bFlipX = pImage2Device->a < 0; | 914 m_bFlipX = pImage2Device->a < 0; |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1035 } | 1035 } |
1036 m_LineIndex++; | 1036 m_LineIndex++; |
1037 if (pPause && pPause->NeedToPauseNow()) { | 1037 if (pPause && pPause->NeedToPauseNow()) { |
1038 return TRUE; | 1038 return TRUE; |
1039 } | 1039 } |
1040 } | 1040 } |
1041 return FALSE; | 1041 return FALSE; |
1042 } | 1042 } |
1043 CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, | 1043 CFX_DIBitmap* CPDF_RenderStatus::LoadSMask(CPDF_Dictionary* pSMaskDict, |
1044 FX_RECT* pClipRect, | 1044 FX_RECT* pClipRect, |
1045 const CFX_AffineMatrix* pMatrix) { | 1045 const CFX_Matrix* pMatrix) { |
1046 if (pSMaskDict == NULL) { | 1046 if (pSMaskDict == NULL) { |
1047 return NULL; | 1047 return NULL; |
1048 } | 1048 } |
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 nonstd::unique_ptr<CPDF_Function> pFunc; | 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.reset(CPDF_Function::Load(pFuncObj)); | 1060 pFunc.reset(CPDF_Function::Load(pFuncObj)); |
1061 | 1061 |
1062 CFX_AffineMatrix matrix = *pMatrix; | 1062 CFX_Matrix 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; |
1071 } | 1071 } |
1072 #else | 1072 #else |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1163 } else if (pFunc) { | 1163 } else if (pFunc) { |
1164 int size = dest_pitch * height; | 1164 int size = dest_pitch * height; |
1165 for (int i = 0; i < size; i++) { | 1165 for (int i = 0; i < size; i++) { |
1166 dest_buf[i] = transfers[src_buf[i]]; | 1166 dest_buf[i] = transfers[src_buf[i]]; |
1167 } | 1167 } |
1168 } else { | 1168 } else { |
1169 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); | 1169 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); |
1170 } | 1170 } |
1171 return pMask.release(); | 1171 return pMask.release(); |
1172 } | 1172 } |
OLD | NEW |