| 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 "core/fpdfapi/fpdf_render/render_int.h" | 7 #include "core/fpdfapi/fpdf_render/render_int.h" |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "core/fpdfdoc/include/cpdf_occontext.h" | 26 #include "core/fpdfdoc/include/cpdf_occontext.h" |
| 27 #include "core/fxcodec/include/fx_codec.h" | 27 #include "core/fxcodec/include/fx_codec.h" |
| 28 #include "core/fxcrt/include/fx_safe_types.h" | 28 #include "core/fxcrt/include/fx_safe_types.h" |
| 29 #include "core/fxge/include/cfx_fxgedevice.h" | 29 #include "core/fxge/include/cfx_fxgedevice.h" |
| 30 #include "core/fxge/include/cfx_pathdata.h" | 30 #include "core/fxge/include/cfx_pathdata.h" |
| 31 | 31 |
| 32 #ifdef _SKIA_SUPPORT_ | 32 #ifdef _SKIA_SUPPORT_ |
| 33 #include "core/fxge/skia/fx_skia_device.h" | 33 #include "core/fxge/skia/fx_skia_device.h" |
| 34 #endif | 34 #endif |
| 35 | 35 |
| 36 FX_BOOL CPDF_RenderStatus::ProcessImage(const CPDF_ImageObject* pImageObj, | 36 FX_BOOL CPDF_RenderStatus::ProcessImage(CPDF_ImageObject* pImageObj, |
| 37 const CFX_Matrix* pObj2Device) { | 37 const CFX_Matrix* pObj2Device) { |
| 38 CPDF_ImageRenderer render; | 38 CPDF_ImageRenderer render; |
| 39 if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { | 39 if (render.Start(this, pImageObj, pObj2Device, m_bStdCS, m_curBlend)) { |
| 40 render.Continue(nullptr); | 40 render.Continue(nullptr); |
| 41 } | 41 } |
| 42 return render.m_Result; | 42 return render.m_Result; |
| 43 } | 43 } |
| 44 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, | 44 void CPDF_RenderStatus::CompositeDIBitmap(CFX_DIBitmap* pDIBitmap, |
| 45 int left, | 45 int left, |
| 46 int top, | 46 int top, |
| (...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 dest_height)) { | 381 dest_height)) { |
| 382 if (m_LoadHandle) { | 382 if (m_LoadHandle) { |
| 383 m_Status = 4; | 383 m_Status = 4; |
| 384 return TRUE; | 384 return TRUE; |
| 385 } | 385 } |
| 386 } | 386 } |
| 387 return FALSE; | 387 return FALSE; |
| 388 } | 388 } |
| 389 | 389 |
| 390 FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource() { | 390 FX_BOOL CPDF_ImageRenderer::StartRenderDIBSource() { |
| 391 if (!m_Loader.m_pBitmap) { | 391 if (!m_Loader.m_pBitmap) |
| 392 return FALSE; | 392 return FALSE; |
| 393 } | 393 |
| 394 m_BitmapAlpha = 255; | 394 m_BitmapAlpha = |
| 395 const CPDF_GeneralStateData* pGeneralState = | 395 FXSYS_round(255 * m_pImageObject->m_GeneralState.GetFillAlpha()); |
| 396 m_pImageObject->m_GeneralState.GetObject(); | |
| 397 if (pGeneralState) { | |
| 398 m_BitmapAlpha = FXSYS_round(pGeneralState->m_FillAlpha * 255); | |
| 399 } | |
| 400 m_pDIBSource = m_Loader.m_pBitmap; | 396 m_pDIBSource = m_Loader.m_pBitmap; |
| 401 if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && | 397 if (m_pRenderStatus->m_Options.m_ColorMode == RENDER_COLOR_ALPHA && |
| 402 !m_Loader.m_pMask) { | 398 !m_Loader.m_pMask) { |
| 403 return StartBitmapAlpha(); | 399 return StartBitmapAlpha(); |
| 404 } | 400 } |
| 405 if (pGeneralState && pGeneralState->m_pTR) { | 401 if (m_pImageObject->m_GeneralState.GetTR()) { |
| 406 if (!pGeneralState->m_pTransferFunc) { | 402 if (!m_pImageObject->m_GeneralState.GetTransferFunc()) { |
| 407 ((CPDF_GeneralStateData*)pGeneralState)->m_pTransferFunc = | 403 m_pImageObject->m_GeneralState.SetTransferFunc( |
| 408 m_pRenderStatus->GetTransferFunc(pGeneralState->m_pTR); | 404 m_pRenderStatus->GetTransferFunc( |
| 405 m_pImageObject->m_GeneralState.GetTR())); |
| 409 } | 406 } |
| 410 if (pGeneralState->m_pTransferFunc && | 407 if (m_pImageObject->m_GeneralState.GetTransferFunc() && |
| 411 !pGeneralState->m_pTransferFunc->m_bIdentity) { | 408 !m_pImageObject->m_GeneralState.GetTransferFunc()->m_bIdentity) { |
| 412 m_pDIBSource = m_Loader.m_pBitmap = | 409 m_pDIBSource = m_Loader.m_pBitmap = |
| 413 pGeneralState->m_pTransferFunc->TranslateImage(m_Loader.m_pBitmap, | 410 m_pImageObject->m_GeneralState.GetTransferFunc()->TranslateImage( |
| 414 !m_Loader.m_bCached); | 411 m_Loader.m_pBitmap, !m_Loader.m_bCached); |
| 415 if (m_Loader.m_bCached && m_Loader.m_pMask) { | 412 if (m_Loader.m_bCached && m_Loader.m_pMask) { |
| 416 m_Loader.m_pMask = m_Loader.m_pMask->Clone(); | 413 m_Loader.m_pMask = m_Loader.m_pMask->Clone(); |
| 417 } | 414 } |
| 418 m_Loader.m_bCached = FALSE; | 415 m_Loader.m_bCached = FALSE; |
| 419 } | 416 } |
| 420 } | 417 } |
| 421 m_FillArgb = 0; | 418 m_FillArgb = 0; |
| 422 m_bPatternColor = FALSE; | 419 m_bPatternColor = FALSE; |
| 423 m_pPattern = nullptr; | 420 m_pPattern = nullptr; |
| 424 if (m_pDIBSource->IsAlphaMask()) { | 421 if (m_pDIBSource->IsAlphaMask()) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 467 m_Flags |= FXDIB_NOSMOOTH; | 464 m_Flags |= FXDIB_NOSMOOTH; |
| 468 } else if (m_pImageObject->GetImage()->IsInterpol()) { | 465 } else if (m_pImageObject->GetImage()->IsInterpol()) { |
| 469 m_Flags |= FXDIB_INTERPOL; | 466 m_Flags |= FXDIB_INTERPOL; |
| 470 } | 467 } |
| 471 if (m_Loader.m_pMask) { | 468 if (m_Loader.m_pMask) { |
| 472 return DrawMaskedImage(); | 469 return DrawMaskedImage(); |
| 473 } | 470 } |
| 474 if (m_bPatternColor) { | 471 if (m_bPatternColor) { |
| 475 return DrawPatternImage(m_pObj2Device); | 472 return DrawPatternImage(m_pObj2Device); |
| 476 } | 473 } |
| 477 if (m_BitmapAlpha == 255 && pGeneralState && pGeneralState->m_FillOP && | 474 if (m_BitmapAlpha == 255 && m_pImageObject->m_GeneralState && |
| 478 pGeneralState->m_OPMode == 0 && | 475 m_pImageObject->m_GeneralState.GetFillOP() && |
| 479 pGeneralState->m_BlendType == FXDIB_BLEND_NORMAL && | 476 m_pImageObject->m_GeneralState.GetOPMode() == 0 && |
| 480 pGeneralState->m_StrokeAlpha == 1 && pGeneralState->m_FillAlpha == 1) { | 477 m_pImageObject->m_GeneralState.GetBlendType() == FXDIB_BLEND_NORMAL && |
| 478 m_pImageObject->m_GeneralState.GetStrokeAlpha() == 1.0f && |
| 479 m_pImageObject->m_GeneralState.GetFillAlpha() == 1.0f) { |
| 481 CPDF_Document* pDocument = nullptr; | 480 CPDF_Document* pDocument = nullptr; |
| 482 CPDF_Page* pPage = nullptr; | 481 CPDF_Page* pPage = nullptr; |
| 483 if (m_pRenderStatus->m_pContext->GetPageCache()) { | 482 if (m_pRenderStatus->m_pContext->GetPageCache()) { |
| 484 pPage = m_pRenderStatus->m_pContext->GetPageCache()->GetPage(); | 483 pPage = m_pRenderStatus->m_pContext->GetPageCache()->GetPage(); |
| 485 pDocument = pPage->m_pDocument; | 484 pDocument = pPage->m_pDocument; |
| 486 } else { | 485 } else { |
| 487 pDocument = m_pImageObject->GetImage()->GetDocument(); | 486 pDocument = m_pImageObject->GetImage()->GetDocument(); |
| 488 } | 487 } |
| 489 CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr; | 488 CPDF_Dictionary* pPageResources = pPage ? pPage->m_pPageResources : nullptr; |
| 490 CPDF_Object* pCSObj = | 489 CPDF_Object* pCSObj = |
| 491 m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectBy( | 490 m_pImageObject->GetImage()->GetStream()->GetDict()->GetDirectObjectBy( |
| 492 "ColorSpace"); | 491 "ColorSpace"); |
| 493 CPDF_ColorSpace* pColorSpace = | 492 CPDF_ColorSpace* pColorSpace = |
| 494 pDocument->LoadColorSpace(pCSObj, pPageResources); | 493 pDocument->LoadColorSpace(pCSObj, pPageResources); |
| 495 if (pColorSpace) { | 494 if (pColorSpace) { |
| 496 int format = pColorSpace->GetFamily(); | 495 int format = pColorSpace->GetFamily(); |
| 497 if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || | 496 if (format == PDFCS_DEVICECMYK || format == PDFCS_SEPARATION || |
| 498 format == PDFCS_DEVICEN) { | 497 format == PDFCS_DEVICEN) { |
| 499 m_BlendType = FXDIB_BLEND_DARKEN; | 498 m_BlendType = FXDIB_BLEND_DARKEN; |
| 500 } | 499 } |
| 501 pDocument->GetPageData()->ReleaseColorSpace(pCSObj); | 500 pDocument->GetPageData()->ReleaseColorSpace(pCSObj); |
| 502 } | 501 } |
| 503 } | 502 } |
| 504 return StartDIBSource(); | 503 return StartDIBSource(); |
| 505 } | 504 } |
| 506 | 505 |
| 507 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, | 506 FX_BOOL CPDF_ImageRenderer::Start(CPDF_RenderStatus* pStatus, |
| 508 const CPDF_PageObject* pObj, | 507 CPDF_PageObject* pObj, |
| 509 const CFX_Matrix* pObj2Device, | 508 const CFX_Matrix* pObj2Device, |
| 510 FX_BOOL bStdCS, | 509 FX_BOOL bStdCS, |
| 511 int blendType) { | 510 int blendType) { |
| 512 m_pRenderStatus = pStatus; | 511 m_pRenderStatus = pStatus; |
| 513 m_bStdCS = bStdCS; | 512 m_bStdCS = bStdCS; |
| 514 m_pImageObject = pObj->AsImage(); | 513 m_pImageObject = pObj->AsImage(); |
| 515 m_BlendType = blendType; | 514 m_BlendType = blendType; |
| 516 m_pObj2Device = pObj2Device; | 515 m_pObj2Device = pObj2Device; |
| 517 CPDF_Dictionary* pOC = m_pImageObject->GetImage()->GetOC(); | 516 CPDF_Dictionary* pOC = m_pImageObject->GetImage()->GetOC(); |
| 518 if (pOC && m_pRenderStatus->m_Options.m_pOCContext && | 517 if (pOC && m_pRenderStatus->m_Options.m_pOCContext && |
| (...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1068 } else if (pFunc) { | 1067 } else if (pFunc) { |
| 1069 int size = dest_pitch * height; | 1068 int size = dest_pitch * height; |
| 1070 for (int i = 0; i < size; i++) { | 1069 for (int i = 0; i < size; i++) { |
| 1071 dest_buf[i] = transfers[src_buf[i]]; | 1070 dest_buf[i] = transfers[src_buf[i]]; |
| 1072 } | 1071 } |
| 1073 } else { | 1072 } else { |
| 1074 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); | 1073 FXSYS_memcpy(dest_buf, src_buf, dest_pitch * height); |
| 1075 } | 1074 } |
| 1076 return pMask.release(); | 1075 return pMask.release(); |
| 1077 } | 1076 } |
| OLD | NEW |