| 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 "../../include/fpdfdoc/fpdf_doc.h" | 7 #include "../../include/fpdfdoc/fpdf_doc.h" |
| 8 #include "../../include/fpdfdoc/fpdf_vt.h" | 8 #include "../../include/fpdfdoc/fpdf_vt.h" |
| 9 #include "pdf_vt.h" | 9 #include "pdf_vt.h" |
| 10 const FX_BYTE gFontSizeSteps[] = { 4, 6, 8, 9, 10, 12, 14, 18, 20, 25,
30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 100, 110, 120, 130, 144}; | 10 const FX_BYTE gFontSizeSteps[] = { 4, 6, 8, 9, 10, 12, 14, 18, 20, 25,
30, 35, 40, 45, 50, 55, 60, 70, 80, 90, 100, 110, 120, 130, 144}; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 70 void CSection::ResetLinePlace() | 70 void CSection::ResetLinePlace() |
| 71 { | 71 { |
| 72 for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) { | 72 for (FX_INT32 i = 0, sz = m_LineArray.GetSize(); i < sz; i++) { |
| 73 if (CLine * pLine = m_LineArray.GetAt(i)) { | 73 if (CLine * pLine = m_LineArray.GetAt(i)) { |
| 74 pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1); | 74 pLine->LinePlace = CPVT_WordPlace(SecPlace.nSecIndex, i, -1); |
| 75 } | 75 } |
| 76 } | 76 } |
| 77 } | 77 } |
| 78 CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordIn
fo & wordinfo) | 78 CPVT_WordPlace CSection::AddWord(const CPVT_WordPlace & place, const CPVT_WordIn
fo & wordinfo) |
| 79 { | 79 { |
| 80 if (CPVT_WordInfo * pWord = FX_NEW CPVT_WordInfo(wordinfo)) { | 80 CPVT_WordInfo * pWord = new CPVT_WordInfo(wordinfo); |
| 81 FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordAr
ray.GetSize()), 0); | 81 FX_INT32 nWordIndex = FPDF_MAX(FPDF_MIN(place.nWordIndex, this->m_WordArray.
GetSize()), 0); |
| 82 if (nWordIndex == m_WordArray.GetSize()) { | 82 if (nWordIndex == m_WordArray.GetSize()) { |
| 83 m_WordArray.Add(pWord); | 83 m_WordArray.Add(pWord); |
| 84 } else { | 84 } else { |
| 85 m_WordArray.InsertAt(nWordIndex, pWord); | 85 m_WordArray.InsertAt(nWordIndex, pWord); |
| 86 } | |
| 87 } | 86 } |
| 88 return place; | 87 return place; |
| 89 } | 88 } |
| 90 CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo) | 89 CPVT_WordPlace CSection::AddLine(const CPVT_LineInfo & lineinfo) |
| 91 { | 90 { |
| 92 return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1); | 91 return CPVT_WordPlace(SecPlace.nSecIndex, m_LineArray.Add(lineinfo), -1); |
| 93 } | 92 } |
| 94 CPVT_FloatRect CSection::Rearrange() | 93 CPVT_FloatRect CSection::Rearrange() |
| 95 { | 94 { |
| 96 ASSERT(m_pVT != NULL); | 95 ASSERT(m_pVT != NULL); |
| (...skipping 730 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 delete m_pVTIterator; | 826 delete m_pVTIterator; |
| 828 m_pVTIterator = NULL; | 827 m_pVTIterator = NULL; |
| 829 } | 828 } |
| 830 ResetAll(); | 829 ResetAll(); |
| 831 } | 830 } |
| 832 void CPDF_VariableText::Initialize() | 831 void CPDF_VariableText::Initialize() |
| 833 { | 832 { |
| 834 if (!m_bInitial) { | 833 if (!m_bInitial) { |
| 835 CPVT_SectionInfo secinfo; | 834 CPVT_SectionInfo secinfo; |
| 836 if (m_bRichText) { | 835 if (m_bRichText) { |
| 837 secinfo.pSecProps = FX_NEW CPVT_SecProps(0.0f, 0.0f, 0); | 836 secinfo.pSecProps = new CPVT_SecProps(0.0f, 0.0f, 0); |
| 838 secinfo.pWordProps = FX_NEW CPVT_WordProps(GetDefaultFontIndex(), PV
T_DEFAULT_FONTSIZE, 0, 0, 0); | 837 secinfo.pWordProps = new CPVT_WordProps(GetDefaultFontIndex(), PVT_D
EFAULT_FONTSIZE, 0, 0, 0); |
| 839 } | 838 } |
| 840 CPVT_WordPlace place; | 839 CPVT_WordPlace place; |
| 841 place.nSecIndex = 0; | 840 place.nSecIndex = 0; |
| 842 AddSection(place, secinfo); | 841 AddSection(place, secinfo); |
| 843 CPVT_LineInfo lineinfo; | 842 CPVT_LineInfo lineinfo; |
| 844 lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize(
)); | 843 lineinfo.fLineAscent = GetFontAscent(GetDefaultFontIndex(), GetFontSize(
)); |
| 845 lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSiz
e()); | 844 lineinfo.fLineDescent = GetFontDescent(GetDefaultFontIndex(), GetFontSiz
e()); |
| 846 AddLine(place, lineinfo); | 845 AddLine(place, lineinfo); |
| 847 if (CSection * pSection = m_SectionArray.GetAt(0)) { | 846 if (CSection * pSection = m_SectionArray.GetAt(0)) { |
| 848 pSection->ResetLinePlace(); | 847 pSection->ResetLinePlace(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 861 FX_INT32 nTotlaWords = this->GetTotalWords(); | 860 FX_INT32 nTotlaWords = this->GetTotalWords(); |
| 862 if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) { | 861 if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) { |
| 863 return place; | 862 return place; |
| 864 } | 863 } |
| 865 if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) { | 864 if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) { |
| 866 return place; | 865 return place; |
| 867 } | 866 } |
| 868 CPVT_WordPlace newplace = place; | 867 CPVT_WordPlace newplace = place; |
| 869 newplace.nWordIndex ++; | 868 newplace.nWordIndex ++; |
| 870 if (m_bRichText) { | 869 if (m_bRichText) { |
| 871 CPVT_WordProps * pNewProps = pWordProps ? FX_NEW CPVT_WordProps(*pWordPr
ops) : FX_NEW CPVT_WordProps(); | 870 CPVT_WordProps * pNewProps = pWordProps ? new CPVT_WordProps(*pWordProps
) : new CPVT_WordProps(); |
| 872 if (pNewProps) { | 871 pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->nFon
tIndex); |
| 873 pNewProps->nFontIndex = GetWordFontIndex(word, charset, pWordProps->
nFontIndex); | 872 return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps)); |
| 874 return AddWord(newplace, CPVT_WordInfo(word, charset, -1, pNewProps)
); | |
| 875 } | |
| 876 } else { | 873 } else { |
| 877 FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWord
FontIndex(word, charset, GetDefaultFontIndex()); | 874 FX_INT32 nFontIndex = GetSubWord() > 0 ? GetDefaultFontIndex() : GetWord
FontIndex(word, charset, GetDefaultFontIndex()); |
| 878 return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL))
; | 875 return AddWord(newplace, CPVT_WordInfo(word, charset, nFontIndex, NULL))
; |
| 879 } | 876 } |
| 880 return place; | 877 return place; |
| 881 } | 878 } |
| 882 CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, co
nst CPVT_SecProps * pSecProps, | 879 CPVT_WordPlace CPDF_VariableText::InsertSection(const CPVT_WordPlace & place, co
nst CPVT_SecProps * pSecProps, |
| 883 const CPVT_WordProps * pWordProps) | 880 const CPVT_WordProps * pWordProps) |
| 884 { | 881 { |
| 885 FX_INT32 nTotlaWords = this->GetTotalWords(); | 882 FX_INT32 nTotlaWords = this->GetTotalWords(); |
| 886 if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) { | 883 if (m_nLimitChar > 0 && nTotlaWords >= m_nLimitChar) { |
| 887 return place; | 884 return place; |
| 888 } | 885 } |
| 889 if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) { | 886 if (m_nCharArray > 0 && nTotlaWords >= m_nCharArray) { |
| 890 return place; | 887 return place; |
| 891 } | 888 } |
| 892 if (!m_bMultiLine) { | 889 if (!m_bMultiLine) { |
| 893 return place; | 890 return place; |
| 894 } | 891 } |
| 895 CPVT_WordPlace wordplace = place; | 892 CPVT_WordPlace wordplace = place; |
| 896 UpdateWordPlace(wordplace); | 893 UpdateWordPlace(wordplace); |
| 897 CPVT_WordPlace newplace = place; | 894 CPVT_WordPlace newplace = place; |
| 898 if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) { | 895 if (CSection * pSection = m_SectionArray.GetAt(wordplace.nSecIndex)) { |
| 899 CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1); | 896 CPVT_WordPlace NewPlace(wordplace.nSecIndex + 1, 0, -1); |
| 900 CPVT_SectionInfo secinfo; | 897 CPVT_SectionInfo secinfo; |
| 901 if (m_bRichText) { | 898 if (m_bRichText) { |
| 902 if (pSecProps) { | 899 if (pSecProps) { |
| 903 secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps); | 900 secinfo.pSecProps = new CPVT_SecProps(*pSecProps); |
| 904 } | 901 } |
| 905 if (pWordProps) { | 902 if (pWordProps) { |
| 906 secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps); | 903 secinfo.pWordProps = new CPVT_WordProps(*pWordProps); |
| 907 } | 904 } |
| 908 } | 905 } |
| 909 AddSection(NewPlace, secinfo); | 906 AddSection(NewPlace, secinfo); |
| 910 newplace = NewPlace; | 907 newplace = NewPlace; |
| 911 if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) { | 908 if (CSection * pNewSection = m_SectionArray.GetAt(NewPlace.nSecIndex)) { |
| 912 for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArr
ay.GetSize(); w < sz; w++) { | 909 for (FX_INT32 w = wordplace.nWordIndex + 1, sz = pSection->m_WordArr
ay.GetSize(); w < sz; w++) { |
| 913 if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) { | 910 if (CPVT_WordInfo * pWord = pSection->m_WordArray.GetAt(w)) { |
| 914 NewPlace.nWordIndex++; | 911 NewPlace.nWordIndex++; |
| 915 pNewSection->AddWord(NewPlace, *pWord); | 912 pNewSection->AddWord(NewPlace, *pWord); |
| 916 } | 913 } |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 982 } | 979 } |
| 983 void CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_Se
cProps * pSecProps, | 980 void CPDF_VariableText::SetText(FX_LPCWSTR text, FX_INT32 charset, const CPVT_Se
cProps * pSecProps, |
| 984 const CPVT_WordProps * pWordProps) | 981 const CPVT_WordProps * pWordProps) |
| 985 { | 982 { |
| 986 DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); | 983 DeleteWords(CPVT_WordRange(GetBeginWordPlace(), GetEndWordPlace())); |
| 987 CFX_WideString swText = text; | 984 CFX_WideString swText = text; |
| 988 CPVT_WordPlace wp(0, 0, -1); | 985 CPVT_WordPlace wp(0, 0, -1); |
| 989 CPVT_SectionInfo secinfo; | 986 CPVT_SectionInfo secinfo; |
| 990 if (m_bRichText) { | 987 if (m_bRichText) { |
| 991 if (pSecProps) { | 988 if (pSecProps) { |
| 992 secinfo.pSecProps = FX_NEW CPVT_SecProps(*pSecProps); | 989 secinfo.pSecProps = new CPVT_SecProps(*pSecProps); |
| 993 } | 990 } |
| 994 if (pWordProps) { | 991 if (pWordProps) { |
| 995 secinfo.pWordProps = FX_NEW CPVT_WordProps(*pWordProps); | 992 secinfo.pWordProps = new CPVT_WordProps(*pWordProps); |
| 996 } | 993 } |
| 997 } | 994 } |
| 998 if (CSection * pSection = m_SectionArray.GetAt(0)) { | 995 if (CSection * pSection = m_SectionArray.GetAt(0)) { |
| 999 pSection->m_SecInfo = secinfo; | 996 pSection->m_SecInfo = secinfo; |
| 1000 } | 997 } |
| 1001 FX_INT32 nCharCount = 0; | 998 FX_INT32 nCharCount = 0; |
| 1002 for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) { | 999 for (FX_INT32 i = 0, sz = swText.GetLength(); i < sz; i++) { |
| 1003 if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) { | 1000 if (m_nLimitChar > 0 && nCharCount >= m_nLimitChar) { |
| 1004 break; | 1001 break; |
| 1005 } | 1002 } |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 delete m_SectionArray.GetAt(s); | 1270 delete m_SectionArray.GetAt(s); |
| 1274 } | 1271 } |
| 1275 m_SectionArray.RemoveAll(); | 1272 m_SectionArray.RemoveAll(); |
| 1276 } | 1273 } |
| 1277 CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const
CPVT_SectionInfo & secinfo) | 1274 CPVT_WordPlace CPDF_VariableText::AddSection(const CPVT_WordPlace & place, const
CPVT_SectionInfo & secinfo) |
| 1278 { | 1275 { |
| 1279 if (IsValid() && !m_bMultiLine) { | 1276 if (IsValid() && !m_bMultiLine) { |
| 1280 return place; | 1277 return place; |
| 1281 } | 1278 } |
| 1282 FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSi
ze()), 0); | 1279 FX_INT32 nSecIndex = FPDF_MAX(FPDF_MIN(place.nSecIndex, m_SectionArray.GetSi
ze()), 0); |
| 1283 CSection * pSection = FX_NEW CSection(this); | 1280 CSection * pSection = new CSection(this); |
| 1284 if (!pSection) { | |
| 1285 return place; | |
| 1286 } | |
| 1287 pSection->m_SecInfo = secinfo; | 1281 pSection->m_SecInfo = secinfo; |
| 1288 pSection->SecPlace.nSecIndex = nSecIndex; | 1282 pSection->SecPlace.nSecIndex = nSecIndex; |
| 1289 if (nSecIndex == m_SectionArray.GetSize()) { | 1283 if (nSecIndex == m_SectionArray.GetSize()) { |
| 1290 m_SectionArray.Add(pSection); | 1284 m_SectionArray.Add(pSection); |
| 1291 } else { | 1285 } else { |
| 1292 m_SectionArray.InsertAt(nSecIndex, pSection); | 1286 m_SectionArray.InsertAt(nSecIndex, pSection); |
| 1293 } | 1287 } |
| 1294 return place; | 1288 return place; |
| 1295 } | 1289 } |
| 1296 CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CP
VT_LineInfo & lineinfo) | 1290 CPVT_WordPlace CPDF_VariableText::AddLine(const CPVT_WordPlace & place, const CP
VT_LineInfo & lineinfo) |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1669 { | 1663 { |
| 1670 return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1; | 1664 return m_pVTProvider ? m_pVTProvider->GetDefaultFontIndex() : -1; |
| 1671 } | 1665 } |
| 1672 FX_BOOL CPDF_VariableText::IsLatinWord(FX_WORD word) | 1666 FX_BOOL CPDF_VariableText::IsLatinWord(FX_WORD word) |
| 1673 { | 1667 { |
| 1674 return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE; | 1668 return m_pVTProvider ? m_pVTProvider->IsLatinWord(word) : FALSE; |
| 1675 } | 1669 } |
| 1676 IPDF_VariableText_Iterator * CPDF_VariableText::GetIterator() | 1670 IPDF_VariableText_Iterator * CPDF_VariableText::GetIterator() |
| 1677 { | 1671 { |
| 1678 if (!m_pVTIterator) { | 1672 if (!m_pVTIterator) { |
| 1679 return m_pVTIterator = FX_NEW CPDF_VariableText_Iterator(this); | 1673 m_pVTIterator = new CPDF_VariableText_Iterator(this); |
| 1680 } | 1674 } |
| 1681 return m_pVTIterator; | 1675 return m_pVTIterator; |
| 1682 } | 1676 } |
| 1683 IPDF_VariableText_Provider* CPDF_VariableText::SetProvider(IPDF_VariableText
_Provider * pProvider) | 1677 IPDF_VariableText_Provider* CPDF_VariableText::SetProvider(IPDF_VariableText
_Provider * pProvider) |
| 1684 { | 1678 { |
| 1685 IPDF_VariableText_Provider* pOld = m_pVTProvider; | 1679 IPDF_VariableText_Provider* pOld = m_pVTProvider; |
| 1686 m_pVTProvider = pProvider; | 1680 m_pVTProvider = pProvider; |
| 1687 return pOld; | 1681 return pOld; |
| 1688 } | 1682 } |
| 1689 CPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT): | 1683 CPDF_VariableText_Iterator::CPDF_VariableText_Iterator(CPDF_VariableText * pVT): |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1854 if (pSection->m_SecInfo.pSecProps) { | 1848 if (pSection->m_SecInfo.pSecProps) { |
| 1855 *pSection->m_SecInfo.pSecProps = section.SecProps; | 1849 *pSection->m_SecInfo.pSecProps = section.SecProps; |
| 1856 } | 1850 } |
| 1857 if (pSection->m_SecInfo.pWordProps) { | 1851 if (pSection->m_SecInfo.pWordProps) { |
| 1858 *pSection->m_SecInfo.pWordProps = section.WordProps; | 1852 *pSection->m_SecInfo.pWordProps = section.WordProps; |
| 1859 } | 1853 } |
| 1860 return TRUE; | 1854 return TRUE; |
| 1861 } | 1855 } |
| 1862 return FALSE; | 1856 return FALSE; |
| 1863 } | 1857 } |
| OLD | NEW |