| Index: core/src/fpdfapi/fpdf_render/fpdf_render.cpp
 | 
| diff --git a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
 | 
| index a2638fe7e1367c9f9158a72b7dbbcf3ddfdb3928..faf6afe7f662eb051fb65e7d86013614bc828e01 100644
 | 
| --- a/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
 | 
| +++ b/core/src/fpdfapi/fpdf_render/fpdf_render.cpp
 | 
| @@ -181,7 +181,7 @@ CPDF_RenderStatus::~CPDF_RenderStatus() {
 | 
|  
 | 
|  FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext,
 | 
|                                        CFX_RenderDevice* pDevice,
 | 
| -                                      const CFX_AffineMatrix* pDeviceMatrix,
 | 
| +                                      const CFX_Matrix* pDeviceMatrix,
 | 
|                                        const CPDF_PageObject* pStopObj,
 | 
|                                        const CPDF_RenderStatus* pParentState,
 | 
|                                        const CPDF_GraphicStates* pInitialStates,
 | 
| @@ -241,9 +241,9 @@ FX_BOOL CPDF_RenderStatus::Initialize(CPDF_RenderContext* pContext,
 | 
|    return TRUE;
 | 
|  }
 | 
|  void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs,
 | 
| -                                         const CFX_AffineMatrix* pObj2Device) {
 | 
| +                                         const CFX_Matrix* pObj2Device) {
 | 
|    CFX_FloatRect clip_rect = m_pDevice->GetClipBox();
 | 
| -  CFX_AffineMatrix device2object;
 | 
| +  CFX_Matrix device2object;
 | 
|    device2object.SetReverse(*pObj2Device);
 | 
|    device2object.TransformRect(clip_rect);
 | 
|    int index = 0;
 | 
| @@ -270,9 +270,8 @@ void CPDF_RenderStatus::RenderObjectList(const CPDF_PageObjects* pObjs,
 | 
|      }
 | 
|    }
 | 
|  }
 | 
