| 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 | 
|  |