| Index: core/fpdfapi/fpdf_render/fpdf_render.cpp
|
| diff --git a/core/fpdfapi/fpdf_render/fpdf_render.cpp b/core/fpdfapi/fpdf_render/fpdf_render.cpp
|
| index add2a8ae23caca853034612a0976633b15633115..81a02cc6a76f5375f0e7633cdda6b2dc0e95f467 100644
|
| --- a/core/fpdfapi/fpdf_render/fpdf_render.cpp
|
| +++ b/core/fpdfapi/fpdf_render/fpdf_render.cpp
|
| @@ -213,6 +213,9 @@ FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext,
|
| void CPDF_RenderStatus::RenderObjectList(
|
| const CPDF_PageObjectHolder* pObjectHolder,
|
| const CFX_Matrix* pObj2Device) {
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| CFX_FloatRect clip_rect(m_pDevice->GetClipBox());
|
| CFX_Matrix device2object;
|
| device2object.SetReverse(*pObj2Device);
|
| @@ -236,9 +239,16 @@ void CPDF_RenderStatus::RenderObjectList(
|
| if (m_bStopped)
|
| return;
|
| }
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| }
|
| +
|
| void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj,
|
| const CFX_Matrix* pObj2Device) {
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
|
| if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) {
|
| return;
|
| @@ -254,6 +264,9 @@ void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj,
|
| return;
|
| }
|
| ProcessObjectNoClip(pObj, pObj2Device);
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| }
|
|
|
| FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj,
|
| @@ -319,6 +332,9 @@ FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj,
|
|
|
| void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj,
|
| const CFX_Matrix* pObj2Device) {
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| FX_BOOL bRet = FALSE;
|
| switch (pObj->GetType()) {
|
| case CPDF_PageObject::TEXT:
|
| @@ -339,6 +355,9 @@ void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj,
|
| }
|
| if (!bRet)
|
| DrawObjWithBackground(pObj, pObj2Device);
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| }
|
|
|
| FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj,
|
| @@ -396,8 +415,12 @@ void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj,
|
| status.RenderSingleObject(pObj, &matrix);
|
| buffer.OutputToDevice();
|
| }
|
| +
|
| FX_BOOL CPDF_RenderStatus::ProcessForm(const CPDF_FormObject* pFormObj,
|
| const CFX_Matrix* pObj2Device) {
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| CPDF_Dictionary* pOC = pFormObj->m_pForm->m_pFormDict->GetDictBy("OC");
|
| if (pOC && m_Options.m_pOCContext &&
|
| !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
|
| @@ -418,8 +441,12 @@ FX_BOOL CPDF_RenderStatus::ProcessForm(const CPDF_FormObject* pFormObj,
|
| status.RenderObjectList(pFormObj->m_pForm, &matrix);
|
| m_bStopped = status.m_bStopped;
|
| m_pDevice->RestoreState(false);
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| return TRUE;
|
| }
|
| +
|
| FX_BOOL IsAvailableMatrix(const CFX_Matrix& matrix) {
|
| if (matrix.a == 0 || matrix.d == 0) {
|
| return matrix.b != 0 && matrix.c != 0;
|
| @@ -645,6 +672,9 @@ FX_BOOL CPDF_RenderStatus::SelectClipPath(const CPDF_PathObject* pPathObj,
|
| }
|
| FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj,
|
| const CFX_Matrix* pObj2Device) {
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| const CPDF_GeneralStateData* pGeneralState =
|
| pPageObj->m_GeneralState.GetObject();
|
| int blend_type =
|
| @@ -745,12 +775,10 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj,
|
| oriDevice.reset(new CFX_DIBitmap);
|
| if (!m_pDevice->CreateCompatibleBitmap(oriDevice.get(), width, height))
|
| return TRUE;
|
| -
|
| m_pDevice->GetDIBits(oriDevice.get(), rect.left, rect.top);
|
| }
|
| if (!bitmap_device.Create(width, height, FXDIB_Argb, oriDevice.get()))
|
| return TRUE;
|
| -
|
| CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
|
| bitmap->Clear(0);
|
| CFX_Matrix new_matrix = *pObj2Device;
|
| @@ -813,6 +841,9 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj,
|
| }
|
| CompositeDIBitmap(bitmap, rect.left, rect.top, 0, blitAlpha, blend_type,
|
| Transparency);
|
| +#if defined _SKIA_SUPPORT_
|
| + DebugVerifyDeviceIsPreMultiplied();
|
| +#endif
|
| return TRUE;
|
| }
|
|
|
| @@ -1263,3 +1294,9 @@ void CPDF_ScaledRenderBuffer::OutputToDevice() {
|
| m_Rect.top, m_Rect.Width(), m_Rect.Height());
|
| }
|
| }
|
| +
|
| +#if defined _SKIA_SUPPORT_
|
| +void CPDF_RenderStatus::DebugVerifyDeviceIsPreMultiplied() const {
|
| + m_pDevice->DebugVerifyBitmapIsPreMultiplied();
|
| +}
|
| +#endif
|
|
|