diff --git a/core/fpdfapi/fpdf_cmaps/cmap_int.h b/core/fpdfapi/fpdf_cmaps/cmap_int.h
index 685d6fe..5735432 100644
--- a/core/fpdfapi/fpdf_cmaps/cmap_int.h
+++ b/core/fpdfapi/fpdf_cmaps/cmap_int.h
@@ -7,6 +7,7 @@
 #ifndef CORE_FPDFAPI_FPDF_CMAPS_CMAP_INT_H_
 #define CORE_FPDFAPI_FPDF_CMAPS_CMAP_INT_H_
 
+#include "core/fxcrt/include/fx_string.h"
 #include "core/fxcrt/include/fx_system.h"
 
 struct FXCMAP_CMap {
@@ -22,7 +23,7 @@
   int m_UseOffset;
 };
 
-void FPDFAPI_FindEmbeddedCMap(const char* name,
+void FPDFAPI_FindEmbeddedCMap(const CFX_ByteString& name,
                               int charset,
                               int coding,
                               const FXCMAP_CMap*& pMap);
diff --git a/core/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp b/core/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
index 1e0250c..caf234b 100644
--- a/core/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
+++ b/core/fpdfapi/fpdf_cmaps/fpdf_cmaps.cpp
@@ -53,7 +53,7 @@
 
 };  // extern "C"
 
-void FPDFAPI_FindEmbeddedCMap(const char* name,
+void FPDFAPI_FindEmbeddedCMap(const CFX_ByteString& bsName,
                               int charset,
                               int coding,
                               const FXCMAP_CMap*& pMap) {
@@ -64,10 +64,10 @@
       pFontGlobals->m_EmbeddedCharsets[charset].m_pMapList;
   for (uint32_t i = 0; i < pFontGlobals->m_EmbeddedCharsets[charset].m_Count;
        i++) {
-    if (FXSYS_strcmp(name, pCMaps[i].m_Name))
-      continue;
-    pMap = &pCMaps[i];
-    break;
+    if (bsName == pCMaps[i].m_Name) {
+      pMap = &pCMaps[i];
+      break;
+    }
   }
 }
 
diff --git a/core/fpdfapi/fpdf_font/font_int.h b/core/fpdfapi/fpdf_font/font_int.h
index a09bb6b..e4689bf 100644
--- a/core/fpdfapi/fpdf_font/font_int.h
+++ b/core/fpdfapi/fpdf_font/font_int.h
@@ -139,7 +139,7 @@
   ~CPDF_CMap();
 
   FX_BOOL LoadPredefined(CPDF_CMapManager* pMgr,
-                         const FX_CHAR* name,
+                         const CFX_ByteString& name,
                          FX_BOOL bPromptCJK);
   FX_BOOL LoadEmbedded(const uint8_t* pData, uint32_t dwSize);
 
diff --git a/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp b/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
index d8cada7..457f8ee 100644
--- a/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
+++ b/core/fpdfapi/fpdf_font/fpdf_font_cid.cpp
@@ -315,10 +315,9 @@
 }
 
 void CPDF_CMapManager::ReloadAll() {
-  for (const auto& pair : m_CMaps) {
-    CPDF_CMap* pCMap = pair.second;
-    pCMap->LoadPredefined(this, pair.first.c_str(), FALSE);
-  }
+  for (const auto& pair : m_CMaps)
+    pair.second->LoadPredefined(this, pair.first, FALSE);
+
   for (size_t i = 0; i < FX_ArraySize(m_CID2UnicodeMaps); ++i) {
     if (CPDF_CID2UnicodeMap* pMap = m_CID2UnicodeMaps[i]) {
       pMap->Load(this, CIDSetFromSizeT(i), FALSE);
@@ -528,12 +527,12 @@
 }
 
 FX_BOOL CPDF_CMap::LoadPredefined(CPDF_CMapManager* pMgr,
-                                  const FX_CHAR* pName,
+                                  const CFX_ByteString& bsName,
                                   FX_BOOL bPromptCJK) {
-  m_PredefinedCMap = pName;
+  m_PredefinedCMap = bsName;
   if (m_PredefinedCMap == "Identity-H" || m_PredefinedCMap == "Identity-V") {
     m_Coding = CIDCODING_CID;
-    m_bVertical = pName[9] == 'V';
+    m_bVertical = bsName[9] == 'V';
     m_bLoaded = TRUE;
     return TRUE;
   }
@@ -564,13 +563,14 @@
       }
     }
   }
-  FPDFAPI_FindEmbeddedCMap(pName, m_Charset, m_Coding, m_pEmbedMap);
-  if (m_pEmbedMap) {
-    m_bLoaded = TRUE;
-    return TRUE;
-  }
-  return FALSE;
+  FPDFAPI_FindEmbeddedCMap(bsName, m_Charset, m_Coding, m_pEmbedMap);
+  if (!m_pEmbedMap)
+    return FALSE;
+
+  m_bLoaded = TRUE;
+  return TRUE;
 }
