Clean up CFX_BidiString.

- Refer to the string in CFX_BidiString by const-ref.
- Remove useless CharAt() method.
- Turn a member variable into a local variable.

Change-Id: I30f221b7350150c839a793129789d8ea7cc1f331
Reviewed-on: https://pdfium-review.googlesource.com/31670
Reviewed-by: dsinclair <dsinclair@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 31ed9fc..cc0c9db 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -702,11 +702,11 @@
          eCurrentDirection == CFX_BidiChar::RIGHT)) {
       eCurrentDirection = CFX_BidiChar::RIGHT;
       for (int m = segment.start + segment.count; m > segment.start; --m)
-        AddCharInfoByRLDirection(bidi.CharAt(m - 1), m_TempCharList[m - 1]);
+        AddCharInfoByRLDirection(str[m - 1], m_TempCharList[m - 1]);
     } else {
       eCurrentDirection = CFX_BidiChar::LEFT;
       for (int m = segment.start; m < segment.start + segment.count; m++)
-        AddCharInfoByLRDirection(bidi.CharAt(m), m_TempCharList[m]);
+        AddCharInfoByLRDirection(str[m], m_TempCharList[m]);
     }
   }
   m_TempCharList.clear();
diff --git a/core/fxcrt/fx_bidi.cpp b/core/fxcrt/fx_bidi.cpp
index db46d99..48504e5 100644
--- a/core/fxcrt/fx_bidi.cpp
+++ b/core/fxcrt/fx_bidi.cpp
@@ -577,16 +577,14 @@
   m_CurrentSegment.direction = direction;
 }
 
-CFX_BidiString::CFX_BidiString(const WideString& str)
-    : m_Str(str),
-      m_pBidiChar(pdfium::MakeUnique<CFX_BidiChar>()),
-      m_eOverallDirection(CFX_BidiChar::LEFT) {
-  for (const auto& c : m_Str) {
-    if (m_pBidiChar->AppendChar(c))
-      m_Order.push_back(m_pBidiChar->GetSegmentInfo());
+CFX_BidiString::CFX_BidiString(const WideString& str) : m_Str(str) {
+  CFX_BidiChar bidi;
+  for (wchar_t c : m_Str) {
+    if (bidi.AppendChar(c))
+      m_Order.push_back(bidi.GetSegmentInfo());
   }
-  if (m_pBidiChar->EndChar())
-    m_Order.push_back(m_pBidiChar->GetSegmentInfo());
+  if (bidi.EndChar())
+    m_Order.push_back(bidi.GetSegmentInfo());
 
   size_t nR2L = std::count_if(m_Order.begin(), m_Order.end(),
                               [](const CFX_BidiChar::Segment& seg) {
@@ -604,6 +602,11 @@
 
 CFX_BidiString::~CFX_BidiString() {}
 
+CFX_BidiChar::Direction CFX_BidiString::OverallDirection() const {
+  ASSERT(m_eOverallDirection != CFX_BidiChar::NEUTRAL);
+  return m_eOverallDirection;
+}
+
 void CFX_BidiString::SetOverallDirectionRight() {
   if (m_eOverallDirection != CFX_BidiChar::RIGHT) {
     std::reverse(m_Order.begin(), m_Order.end());
diff --git a/core/fxcrt/fx_bidi.h b/core/fxcrt/fx_bidi.h
index a9b52cf..54d5255 100644
--- a/core/fxcrt/fx_bidi.h
+++ b/core/fxcrt/fx_bidi.h
@@ -41,7 +41,7 @@
 
   // Call after a change in direction is indicated by the above to get
   // information about the segment to process.
-  Segment GetSegmentInfo() const { return m_LastSegment; }
+  const Segment& GetSegmentInfo() const { return m_LastSegment; }
 
  private:
   void StartNewSegment(CFX_BidiChar::Direction direction);
@@ -58,22 +58,18 @@
   ~CFX_BidiString();
 
   // Overall direction is always LEFT or RIGHT, never NEUTRAL.
-  CFX_BidiChar::Direction OverallDirection() const {
-    return m_eOverallDirection;
-  }
+  CFX_BidiChar::Direction OverallDirection() const;
 
   // Force the overall direction to be R2L regardless of what was detected.
   void SetOverallDirectionRight();
 
-  wchar_t CharAt(size_t x) const { return m_Str[x]; }
   const_iterator begin() const { return m_Order.begin(); }
   const_iterator end() const { return m_Order.end(); }
 
  private:
-  const WideString m_Str;
-  std::unique_ptr<CFX_BidiChar> m_pBidiChar;
+  const WideString& m_Str;
   std::vector<CFX_BidiChar::Segment> m_Order;
-  CFX_BidiChar::Direction m_eOverallDirection;
+  CFX_BidiChar::Direction m_eOverallDirection = CFX_BidiChar::LEFT;
 };
 
 #if PDF_ENABLE_XFA