From e533b93601c7e9eb328619681a78c188d1a89191 Mon Sep 17 00:00:00 2001 From: Dan Sinclair Date: Thu, 16 Mar 2017 11:47:20 -0400 Subject: Create common base class for TxtBreak and RTFBreak. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This CL starts extracting common members between the two break classes into a common base class. This also normalizes some of the member names to be the same across classes. Change-Id: I7f4e5065f2dac79eb4ebba397458236cc0609d38 Reviewed-on: https://pdfium-review.googlesource.com/3058 Reviewed-by: Nicolás Peña Commit-Queue: dsinclair --- xfa/fgas/layout/cfx_break.cpp | 138 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 xfa/fgas/layout/cfx_break.cpp (limited to 'xfa/fgas/layout/cfx_break.cpp') diff --git a/xfa/fgas/layout/cfx_break.cpp b/xfa/fgas/layout/cfx_break.cpp new file mode 100644 index 0000000000..8be1d1704a --- /dev/null +++ b/xfa/fgas/layout/cfx_break.cpp @@ -0,0 +1,138 @@ +// Copyright 2017 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/fgas/layout/cfx_break.h" + +#include + +namespace { + +const int kMinimumTabWidth = 160000; + +} // namespace + +CFX_Break::CFX_Break(uint32_t dwLayoutStyles) + : m_eCharType(FX_CHARTYPE_Unknown), + m_bSingleLine(false), + m_bCombText(false), + m_dwLayoutStyles(dwLayoutStyles), + m_iLineStart(0), + m_iLineWidth(2000000), + m_wParagraphBreakChar(L'\n'), + m_iFontSize(240), + m_iTabWidth(720000), + m_iHorizontalScale(100), + m_iVerticalScale(100), + m_iTolerance(0), + m_iCharSpace(0), + m_iDefChar(0), + m_wDefChar(0xFEFF), + m_pFont(nullptr), + m_pCurLine(nullptr), + m_iReadyLineIndex(-1) { + m_pCurLine = &m_Line[0]; +} + +CFX_Break::~CFX_Break() {} + +void CFX_Break::SetLayoutStyles(uint32_t dwLayoutStyles) { + m_dwLayoutStyles = dwLayoutStyles; + m_bSingleLine = (m_dwLayoutStyles & FX_LAYOUTSTYLE_SingleLine) != 0; + m_bCombText = (m_dwLayoutStyles & FX_LAYOUTSTYLE_CombText) != 0; + + ResetArabicContext(); +} + +void CFX_Break::SetHorizontalScale(int32_t iScale) { + iScale = std::max(iScale, 0); + if (m_iHorizontalScale == iScale) + return; + + SetBreakStatus(); + m_iHorizontalScale = iScale; +} + +void CFX_Break::SetVerticalScale(int32_t iScale) { + if (iScale < 0) + iScale = 0; + if (m_iVerticalScale == iScale) + return; + + SetBreakStatus(); + m_iVerticalScale = iScale; +} + +void CFX_Break::SetFont(const CFX_RetainPtr& pFont) { + if (!pFont || pFont == m_pFont) + return; + + SetBreakStatus(); + m_pFont = pFont; + FontChanged(); +} + +void CFX_Break::SetFontSize(float fFontSize) { + int32_t iFontSize = FXSYS_round(fFontSize * 20.0f); + if (m_iFontSize == iFontSize) + return; + + SetBreakStatus(); + m_iFontSize = iFontSize; + FontChanged(); +} + +void CFX_Break::FontChanged() { + m_iDefChar = 0; + if (!m_pFont || m_wDefChar == 0xFEFF) + return; + + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); + m_iDefChar *= m_iFontSize; +} + +void CFX_Break::SetTabWidth(float fTabWidth) { + // Note, the use of max here was only done in the TxtBreak code. Leaving this + // in for the RTFBreak code for consistency. If we see issues with tab widths + // we may need to fix this. + m_iTabWidth = std::max(FXSYS_round(fTabWidth * 20000.0f), kMinimumTabWidth); +} + +void CFX_Break::SetDefaultChar(wchar_t wch) { + m_wDefChar = wch; + m_iDefChar = 0; + if (m_wDefChar == 0xFEFF || !m_pFont) + return; + + m_pFont->GetCharWidth(m_wDefChar, m_iDefChar, false); + if (m_iDefChar < 0) + m_iDefChar = 0; + else + m_iDefChar *= m_iFontSize; +} + +void CFX_Break::SetParagraphBreakChar(wchar_t wch) { + if (wch != L'\r' && wch != L'\n') + return; + m_wParagraphBreakChar = wch; +} + +void CFX_Break::SetLineBreakTolerance(float fTolerance) { + m_iTolerance = FXSYS_round(fTolerance * 20000.0f); +} + +void CFX_Break::SetCharSpace(float fCharSpace) { + m_iCharSpace = FXSYS_round(fCharSpace * 20000.0f); +} + +void CFX_Break::SetLineBoundary(float fLineStart, float fLineEnd) { + if (fLineStart > fLineEnd) + return; + + m_iLineStart = FXSYS_round(fLineStart * 20000.0f); + m_iLineWidth = FXSYS_round(fLineEnd * 20000.0f); + m_pCurLine->m_iStart = std::min(m_pCurLine->m_iStart, m_iLineWidth); + m_pCurLine->m_iStart = std::max(m_pCurLine->m_iStart, m_iLineStart); +} -- cgit v1.2.3