diff options
Diffstat (limited to 'core/fxcrt/fx_arabic.cpp')
-rw-r--r-- | core/fxcrt/fx_arabic.cpp | 167 |
1 files changed, 75 insertions, 92 deletions
diff --git a/core/fxcrt/fx_arabic.cpp b/core/fxcrt/fx_arabic.cpp index a649e49759..108c6c19ac 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); } |