+
 FX_BOOL CPDF_CMap::LoadEmbedded(const uint8_t* pData, uint32_t size) {
   m_pMapping = FX_Alloc(uint16_t, 65536);
   CPDF_CMapParser parser;
diff --git a/fpdfsdk/fpdfppo.cpp b/fpdfsdk/fpdfppo.cpp
index 85dba5e..3432fb6 100644
--- a/fpdfsdk/fpdfppo.cpp
+++ b/fpdfsdk/fpdfppo.cpp
@@ -223,17 +223,12 @@
         const CFX_ByteString& key = it->first;
         CPDF_Object* pNextObj = it->second;
         ++it;
-        if (!FXSYS_strcmp(key.c_str(), "Parent") ||
-            !FXSYS_strcmp(key.c_str(), "Prev") ||
-            !FXSYS_strcmp(key.c_str(), "First")) {
+        if (key == "Parent" || key == "Prev" || key == "First")
           continue;
-        }
-        if (pNextObj) {
-          if (!UpdateReference(pNextObj, pDoc, pObjNumberMap))
-            pDict->RemoveAt(key);
-        } else {
+        if (!pNextObj)
           return FALSE;
-        }
+        if (!UpdateReference(pNextObj, pDoc, pObjNumberMap))
+          pDict->RemoveAt(key);
       }
       break;
     }
diff --git a/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp b/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp
index 1789d15..17f62f5 100644
--- a/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp
+++ b/fpdfsdk/pdfwindow/PWL_ScrollBar.cpp
@@ -818,15 +818,14 @@
       }
       break;
     case PNM_SETSCROLLINFO: {
-      if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) {
-        if (FXSYS_memcmp(&m_OriginInfo, pInfo, sizeof(PWL_SCROLL_INFO)) != 0) {
-          m_OriginInfo = *pInfo;
-          FX_FLOAT fMax =
-              pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
-          fMax = fMax > 0.0f ? fMax : 0.0f;
-          SetScrollRange(0, fMax, pInfo->fPlateWidth);
-          SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep);
-        }
+      PWL_SCROLL_INFO* pInfo = reinterpret_cast<PWL_SCROLL_INFO*>(lParam);
+      if (pInfo && *pInfo != m_OriginInfo) {
+        m_OriginInfo = *pInfo;
+        FX_FLOAT fMax =
+            pInfo->fContentMax - pInfo->fContentMin - pInfo->fPlateWidth;
+        fMax = fMax > 0.0f ? fMax : 0.0f;
+        SetScrollRange(0, fMax, pInfo->fPlateWidth);
+        SetScrollStep(pInfo->fBigStep, pInfo->fSmallStep);
       }
     } break;
     case PNM_SETSCROLLPOS: {
@@ -1183,13 +1182,12 @@
 
 void CPWL_ScrollBar::TimerProc() {
   PWL_SCROLL_PRIVATEDATA sTemp = m_sData;
-
   if (m_bMinOrMax)
     m_sData.SubSmall();
   else
     m_sData.AddSmall();
 
-  if (FXSYS_memcmp(&m_sData, &sTemp, sizeof(PWL_SCROLL_PRIVATEDATA)) != 0) {
+  if (sTemp != m_sData) {
     MovePosButton(TRUE);
     NotifyScrollWindow();
   }
diff --git a/fpdfsdk/pdfwindow/PWL_ScrollBar.h b/fpdfsdk/pdfwindow/PWL_ScrollBar.h
index c03b20d..ae71472 100644
--- a/fpdfsdk/pdfwindow/PWL_ScrollBar.h
+++ b/fpdfsdk/pdfwindow/PWL_ScrollBar.h
@@ -20,6 +20,16 @@
         fPlateWidth(0.0f),
         fBigStep(0.0f),
         fSmallStep(0.0f) {}
+
+  bool operator==(const PWL_SCROLL_INFO& that) const {
+    return fContentMin == that.fContentMin && fContentMax == that.fContentMax &&
+           fPlateWidth == that.fPlateWidth && fBigStep == that.fBigStep &&
+           fSmallStep == that.fSmallStep;
+  }
+  bool operator!=(const PWL_SCROLL_INFO& that) const {
+    return !(*this == that);
+  }
+
   FX_FLOAT fContentMin;
   FX_FLOAT fContentMax;
   FX_FLOAT fPlateWidth;
@@ -58,18 +68,34 @@
  public:
   PWL_FLOATRANGE();
   PWL_FLOATRANGE(FX_FLOAT min, FX_FLOAT max);
+
+  bool operator==(const PWL_FLOATRANGE& that) const {
+    return fMin == that.fMin && fMax == that.fMax;
+  }
+  bool operator!=(const PWL_FLOATRANGE& that) const { return !(*this == that); }
+
   void Default();
   void Set(FX_FLOAT min, FX_FLOAT max);
   FX_BOOL In(FX_FLOAT x) const;
   FX_FLOAT GetWidth() const;
 
-  FX_FLOAT fMin, fMax;
+  FX_FLOAT fMin;
+  FX_FLOAT fMax;
 };
 
 struct PWL_SCROLL_PRIVATEDATA {
  public:
   PWL_SCROLL_PRIVATEDATA();
 
+  bool operator==(const PWL_SCROLL_PRIVATEDATA& that) const {
+    return ScrollRange == that.ScrollRange &&
+           fClientWidth == that.fClientWidth && fScrollPos == that.fScrollPos &&
+           fBigStep == that.fBigStep && fSmallStep == that.fSmallStep;
+  }
+  bool operator!=(const PWL_SCROLL_PRIVATEDATA& that) const {
+    return !(*this == that);
+  }
+
   void Default();
   void SetScrollRange(FX_FLOAT min, FX_FLOAT max);
   void SetClientWidth(FX_FLOAT width);
