blob: dc2a628c23fd7b81e489a0b1c2063d0ec203eb7c [file] [log] [blame]
// Copyright 2014 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
#include "xfa/fde/cfde_rendercontext.h"
#include "third_party/base/logging.h"
#include "third_party/base/ptr_util.h"
#include "xfa/fde/cfde_brush.h"
#include "xfa/fde/cfde_renderdevice.h"
#include "xfa/fde/cfde_txtedttextset.h"
#define FDE_PATHRENDER_Stroke 1
#define FDE_PATHRENDER_Fill 2
CFDE_RenderContext::CFDE_RenderContext()
: m_pRenderDevice(nullptr), m_Transform() {
m_Transform.SetIdentity();
}
CFDE_RenderContext::~CFDE_RenderContext() {}
void CFDE_RenderContext::StartRender(CFDE_RenderDevice* pRenderDevice,
CFDE_TxtEdtPage* pCanvasSet,
const CFX_Matrix& tmDoc2Device) {
if (m_pRenderDevice || !pRenderDevice || !pCanvasSet)
return;
m_pRenderDevice = pRenderDevice;
m_Transform = tmDoc2Device;
if (!m_pIterator)
m_pIterator = pdfium::MakeUnique<CFDE_VisualSetIterator>();
if (m_pIterator->AttachCanvas(pCanvasSet))
m_pIterator->FilterObjects();
}
void CFDE_RenderContext::DoRender() {
if (!m_pRenderDevice || !m_pIterator)
return;
CFX_RectF rtDocClip = m_pRenderDevice->GetClipRect();
if (rtDocClip.IsEmpty()) {
rtDocClip.left = rtDocClip.top = 0;
rtDocClip.width = (float)m_pRenderDevice->GetWidth();
rtDocClip.height = (float)m_pRenderDevice->GetHeight();
}
m_Transform.GetInverse().TransformRect(rtDocClip);
IFDE_VisualSet* pVisualSet;
FDE_TEXTEDITPIECE* pPiece;
int32_t iCount = 0;
while (true) {
pPiece = m_pIterator->GetNext(pVisualSet);
if (!pPiece || !pVisualSet)
return;
if (!rtDocClip.IntersectWith(pVisualSet->GetRect(*pPiece)))
continue;
switch (pVisualSet->GetType()) {
case FDE_VISUALOBJ_Text:
RenderText(static_cast<CFDE_TxtEdtTextSet*>(pVisualSet), pPiece);
iCount += 5;
break;
case FDE_VISUALOBJ_Canvas:
NOTREACHED();
break;
default:
break;
}
}
}
void CFDE_RenderContext::RenderText(CFDE_TxtEdtTextSet* pTextSet,
FDE_TEXTEDITPIECE* pText) {
ASSERT(m_pRenderDevice);
ASSERT(pTextSet && pText);
CFX_RetainPtr<CFGAS_GEFont> pFont = pTextSet->GetFont();
if (!pFont)
return;
int32_t iCount = pTextSet->GetDisplayPos(*pText, nullptr, false);
if (iCount < 1)
return;
if (!m_pBrush)
m_pBrush = pdfium::MakeUnique<CFDE_Brush>();
if (m_CharPos.size() < static_cast<size_t>(iCount))
m_CharPos.resize(iCount, FXTEXT_CHARPOS());
iCount = pTextSet->GetDisplayPos(*pText, m_CharPos.data(), false);
float fFontSize = pTextSet->GetFontSize();
FX_ARGB dwColor = pTextSet->GetFontColor();
m_pBrush->SetColor(dwColor);
m_pRenderDevice->DrawString(m_pBrush.get(), pFont, m_CharPos.data(), iCount,
fFontSize, &m_Transform);
}