summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHenrique Nakashima <hnakashima@chromium.org>2018-04-19 21:59:33 +0000
committerChromium commit bot <commit-bot@chromium.org>2018-04-19 21:59:33 +0000
commitc831580e1b4547d5fcbe74864e657c1c4ebffc12 (patch)
tree56ced70e887dd87c15588a6a2c65276334b0c971
parent8549ab48a5f8b613ea35dfd64f925fd0438efd0d (diff)
downloadpdfium-c831580e1b4547d5fcbe74864e657c1c4ebffc12.tar.xz
Fix duplicated text in each line in XFA widgets.
When calculating the characters to display, the run offset was not added to the offset inside the run, so characters from the first run were always used instead of from the run that the line should display. Bug: chromium:832909 Change-Id: I4d1d284894ce6ac9c7a49976aa6a6d0cf21f1382 Reviewed-on: https://pdfium-review.googlesource.com/30993 Commit-Queue: Henrique Nakashima <hnakashima@chromium.org> Reviewed-by: dsinclair <dsinclair@chromium.org>
-rw-r--r--xfa/fde/cfde_texteditengine.cpp2
-rw-r--r--xfa/fgas/layout/cfx_txtbreak.cpp19
-rw-r--r--xfa/fgas/layout/cfx_txtbreak.h1
3 files changed, 15 insertions, 7 deletions
diff --git a/xfa/fde/cfde_texteditengine.cpp b/xfa/fde/cfde_texteditengine.cpp
index ac66fd7f99..a423ba6eb4 100644
--- a/xfa/fde/cfde_texteditengine.cpp
+++ b/xfa/fde/cfde_texteditengine.cpp
@@ -953,6 +953,7 @@ std::vector<CFX_RectF> CFDE_TextEditEngine::GetCharRects(
FX_TXTRUN tr;
tr.pEdtEngine = this;
+ tr.iStart = piece.nStart;
tr.iLength = piece.nCount;
tr.pFont = font_;
tr.fFontSize = font_size_;
@@ -969,6 +970,7 @@ std::vector<FXTEXT_CHARPOS> CFDE_TextEditEngine::GetDisplayPos(
FX_TXTRUN tr;
tr.pEdtEngine = this;
+ tr.iStart = piece.nStart;
tr.iLength = piece.nCount;
tr.pFont = font_;
tr.fFontSize = font_size_;
diff --git a/xfa/fgas/layout/cfx_txtbreak.cpp b/xfa/fgas/layout/cfx_txtbreak.cpp
index c3075b00dc..ccbc6a817a 100644
--- a/xfa/fgas/layout/cfx_txtbreak.cpp
+++ b/xfa/fgas/layout/cfx_txtbreak.cpp
@@ -686,11 +686,12 @@ int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun,
bool bShadda = false;
bool bLam = false;
for (int32_t i = 0; i <= iLength; i++) {
+ int32_t iAbsolute = i + pTxtRun->iStart;
int32_t iWidth;
wchar_t wch;
if (pEngine) {
- wch = pEngine->GetChar(i);
- iWidth = pEngine->GetWidthOfChar(i);
+ wch = pEngine->GetChar(iAbsolute);
+ iWidth = pEngine->GetWidthOfChar(iAbsolute);
} else {
wch = *pStr++;
iWidth = *pWidths++;
@@ -709,7 +710,8 @@ int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun,
if (pEngine) {
iNext = i + 1;
while (iNext <= iLength) {
- wNext = pEngine->GetChar(iNext);
+ int32_t iNextAbsolute = iNext + pTxtRun->iStart;
+ wNext = pEngine->GetChar(iNextAbsolute);
dwProps = FX_GetUnicodeProperties(wNext);
if ((dwProps & FX_CHARTYPEBITSMASK) != FX_CHARTYPE_Combination)
break;
@@ -747,8 +749,10 @@ int32_t CFX_TxtBreak::GetDisplayPos(const FX_TXTRUN* pTxtRun,
wNext = 0xFEFF;
if (pEngine) {
iNext = i + 1;
- if (iNext <= iLength)
- wNext = pEngine->GetChar(iNext);
+ if (iNext <= iLength) {
+ int32_t iNextAbsolute = iNext + pTxtRun->iStart;
+ wNext = pEngine->GetChar(iNextAbsolute);
+ }
} else {
if (i < iLength)
wNext = *pStr;
@@ -930,9 +934,10 @@ std::vector<CFX_RectF> CFX_TxtBreak::GetCharRects(const FX_TXTRUN* pTxtRun,
std::vector<CFX_RectF> rtArray(iLength);
for (int32_t i = 0; i < iLength; i++) {
+ int32_t iAbsolute = i + pTxtRun->iStart;
if (pEngine) {
- wch = pEngine->GetChar(i);
- iCharSize = pEngine->GetWidthOfChar(i);
+ wch = pEngine->GetChar(iAbsolute);
+ iCharSize = pEngine->GetWidthOfChar(iAbsolute);
} else {
wch = *pStr++;
iCharSize = *pWidths++;
diff --git a/xfa/fgas/layout/cfx_txtbreak.h b/xfa/fgas/layout/cfx_txtbreak.h
index b43fda0e2f..a0e034280b 100644
--- a/xfa/fgas/layout/cfx_txtbreak.h
+++ b/xfa/fgas/layout/cfx_txtbreak.h
@@ -42,6 +42,7 @@ struct FX_TXTRUN {
CFDE_TextEditEngine* pEdtEngine;
WideString wsStr;
int32_t* pWidths;
+ int32_t iStart;
int32_t iLength;
RetainPtr<CFGAS_GEFont> pFont;
float fFontSize;