diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-08-14 17:23:25 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-08-15 13:42:32 +0000 |
commit | 73b492a5d775c05d8c186c8478d1003edfffd34c (patch) | |
tree | 0815bab5627ae27f5eb2f1a45b90bb9dc10b9e1c /xfa/fde/cfde_textout.cpp | |
parent | 5f0e64435c97755a7d309e80ea0a4dad83e76e73 (diff) | |
download | pdfium-73b492a5d775c05d8c186c8478d1003edfffd34c.tar.xz |
Remove CFDE_RenderDevice
This CL removes CFDE_RenderDevice. For most of the proxy'd calls we call
the CFX_RenderDevice directly now. To set the clip rect an overload was
added to accept a CFX_RectF and handle the casting to FX_RECT. The one
needed method, DrawString, is move to a static on CFDE_TextOut.
Change-Id: I95ea7e1fa1fd4702074b797c06423c9c9cb51db9
Reviewed-on: https://pdfium-review.googlesource.com/10951
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'xfa/fde/cfde_textout.cpp')
-rw-r--r-- | xfa/fde/cfde_textout.cpp | 105 |
1 files changed, 92 insertions, 13 deletions
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, |