diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-03-16 11:47:20 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-03-16 18:21:03 +0000 |
commit | e533b93601c7e9eb328619681a78c188d1a89191 (patch) | |
tree | 0e3741cec1296a39e478c67eeac3ecc9c000fc24 /xfa/fgas/layout/cfx_break.cpp | |
parent | c9819a972830e9d1210d9d8f5c81d9f03f7c90a9 (diff) | |
download | pdfium-e533b93601c7e9eb328619681a78c188d1a89191.tar.xz |
Create common base class for TxtBreak and RTFBreak.
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 <npm@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'xfa/fgas/layout/cfx_break.cpp')
-rw-r--r-- | xfa/fgas/layout/cfx_break.cpp | 138 |
1 files changed, 138 insertions, 0 deletions
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 <algorithm> + +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<CFGAS_GEFont>& 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); +} |