| -void CPDF_RenderStatus::RenderSingleObject(
 | 
| -    const CPDF_PageObject* pObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device) {
 | 
| +void CPDF_RenderStatus::RenderSingleObject(const CPDF_PageObject* pObj,
 | 
| +                                           const CFX_Matrix* pObj2Device) {
 | 
|    CFX_AutoRestorer<int> restorer(&s_CurrentRecursionDepth);
 | 
|    if (++s_CurrentRecursionDepth > kRenderMaxRecursionDepth) {
 | 
|      return;
 | 
| @@ -290,10 +289,9 @@ void CPDF_RenderStatus::RenderSingleObject(
 | 
|    ProcessObjectNoClip(pObj, pObj2Device);
 | 
|  }
 | 
|  
 | 
| -FX_BOOL CPDF_RenderStatus::ContinueSingleObject(
 | 
| -    const CPDF_PageObject* pObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device,
 | 
| -    IFX_Pause* pPause) {
 | 
| +FX_BOOL CPDF_RenderStatus::ContinueSingleObject(const CPDF_PageObject* pObj,
 | 
| +                                                const CFX_Matrix* pObj2Device,
 | 
| +                                                IFX_Pause* pPause) {
 | 
|    if (m_pObjectRenderer) {
 | 
|      if (m_pObjectRenderer->Continue(pPause))
 | 
|        return TRUE;
 | 
| @@ -335,11 +333,10 @@ IPDF_ObjectRenderer* IPDF_ObjectRenderer::Create(int type) {
 | 
|    }
 | 
|    return new CPDF_ImageRenderer;
 | 
|  }
 | 
| -FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(
 | 
| -    const CPDF_PageObject* pObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device,
 | 
| -    FX_BOOL bLogical,
 | 
| -    FX_RECT& rect) const {
 | 
| +FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(const CPDF_PageObject* pObj,
 | 
| +                                                const CFX_Matrix* pObj2Device,
 | 
| +                                                FX_BOOL bLogical,
 | 
| +                                                FX_RECT& rect) const {
 | 
|    rect = pObj->GetBBox(pObj2Device);
 | 
|    FX_RECT rtClip = m_pDevice->GetClipBox();
 | 
|    if (!bLogical) {
 | 
| @@ -359,7 +356,7 @@ FX_BOOL CPDF_RenderStatus::GetObjectClippedRect(
 | 
|    return rect.IsEmpty();
 | 
|  }
 | 
|  void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj,
 | 
| -                                         const CFX_AffineMatrix* pObj2Device) {
 | 
| +                                         const CFX_Matrix* pObj2Device) {
 | 
|    CFX_DIBitmap* pBitmap = m_pDevice->GetBitmap();
 | 
|    if (pBitmap == NULL) {
 | 
|      return;
 | 
| @@ -380,9 +377,8 @@ void CPDF_RenderStatus::DitherObjectArea(const CPDF_PageObject* pObj,
 | 
|      pBitmap->DitherFS(pal, 16, &rect);
 | 
|    }
 | 
|  }
 | 
| -void CPDF_RenderStatus::ProcessObjectNoClip(
 | 
| -    const CPDF_PageObject* pObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device) {
 | 
| +void CPDF_RenderStatus::ProcessObjectNoClip(const CPDF_PageObject* pObj,
 | 
| +                                            const CFX_Matrix* pObj2Device) {
 | 
|    FX_BOOL bRet = FALSE;
 | 
|    switch (pObj->m_Type) {
 | 
|      case PDFPAGE_TEXT:
 | 
| @@ -405,9 +401,8 @@ void CPDF_RenderStatus::ProcessObjectNoClip(
 | 
|      DrawObjWithBackground(pObj, pObj2Device);
 | 
|    }
 | 
|  }
 | 
| -FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(
 | 
| -    const CPDF_PageObject* pObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device) {
 | 
| +FX_BOOL CPDF_RenderStatus::DrawObjWithBlend(const CPDF_PageObject* pObj,
 | 
| +                                            const CFX_Matrix* pObj2Device) {
 | 
|    FX_BOOL bRet = FALSE;
 | 
|    switch (pObj->m_Type) {
 | 
|      case PDFPAGE_PATH:
 | 
| @@ -427,9 +422,8 @@ void CPDF_RenderStatus::GetScaledMatrix(CFX_Matrix& matrix) const {
 | 
|    matrix.a *= FXSYS_fabs(dCTM.a);
 | 
|    matrix.d *= FXSYS_fabs(dCTM.d);
 | 
|  }
 | 
| -void CPDF_RenderStatus::DrawObjWithBackground(
 | 
| -    const CPDF_PageObject* pObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device) {
 | 
| +void CPDF_RenderStatus::DrawObjWithBackground(const CPDF_PageObject* pObj,
 | 
| +                                              const CFX_Matrix* pObj2Device) {
 | 
|    FX_RECT rect;
 | 
|    if (GetObjectClippedRect(pObj, pObj2Device, FALSE, rect)) {
 | 
|      return;
 | 
| @@ -443,7 +437,7 @@ void CPDF_RenderStatus::DrawObjWithBackground(
 | 
|    if (!buffer.Initialize(m_pContext, m_pDevice, &rect, pObj, &m_Options, res)) {
 | 
|      return;
 | 
|    }
 | 
| -  CFX_AffineMatrix matrix = *pObj2Device;
 | 
| +  CFX_Matrix matrix = *pObj2Device;
 | 
|    matrix.Concat(*buffer.GetMatrix());
 | 
|    GetScaledMatrix(matrix);
 | 
|    CPDF_Dictionary* pFormResource = NULL;
 | 
| @@ -462,14 +456,14 @@ void CPDF_RenderStatus::DrawObjWithBackground(
 | 
|    buffer.OutputToDevice();
 | 
|  }
 | 
|  FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj,
 | 
| -                                       const CFX_AffineMatrix* pObj2Device) {
 | 
| +                                       const CFX_Matrix* pObj2Device) {
 | 
|    CPDF_Dictionary* pOC =
 | 
|        pFormObj->m_pForm->m_pFormDict->GetDict(FX_BSTRC("OC"));
 | 
|    if (pOC && m_Options.m_pOCContext &&
 | 
|        !m_Options.m_pOCContext->CheckOCGVisible(pOC)) {
 | 
|      return TRUE;
 | 
|    }
 | 
| -  CFX_AffineMatrix matrix = pFormObj->m_FormMatrix;
 | 
| +  CFX_Matrix matrix = pFormObj->m_FormMatrix;
 | 
|    matrix.Concat(*pObj2Device);
 | 
|    CPDF_Dictionary* pResources = NULL;
 | 
|    if (pFormObj->m_pForm && pFormObj->m_pForm->m_pFormDict) {
 | 
| @@ -486,7 +480,7 @@ FX_BOOL CPDF_RenderStatus::ProcessForm(CPDF_FormObject* pFormObj,
 | 
|    m_pDevice->RestoreState();
 | 
|    return TRUE;
 | 
|  }
 | 
| -FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix) {
 | 
| +FX_BOOL IsAvailableMatrix(const CFX_Matrix& matrix) {
 | 
|    if (matrix.a == 0 || matrix.d == 0) {
 | 
|      return matrix.b != 0 && matrix.c != 0;
 | 
|    }
 | 
| @@ -496,7 +490,7 @@ FX_BOOL IsAvailableMatrix(const CFX_AffineMatrix& matrix) {
 | 
|    return TRUE;
 | 
|  }
 | 
|  FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj,
 | 
| -                                       const CFX_AffineMatrix* pObj2Device) {
 | 
| +                                       const CFX_Matrix* pObj2Device) {
 | 
|    int FillType = pPathObj->m_FillType;
 | 
|    FX_BOOL bStroke = pPathObj->m_bStroke;
 | 
|    ProcessPathPattern(pPathObj, pObj2Device, FillType, bStroke);
 | 
| @@ -511,7 +505,7 @@ FX_BOOL CPDF_RenderStatus::ProcessPath(CPDF_PathObject* pPathObj,
 | 
|    if (bStroke) {
 | 
|      stroke_argb = GetStrokeArgb(pPathObj);
 | 
|    }
 | 
| -  CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
 | 
| +  CFX_Matrix path_matrix = pPathObj->m_Matrix;
 | 
|    path_matrix.Concat(*pObj2Device);
 | 
|    if (!IsAvailableMatrix(path_matrix)) {
 | 
|      return TRUE;
 | 
| @@ -623,7 +617,7 @@ FX_ARGB CPDF_RenderStatus::GetStrokeArgb(const CPDF_PageObject* pObj) const {
 | 
|    return m_Options.TranslateColor(ArgbEncode(alpha, rgb));
 | 
|  }
 | 
|  void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath,
 | 
| -                                        const CFX_AffineMatrix* pObj2Device) {
 | 
| +                                        const CFX_Matrix* pObj2Device) {
 | 
|    if (ClipPath.IsNull()) {
 | 
|      if (!m_LastClipPath.IsNull()) {
 | 
|        m_pDevice->RestoreState(TRUE);
 | 
| @@ -683,7 +677,7 @@ void CPDF_RenderStatus::ProcessClipPath(CPDF_ClipPath ClipPath,
 | 
|  }
 | 
|  
 | 
|  void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath,
 | 
| -                                     const CFX_AffineMatrix* pObj2Device) {
 | 
| +                                     const CFX_Matrix* pObj2Device) {
 | 
|    if (ClipPath.IsNull()) {
 | 
|      return;
 | 
|    }
 | 
| @@ -707,9 +701,9 @@ void CPDF_RenderStatus::DrawClipPath(CPDF_ClipPath ClipPath,
 | 
|    }
 | 
|  }
 | 
|  FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj,
 | 
| -                                          const CFX_AffineMatrix* pObj2Device,
 | 
| +                                          const CFX_Matrix* pObj2Device,
 | 
|                                            FX_BOOL bStroke) {
 | 
| -  CFX_AffineMatrix path_matrix = pPathObj->m_Matrix;
 | 
| +  CFX_Matrix path_matrix = pPathObj->m_Matrix;
 | 
|    path_matrix.Concat(*pObj2Device);
 | 
|    if (bStroke) {
 | 
|      CFX_GraphStateData graphState(*pPathObj->m_GraphState);
 | 
| @@ -725,9 +719,8 @@ FX_BOOL CPDF_RenderStatus::SelectClipPath(CPDF_PathObject* pPathObj,
 | 
|    }
 | 
|    return m_pDevice->SetClip_PathFill(pPathObj->m_Path, &path_matrix, fill_mode);
 | 
|  }
 | 
| -FX_BOOL CPDF_RenderStatus::ProcessTransparency(
 | 
| -    const CPDF_PageObject* pPageObj,
 | 
| -    const CFX_AffineMatrix* pObj2Device) {
 | 
| +FX_BOOL CPDF_RenderStatus::ProcessTransparency(const CPDF_PageObject* pPageObj,
 | 
| +                                               const CFX_Matrix* pObj2Device) {
 | 
|    const CPDF_GeneralStateData* pGeneralState = pPageObj->m_GeneralState;
 | 
|    int blend_type =
 | 
|        pGeneralState ? pGeneralState->m_BlendType : FXDIB_BLEND_NORMAL;
 | 
| @@ -838,7 +831,7 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency(
 | 
|  
 | 
|    CFX_DIBitmap* bitmap = bitmap_device.GetBitmap();
 | 
|    bitmap->Clear(0);
 | 
| -  CFX_AffineMatrix new_matrix = *pObj2Device;
 | 
| +  CFX_Matrix new_matrix = *pObj2Device;
 | 
|    new_matrix.TranslateI(-rect.left, -rect.top);
 | 
|    new_matrix.Scale(scaleX, scaleY);
 | 
|    nonstd::unique_ptr<CFX_DIBitmap> pTextMask;
 | 
| @@ -855,7 +848,7 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency(
 | 
|        if (textobj == NULL) {
 | 
|          break;
 | 
|        }
 | 
| -      CFX_AffineMatrix text_matrix;
 | 
| +      CFX_Matrix text_matrix;
 | 
|        textobj->GetTextMatrix(&text_matrix);
 | 
|        CPDF_TextRenderer::DrawTextPath(
 | 
|            &text_device, textobj->m_nChars, textobj->m_pCharCodes,
 | 
| @@ -871,7 +864,7 @@ FX_BOOL CPDF_RenderStatus::ProcessTransparency(
 | 
|    bitmap_render.ProcessObjectNoClip(pPageObj, &new_matrix);
 | 
|    m_bStopped = bitmap_render.m_bStopped;
 | 
|    if (pSMaskDict) {
 | 
| -    CFX_AffineMatrix smask_matrix;
 | 
| +    CFX_Matrix smask_matrix;
 | 
|      FXSYS_memcpy(&smask_matrix, pGeneralState->m_SMaskMatrix,
 | 
|                   sizeof smask_matrix);
 | 
|      smask_matrix.Concat(*pObj2Device);
 | 
| @@ -930,7 +923,7 @@ CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj,
 | 
|      return pBackdrop.release();
 | 
|    }
 | 
|  
 | 
| -  CFX_AffineMatrix FinalMatrix = m_DeviceMatrix;
 | 
| +  CFX_Matrix FinalMatrix = m_DeviceMatrix;
 | 
|    FinalMatrix.TranslateI(-left, -top);
 | 
|    FinalMatrix.Scale(scaleX, scaleY);
 | 
|    pBackdrop->Clear(pBackdrop->HasAlpha() ? 0 : 0xffffffff);
 | 
| @@ -943,7 +936,7 @@ CFX_DIBitmap* CPDF_RenderStatus::GetBackdrop(const CPDF_PageObject* pObj,
 | 
|  void CPDF_RenderContext::GetBackground(CFX_DIBitmap* pBuffer,
 | 
|                                         const CPDF_PageObject* pObj,
 | 
|                                         const CPDF_RenderOptions* pOptions,
 | 
| -                                       CFX_AffineMatrix* pFinalMatrix) {
 | 
| +                                       CFX_Matrix* pFinalMatrix) {
 | 
|    CFX_FxgeDevice device;
 | 
|    device.Attach(pBuffer);
 | 
|  
 | 
| @@ -994,9 +987,8 @@ void CPDF_RenderContext::Clear() {
 | 
|    m_bFirstLayer = TRUE;
 | 
|    m_ContentList.RemoveAll();
 | 
|  }
 | 
| -void CPDF_RenderContext::AppendObjectList(
 | 
| -    CPDF_PageObjects* pObjs,
 | 
| -    const CFX_AffineMatrix* pObject2Device) {
 | 
| +void CPDF_RenderContext::AppendObjectList(CPDF_PageObjects* pObjs,
 | 
| +                                          const CFX_Matrix* pObject2Device) {
 | 
|    _PDF_RenderItem* pItem = m_ContentList.AddSpace();
 | 
|    pItem->m_pObjectList = pObjs;
 | 
|    if (pObject2Device) {
 | 
| @@ -1007,19 +999,19 @@ void CPDF_RenderContext::AppendObjectList(
 | 
|  }
 | 
|  void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice,
 | 
|                                  const CPDF_RenderOptions* pOptions,
 | 
| -                                const CFX_AffineMatrix* pLastMatrix) {
 | 
| +                                const CFX_Matrix* pLastMatrix) {
 | 
|    Render(pDevice, NULL, pOptions, pLastMatrix);
 | 
|  }
 | 
|  void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice,
 | 
|                                  const CPDF_PageObject* pStopObj,
 | 
|                                  const CPDF_RenderOptions* pOptions,
 | 
| -                                const CFX_AffineMatrix* pLastMatrix) {
 | 
| +                                const CFX_Matrix* pLastMatrix) {
 | 
|    int count = m_ContentList.GetSize();
 | 
|    for (int j = 0; j < count; j++) {
 | 
|      pDevice->SaveState();
 | 
|      _PDF_RenderItem* pItem = m_ContentList.GetDataPtr(j);
 | 
|      if (pLastMatrix) {
 | 
| -      CFX_AffineMatrix FinalMatrix = pItem->m_Matrix;
 | 
| +      CFX_Matrix FinalMatrix = pItem->m_Matrix;
 | 
|        FinalMatrix.Concat(*pLastMatrix);
 | 
|        CPDF_RenderStatus status;
 | 
|        status.Initialize(this, pDevice, pLastMatrix, pStopObj, NULL, NULL,
 | 
| @@ -1051,7 +1043,7 @@ void CPDF_RenderContext::Render(CFX_RenderDevice* pDevice,
 | 
|  }
 | 
|  void CPDF_RenderContext::DrawObjectList(CFX_RenderDevice* pDevice,
 | 
|                                          CPDF_PageObjects* pObjs,
 | 
| -                                        const CFX_AffineMatrix* pObject2Device,
 | 
| +                                        const CFX_Matrix* pObject2Device,
 | 
|                                          const CPDF_RenderOptions* pOptions) {
 | 
|    AppendObjectList(pObjs, pObject2Device);
 | 
|    Render(pDevice, pOptions);
 | 
| @@ -1130,7 +1122,7 @@ void CPDF_ProgressiveRenderer::Continue(IFX_Pause* pPause) {
 | 
|            pItem->m_pObjectList->m_Transparency, FALSE, NULL);
 | 
|        m_pDevice->SaveState();
 | 
|        m_ClipRect = m_pDevice->GetClipBox();
 | 
| -      CFX_AffineMatrix device2object;
 | 
| +      CFX_Matrix device2object;
 | 
|        device2object.SetReverse(pItem->m_Matrix);
 | 
|        device2object.TransformRect(m_ClipRect);
 | 
|      }
 | 
| 
 |