OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fde/cfde_txtedtpage.h" | 7 #include "xfa/fde/cfde_txtedtpage.h" |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 const double kTolerance = 0.1f; | 22 const double kTolerance = 0.1f; |
23 | 23 |
24 } // namespace | 24 } // namespace |
25 | 25 |
26 IFDE_TxtEdtPage* IFDE_TxtEdtPage::Create(CFDE_TxtEdtEngine* pEngine, | 26 IFDE_TxtEdtPage* IFDE_TxtEdtPage::Create(CFDE_TxtEdtEngine* pEngine, |
27 int32_t nIndex) { | 27 int32_t nIndex) { |
28 return new CFDE_TxtEdtPage(pEngine, nIndex); | 28 return new CFDE_TxtEdtPage(pEngine, nIndex); |
29 } | 29 } |
30 | 30 |
31 CFDE_TxtEdtPage::CFDE_TxtEdtPage(CFDE_TxtEdtEngine* pEngine, int32_t nPageIndex) | 31 CFDE_TxtEdtPage::CFDE_TxtEdtPage(CFDE_TxtEdtEngine* pEngine, int32_t nPageIndex) |
32 : m_pTextSet(nullptr), | 32 : m_pEditEngine(pEngine), |
33 m_PieceMassArr(100), | 33 m_PieceMassArr(100), |
34 m_pBgnParag(nullptr), | 34 m_pBgnParag(nullptr), |
35 m_pEndParag(nullptr), | 35 m_pEndParag(nullptr), |
36 m_nRefCount(0), | 36 m_nRefCount(0), |
37 m_nPageStart(-1), | 37 m_nPageStart(-1), |
38 m_nCharCount(0), | 38 m_nCharCount(0), |
39 m_nPageIndex(nPageIndex), | 39 m_nPageIndex(nPageIndex), |
40 m_bLoaded(FALSE), | 40 m_bLoaded(FALSE) { |
41 m_pCharWidth(nullptr) { | |
42 FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF)); | 41 FXSYS_memset(&m_rtPage, 0, sizeof(CFX_RectF)); |
43 FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF)); | 42 FXSYS_memset(&m_rtPageMargin, 0, sizeof(CFX_RectF)); |
44 FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF)); | 43 FXSYS_memset(&m_rtPageContents, 0, sizeof(CFX_RectF)); |
45 FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF)); | 44 FXSYS_memset(&m_rtPageCanvas, 0, sizeof(CFX_RectF)); |
46 m_pEditEngine = static_cast<CFDE_TxtEdtEngine*>(pEngine); | |
47 } | 45 } |
48 | 46 |
49 CFDE_TxtEdtPage::~CFDE_TxtEdtPage() { | 47 CFDE_TxtEdtPage::~CFDE_TxtEdtPage() { |
50 m_PieceMassArr.RemoveAll(TRUE); | 48 m_PieceMassArr.RemoveAll(TRUE); |
51 delete m_pTextSet; | |
52 delete[] m_pCharWidth; | |
53 } | 49 } |
54 | 50 |
55 CFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const { | 51 CFDE_TxtEdtEngine* CFDE_TxtEdtPage::GetEngine() const { |
56 return m_pEditEngine; | 52 return m_pEditEngine; |
57 } | 53 } |
58 | 54 |
59 FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() { | 55 FDE_VISUALOBJTYPE CFDE_TxtEdtPage::GetType() { |
60 return FDE_VISUALOBJ_Text; | 56 return FDE_VISUALOBJ_Text; |
61 } | 57 } |
62 | 58 |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
301 FX_BOOL bLineReserve = | 297 FX_BOOL bLineReserve = |
302 pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; | 298 pParams->dwLayoutStyles & FDE_TEXTEDITLAYOUT_LineReserve; |
303 FX_FLOAT fLineStart = | 299 FX_FLOAT fLineStart = |
304 bVertial | 300 bVertial |
305 ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f) | 301 ? (bLineReserve ? (pParams->fPlateWidth - pParams->fLineSpace) : 0.0f) |
306 : 0.0f; | 302 : 0.0f; |
307 FX_FLOAT fLineStep = | 303 FX_FLOAT fLineStep = |
308 (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace; | 304 (bVertial && bLineReserve) ? (-pParams->fLineSpace) : pParams->fLineSpace; |
309 FX_FLOAT fLinePos = fLineStart; | 305 FX_FLOAT fLinePos = fLineStart; |
310 if (!m_pTextSet) | 306 if (!m_pTextSet) |
311 m_pTextSet = new CFDE_TxtEdtTextSet(this); | 307 m_pTextSet.reset(new CFDE_TxtEdtTextSet(this)); |
312 | 308 |
313 m_PieceMassArr.RemoveAll(TRUE); | 309 m_PieceMassArr.RemoveAll(TRUE); |
314 uint32_t dwBreakStatus = FX_TXTBREAK_None; | 310 uint32_t dwBreakStatus = FX_TXTBREAK_None; |
315 int32_t nPieceStart = 0; | 311 int32_t nPieceStart = 0; |
316 delete[] m_pCharWidth; | |
317 | 312 |
318 m_pCharWidth = new int32_t[nPageEnd - nPageStart + 1]; | 313 m_CharWidths.resize(nPageEnd - nPageStart + 1, 0); |
319 pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); | 314 pBreak->EndBreak(FX_TXTBREAK_ParagraphBreak); |
320 pBreak->ClearBreakPieces(); | 315 pBreak->ClearBreakPieces(); |
321 m_nPageStart = nPageStart; | 316 m_nPageStart = nPageStart; |
322 m_nCharCount = nPageEnd - nPageStart + 1; | 317 m_nCharCount = nPageEnd - nPageStart + 1; |
323 FX_BOOL bReload = FALSE; | 318 FX_BOOL bReload = FALSE; |
324 FX_FLOAT fDefCharWidth = 0; | 319 FX_FLOAT fDefCharWidth = 0; |
325 std::unique_ptr<IFX_CharIter> pIter(m_pIter->Clone()); | 320 std::unique_ptr<IFX_CharIter> pIter(m_pIter->Clone()); |
326 pIter->SetAt(nPageStart); | 321 pIter->SetAt(nPageStart); |
327 m_pIter->SetAt(nPageStart); | 322 m_pIter->SetAt(nPageStart); |
328 FX_BOOL bFirstPiece = TRUE; | 323 FX_BOOL bFirstPiece = TRUE; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 if (bFirstPiece) { | 382 if (bFirstPiece) { |
388 m_rtPageContents = TxtEdtPiece.rtPiece; | 383 m_rtPageContents = TxtEdtPiece.rtPiece; |
389 bFirstPiece = FALSE; | 384 bFirstPiece = FALSE; |
390 } else { | 385 } else { |
391 m_rtPageContents.Union(TxtEdtPiece.rtPiece); | 386 m_rtPageContents.Union(TxtEdtPiece.rtPiece); |
392 } | 387 } |
393 nPieceStart += TxtEdtPiece.nCount; | 388 nPieceStart += TxtEdtPiece.nCount; |
394 m_PieceMassArr.Add(TxtEdtPiece); | 389 m_PieceMassArr.Add(TxtEdtPiece); |
395 for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) { | 390 for (int32_t k = 0; k < TxtEdtPiece.nCount; k++) { |
396 CFX_Char* ptc = pPiece->GetCharPtr(k); | 391 CFX_Char* ptc = pPiece->GetCharPtr(k); |
397 m_pCharWidth[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth; | 392 m_CharWidths[TxtEdtPiece.nStart + k] = ptc->m_iCharWidth; |
398 } | 393 } |
399 } | 394 } |
400 fLinePos += fLineStep; | 395 fLinePos += fLineStep; |
401 pBreak->ClearBreakPieces(); | 396 pBreak->ClearBreakPieces(); |
402 } | 397 } |
403 if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) { | 398 if (pIter->GetAt() == nPageEnd && dwBreakStatus == FX_TXTBREAK_LineBreak) { |
404 bReload = TRUE; | 399 bReload = TRUE; |
405 pIter->Next(TRUE); | 400 pIter->Next(TRUE); |
406 } | 401 } |
407 } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd)); | 402 } while (pIter->Next(FALSE) && (pIter->GetAt() <= nPageEnd)); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 return 0; | 436 return 0; |
442 } | 437 } |
443 | 438 |
444 void CFDE_TxtEdtPage::UnloadPage(const CFX_RectF* pClipBox) { | 439 void CFDE_TxtEdtPage::UnloadPage(const CFX_RectF* pClipBox) { |
445 ASSERT(m_nRefCount > 0); | 440 ASSERT(m_nRefCount > 0); |
446 m_nRefCount--; | 441 m_nRefCount--; |
447 if (m_nRefCount != 0) | 442 if (m_nRefCount != 0) |
448 return; | 443 return; |
449 | 444 |
450 m_PieceMassArr.RemoveAll(FALSE); | 445 m_PieceMassArr.RemoveAll(FALSE); |
451 delete m_pTextSet; | 446 m_pTextSet.reset(); |
452 m_pTextSet = nullptr; | 447 m_CharWidths.clear(); |
453 delete[] m_pCharWidth; | |
454 m_pCharWidth = nullptr; | |
455 if (m_pBgnParag) { | 448 if (m_pBgnParag) { |
456 m_pBgnParag->UnloadParag(); | 449 m_pBgnParag->UnloadParag(); |
457 m_pBgnParag = nullptr; | 450 m_pBgnParag = nullptr; |
458 } | 451 } |
459 if (m_pEndParag) { | 452 if (m_pEndParag) { |
460 m_pEndParag->UnloadParag(); | 453 m_pEndParag->UnloadParag(); |
461 m_pEndParag = nullptr; | 454 m_pEndParag = nullptr; |
462 } | 455 } |
463 m_pIter.reset(); | 456 m_pIter.reset(); |
464 } | 457 } |
465 | 458 |
466 const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() { | 459 const CFX_RectF& CFDE_TxtEdtPage::GetContentsBox() { |
467 return m_rtPageContents; | 460 return m_rtPageContents; |
468 } | 461 } |
469 | 462 |
470 FX_POSITION CFDE_TxtEdtPage::GetFirstPosition() { | 463 FX_POSITION CFDE_TxtEdtPage::GetFirstPosition() { |
471 if (m_PieceMassArr.GetSize() < 1) | 464 if (m_PieceMassArr.GetSize() < 1) |
472 return nullptr; | 465 return nullptr; |
473 return (FX_POSITION)1; | 466 return (FX_POSITION)1; |
474 } | 467 } |
475 | 468 |
476 FDE_TEXTEDITPIECE* CFDE_TxtEdtPage::GetNext(FX_POSITION& pos, | 469 FDE_TEXTEDITPIECE* CFDE_TxtEdtPage::GetNext(FX_POSITION& pos, |
477 IFDE_VisualSet*& pVisualSet) { | 470 IFDE_VisualSet*& pVisualSet) { |
478 if (!m_pTextSet) { | 471 if (!m_pTextSet) { |
479 pos = nullptr; | 472 pos = nullptr; |
480 return nullptr; | 473 return nullptr; |
481 } | 474 } |
482 int32_t nPos = (int32_t)(uintptr_t)pos; | 475 int32_t nPos = (int32_t)(uintptr_t)pos; |
483 pVisualSet = m_pTextSet; | 476 pVisualSet = m_pTextSet.get(); |
484 if (nPos + 1 > m_PieceMassArr.GetSize()) { | 477 if (nPos + 1 > m_PieceMassArr.GetSize()) { |
485 pos = nullptr; | 478 pos = nullptr; |
486 } else { | 479 } else { |
487 pos = (FX_POSITION)(uintptr_t)(nPos + 1); | 480 pos = (FX_POSITION)(uintptr_t)(nPos + 1); |
488 } | 481 } |
489 return m_PieceMassArr.GetPtrAt(nPos - 1); | 482 return m_PieceMassArr.GetPtrAt(nPos - 1); |
490 } | 483 } |
491 | 484 |
492 FX_WCHAR CFDE_TxtEdtPage::GetChar(const FDE_TEXTEDITPIECE* pIdentity, | 485 FX_WCHAR CFDE_TxtEdtPage::GetChar(const FDE_TEXTEDITPIECE* pIdentity, |
493 int32_t index) const { | 486 int32_t index) const { |
494 int32_t nIndex = m_nPageStart + pIdentity->nStart + index; | 487 int32_t nIndex = m_nPageStart + pIdentity->nStart + index; |
495 if (nIndex != m_pIter->GetAt()) { | 488 if (nIndex != m_pIter->GetAt()) { |
496 m_pIter->SetAt(nIndex); | 489 m_pIter->SetAt(nIndex); |
497 } | 490 } |
498 FX_WCHAR wChar = m_pIter->GetChar(); | 491 FX_WCHAR wChar = m_pIter->GetChar(); |
499 m_pIter->Next(); | 492 m_pIter->Next(); |
500 return wChar; | 493 return wChar; |
501 } | 494 } |
502 | 495 |
503 int32_t CFDE_TxtEdtPage::GetWidth(const FDE_TEXTEDITPIECE* pIdentity, | 496 int32_t CFDE_TxtEdtPage::GetWidth(const FDE_TEXTEDITPIECE* pIdentity, |
504 int32_t index) const { | 497 int32_t index) const { |
505 int32_t nWidth = m_pCharWidth[pIdentity->nStart + index]; | 498 int32_t nWidth = m_CharWidths[pIdentity->nStart + index]; |
506 return nWidth; | 499 return nWidth; |
507 } | 500 } |
508 | 501 |
509 void CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF& ptF, | 502 void CFDE_TxtEdtPage::NormalizePt2Rect(CFX_PointF& ptF, |
510 const CFX_RectF& rtF, | 503 const CFX_RectF& rtF, |
511 FX_FLOAT fTolerance) const { | 504 FX_FLOAT fTolerance) const { |
512 if (rtF.Contains(ptF.x, ptF.y)) { | 505 if (rtF.Contains(ptF.x, ptF.y)) { |
513 return; | 506 return; |
514 } | 507 } |
515 if (ptF.x < rtF.left) { | 508 if (ptF.x < rtF.left) { |
516 ptF.x = rtF.left; | 509 ptF.x = rtF.left; |
517 } else if (ptF.x >= rtF.right()) { | 510 } else if (ptF.x >= rtF.right()) { |
518 ptF.x = rtF.right() - fTolerance; | 511 ptF.x = rtF.right() - fTolerance; |
519 } | 512 } |
520 if (ptF.y < rtF.top) { | 513 if (ptF.y < rtF.top) { |
521 ptF.y = rtF.top; | 514 ptF.y = rtF.top; |
522 } else if (ptF.y >= rtF.bottom()) { | 515 } else if (ptF.y >= rtF.bottom()) { |
523 ptF.y = rtF.bottom() - fTolerance; | 516 ptF.y = rtF.bottom() - fTolerance; |
524 } | 517 } |
525 } | 518 } |
OLD | NEW |