summaryrefslogtreecommitdiff
path: root/xfa/fde
diff options
context:
space:
mode:
Diffstat (limited to 'xfa/fde')
-rw-r--r--xfa/fde/cfde_renderdevice.cpp159
-rw-r--r--xfa/fde/cfde_renderdevice.h48
-rw-r--r--xfa/fde/cfde_textout.cpp105
-rw-r--r--xfa/fde/cfde_textout.h13
4 files changed, 102 insertions, 223 deletions
diff --git a/xfa/fde/cfde_renderdevice.cpp b/xfa/fde/cfde_renderdevice.cpp
deleted file mode 100644
index e9457f4c5e..0000000000
--- a/xfa/fde/cfde_renderdevice.cpp
+++ /dev/null
@@ -1,159 +0,0 @@
-// 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_renderdevice.h"
-
-#include <algorithm>
-#include <memory>
-#include <utility>
-
-#include "core/fxge/cfx_graphstatedata.h"
-#include "core/fxge/cfx_pathdata.h"
-#include "core/fxge/cfx_renderdevice.h"
-#include "core/fxge/cfx_substfont.h"
-#include "core/fxge/dib/cfx_imagerenderer.h"
-#include "third_party/base/ptr_util.h"
-#include "xfa/fgas/font/cfgas_fontmgr.h"
-#include "xfa/fgas/font/cfgas_gefont.h"
-
-CFDE_RenderDevice::CFDE_RenderDevice(CFX_RenderDevice* pDevice)
- : m_pDevice(pDevice) {
- ASSERT(pDevice);
-
- FX_RECT rt = m_pDevice->GetClipBox();
- m_rtClip = CFX_RectF(static_cast<float>(rt.left), static_cast<float>(rt.top),
- static_cast<float>(rt.Width()),
- static_cast<float>(rt.Height()));
-}
-
-CFDE_RenderDevice::~CFDE_RenderDevice() {}
-
-int32_t CFDE_RenderDevice::GetWidth() const {
- return m_pDevice->GetWidth();
-}
-
-int32_t CFDE_RenderDevice::GetHeight() const {
- return m_pDevice->GetHeight();
-}
-
-void CFDE_RenderDevice::SaveState() {
- m_pDevice->SaveState();
-}
-
-void CFDE_RenderDevice::RestoreState() {
- m_pDevice->RestoreState(false);
- const FX_RECT& rt = m_pDevice->GetClipBox();
- m_rtClip = CFX_RectF(static_cast<float>(rt.left), static_cast<float>(rt.top),
- static_cast<float>(rt.Width()),
- static_cast<float>(rt.Height()));
-}
-
-bool CFDE_RenderDevice::SetClipRect(const CFX_RectF& rtClip) {
- m_rtClip = rtClip;
- return m_pDevice->SetClip_Rect(
- FX_RECT((int32_t)floor(rtClip.left), (int32_t)floor(rtClip.top),
- (int32_t)ceil(rtClip.right()), (int32_t)ceil(rtClip.bottom())));
-}
-
-const CFX_RectF& CFDE_RenderDevice::GetClipRect() {
- return m_rtClip;
-}
-
-bool CFDE_RenderDevice::DrawString(FX_ARGB color,
- const CFX_RetainPtr<CFGAS_GEFont>& pFont,
- const FXTEXT_CHARPOS* pCharPos,
- int32_t iCount,
- float fFontSize,
- const CFX_Matrix* pMatrix) {
- ASSERT(pFont && pCharPos && iCount > 0);
- CFX_Font* pFxFont = pFont->GetDevFont();
- if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 &&
- !pFxFont->IsItalic()) {
- FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
- float* pAM;
- for (int32_t i = 0; i < iCount; ++i) {
- static const float mc = 0.267949f;
- pAM = pCP->m_AdjustMatrix;
- pAM[2] = mc * pAM[0] + pAM[2];
- pAM[3] = mc * pAM[1] + pAM[3];
- pCP++;
- }
- }
- FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
- CFX_RetainPtr<CFGAS_GEFont> pCurFont;
- CFX_RetainPtr<CFGAS_GEFont> pSTFont;
- FXTEXT_CHARPOS* pCurCP = nullptr;
- int32_t iCurCount = 0;
-
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
- uint32_t dwFontStyle = pFont->GetFontStyles();
- CFX_Font FxFont;
- auto SubstFxFont = pdfium::MakeUnique<CFX_SubstFont>();
- SubstFxFont->m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400;
- SubstFxFont->m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0;
- SubstFxFont->m_WeightCJK = SubstFxFont->m_Weight;
- SubstFxFont->m_bItalicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic);
- FxFont.SetSubstFont(std::move(SubstFxFont));
-#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-
- for (int32_t i = 0; i < iCount; ++i) {
- pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex);
- pCP->m_GlyphIndex &= 0x00FFFFFF;
- pCP->m_bFontStyle = false;
- if (pCurFont != pSTFont) {
- if (pCurFont) {
- pFxFont = pCurFont->GetDevFont();
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
- FxFont.SetFace(pFxFont->GetFace());
- m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, -fFontSize,
- pMatrix, color, FXTEXT_CLEARTYPE);
-#else
- m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, -fFontSize,
- pMatrix, color, FXTEXT_CLEARTYPE);
-#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
- }
- pCurFont = pSTFont;
- pCurCP = pCP;
- iCurCount = 1;
- } else {
- iCurCount++;
- }
- pCP++;
- }
- if (pCurFont && iCurCount) {
- pFxFont = pCurFont->GetDevFont();
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
- FxFont.SetFace(pFxFont->GetFace());
- bool bRet =
- m_pDevice->DrawNormalText(iCurCount, pCurCP, &FxFont, -fFontSize,
- pMatrix, color, FXTEXT_CLEARTYPE);
- FxFont.SetFace(nullptr);
- return bRet;
-#else
- return m_pDevice->DrawNormalText(iCurCount, pCurCP, pFxFont, -fFontSize,
- pMatrix, color, FXTEXT_CLEARTYPE);
-#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
- }
-
-#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
- FxFont.SetFace(nullptr);
-#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
-
- return true;
-}
-
-bool CFDE_RenderDevice::DrawPath(FX_ARGB color,
- float fPenWidth,
- const CFX_PathData& pPath,
- const CFX_Matrix* pMatrix) {
- CFX_GraphStateData graphState;
- graphState.m_LineCap = CFX_GraphStateData::LineCapButt;
- graphState.m_LineJoin = CFX_GraphStateData::LineJoinMiter;
- graphState.m_LineWidth = fPenWidth;
- graphState.m_MiterLimit = 10;
- graphState.m_DashPhase = 0;
- return m_pDevice->DrawPath(&pPath, pMatrix, &graphState, 0, color, 0);
-}
diff --git a/xfa/fde/cfde_renderdevice.h b/xfa/fde/cfde_renderdevice.h
deleted file mode 100644
index ccc2ef281e..0000000000
--- a/xfa/fde/cfde_renderdevice.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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
-
-#ifndef XFA_FDE_CFDE_RENDERDEVICE_H_
-#define XFA_FDE_CFDE_RENDERDEVICE_H_
-
-#include <vector>
-
-#include "core/fxge/cfx_renderdevice.h"
-#include "xfa/fgas/font/cfgas_gefont.h"
-
-class CFX_PathData;
-class CFX_GraphStateData;
-
-class CFDE_RenderDevice {
- public:
- explicit CFDE_RenderDevice(CFX_RenderDevice* pDevice);
- ~CFDE_RenderDevice();
-
- int32_t GetWidth() const;
- int32_t GetHeight() const;
-
- void SaveState();
- void RestoreState();
-
- bool SetClipRect(const CFX_RectF& rtClip);
- const CFX_RectF& GetClipRect();
-
- bool DrawString(FX_ARGB color,
- const CFX_RetainPtr<CFGAS_GEFont>& pFont,
- const FXTEXT_CHARPOS* pCharPos,
- int32_t iCount,
- float fFontSize,
- const CFX_Matrix* pMatrix);
- bool DrawPath(FX_ARGB color,
- float fPenWidth,
- const CFX_PathData& pPath,
- const CFX_Matrix* pMatrix);
-
- private:
- CFX_RenderDevice* const m_pDevice;
- CFX_RectF m_rtClip;
-};
-
-#endif // XFA_FDE_CFDE_RENDERDEVICE_H_
diff --git a/xfa/fde/cfde_textout.cpp b/xfa/fde/cfde_textout.cpp
index 5f7fe078f1..7a246a8efe 100644
--- a/xfa/fde/cfde_textout.cpp
+++ b/xfa/fde/cfde_textout.cpp
@@ -14,7 +14,6 @@
#include "core/fxge/cfx_pathdata.h"
#include "third_party/base/ptr_util.h"
#include "third_party/base/stl_util.h"
-#include "xfa/fde/cfde_renderdevice.h"
#include "xfa/fgas/layout/cfx_txtbreak.h"
namespace {
@@ -31,6 +30,90 @@ bool IsTextAlignmentTop(const FDE_TextAlignment align) {
} // namespace
+// static
+bool CFDE_TextOut::DrawString(CFX_RenderDevice* device,
+ FX_ARGB color,
+ const CFX_RetainPtr<CFGAS_GEFont>& pFont,
+ const FXTEXT_CHARPOS* pCharPos,
+ int32_t iCount,
+ float fFontSize,
+ const CFX_Matrix* pMatrix) {
+ ASSERT(pFont && pCharPos && iCount > 0);
+ CFX_Font* pFxFont = pFont->GetDevFont();
+ if ((pFont->GetFontStyles() & FX_FONTSTYLE_Italic) != 0 &&
+ !pFxFont->IsItalic()) {
+ FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
+ float* pAM;
+ for (int32_t i = 0; i < iCount; ++i) {
+ static const float mc = 0.267949f;
+ pAM = pCP->m_AdjustMatrix;
+ pAM[2] = mc * pAM[0] + pAM[2];
+ pAM[3] = mc * pAM[1] + pAM[3];
+ pCP++;
+ }
+ }
+ FXTEXT_CHARPOS* pCP = (FXTEXT_CHARPOS*)pCharPos;
+ CFX_RetainPtr<CFGAS_GEFont> pCurFont;
+ CFX_RetainPtr<CFGAS_GEFont> pSTFont;
+ FXTEXT_CHARPOS* pCurCP = nullptr;
+ int32_t iCurCount = 0;
+
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+ uint32_t dwFontStyle = pFont->GetFontStyles();
+ CFX_Font FxFont;
+ auto SubstFxFont = pdfium::MakeUnique<CFX_SubstFont>();
+ SubstFxFont->m_Weight = dwFontStyle & FX_FONTSTYLE_Bold ? 700 : 400;
+ SubstFxFont->m_ItalicAngle = dwFontStyle & FX_FONTSTYLE_Italic ? -12 : 0;
+ SubstFxFont->m_WeightCJK = SubstFxFont->m_Weight;
+ SubstFxFont->m_bItalicCJK = !!(dwFontStyle & FX_FONTSTYLE_Italic);
+ FxFont.SetSubstFont(std::move(SubstFxFont));
+#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+
+ for (int32_t i = 0; i < iCount; ++i) {
+ pSTFont = pFont->GetSubstFont((int32_t)pCP->m_GlyphIndex);
+ pCP->m_GlyphIndex &= 0x00FFFFFF;
+ pCP->m_bFontStyle = false;
+ if (pCurFont != pSTFont) {
+ if (pCurFont) {
+ pFxFont = pCurFont->GetDevFont();
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+ FxFont.SetFace(pFxFont->GetFace());
+ device->DrawNormalText(iCurCount, pCurCP, &FxFont, -fFontSize, pMatrix,
+ color, FXTEXT_CLEARTYPE);
+#else
+ device->DrawNormalText(iCurCount, pCurCP, pFxFont, -fFontSize, pMatrix,
+ color, FXTEXT_CLEARTYPE);
+#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+ }
+ pCurFont = pSTFont;
+ pCurCP = pCP;
+ iCurCount = 1;
+ } else {
+ iCurCount++;
+ }
+ pCP++;
+ }
+ if (pCurFont && iCurCount) {
+ pFxFont = pCurFont->GetDevFont();
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+ FxFont.SetFace(pFxFont->GetFace());
+ bool bRet = device->DrawNormalText(iCurCount, pCurCP, &FxFont, -fFontSize,
+ pMatrix, color, FXTEXT_CLEARTYPE);
+ FxFont.SetFace(nullptr);
+ return bRet;
+#else
+ return device->DrawNormalText(iCurCount, pCurCP, pFxFont, -fFontSize,
+ pMatrix, color, FXTEXT_CLEARTYPE);
+#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+ }
+
+#if _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+ FxFont.SetFace(nullptr);
+#endif // _FXM_PLATFORM_ != _FXM_PLATFORM_WINDOWS_
+
+ return true;
+}
+
FDE_TTOPIECE::FDE_TTOPIECE() = default;
FDE_TTOPIECE::FDE_TTOPIECE(const FDE_TTOPIECE& that) = default;
@@ -102,11 +185,6 @@ void CFDE_TextOut::SetLineSpace(float fLineSpace) {
m_fLineSpace = fLineSpace;
}
-void CFDE_TextOut::SetRenderDevice(CFX_RenderDevice* pDevice) {
- ASSERT(pDevice);
- m_pRenderDevice = pdfium::MakeUnique<CFDE_RenderDevice>(pDevice);
-}
-
void CFDE_TextOut::SetLineBreakTolerance(float fTolerance) {
m_fTolerance = fTolerance;
m_pTxtBreak->SetLineBreakTolerance(m_fTolerance);
@@ -208,7 +286,8 @@ bool CFDE_TextOut::RetrieveLineWidth(CFX_BreakType dwBreakStatus,
return true;
}
-void CFDE_TextOut::DrawLogicText(const wchar_t* pwsStr,
+void CFDE_TextOut::DrawLogicText(CFX_RenderDevice* device,
+ const wchar_t* pwsStr,
int32_t iLength,
const CFX_RectF& rect) {
ASSERT(m_pFont && m_fFontSize >= 1.0f);
@@ -226,15 +305,15 @@ void CFDE_TextOut::DrawLogicText(const wchar_t* pwsStr,
Reload(rect);
DoAlignment(rect);
- if (!m_pRenderDevice || m_ttoLines.empty())
+ if (!device || m_ttoLines.empty())
return;
CFX_RectF rtClip;
m_Matrix.TransformRect(rtClip);
- m_pRenderDevice->SaveState();
+ device->SaveState();
if (rtClip.Width() > 0.0f && rtClip.Height() > 0.0f)
- m_pRenderDevice->SetClipRect(rtClip);
+ device->SetClip_Rect(rtClip);
for (auto& line : m_ttoLines) {
int32_t iPieces = line.GetSize();
@@ -245,12 +324,12 @@ void CFDE_TextOut::DrawLogicText(const wchar_t* pwsStr,
int32_t iCount = GetDisplayPos(pPiece);
if (iCount > 0) {
- m_pRenderDevice->DrawString(m_TxtColor, m_pFont, m_CharPos.data(),
- iCount, m_fFontSize, &m_Matrix);
+ CFDE_TextOut::DrawString(device, m_TxtColor, m_pFont, m_CharPos.data(),
+ iCount, m_fFontSize, &m_Matrix);
}
}
}
- m_pRenderDevice->RestoreState();
+ device->RestoreState(false);
}
void CFDE_TextOut::LoadText(const wchar_t* pwsStr,
diff --git a/xfa/fde/cfde_textout.h b/xfa/fde/cfde_textout.h
index f2541bb11b..421987c3fd 100644
--- a/xfa/fde/cfde_textout.h
+++ b/xfa/fde/cfde_textout.h
@@ -76,6 +76,14 @@ class CFDE_TTOLine {
class CFDE_TextOut {
public:
+ static bool DrawString(CFX_RenderDevice* device,
+ FX_ARGB color,
+ const CFX_RetainPtr<CFGAS_GEFont>& pFont,
+ const FXTEXT_CHARPOS* pCharPos,
+ int32_t iCount,
+ float fFontSize,
+ const CFX_Matrix* pMatrix);
+
CFDE_TextOut();
~CFDE_TextOut();
@@ -85,13 +93,13 @@ class CFDE_TextOut {
void SetStyles(const FDE_TextStyle& dwStyles);
void SetAlignment(FDE_TextAlignment iAlignment);
void SetLineSpace(float fLineSpace);
- void SetRenderDevice(CFX_RenderDevice* pDevice);
void SetMatrix(const CFX_Matrix& matrix) { m_Matrix = matrix; }
void SetLineBreakTolerance(float fTolerance);
void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_SizeF& size);
void CalcLogicSize(const wchar_t* pwsStr, int32_t iLength, CFX_RectF& rect);
- void DrawLogicText(const wchar_t* pwsStr,
+ void DrawLogicText(CFX_RenderDevice* device,
+ const wchar_t* pwsStr,
int32_t iLength,
const CFX_RectF& rect);
int32_t GetTotalLines() const { return m_iTotalLines; }
@@ -134,7 +142,6 @@ class CFDE_TextOut {
int32_t m_iCurPiece;
int32_t m_iTotalLines;
std::vector<FXTEXT_CHARPOS> m_CharPos;
- std::unique_ptr<CFDE_RenderDevice> m_pRenderDevice;
};
#endif // XFA_FDE_CFDE_TEXTOUT_H_