Index: core/fxcrt/fx_arabic.cpp |
diff --git a/core/fxcrt/fx_arabic.cpp b/core/fxcrt/fx_arabic.cpp |
index a649e49759e0498699c18ff380c139aa5971d9b0..108c6c19ac470d890cdd2b876637d0fee7926e51 100644 |
--- a/core/fxcrt/fx_arabic.cpp |
+++ b/core/fxcrt/fx_arabic.cpp |
@@ -5,7 +5,12 @@ |
// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
#include "core/fxcrt/fx_arabic.h" |
+ |
+#include <algorithm> |
+#include <vector> |
+ |
#include "core/fxcrt/fx_ucd.h" |
+#include "third_party/base/stl_util.h" |
namespace { |
@@ -419,81 +424,62 @@ void FX_BidiReorder(int32_t iBaseLevel, |
template <class baseType> |
class CFX_BidiLineTemplate { |
public: |
- void FX_BidiReverseString(CFX_ArrayTemplate<baseType>& chars, |
+ void FX_BidiReverseString(std::vector<baseType>& chars, |
int32_t iStart, |
int32_t iCount) { |
- ASSERT(iStart > -1 && iStart < chars.GetSize()); |
- ASSERT(iCount >= 0 && iStart + iCount <= chars.GetSize()); |
- baseType *pStart, *pEnd; |
- int32_t iEnd = iStart + iCount - 1, iTemp; |
- while (iStart < iEnd) { |
- pStart = chars.GetDataPtr(iStart++); |
- pEnd = chars.GetDataPtr(iEnd--); |
- iTemp = pStart->m_iBidiPos; |
- pStart->m_iBidiPos = pEnd->m_iBidiPos; |
- pEnd->m_iBidiPos = iTemp; |
- } |
+ ASSERT(iStart >= 0 && iStart < pdfium::CollectionSize<int32_t>(chars)); |
+ ASSERT(iCount >= 0 && |
+ iStart + iCount <= pdfium::CollectionSize<int32_t>(chars)); |
+ std::reverse(chars.begin() + iStart, chars.begin() + iStart + iCount); |
} |
- void FX_BidiSetDeferredRun(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ void FX_BidiSetDeferredRun(std::vector<baseType>& chars, |
bool bClass, |
int32_t iStart, |
int32_t iCount, |
int32_t iValue) { |
- ASSERT(iStart > -1 && iStart <= chars.GetSize()); |
+ ASSERT(iStart >= 0 && iStart <= pdfium::CollectionSize<int32_t>(chars)); |
ASSERT(iStart - iCount > -1); |
- baseType* pTC; |
int32_t iLast = iStart - iCount; |
if (bClass) { |
- for (int32_t i = iStart - 1; i >= iLast; i--) { |
- pTC = chars.GetDataPtr(i); |
- pTC->m_iBidiClass = (int16_t)iValue; |
- } |
+ for (int32_t i = iStart - 1; i >= iLast; i--) |
+ chars[i].m_iBidiClass = (int16_t)iValue; |
} else { |
- for (int32_t i = iStart - 1; i >= iLast; i--) { |
- pTC = chars.GetDataPtr(i); |
- pTC->m_iBidiLevel = (int16_t)iValue; |
- } |
+ for (int32_t i = iStart - 1; i >= iLast; i--) |
+ chars[i].m_iBidiLevel = (int16_t)iValue; |
} |
} |
- void FX_BidiClassify(CFX_ArrayTemplate<baseType>& chars, |
- int32_t iCount, |
- bool bWS) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
- baseType* pTC; |
+ |
+ void FX_BidiClassify(std::vector<baseType>& chars, int32_t iCount, bool bWS) { |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
if (bWS) { |
for (int32_t i = 0; i < iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
- pTC->m_iBidiClass = |
- (int16_t)(pTC->m_dwCharProps & FX_BIDICLASSBITSMASK) >> |
+ chars[i].m_iBidiClass = |
+ (int16_t)(chars[i].m_dwCharProps & FX_BIDICLASSBITSMASK) >> |
FX_BIDICLASSBITS; |
} |
} else { |
for (int32_t i = 0; i < iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
- pTC->m_iBidiClass = (int16_t) |
- gc_FX_BidiNTypes[(pTC->m_dwCharProps & FX_BIDICLASSBITSMASK) >> |
+ chars[i].m_iBidiClass = (int16_t) |
+ gc_FX_BidiNTypes[(chars[i].m_dwCharProps & FX_BIDICLASSBITSMASK) >> |
FX_BIDICLASSBITS]; |
} |
} |
} |
- void FX_BidiResolveExplicit(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ void FX_BidiResolveExplicit(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
- if (iCount < 1) { |
- return; |
- } |
- baseType* pTC; |
- for (int32_t i = 0; i < iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
- pTC->m_iBidiLevel = (int16_t)iBaseLevel; |
- } |
+ for (int32_t i = 0; i < iCount; i++) |
+ chars[i].m_iBidiLevel = static_cast<int16_t>(iBaseLevel); |
} |
- void FX_BidiResolveWeak(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ void FX_BidiResolveWeak(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
iCount--; |
if (iCount < 1) { |
return; |
@@ -503,7 +489,7 @@ class CFX_BidiLineTemplate { |
int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; |
int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; |
for (; i <= iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
+ pTC = &chars[i]; |
iClsCur = pTC->m_iBidiClass; |
if (iClsCur == FX_BIDICLASS_BN) { |
pTC->m_iBidiLevel = (int16_t)iLevelCur; |
@@ -511,7 +497,7 @@ class CFX_BidiLineTemplate { |
iClsCur = FX_BidiDirection(iLevelCur); |
pTC->m_iBidiClass = (int16_t)iClsCur; |
} else if (i < iCount) { |
- pTCNext = chars.GetDataPtr(i + 1); |
+ pTCNext = &chars[i + 1]; |
int32_t iLevelNext, iLevelNew; |
iClsNew = pTCNext->m_iBidiClass; |
iLevelNext = pTCNext->m_iBidiLevel; |
@@ -561,10 +547,11 @@ class CFX_BidiLineTemplate { |
} |
} |
} |
- void FX_BidiResolveNeutrals(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ void FX_BidiResolveNeutrals(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
iCount--; |
if (iCount < 1) { |
@@ -575,7 +562,7 @@ class CFX_BidiLineTemplate { |
int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; |
int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; |
for (; i <= iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
+ pTC = &chars[i]; |
iClsCur = pTC->m_iBidiClass; |
if (iClsCur == FX_BIDICLASS_BN) { |
if (iNum) { |
@@ -609,27 +596,25 @@ class CFX_BidiLineTemplate { |
} |
} |
} |
- void FX_BidiResolveImplicit(CFX_ArrayTemplate<baseType>& chars, |
- int32_t iCount) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
- baseType* pTC; |
- int32_t iCls, iLevel; |
+ |
+ void FX_BidiResolveImplicit(std::vector<baseType>& chars, int32_t iCount) { |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
for (int32_t i = 0; i < iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
- iCls = pTC->m_iBidiClass; |
+ int32_t iCls = chars[i].m_iBidiClass; |
if (iCls == FX_BIDICLASS_BN) { |
continue; |
} |
ASSERT(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); |
- iLevel = pTC->m_iBidiLevel; |
+ int32_t iLevel = chars[i].m_iBidiLevel; |
iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; |
- pTC->m_iBidiLevel = (int16_t)iLevel; |
+ chars[i].m_iBidiLevel = (int16_t)iLevel; |
} |
} |
- void FX_BidiResolveWhitespace(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ void FX_BidiResolveWhitespace(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
if (iCount < 1) { |
return; |
@@ -637,10 +622,8 @@ class CFX_BidiLineTemplate { |
iCount--; |
int32_t iLevel = iBaseLevel; |
int32_t i = 0, iNum = 0; |
- baseType* pTC; |
for (; i <= iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
- switch (pTC->m_iBidiClass) { |
+ switch (chars[i].m_iBidiClass) { |
case FX_BIDICLASS_WS: |
iNum++; |
break; |
@@ -650,7 +633,7 @@ class CFX_BidiLineTemplate { |
case FX_BIDICLASS_RLO: |
case FX_BIDICLASS_PDF: |
case FX_BIDICLASS_BN: |
- pTC->m_iBidiLevel = (int16_t)iLevel; |
+ chars[i].m_iBidiLevel = (int16_t)iLevel; |
iNum++; |
break; |
case FX_BIDICLASS_S: |
@@ -658,41 +641,39 @@ class CFX_BidiLineTemplate { |
if (iNum > 0) { |
FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); |
} |
- pTC->m_iBidiLevel = (int16_t)iBaseLevel; |
+ chars[i].m_iBidiLevel = (int16_t)iBaseLevel; |
iNum = 0; |
break; |
default: |
iNum = 0; |
break; |
} |
- iLevel = pTC->m_iBidiLevel; |
+ iLevel = chars[i].m_iBidiLevel; |
} |
if (iNum > 0) { |
FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); |
} |
} |
- int32_t FX_BidiReorderLevel(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ int32_t FX_BidiReorderLevel(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel, |
int32_t iStart, |
bool bReverse) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
ASSERT(iStart >= 0 && iStart < iCount); |
if (iCount < 1) { |
return 0; |
} |
- baseType* pTC; |
bReverse = bReverse || FX_IsOdd(iBaseLevel); |
- int32_t i = iStart, iLevel; |
+ int32_t i = iStart; |
for (; i < iCount; i++) { |
- pTC = chars.GetDataPtr(i); |
- if ((iLevel = pTC->m_iBidiLevel) == iBaseLevel) { |
+ int32_t iLevel = chars[i].m_iBidiLevel; |
+ if (iLevel == iBaseLevel) |
continue; |
- } |
- if (iLevel < iBaseLevel) { |
+ if (iLevel < iBaseLevel) |
break; |
- } |
i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse) - 1; |
} |
int32_t iNum = i - iStart; |
@@ -701,31 +682,28 @@ class CFX_BidiLineTemplate { |
} |
return iNum; |
} |
- void FX_BidiReorder(CFX_ArrayTemplate<baseType>& chars, |
+ |
+ void FX_BidiReorder(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
int32_t i = 0; |
while (i < iCount) { |
i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, false); |
} |
} |
- void FX_BidiPosition(CFX_ArrayTemplate<baseType>& chars, int32_t iCount) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
- baseType* pTC; |
- int32_t i = 0; |
- while (i < iCount) { |
- pTC = chars.GetDataPtr(i); |
- pTC = chars.GetDataPtr(pTC->m_iBidiPos); |
- pTC->m_iBidiOrder = i++; |
- } |
+ |
+ void FX_BidiPosition(std::vector<baseType>& chars, int32_t iCount) { |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
+ for (int32_t i = 0; i < iCount; ++i) |
+ chars[chars[i].m_iBidiPos].m_iBidiOrder = i; |
} |
- void FX_BidiLine(CFX_ArrayTemplate<baseType>& chars, |
+ void FX_BidiLine(std::vector<baseType>& chars, |
int32_t iCount, |
int32_t iBaseLevel) { |
- ASSERT(iCount > -1 && iCount <= chars.GetSize()); |
+ ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
if (iCount < 2) { |
return; |
} |
@@ -740,11 +718,16 @@ class CFX_BidiLineTemplate { |
FX_BidiPosition(chars, iCount); |
} |
}; |
-void FX_BidiLine(CFX_TxtCharArray& chars, int32_t iCount, int32_t iBaseLevel) { |
+ |
+void FX_BidiLine(std::vector<CFX_TxtChar>& chars, |
+ int32_t iCount, |
+ int32_t iBaseLevel) { |
CFX_BidiLineTemplate<CFX_TxtChar> blt; |
blt.FX_BidiLine(chars, iCount, iBaseLevel); |
} |
-void FX_BidiLine(CFX_RTFCharArray& chars, int32_t iCount, int32_t iBaseLevel) { |
+void FX_BidiLine(std::vector<CFX_RTFChar>& chars, |
+ int32_t iCount, |
+ int32_t iBaseLevel) { |
CFX_BidiLineTemplate<CFX_RTFChar> blt; |
blt.FX_BidiLine(chars, iCount, iBaseLevel); |
} |