diff --git a/BUILD.gn b/BUILD.gn
index ab36368..e010ace 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -512,7 +512,6 @@
     "core/fxcodec/codec/fx_codec_jpx_opj.cpp",
     "core/fxcodec/include/fx_codec.h",
     "core/fxcodec/include/fx_codec_def.h",
-    "core/fxcodec/include/fx_codec_flate.h",
     "core/fxcodec/jbig2/JBig2_ArithDecoder.cpp",
     "core/fxcodec/jbig2/JBig2_ArithDecoder.h",
     "core/fxcodec/jbig2/JBig2_ArithIntDecoder.cpp",
@@ -765,18 +764,10 @@
     "fpdfsdk/pdfwindow/PWL_FontMap.h",
     "fpdfsdk/pdfwindow/PWL_Icon.cpp",
     "fpdfsdk/pdfwindow/PWL_Icon.h",
-    "fpdfsdk/pdfwindow/PWL_IconList.cpp",
-    "fpdfsdk/pdfwindow/PWL_IconList.h",
-    "fpdfsdk/pdfwindow/PWL_Label.cpp",
-    "fpdfsdk/pdfwindow/PWL_Label.h",
     "fpdfsdk/pdfwindow/PWL_ListBox.cpp",
     "fpdfsdk/pdfwindow/PWL_ListBox.h",
-    "fpdfsdk/pdfwindow/PWL_ListCtrl.cpp",
-    "fpdfsdk/pdfwindow/PWL_ListCtrl.h",
     "fpdfsdk/pdfwindow/PWL_ScrollBar.cpp",
     "fpdfsdk/pdfwindow/PWL_ScrollBar.h",
-    "fpdfsdk/pdfwindow/PWL_Signature.cpp",
-    "fpdfsdk/pdfwindow/PWL_Signature.h",
     "fpdfsdk/pdfwindow/PWL_SpecialButton.cpp",
     "fpdfsdk/pdfwindow/PWL_SpecialButton.h",
     "fpdfsdk/pdfwindow/PWL_Utils.cpp",
@@ -1078,16 +1069,8 @@
       "xfa/fwl/lightwidget/cfwl_picturebox.h",
       "xfa/fwl/lightwidget/cfwl_pushbutton.cpp",
       "xfa/fwl/lightwidget/cfwl_pushbutton.h",
-      "xfa/fwl/lightwidget/cfwl_scrollbar.cpp",
-      "xfa/fwl/lightwidget/cfwl_scrollbar.h",
-      "xfa/fwl/lightwidget/cfwl_theme.cpp",
-      "xfa/fwl/lightwidget/cfwl_theme.h",
-      "xfa/fwl/lightwidget/cfwl_tooltip.cpp",
-      "xfa/fwl/lightwidget/cfwl_tooltip.h",
       "xfa/fwl/lightwidget/cfwl_widget.cpp",
       "xfa/fwl/lightwidget/cfwl_widget.h",
-      "xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp",
-      "xfa/fwl/lightwidget/cfwl_widgetdelegate.h",
       "xfa/fwl/lightwidget/cfwl_widgetproperties.cpp",
       "xfa/fwl/lightwidget/cfwl_widgetproperties.h",
       "xfa/fwl/theme/cfwl_barcodetp.cpp",
@@ -1102,8 +1085,6 @@
       "xfa/fwl/theme/cfwl_datetimepickertp.h",
       "xfa/fwl/theme/cfwl_edittp.cpp",
       "xfa/fwl/theme/cfwl_edittp.h",
-      "xfa/fwl/theme/cfwl_formtp.cpp",
-      "xfa/fwl/theme/cfwl_formtp.h",
       "xfa/fwl/theme/cfwl_listboxtp.cpp",
       "xfa/fwl/theme/cfwl_listboxtp.h",
       "xfa/fwl/theme/cfwl_monthcalendartp.cpp",
@@ -1120,8 +1101,6 @@
       "xfa/fxbarcode/BC_Dimension.cpp",
       "xfa/fxbarcode/BC_Dimension.h",
       "xfa/fxbarcode/BC_Library.cpp",
-      "xfa/fxbarcode/BC_ResultPoint.cpp",
-      "xfa/fxbarcode/BC_ResultPoint.h",
       "xfa/fxbarcode/BC_TwoDimWriter.cpp",
       "xfa/fxbarcode/BC_TwoDimWriter.h",
       "xfa/fxbarcode/BC_UtilCodingConvert.cpp",
@@ -1155,14 +1134,10 @@
       "xfa/fxbarcode/common/BC_CommonBitArray.h",
       "xfa/fxbarcode/common/BC_CommonBitMatrix.cpp",
       "xfa/fxbarcode/common/BC_CommonBitMatrix.h",
-      "xfa/fxbarcode/common/BC_CommonBitSource.cpp",
-      "xfa/fxbarcode/common/BC_CommonBitSource.h",
       "xfa/fxbarcode/common/BC_CommonByteArray.cpp",
       "xfa/fxbarcode/common/BC_CommonByteArray.h",
       "xfa/fxbarcode/common/BC_CommonByteMatrix.cpp",
       "xfa/fxbarcode/common/BC_CommonByteMatrix.h",
-      "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp",
-      "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h",
       "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp",
       "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h",
       "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp",
@@ -1220,8 +1195,6 @@
       "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h",
       "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp",
       "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h",
-      "xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp",
-      "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h",
       "xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp",
       "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h",
       "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp",
diff --git a/core/fxcodec/codec/fx_codec_flate.cpp b/core/fxcodec/codec/fx_codec_flate.cpp
index d32a8a1..fd86cf3 100644
--- a/core/fxcodec/codec/fx_codec_flate.cpp
+++ b/core/fxcodec/codec/fx_codec_flate.cpp
@@ -10,7 +10,6 @@
 #include <memory>
 
 #include "core/fxcodec/include/fx_codec.h"
-#include "core/fxcodec/include/fx_codec_flate.h"
 #include "core/fxcrt/include/fx_ext.h"
 #include "third_party/zlib_v128/zlib.h"
 
diff --git a/core/fxcodec/include/fx_codec_flate.h b/core/fxcodec/include/fx_codec_flate.h
deleted file mode 100644
index 83e9281..0000000
--- a/core/fxcodec/include/fx_codec_flate.h
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright 2015 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef CORE_FXCODEC_INCLUDE_FX_CODEC_FLATE_H_
-#define CORE_FXCODEC_INCLUDE_FX_CODEC_FLATE_H_
-
-#include "third_party/zlib_v128/zlib.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// Note: Some of these return Z_* status codes from zlib.h.
-void* FPDFAPI_FlateInit(void* (*alloc_func)(void*, unsigned int, unsigned int),
-                        void (*free_func)(void*, void*));
-void FPDFAPI_FlateInput(void* context,
-                        const unsigned char* src_buf,
-                        unsigned int src_size);
-int FPDFAPI_FlateOutput(void* context,
-                        unsigned char* dest_buf,
-                        unsigned int dest_size);
-int FPDFAPI_FlateGetAvailIn(void* context);
-int FPDFAPI_FlateGetAvailOut(void* context);
-void FPDFAPI_FlateEnd(void* context);
-
-#ifdef __cplusplus
-}  // extern "C"
-#endif
-
-#endif  // CORE_FXCODEC_INCLUDE_FX_CODEC_FLATE_H_
diff --git a/fpdfsdk/pdfwindow/PWL_IconList.cpp b/fpdfsdk/pdfwindow/PWL_IconList.cpp
deleted file mode 100644
index 26d6c92..0000000
--- a/fpdfsdk/pdfwindow/PWL_IconList.cpp
+++ /dev/null
@@ -1,478 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fpdfsdk/pdfwindow/PWL_IconList.h"
-
-#include "fpdfsdk/pdfwindow/PWL_Label.h"
-#include "fpdfsdk/pdfwindow/PWL_ListCtrl.h"
-#include "fpdfsdk/pdfwindow/PWL_ScrollBar.h"
-#include "fpdfsdk/pdfwindow/PWL_Utils.h"
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-#include "public/fpdf_fwlevent.h"
-
-#define PWL_IconList_ITEM_ICON_LEFTMARGIN 10.0f
-#define PWL_IconList_ITEM_WIDTH 20.0f
-#define PWL_IconList_ITEM_HEIGHT 20.0f
-#define PWL_IconList_ITEM_SPACE 4.0f
-
-CPWL_IconList_Item::CPWL_IconList_Item()
-    : m_nIconIndex(-1),
-      m_pData(nullptr),
-      m_bSelected(FALSE),
-      m_pText(nullptr) {}
-
-CPWL_IconList_Item::~CPWL_IconList_Item() {}
-
-CFX_ByteString CPWL_IconList_Item::GetClassName() const {
-  return "CPWL_IconList_Item";
-}
-
-FX_FLOAT CPWL_IconList_Item::GetItemHeight(FX_FLOAT fLimitWidth) {
-  return PWL_IconList_ITEM_HEIGHT;
-}
-
-void CPWL_IconList_Item::DrawThisAppearance(CFX_RenderDevice* pDevice,
-                                            CFX_Matrix* pUser2Device) {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  if (m_bSelected) {
-    if (IsEnabled()) {
-      CPWL_Utils::DrawFillRect(
-          pDevice, pUser2Device, rcClient,
-          CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_SELBACKCOLOR,
-                                        GetTransparency()));
-    } else {
-      CPWL_Utils::DrawFillRect(
-          pDevice, pUser2Device, rcClient,
-          CPWL_Utils::PWLColorToFXColor(PWL_DEFAULT_LIGHTGRAYCOLOR,
-                                        GetTransparency()));
-    }
-  }
-
-  CFX_FloatRect rcIcon = rcClient;
-  rcIcon.left += PWL_IconList_ITEM_ICON_LEFTMARGIN;
-  rcIcon.right = rcIcon.left + PWL_IconList_ITEM_WIDTH;
-
-  CPWL_Utils::DrawIconAppStream(pDevice, pUser2Device, m_nIconIndex, rcIcon,
-                                m_crIcon, m_pText->GetTextColor(),
-                                GetTransparency());
-}
-
-void CPWL_IconList_Item::SetSelect(FX_BOOL bSelected) {
-  m_bSelected = bSelected;
-
-  if (bSelected)
-    m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);
-  else
-    m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);
-}
-
-FX_BOOL CPWL_IconList_Item::IsSelected() const {
-  return m_bSelected;
-}
-
-void CPWL_IconList_Item::CreateChildWnd(const PWL_CREATEPARAM& cp) {
-  m_pText = new CPWL_Label;
-
-  PWL_CREATEPARAM lcp = cp;
-  lcp.pParentWnd = this;
-  lcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PES_LEFT | PES_CENTER;
-  lcp.sTextColor = PWL_DEFAULT_BLACKCOLOR;
-  lcp.fFontSize = 12;
-  m_pText->Create(lcp);
-}
-
-void CPWL_IconList_Item::SetData(void* pData) {
-  m_pData = pData;
-}
-
-void CPWL_IconList_Item::SetIcon(int32_t nIconIndex) {
-  m_nIconIndex = nIconIndex;
-}
-
-void CPWL_IconList_Item::SetText(const CFX_WideString& str) {
-  m_pText->SetText(str.c_str());
-}
-
-CFX_WideString CPWL_IconList_Item::GetText() const {
-  return m_pText->GetText();
-}
-
-void CPWL_IconList_Item::RePosChildWnd() {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  rcClient.left +=
-      (PWL_IconList_ITEM_ICON_LEFTMARGIN + PWL_IconList_ITEM_WIDTH +
-       PWL_IconList_ITEM_ICON_LEFTMARGIN);
-
-  m_pText->Move(rcClient, TRUE, FALSE);
-}
-
-void CPWL_IconList_Item::SetIconFillColor(const CPWL_Color& color) {
-  m_crIcon = color;
-}
-
-void CPWL_IconList_Item::OnEnabled() {
-  if (m_bSelected)
-    m_pText->SetTextColor(PWL_DEFAULT_WHITECOLOR);
-  else
-    m_pText->SetTextColor(PWL_DEFAULT_BLACKCOLOR);
-
-  InvalidateRect();
-}
-
-void CPWL_IconList_Item::OnDisabled() {
-  m_pText->SetTextColor(PWL_DEFAULT_HEAVYGRAYCOLOR);
-
-  InvalidateRect();
-}
-
-CPWL_IconList_Content::CPWL_IconList_Content(int32_t nListCount)
-    : m_nSelectIndex(-1),
-      m_bMouseDown(FALSE),
-      m_nListCount(nListCount) {}
-
-CPWL_IconList_Content::~CPWL_IconList_Content() {}
-
-void CPWL_IconList_Content::CreateChildWnd(const PWL_CREATEPARAM& cp) {
-  for (int32_t i = 0; i < m_nListCount; i++) {
-    CPWL_IconList_Item* pNewItem = new CPWL_IconList_Item();
-
-    PWL_CREATEPARAM icp = cp;
-    icp.pParentWnd = this;
-    icp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_NOREFRESHCLIP;
-    pNewItem->Create(icp);
-  }
-
-  SetItemSpace(PWL_IconList_ITEM_SPACE);
-  ResetContent(0);
-
-  if (CPWL_Wnd* pParent = GetParentWindow()) {
-    CFX_FloatRect rcScroll = GetScrollArea();
-    GetScrollPos();
-
-    PWL_SCROLL_INFO sInfo;
-    sInfo.fContentMin = rcScroll.bottom;
-    sInfo.fContentMax = rcScroll.top;
-    sInfo.fPlateWidth = GetClientRect().Height();
-    sInfo.fSmallStep = 13.0f;
-    sInfo.fBigStep = sInfo.fPlateWidth;
-
-    pParent->OnNotify(this, PNM_SETSCROLLINFO, SBT_VSCROLL, (intptr_t)&sInfo);
-  }
-}
-
-FX_BOOL CPWL_IconList_Content::OnLButtonDown(const CFX_FloatPoint& point,
-                                             uint32_t nFlag) {
-  SetFocus();
-
-  SetCapture();
-  m_bMouseDown = TRUE;
-
-  int32_t nItemIndex = FindItemIndex(point);
-  SetSelect(nItemIndex);
-  ScrollToItem(nItemIndex);
-
-  return TRUE;
-}
-
-FX_BOOL CPWL_IconList_Content::OnLButtonUp(const CFX_FloatPoint& point,
-                                           uint32_t nFlag) {
-  m_bMouseDown = FALSE;
-  ReleaseCapture();
-
-  return TRUE;
-}
-
-FX_BOOL CPWL_IconList_Content::OnMouseMove(const CFX_FloatPoint& point,
-                                           uint32_t nFlag) {
-  if (m_bMouseDown) {
-    int32_t nItemIndex = FindItemIndex(point);
-    SetSelect(nItemIndex);
-    ScrollToItem(nItemIndex);
-  }
-
-  return TRUE;
-}
-
-FX_BOOL CPWL_IconList_Content::OnKeyDown(uint16_t nChar, uint32_t nFlag) {
-  switch (nChar) {
-    case FWL_VKEY_Up:
-      if (m_nSelectIndex > 0) {
-        int32_t nItemIndex = m_nSelectIndex - 1;
-        SetSelect(nItemIndex);
-        ScrollToItem(nItemIndex);
-      }
-      return TRUE;
-    case FWL_VKEY_Down:
-      if (m_nSelectIndex < m_nListCount - 1) {
-        int32_t nItemIndex = m_nSelectIndex + 1;
-        SetSelect(nItemIndex);
-        ScrollToItem(nItemIndex);
-      }
-      return TRUE;
-  }
-
-  return FALSE;
-}
-
-int32_t CPWL_IconList_Content::FindItemIndex(const CFX_FloatPoint& point) {
-  int32_t nIndex = 0;
-  for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
-    if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
-      CFX_FloatRect rcWnd = pChild->ChildToParent(pChild->GetWindowRect());
-
-      if (point.y < rcWnd.top) {
-        nIndex = i;
-      }
-    }
-  }
-
-  return nIndex;
-}
-
-void CPWL_IconList_Content::ScrollToItem(int32_t nItemIndex) {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) {
-    CFX_FloatRect rcOrigin = pItem->GetWindowRect();
-    CFX_FloatRect rcWnd = pItem->ChildToParent(rcOrigin);
-
-    if (!(rcWnd.bottom > rcClient.bottom && rcWnd.top < rcClient.top)) {
-      CFX_FloatPoint ptScroll = GetScrollPos();
-
-      if (rcWnd.top > rcClient.top) {
-        ptScroll.y = rcOrigin.top;
-      } else if (rcWnd.bottom < rcClient.bottom) {
-        ptScroll.y = rcOrigin.bottom + rcClient.Height();
-      }
-
-      SetScrollPos(ptScroll);
-      ResetFace();
-      InvalidateRect();
-      if (CPWL_Wnd* pParent = GetParentWindow()) {
-        pParent->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL,
-                          (intptr_t)&ptScroll.y);
-      }
-    }
-  }
-}
-
-void CPWL_IconList_Content::SetSelect(int32_t nIndex) {
-  if (m_nSelectIndex == nIndex)
-    return;
-
-  SelectItem(m_nSelectIndex, FALSE);
-  SelectItem(nIndex, TRUE);
-  m_nSelectIndex = nIndex;
-}
-
-int32_t CPWL_IconList_Content::GetSelect() const {
-  return m_nSelectIndex;
-}
-
-void CPWL_IconList_Content::SelectItem(int32_t nItemIndex, FX_BOOL bSelect) {
-  if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex)) {
-    pItem->SetSelect(bSelect);
-    pItem->InvalidateRect();
-  }
-}
-
-CPWL_IconList_Item* CPWL_IconList_Content::GetListItem(
-    int32_t nItemIndex) const {
-  if (nItemIndex >= 0 && nItemIndex < m_aChildren.GetSize()) {
-    if (CPWL_Wnd* pChild = m_aChildren.GetAt(nItemIndex)) {
-      if (pChild->GetClassName() == "CPWL_IconList_Item") {
-        return (CPWL_IconList_Item*)pChild;
-      }
-    }
-  }
-
-  return nullptr;
-}
-
-void CPWL_IconList_Content::SetListData(int32_t nItemIndex, void* pData) {
-  if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
-    pItem->SetData(pData);
-}
-
-void CPWL_IconList_Content::SetListIcon(int32_t nItemIndex,
-                                        int32_t nIconIndex) {
-  if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
-    pItem->SetIcon(nIconIndex);
-}
-
-void CPWL_IconList_Content::SetListString(int32_t nItemIndex,
-                                          const CFX_WideString& str) {
-  if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
-    pItem->SetText(str);
-}
-
-CFX_WideString CPWL_IconList_Content::GetListString(int32_t nItemIndex) const {
-  if (CPWL_IconList_Item* pItem = GetListItem(nItemIndex))
-    return pItem->GetText();
-
-  return L"";
-}
-
-void CPWL_IconList_Content::SetIconFillColor(const CPWL_Color& color) {
-  for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
-    if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
-      if (pChild->GetClassName() == "CPWL_IconList_Item") {
-        CPWL_IconList_Item* pItem = (CPWL_IconList_Item*)pChild;
-        pItem->SetIconFillColor(color);
-        pItem->InvalidateRect();
-      }
-    }
-  }
-}
-
-CPWL_IconList::CPWL_IconList(int32_t nListCount)
-    : m_pListContent(nullptr), m_nListCount(nListCount) {}
-
-CPWL_IconList::~CPWL_IconList() {}
-
-void CPWL_IconList::RePosChildWnd() {
-  CPWL_Wnd::RePosChildWnd();
-
-  if (m_pListContent)
-    m_pListContent->Move(GetClientRect(), TRUE, FALSE);
-}
-
-void CPWL_IconList::CreateChildWnd(const PWL_CREATEPARAM& cp) {
-  m_pListContent = new CPWL_IconList_Content(m_nListCount);
-
-  PWL_CREATEPARAM ccp = cp;
-  ccp.pParentWnd = this;
-  ccp.dwFlags = PWS_CHILD | PWS_VISIBLE;
-  m_pListContent->Create(ccp);
-}
-
-void CPWL_IconList::OnCreated() {
-  if (CPWL_ScrollBar* pScrollBar = GetVScrollBar()) {
-    pScrollBar->RemoveFlag(PWS_AUTOTRANSPARENT);
-    pScrollBar->SetTransparency(255);
-    pScrollBar->SetNotifyForever(TRUE);
-  }
-}
-
-void CPWL_IconList::OnNotify(CPWL_Wnd* pWnd,
-                             uint32_t msg,
-                             intptr_t wParam,
-                             intptr_t lParam) {
-  CPWL_Wnd::OnNotify(pWnd, msg, wParam, lParam);
-
-  if (wParam == SBT_VSCROLL) {
-    switch (msg) {
-      case PNM_SETSCROLLINFO:
-        if (PWL_SCROLL_INFO* pInfo = (PWL_SCROLL_INFO*)lParam) {
-          if (CPWL_ScrollBar* pScrollBar = GetVScrollBar()) {
-            if (pInfo->fContentMax - pInfo->fContentMin > pInfo->fPlateWidth) {
-              if (!pScrollBar->IsVisible()) {
-                pScrollBar->SetVisible(TRUE);
-                RePosChildWnd();
-              } else {
-              }
-            } else {
-              if (pScrollBar->IsVisible()) {
-                pScrollBar->SetVisible(FALSE);
-                RePosChildWnd();
-              }
-
-              if (m_pListContent)
-                m_pListContent->SetScrollPos(CFX_FloatPoint(0.0f, 0.0f));
-            }
-
-            pScrollBar->OnNotify(pWnd, PNM_SETSCROLLINFO, wParam, lParam);
-          }
-        }
-        return;
-      case PNM_SCROLLWINDOW:
-        if (m_pListContent) {
-          m_pListContent->SetScrollPos(
-              CFX_FloatPoint(0.0f, *(FX_FLOAT*)lParam));
-          m_pListContent->ResetFace();
-          m_pListContent->InvalidateRect(nullptr);
-        }
-        return;
-      case PNM_SETSCROLLPOS:
-        if (CPWL_ScrollBar* pScrollBar = GetVScrollBar())
-          pScrollBar->OnNotify(pWnd, PNM_SETSCROLLPOS, wParam, lParam);
-        return;
-    }
-  }
-}
-
-void CPWL_IconList::SetSelect(int32_t nIndex) {
-  m_pListContent->SetSelect(nIndex);
-}
-
-void CPWL_IconList::SetTopItem(int32_t nIndex) {
-  m_pListContent->ScrollToItem(nIndex);
-}
-
-int32_t CPWL_IconList::GetSelect() const {
-  return m_pListContent->GetSelect();
-}
-
-void CPWL_IconList::SetListData(int32_t nItemIndex, void* pData) {
-  m_pListContent->SetListData(nItemIndex, pData);
-}
-
-void CPWL_IconList::SetListIcon(int32_t nItemIndex, int32_t nIconIndex) {
-  m_pListContent->SetListIcon(nItemIndex, nIconIndex);
-}
-
-void CPWL_IconList::SetListString(int32_t nItemIndex,
-                                  const CFX_WideString& str) {
-  m_pListContent->SetListString(nItemIndex, str);
-}
-
-CFX_WideString CPWL_IconList::GetListString(int32_t nItemIndex) const {
-  return m_pListContent->GetListString(nItemIndex);
-}
-
-void CPWL_IconList::SetIconFillColor(const CPWL_Color& color) {
-  m_pListContent->SetIconFillColor(color);
-}
-
-FX_BOOL CPWL_IconList::OnMouseWheel(short zDelta,
-                                    const CFX_FloatPoint& point,
-                                    uint32_t nFlag) {
-  CFX_FloatPoint ptScroll = m_pListContent->GetScrollPos();
-  CFX_FloatRect rcScroll = m_pListContent->GetScrollArea();
-  CFX_FloatRect rcContents = m_pListContent->GetClientRect();
-
-  if (rcScroll.top - rcScroll.bottom > rcContents.Height()) {
-    CFX_FloatPoint ptNew = ptScroll;
-
-    if (zDelta > 0)
-      ptNew.y += 30;
-    else
-      ptNew.y -= 30;
-
-    if (ptNew.y > rcScroll.top)
-      ptNew.y = rcScroll.top;
-    if (ptNew.y < rcScroll.bottom + rcContents.Height())
-      ptNew.y = rcScroll.bottom + rcContents.Height();
-    if (ptNew.y < rcScroll.bottom)
-      ptNew.y = rcScroll.bottom;
-
-    if (ptNew.y != ptScroll.y) {
-      m_pListContent->SetScrollPos(ptNew);
-      m_pListContent->ResetFace();
-      m_pListContent->InvalidateRect(nullptr);
-
-      if (CPWL_ScrollBar* pScrollBar = GetVScrollBar())
-        pScrollBar->OnNotify(this, PNM_SETSCROLLPOS, SBT_VSCROLL,
-                             (intptr_t)&ptNew.y);
-
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
diff --git a/fpdfsdk/pdfwindow/PWL_IconList.h b/fpdfsdk/pdfwindow/PWL_IconList.h
deleted file mode 100644
index 901f4de..0000000
--- a/fpdfsdk/pdfwindow/PWL_IconList.h
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FPDFSDK_PDFWINDOW_PWL_ICONLIST_H_
-#define FPDFSDK_PDFWINDOW_PWL_ICONLIST_H_
-
-#include "core/fxcrt/include/fx_string.h"
-#include "fpdfsdk/pdfwindow/PWL_ListCtrl.h"
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-class CPWL_IconList_Item;
-class CPWL_IconList_Content;
-class CPWL_IconList;
-class CPWL_Label;
-
-class CPWL_IconList_Item : public CPWL_Wnd {
- public:
-  CPWL_IconList_Item();
-  ~CPWL_IconList_Item() override;
-
-  void SetSelect(FX_BOOL bSelected);
-  FX_BOOL IsSelected() const;
-  void SetData(void* pData);
-  void SetIcon(int32_t nIconIndex);
-  void SetText(const CFX_WideString& str);
-  void SetIconFillColor(const CPWL_Color& color);
-  CFX_WideString GetText() const;
-
- protected:
-  // CPWL_Wnd
-  CFX_ByteString GetClassName() const override;
-  void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
-  void RePosChildWnd() override;
-  FX_FLOAT GetItemHeight(FX_FLOAT fLimitWidth) override;
-  void DrawThisAppearance(CFX_RenderDevice* pDevice,
-                          CFX_Matrix* pUser2Device) override;
-  void OnEnabled() override;
-  void OnDisabled() override;
-
- private:
-  int32_t m_nIconIndex;
-  void* m_pData;
-  FX_BOOL m_bSelected;
-  CPWL_Label* m_pText;
-  CPWL_Color m_crIcon;
-};
-
-class CPWL_IconList_Content : public CPWL_ListCtrl {
- public:
-  CPWL_IconList_Content(int32_t nListCount);
-  ~CPWL_IconList_Content() override;
-
-  void SetSelect(int32_t nIndex);
-  int32_t GetSelect() const;
-  void SetListData(int32_t nItemIndex, void* pData);
-  void SetListIcon(int32_t nItemIndex, int32_t nIconIndex);
-  void SetListString(int32_t nItemIndex, const CFX_WideString& str);
-  void SetIconFillColor(const CPWL_Color& color);
-  CFX_WideString GetListString(int32_t nItemIndex) const;
-  void ScrollToItem(int32_t nItemIndex);
-
- protected:
-  // CPWL_ListCtrl
-  void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
-  FX_BOOL OnLButtonDown(const CFX_FloatPoint& point, uint32_t nFlag) override;
-  FX_BOOL OnLButtonUp(const CFX_FloatPoint& point, uint32_t nFlag) override;
-  FX_BOOL OnMouseMove(const CFX_FloatPoint& point, uint32_t nFlag) override;
-  FX_BOOL OnKeyDown(uint16_t nChar, uint32_t nFlag) override;
-
- private:
-  CPWL_IconList_Item* GetListItem(int32_t nItemIndex) const;
-  void SelectItem(int32_t nItemIndex, FX_BOOL bSelect);
-  int32_t FindItemIndex(const CFX_FloatPoint& point);
-
-  int32_t m_nSelectIndex;
-  FX_BOOL m_bMouseDown;
-  int32_t m_nListCount;
-};
-
-class CPWL_IconList : public CPWL_Wnd {
- public:
-  CPWL_IconList(int32_t nListCount);
-  ~CPWL_IconList() override;
-
-  void SetSelect(int32_t nIndex);
-  void SetTopItem(int32_t nIndex);
-  int32_t GetSelect() const;
-  void SetListData(int32_t nItemIndex, void* pData);
-  void SetListIcon(int32_t nItemIndex, int32_t nIconIndex);
-  void SetListString(int32_t nItemIndex, const CFX_WideString& str);
-  void SetIconFillColor(const CPWL_Color& color);
-  CFX_WideString GetListString(int32_t nItemIndex) const;
-
- protected:
-  // CPWL_Wnd
-  FX_BOOL OnMouseWheel(short zDelta,
-                       const CFX_FloatPoint& point,
-                       uint32_t nFlag) override;
-  void OnCreated() override;
-  void RePosChildWnd() override;
-  void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
-  void OnNotify(CPWL_Wnd* pWnd,
-                uint32_t msg,
-                intptr_t wParam = 0,
-                intptr_t lParam = 0) override;
-
- private:
-  CPWL_IconList_Content* m_pListContent;
-  int32_t m_nListCount;
-};
-
-#endif  // FPDFSDK_PDFWINDOW_PWL_ICONLIST_H_
diff --git a/fpdfsdk/pdfwindow/PWL_Label.cpp b/fpdfsdk/pdfwindow/PWL_Label.cpp
deleted file mode 100644
index 83d299c..0000000
--- a/fpdfsdk/pdfwindow/PWL_Label.cpp
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fpdfsdk/fxedit/include/fx_edit.h"
-#include "fpdfsdk/pdfwindow/PWL_Label.h"
-#include "fpdfsdk/pdfwindow/PWL_Utils.h"
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-CPWL_Label::CPWL_Label() : m_pEdit(IFX_Edit::NewEdit()) {}
-
-CPWL_Label::~CPWL_Label() {
-  IFX_Edit::DelEdit(m_pEdit);
-}
-
-CFX_ByteString CPWL_Label::GetClassName() const {
-  return "CPWL_Label";
-}
-
-void CPWL_Label::OnCreated() {
-  SetParamByFlag();
-  SetFontSize(GetCreationParam().fFontSize);
-
-  m_pEdit->SetFontMap(GetFontMap());
-  m_pEdit->Initialize();
-
-  if (HasFlag(PES_TEXTOVERFLOW)) {
-    SetClipRect(CFX_FloatRect(0.0f, 0.0f, 0.0f, 0.0f));
-    m_pEdit->SetTextOverflow(TRUE);
-  }
-}
-
-void CPWL_Label::SetText(const FX_WCHAR* csText) {
-  m_pEdit->SetText(csText);
-}
-
-void CPWL_Label::RePosChildWnd() {
-  m_pEdit->SetPlateRect(GetClientRect());
-}
-
-void CPWL_Label::SetFontSize(FX_FLOAT fFontSize) {
-  m_pEdit->SetFontSize(fFontSize);
-}
-
-FX_FLOAT CPWL_Label::GetFontSize() const {
-  return m_pEdit->GetFontSize();
-}
-
-void CPWL_Label::SetParamByFlag() {
-  if (HasFlag(PES_LEFT)) {
-    m_pEdit->SetAlignmentH(0);
-  } else if (HasFlag(PES_MIDDLE)) {
-    m_pEdit->SetAlignmentH(1);
-  } else if (HasFlag(PES_RIGHT)) {
-    m_pEdit->SetAlignmentH(2);
-  } else {
-    m_pEdit->SetAlignmentH(0);
-  }
-
-  if (HasFlag(PES_TOP)) {
-    m_pEdit->SetAlignmentV(0);
-  } else if (HasFlag(PES_CENTER)) {
-    m_pEdit->SetAlignmentV(1);
-  } else if (HasFlag(PES_BOTTOM)) {
-    m_pEdit->SetAlignmentV(2);
-  } else {
-    m_pEdit->SetAlignmentV(0);
-  }
-
-  if (HasFlag(PES_PASSWORD)) {
-    m_pEdit->SetPasswordChar('*');
-  }
-
-  m_pEdit->SetMultiLine(HasFlag(PES_MULTILINE));
-  m_pEdit->SetAutoReturn(HasFlag(PES_AUTORETURN));
-  m_pEdit->SetAutoFontSize(HasFlag(PWS_AUTOFONTSIZE));
-  m_pEdit->SetAutoScroll(HasFlag(PES_AUTOSCROLL));
-}
-
-void CPWL_Label::DrawThisAppearance(CFX_RenderDevice* pDevice,
-                                    CFX_Matrix* pUser2Device) {
-  CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
-
-  GetClientRect();
-
-  CFX_FloatRect rcClip;
-  CPVT_WordRange wrRange = m_pEdit->GetVisibleWordRange();
-  CPVT_WordRange* pRange = nullptr;
-
-  if (!HasFlag(PES_TEXTOVERFLOW)) {
-    rcClip = GetClientRect();
-    pRange = &wrRange;
-  }
-  CFX_SystemHandler* pSysHandler = GetSystemHandler();
-  IFX_Edit::DrawEdit(
-      pDevice, pUser2Device, m_pEdit,
-      CPWL_Utils::PWLColorToFXColor(GetTextColor(), GetTransparency()),
-      CPWL_Utils::PWLColorToFXColor(GetTextStrokeColor(), GetTransparency()),
-      rcClip, CFX_FloatPoint(0.0f, 0.0f), pRange, pSysHandler, nullptr);
-}
-
-void CPWL_Label::SetHorzScale(int32_t nHorzScale) {
-  m_pEdit->SetHorzScale(nHorzScale);
-}
-
-void CPWL_Label::SetCharSpace(FX_FLOAT fCharSpace) {
-  m_pEdit->SetCharSpace(fCharSpace);
-}
-
-CFX_FloatRect CPWL_Label::GetContentRect() const {
-  return m_pEdit->GetContentRect();
-}
-
-void CPWL_Label::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
-  CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-
-  sAppStream << GetTextAppearanceStream(CFX_FloatPoint(0.0f, 0.0f)).AsStringC();
-}
-
-CFX_ByteString CPWL_Label::GetTextAppearanceStream(
-    const CFX_FloatPoint& ptOffset) const {
-  CFX_ByteTextBuf sRet;
-  CFX_ByteString sEdit = CPWL_Utils::GetEditAppStream(m_pEdit, ptOffset);
-  if (sEdit.GetLength() > 0) {
-    sRet << "BT\n" << CPWL_Utils::GetColorAppStream(GetTextColor()).AsStringC()
-         << sEdit.AsStringC() << "ET\n";
-  }
-  return sRet.MakeString();
-}
-
-CFX_WideString CPWL_Label::GetText() const {
-  return m_pEdit->GetText();
-}
-
-void CPWL_Label::SetLimitChar(int32_t nLimitChar) {
-  m_pEdit->SetLimitChar(nLimitChar);
-}
-
-int32_t CPWL_Label::GetTotalWords() {
-  return m_pEdit->GetTotalWords();
-}
diff --git a/fpdfsdk/pdfwindow/PWL_Label.h b/fpdfsdk/pdfwindow/PWL_Label.h
deleted file mode 100644
index 7b5a3e5..0000000
--- a/fpdfsdk/pdfwindow/PWL_Label.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FPDFSDK_PDFWINDOW_PWL_LABEL_H_
-#define FPDFSDK_PDFWINDOW_PWL_LABEL_H_
-
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-class IFX_Edit;
-
-class CPWL_Label : public CPWL_Wnd {
- public:
-  CPWL_Label();
-  ~CPWL_Label() override;
-
-  void SetText(const FX_WCHAR* csText);
-  CFX_WideString GetText() const;
-  void SetLimitChar(int32_t nLimitChar);
-  void SetHorzScale(int32_t nHorzScale);
-  void SetCharSpace(FX_FLOAT fCharSpace);
-  CFX_FloatRect GetContentRect() const;
-  int32_t GetTotalWords();
-  CFX_ByteString GetTextAppearanceStream(const CFX_FloatPoint& ptOffset) const;
-
- protected:
-  // CPWL_Wnd
-  CFX_ByteString GetClassName() const override;
-  void SetFontSize(FX_FLOAT fFontSize) override;
-  FX_FLOAT GetFontSize() const override;
-  void OnCreated() override;
-  void DrawThisAppearance(CFX_RenderDevice* pDevice,
-                          CFX_Matrix* pUser2Device) override;
-  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
-  void RePosChildWnd() override;
-
- private:
-  void SetParamByFlag();
-
-  IFX_Edit* m_pEdit;
-};
-
-#endif  // FPDFSDK_PDFWINDOW_PWL_LABEL_H_
diff --git a/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp b/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp
deleted file mode 100644
index dde2160..0000000
--- a/fpdfsdk/pdfwindow/PWL_ListCtrl.cpp
+++ /dev/null
@@ -1,205 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "core/fxge/include/fx_ge.h"
-#include "fpdfsdk/pdfwindow/PWL_ListCtrl.h"
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-CPWL_ListCtrl::CPWL_ListCtrl()
-    : m_rcContent(0, 0, 0, 0),
-      m_ptScroll(0, 0),
-      m_fItemSpace(0.0f),
-      m_fTopSpace(0.0f),
-      m_fBottomSpace(0.0f) {}
-
-CPWL_ListCtrl::~CPWL_ListCtrl() {}
-
-void CPWL_ListCtrl::SetScrollPos(const CFX_FloatPoint& point) {
-  m_ptScroll = point;
-
-  if (m_ptScroll.x < m_rcContent.left)
-    m_ptScroll.x = m_rcContent.left;
-
-  if (m_ptScroll.x > m_rcContent.right)
-    m_ptScroll.x = m_rcContent.right;
-
-  if (m_ptScroll.y > m_rcContent.top)
-    m_ptScroll.y = m_rcContent.top;
-
-  if (m_ptScroll.y < m_rcContent.bottom)
-    m_ptScroll.y = m_rcContent.bottom;
-}
-
-CFX_FloatPoint CPWL_ListCtrl::GetScrollPos() const {
-  return m_ptScroll;
-}
-
-CFX_FloatRect CPWL_ListCtrl::GetScrollArea() const {
-  return m_rcContent;
-}
-
-void CPWL_ListCtrl::ResetFace() {
-  ResetAll(FALSE, 0);
-}
-
-void CPWL_ListCtrl::ResetContent(int32_t nStart) {
-  if (nStart < 0)
-    nStart = 0;
-  if (nStart >= 0 && nStart < m_aChildren.GetSize())
-    ResetAll(TRUE, nStart);
-}
-
-FX_FLOAT CPWL_ListCtrl::GetContentsHeight(FX_FLOAT fLimitWidth) {
-  FX_FLOAT fRet = m_fTopSpace;
-
-  FX_FLOAT fBorderWidth = (FX_FLOAT)GetBorderWidth();
-
-  if (fLimitWidth > fBorderWidth * 2) {
-    for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
-      if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
-        FX_FLOAT fLeft = pChild->GetItemLeftMargin();
-        FX_FLOAT fRight = pChild->GetItemRightMargin();
-
-        fRet += pChild->GetItemHeight(fLimitWidth - fBorderWidth * 2 - fLeft -
-                                      fRight);
-        fRet += m_fItemSpace;
-      }
-    }
-
-    fRet -= m_fItemSpace;
-  }
-
-  fRet += m_fBottomSpace;
-
-  return fRet;
-}
-
-void CPWL_ListCtrl::ResetAll(FX_BOOL bMove, int32_t nStart) {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  FX_FLOAT fWidth = rcClient.Width();
-
-  FX_FLOAT fy = 0.0f - m_fTopSpace;
-
-  if (nStart - 1 >= 0 && nStart - 1 < m_aChildren.GetSize())
-    if (CPWL_Wnd* pChild = m_aChildren.GetAt(nStart - 1))
-      fy = pChild->GetWindowRect().bottom - m_fItemSpace;
-
-  for (int32_t i = nStart, sz = m_aChildren.GetSize(); i < sz; i++) {
-    if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
-      FX_FLOAT fLeft = pChild->GetItemLeftMargin();
-      FX_FLOAT fRight = pChild->GetItemRightMargin();
-
-      pChild->SetChildMatrix(CFX_Matrix(1, 0, 0, 1,
-                                        rcClient.left - m_ptScroll.x,
-                                        rcClient.top - m_ptScroll.y));
-
-      if (bMove) {
-        FX_FLOAT fItemHeight = pChild->GetItemHeight(fWidth - fLeft - fRight);
-        pChild->Move(
-            CFX_FloatRect(fLeft, fy - fItemHeight, fWidth - fRight, fy), TRUE,
-            FALSE);
-        fy -= fItemHeight;
-        fy -= m_fItemSpace;
-      }
-    }
-  }
-
-  fy += m_fItemSpace;
-
-  fy -= m_fBottomSpace;
-
-  if (bMove) {
-    m_rcContent.left = 0;
-    m_rcContent.top = 0;
-    m_rcContent.right = fWidth;
-    m_rcContent.bottom = fy;
-  }
-}
-
-void CPWL_ListCtrl::SetItemSpace(FX_FLOAT fSpace) {
-  m_fItemSpace = fSpace;
-}
-
-void CPWL_ListCtrl::SetTopSpace(FX_FLOAT fSpace) {
-  m_fTopSpace = fSpace;
-}
-
-void CPWL_ListCtrl::SetBottomSpace(FX_FLOAT fSpace) {
-  m_fBottomSpace = fSpace;
-}
-
-void CPWL_ListCtrl::RePosChildWnd() {
-  ResetFace();
-}
-
-void CPWL_ListCtrl::DrawChildAppearance(CFX_RenderDevice* pDevice,
-                                        CFX_Matrix* pUser2Device) {
-  pDevice->SaveState();
-  CFX_FloatRect rcClient = GetClientRect();
-  CFX_FloatRect rcTemp = rcClient;
-  pUser2Device->TransformRect(rcTemp);
-  pDevice->SetClip_Rect(FX_RECT((int32_t)rcTemp.left, (int32_t)rcTemp.bottom,
-                                (int32_t)rcTemp.right, (int32_t)rcTemp.top));
-
-  for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
-    if (CPWL_Wnd* pChild = m_aChildren.GetAt(i)) {
-      CFX_FloatRect rcChild = pChild->ChildToParent(pChild->GetWindowRect());
-      if (!(rcChild.top < rcClient.bottom || rcChild.bottom > rcClient.top)) {
-        CFX_Matrix mt = pChild->GetChildMatrix();
-        if (mt.IsIdentity()) {
-          pChild->DrawAppearance(pDevice, pUser2Device);
-        } else {
-          mt.Concat(*pUser2Device);
-          pChild->DrawAppearance(pDevice, &mt);
-        }
-      }
-    }
-  }
-
-  pDevice->RestoreState(false);
-}
-
-int32_t CPWL_ListCtrl::GetItemIndex(CPWL_Wnd* pItem) {
-  for (int32_t i = 0, sz = m_aChildren.GetSize(); i < sz; i++) {
-    if (pItem == m_aChildren.GetAt(i))
-      return i;
-  }
-
-  return -1;
-}
-
-CFX_FloatPoint CPWL_ListCtrl::InToOut(const CFX_FloatPoint& point) const {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  return CFX_FloatPoint(point.x + rcClient.left - m_ptScroll.x,
-                        point.y + rcClient.top - m_ptScroll.y);
-}
-
-CFX_FloatPoint CPWL_ListCtrl::OutToIn(const CFX_FloatPoint& point) const {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  return CFX_FloatPoint(point.x - rcClient.left + m_ptScroll.x,
-                        point.y - rcClient.top + m_ptScroll.y);
-}
-
-CFX_FloatRect CPWL_ListCtrl::InToOut(const CFX_FloatRect& rect) const {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  return CFX_FloatRect(rect.left + rcClient.left - m_ptScroll.x,
-                       rect.bottom + rcClient.top - m_ptScroll.y,
-                       rect.right + rcClient.left - m_ptScroll.x,
-                       rect.top + rcClient.top - m_ptScroll.y);
-}
-
-CFX_FloatRect CPWL_ListCtrl::OutToIn(const CFX_FloatRect& rect) const {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  return CFX_FloatRect(rect.left - rcClient.left + m_ptScroll.x,
-                       rect.bottom - rcClient.top + m_ptScroll.y,
-                       rect.right - rcClient.left + m_ptScroll.x,
-                       rect.top - rcClient.top + m_ptScroll.y);
-}
diff --git a/fpdfsdk/pdfwindow/PWL_ListCtrl.h b/fpdfsdk/pdfwindow/PWL_ListCtrl.h
deleted file mode 100644
index 8448019..0000000
--- a/fpdfsdk/pdfwindow/PWL_ListCtrl.h
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FPDFSDK_PDFWINDOW_PWL_LISTCTRL_H_
-#define FPDFSDK_PDFWINDOW_PWL_LISTCTRL_H_
-
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-class CPWL_ListCtrl : public CPWL_Wnd {
- public:
-  CPWL_ListCtrl();
-  ~CPWL_ListCtrl() override;
-
-  void SetScrollPos(const CFX_FloatPoint& point);
-  CFX_FloatPoint GetScrollPos() const;
-  CFX_FloatRect GetScrollArea() const;
-  void SetItemSpace(FX_FLOAT fSpace);
-  void SetTopSpace(FX_FLOAT fSpace);
-  void SetBottomSpace(FX_FLOAT fSpace);
-  void ResetFace();
-  void ResetContent(int32_t nStart);
-  int32_t GetItemIndex(CPWL_Wnd* pItem);
-  FX_FLOAT GetContentsHeight(FX_FLOAT fLimitWidth);
-  CFX_FloatPoint InToOut(const CFX_FloatPoint& point) const;
-  CFX_FloatPoint OutToIn(const CFX_FloatPoint& point) const;
-  CFX_FloatRect InToOut(const CFX_FloatRect& rect) const;
-  CFX_FloatRect OutToIn(const CFX_FloatRect& rect) const;
-
- protected:
-  // CPWL_Wnd
-  void RePosChildWnd() override;
-  void DrawChildAppearance(CFX_RenderDevice* pDevice,
-                           CFX_Matrix* pUser2Device) override;
-
- private:
-  void ResetAll(FX_BOOL bMove, int32_t nStart);
-
-  CFX_FloatRect m_rcContent;
-  CFX_FloatPoint m_ptScroll;
-  FX_FLOAT m_fItemSpace;
-  FX_FLOAT m_fTopSpace;
-  FX_FLOAT m_fBottomSpace;
-};
-
-#endif  // FPDFSDK_PDFWINDOW_PWL_LISTCTRL_H_
diff --git a/fpdfsdk/pdfwindow/PWL_Signature.cpp b/fpdfsdk/pdfwindow/PWL_Signature.cpp
deleted file mode 100644
index 7513950..0000000
--- a/fpdfsdk/pdfwindow/PWL_Signature.cpp
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fpdfsdk/pdfwindow/PWL_Signature.h"
-
-#include "core/fxge/include/fx_ge.h"
-#include "fpdfsdk/pdfwindow/PWL_Icon.h"
-#include "fpdfsdk/pdfwindow/PWL_Label.h"
-#include "fpdfsdk/pdfwindow/PWL_Utils.h"
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-CPWL_Signature_Image::CPWL_Signature_Image() : m_pImage(nullptr) {}
-
-CPWL_Signature_Image::~CPWL_Signature_Image() {}
-
-void CPWL_Signature_Image::SetImage(CFX_DIBSource* pImage) {
-  m_pImage = pImage;
-}
-
-CFX_DIBSource* CPWL_Signature_Image::GetImage() {
-  return m_pImage;
-}
-
-void CPWL_Signature_Image::DrawThisAppearance(CFX_RenderDevice* pDevice,
-                                              CFX_Matrix* pUser2Device) {
-  CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
-
-  if (m_pImage) {
-    CFX_FloatRect rcClient = GetClientRect();
-
-    FX_FLOAT x, y;
-    pUser2Device->Transform(rcClient.left, rcClient.top, x, y);
-
-    pDevice->StretchDIBits(m_pImage, (int32_t)x, (int32_t)y,
-                           (int32_t)rcClient.Width(),
-                           (int32_t)rcClient.Height());
-  }
-}
-
-void CPWL_Signature_Image::GetThisAppearanceStream(
-    CFX_ByteTextBuf& sAppStream) {
-  sAppStream << CPWL_Image::GetImageAppStream().AsStringC();
-}
-
-void CPWL_Signature_Image::GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) {
-  FX_FLOAT fImageW, fImageH;
-
-  GetImageSize(fImageW, fImageH);
-
-  CFX_FloatRect rcClient = GetClientRect();
-
-  fHScale = rcClient.Width() / fImageW;
-  fVScale = rcClient.Height() / fImageH;
-}
-
-CPWL_Signature::CPWL_Signature()
-    : m_pText(nullptr),
-      m_pDescription(nullptr),
-      m_pImage(nullptr),
-      m_bTextExist(TRUE),
-      m_bImageExist(FALSE),
-      m_bFlagExist(TRUE) {}
-
-CPWL_Signature::~CPWL_Signature() {}
-
-void CPWL_Signature::SetTextFlag(FX_BOOL bTextExist) {
-  m_bTextExist = bTextExist;
-
-  RePosChildWnd();
-}
-
-void CPWL_Signature::SetImageFlag(FX_BOOL bImageExist) {
-  m_bImageExist = bImageExist;
-
-  RePosChildWnd();
-}
-
-void CPWL_Signature::SetFoxitFlag(FX_BOOL bFlagExist) {
-  m_bFlagExist = bFlagExist;
-}
-
-void CPWL_Signature::SetText(const FX_WCHAR* sText) {
-  m_pText->SetText(sText);
-
-  RePosChildWnd();
-}
-
-void CPWL_Signature::SetDescription(const FX_WCHAR* str) {
-  m_pDescription->SetText(str);
-
-  RePosChildWnd();
-}
-
-void CPWL_Signature::SetImage(CFX_DIBSource* pImage) {
-  m_pImage->SetImage(pImage);
-
-  RePosChildWnd();
-}
-
-void CPWL_Signature::SetImageStream(CPDF_Stream* pStream,
-                                    const FX_CHAR* sImageAlias) {
-  m_pImage->SetPDFStream(pStream);
-  m_pImage->SetImageAlias(sImageAlias);
-
-  RePosChildWnd();
-}
-
-void CPWL_Signature::RePosChildWnd() {
-  CFX_FloatRect rcClient = GetClientRect();
-
-  CFX_FloatRect rcText = rcClient;
-  CFX_FloatRect rcDescription = rcClient;
-
-  FX_BOOL bTextVisible = m_bTextExist && m_pText->GetText().GetLength() > 0;
-
-  if ((bTextVisible || m_bImageExist) &&
-      m_pDescription->GetText().GetLength() > 0) {
-    if (rcClient.Width() >= rcClient.Height()) {
-      rcText.right = rcText.left + rcClient.Width() / 2.0f;
-      rcDescription.left = rcDescription.right - rcClient.Width() / 2.0f;
-    } else {
-      rcText.bottom = rcText.top - rcClient.Height() / 2.0f;
-      rcDescription.top = rcDescription.bottom + rcClient.Height() / 2.0f;
-    }
-  }
-
-  m_pText->SetVisible(bTextVisible);
-  m_pImage->SetVisible(m_bImageExist);
-
-  m_pText->Move(rcText, TRUE, FALSE);
-  m_pImage->Move(rcText, TRUE, FALSE);
-  m_pDescription->Move(rcDescription, TRUE, FALSE);
-}
-
-void CPWL_Signature::CreateChildWnd(const PWL_CREATEPARAM& cp) {
-  m_pImage = new CPWL_Signature_Image;
-  PWL_CREATEPARAM icp = cp;
-  icp.pParentWnd = this;
-  icp.dwFlags = PWS_CHILD | PWS_VISIBLE;
-  icp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
-  m_pImage->Create(icp);
-
-  m_pText = new CPWL_Label;
-  PWL_CREATEPARAM acp = cp;
-  acp.pParentWnd = this;
-  acp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE |
-                PES_AUTORETURN | PES_MIDDLE | PES_CENTER;
-  acp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
-  m_pText->Create(acp);
-
-  m_pDescription = new CPWL_Label;
-  PWL_CREATEPARAM dcp = cp;
-  dcp.pParentWnd = this;
-  dcp.dwFlags = PWS_CHILD | PWS_VISIBLE | PWS_AUTOFONTSIZE | PES_MULTILINE |
-                PES_AUTORETURN | PES_LEFT | PES_CENTER;
-  dcp.sTextColor = CPWL_Color(COLORTYPE_GRAY, 0);
-  m_pDescription->Create(dcp);
-}
-
-void CPWL_Signature::DrawThisAppearance(CFX_RenderDevice* pDevice,
-                                        CFX_Matrix* pUser2Device) {
-  CPWL_Wnd::DrawThisAppearance(pDevice, pUser2Device);
-
-  if (m_bFlagExist) {
-    CPWL_Utils::DrawIconAppStream(
-        pDevice, pUser2Device, PWL_ICONTYPE_FOXIT,
-        CPWL_Utils::GetCenterSquare(GetClientRect()),
-        CPWL_Color(COLORTYPE_RGB, 0.91f, 0.855f, 0.92f),
-        CPWL_Color(COLORTYPE_TRANSPARENT), 255);
-  }
-}
-
-void CPWL_Signature::GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) {
-  CPWL_Wnd::GetThisAppearanceStream(sAppStream);
-}
diff --git a/fpdfsdk/pdfwindow/PWL_Signature.h b/fpdfsdk/pdfwindow/PWL_Signature.h
deleted file mode 100644
index 47d0bb0..0000000
--- a/fpdfsdk/pdfwindow/PWL_Signature.h
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FPDFSDK_PDFWINDOW_PWL_SIGNATURE_H_
-#define FPDFSDK_PDFWINDOW_PWL_SIGNATURE_H_
-
-#include "fpdfsdk/pdfwindow/PWL_Icon.h"
-#include "fpdfsdk/pdfwindow/PWL_Wnd.h"
-
-class CFX_DIBSource;
-class CPWL_Label;
-
-class CPWL_Signature_Image : public CPWL_Image {
- public:
-  CPWL_Signature_Image();
-  ~CPWL_Signature_Image() override;
-
-  void SetImage(CFX_DIBSource* pImage);
-  CFX_DIBSource* GetImage();
-
- protected:
-  // CPWL_Image
-  void DrawThisAppearance(CFX_RenderDevice* pDevice,
-                          CFX_Matrix* pUser2Device) override;
-  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
-  void GetScale(FX_FLOAT& fHScale, FX_FLOAT& fVScale) override;
-
- private:
-  CFX_DIBSource* m_pImage;
-};
-
-class CPWL_Signature : public CPWL_Wnd {
- public:
-  CPWL_Signature();
-  ~CPWL_Signature() override;
-
-  void SetText(const FX_WCHAR* sText);
-  void SetDescription(const FX_WCHAR* str);
-  void SetImage(CFX_DIBSource* pImage);
-  void SetImageStream(CPDF_Stream* pStream, const FX_CHAR* sImageAlias);
-
-  void SetTextFlag(FX_BOOL bTextExist);
-  void SetImageFlag(FX_BOOL bImageExist);
-  void SetFoxitFlag(FX_BOOL bFlagExist);
-
- protected:
-  // CPWL_Wnd
-  void RePosChildWnd() override;
-  void CreateChildWnd(const PWL_CREATEPARAM& cp) override;
-  void DrawThisAppearance(CFX_RenderDevice* pDevice,
-                          CFX_Matrix* pUser2Device) override;
-  void GetThisAppearanceStream(CFX_ByteTextBuf& sAppStream) override;
-
- private:
-  CPWL_Label* m_pText;
-  CPWL_Label* m_pDescription;
-  CPWL_Signature_Image* m_pImage;
-
-  FX_BOOL m_bTextExist;
-  FX_BOOL m_bImageExist;
-  FX_BOOL m_bFlagExist;
-};
-
-#endif  // FPDFSDK_PDFWINDOW_PWL_SIGNATURE_H_
diff --git a/pdfium.gyp b/pdfium.gyp
index 153864a..d6da141 100644
--- a/pdfium.gyp
+++ b/pdfium.gyp
@@ -509,7 +509,6 @@
       'sources': [
         'core/fxcodec/include/fx_codec.h',
         'core/fxcodec/include/fx_codec_def.h',
-        'core/fxcodec/include/fx_codec_flate.h',
         'core/fxcodec/codec/ccodec_basicmodule.h',
         'core/fxcodec/codec/ccodec_faxmodule.h',
         'core/fxcodec/codec/ccodec_flatemodule.h',
@@ -789,18 +788,10 @@
         'fpdfsdk/pdfwindow/PWL_FontMap.h',
         'fpdfsdk/pdfwindow/PWL_Icon.cpp',
         'fpdfsdk/pdfwindow/PWL_Icon.h',
-        'fpdfsdk/pdfwindow/PWL_IconList.cpp',
-        'fpdfsdk/pdfwindow/PWL_IconList.h',
-        'fpdfsdk/pdfwindow/PWL_Label.cpp',
-        'fpdfsdk/pdfwindow/PWL_Label.h',
         'fpdfsdk/pdfwindow/PWL_ListBox.cpp',
         'fpdfsdk/pdfwindow/PWL_ListBox.h',
-        'fpdfsdk/pdfwindow/PWL_ListCtrl.cpp',
-        'fpdfsdk/pdfwindow/PWL_ListCtrl.h',
         'fpdfsdk/pdfwindow/PWL_ScrollBar.cpp',
         'fpdfsdk/pdfwindow/PWL_ScrollBar.h',
-        'fpdfsdk/pdfwindow/PWL_Signature.cpp',
-        'fpdfsdk/pdfwindow/PWL_Signature.h',
         'fpdfsdk/pdfwindow/PWL_SpecialButton.cpp',
         'fpdfsdk/pdfwindow/PWL_SpecialButton.h',
         'fpdfsdk/pdfwindow/PWL_Utils.cpp',
diff --git a/xfa.gyp b/xfa.gyp
index 9df9a11..da0492b 100644
--- a/xfa.gyp
+++ b/xfa.gyp
@@ -218,16 +218,8 @@
         "xfa/fwl/lightwidget/cfwl_picturebox.h",
         "xfa/fwl/lightwidget/cfwl_pushbutton.cpp",
         "xfa/fwl/lightwidget/cfwl_pushbutton.h",
-        "xfa/fwl/lightwidget/cfwl_scrollbar.cpp",
-        "xfa/fwl/lightwidget/cfwl_scrollbar.h",
-        "xfa/fwl/lightwidget/cfwl_theme.cpp",
-        "xfa/fwl/lightwidget/cfwl_theme.h",
-        "xfa/fwl/lightwidget/cfwl_tooltip.cpp",
-        "xfa/fwl/lightwidget/cfwl_tooltip.h",
         "xfa/fwl/lightwidget/cfwl_widget.cpp",
         "xfa/fwl/lightwidget/cfwl_widget.h",
-        "xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp",
-        "xfa/fwl/lightwidget/cfwl_widgetdelegate.h",
         "xfa/fwl/lightwidget/cfwl_widgetproperties.cpp",
         "xfa/fwl/lightwidget/cfwl_widgetproperties.h",
         "xfa/fwl/theme/cfwl_barcodetp.cpp",
@@ -242,8 +234,6 @@
         "xfa/fwl/theme/cfwl_datetimepickertp.h",
         "xfa/fwl/theme/cfwl_edittp.cpp",
         "xfa/fwl/theme/cfwl_edittp.h",
-        "xfa/fwl/theme/cfwl_formtp.cpp",
-        "xfa/fwl/theme/cfwl_formtp.h",
         "xfa/fwl/theme/cfwl_listboxtp.cpp",
         "xfa/fwl/theme/cfwl_listboxtp.h",
         "xfa/fwl/theme/cfwl_monthcalendartp.cpp",
@@ -260,8 +250,6 @@
         "xfa/fxbarcode/BC_Dimension.cpp",
         "xfa/fxbarcode/BC_Dimension.h",
         "xfa/fxbarcode/BC_Library.cpp",
-        "xfa/fxbarcode/BC_ResultPoint.cpp",
-        "xfa/fxbarcode/BC_ResultPoint.h",
         "xfa/fxbarcode/BC_TwoDimWriter.cpp",
         "xfa/fxbarcode/BC_TwoDimWriter.h",
         "xfa/fxbarcode/BC_UtilCodingConvert.cpp",
@@ -295,14 +283,10 @@
         "xfa/fxbarcode/common/BC_CommonBitArray.h",
         "xfa/fxbarcode/common/BC_CommonBitMatrix.cpp",
         "xfa/fxbarcode/common/BC_CommonBitMatrix.h",
-        "xfa/fxbarcode/common/BC_CommonBitSource.cpp",
-        "xfa/fxbarcode/common/BC_CommonBitSource.h",
         "xfa/fxbarcode/common/BC_CommonByteArray.cpp",
         "xfa/fxbarcode/common/BC_CommonByteArray.h",
         "xfa/fxbarcode/common/BC_CommonByteMatrix.cpp",
         "xfa/fxbarcode/common/BC_CommonByteMatrix.h",
-        "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp",
-        "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h",
         "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.cpp",
         "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomon.h",
         "xfa/fxbarcode/common/reedsolomon/BC_ReedSolomonGF256.cpp",
@@ -360,8 +344,6 @@
         "xfa/fxbarcode/pdf417/BC_PDF417BarcodeMatrix.h",
         "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.cpp",
         "xfa/fxbarcode/pdf417/BC_PDF417BarcodeRow.h",
-        "xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp",
-        "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h",
         "xfa/fxbarcode/pdf417/BC_PDF417Compaction.cpp",
         "xfa/fxbarcode/pdf417/BC_PDF417Compaction.h",
         "xfa/fxbarcode/pdf417/BC_PDF417ErrorCorrection.cpp",
diff --git a/xfa/fwl/lightwidget/cfwl_scrollbar.cpp b/xfa/fwl/lightwidget/cfwl_scrollbar.cpp
deleted file mode 100644
index eb4276c..0000000
--- a/xfa/fwl/lightwidget/cfwl_scrollbar.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fwl/lightwidget/cfwl_scrollbar.h"
-
-#include <memory>
-
-#include "xfa/fwl/basewidget/ifwl_scrollbar.h"
-
-CFWL_ScrollBar* CFWL_ScrollBar::Create() {
-  return new CFWL_ScrollBar;
-}
-
-CFWL_ScrollBar::CFWL_ScrollBar() {}
-
-CFWL_ScrollBar::~CFWL_ScrollBar() {}
-
-FWL_Error CFWL_ScrollBar::Initialize(const CFWL_WidgetProperties* pProperties) {
-  if (m_pIface)
-    return FWL_Error::Indefinite;
-  if (pProperties) {
-    *m_pProperties = *pProperties;
-  }
-  std::unique_ptr<IFWL_ScrollBar> pScrollBar(IFWL_ScrollBar::Create(
-      m_pProperties->MakeWidgetImpProperties(nullptr), nullptr));
-  FWL_Error ret = pScrollBar->Initialize();
-  if (ret != FWL_Error::Succeeded) {
-    return ret;
-  }
-  m_pIface = pScrollBar.release();
-  CFWL_Widget::Initialize();
-  return FWL_Error::Succeeded;
-}
-
-FX_BOOL CFWL_ScrollBar::IsVertical() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->IsVertical();
-}
-
-FWL_Error CFWL_ScrollBar::GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetRange(fMin, fMax);
-}
-
-FWL_Error CFWL_ScrollBar::SetRange(FX_FLOAT fMin, FX_FLOAT fMax) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetRange(fMin, fMax);
-}
-
-FX_FLOAT CFWL_ScrollBar::GetPageSize() {
-  if (!m_pIface)
-    return 0;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetPageSize();
-}
-
-FWL_Error CFWL_ScrollBar::SetPageSize(FX_FLOAT fPageSize) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetPageSize(fPageSize);
-}
-
-FX_FLOAT CFWL_ScrollBar::GetStepSize() {
-  if (!m_pIface)
-    return 0;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetStepSize();
-}
-
-FWL_Error CFWL_ScrollBar::SetStepSize(FX_FLOAT fStepSize) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetStepSize(fStepSize);
-}
-
-FX_FLOAT CFWL_ScrollBar::GetPos() {
-  if (!m_pIface)
-    return -1;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetPos();
-}
-
-FWL_Error CFWL_ScrollBar::SetPos(FX_FLOAT fPos) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetPos(fPos);
-}
-
-FX_FLOAT CFWL_ScrollBar::GetTrackPos() {
-  if (!m_pIface)
-    return -1;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->GetTrackPos();
-}
-
-FWL_Error CFWL_ScrollBar::SetTrackPos(FX_FLOAT fTrackPos) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->SetTrackPos(fTrackPos);
-}
-
-FX_BOOL CFWL_ScrollBar::DoScroll(uint32_t dwCode, FX_FLOAT fPos) {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ScrollBar*>(m_pIface)->DoScroll(dwCode, fPos);
-}
diff --git a/xfa/fwl/lightwidget/cfwl_scrollbar.h b/xfa/fwl/lightwidget/cfwl_scrollbar.h
deleted file mode 100644
index fd80e8b..0000000
--- a/xfa/fwl/lightwidget/cfwl_scrollbar.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FWL_LIGHTWIDGET_CFWL_SCROLLBAR_H_
-#define XFA_FWL_LIGHTWIDGET_CFWL_SCROLLBAR_H_
-
-#include "xfa/fwl/lightwidget/cfwl_widget.h"
-
-class CFWL_ScrollBar : public CFWL_Widget {
- public:
-  static CFWL_ScrollBar* Create();
-  FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = NULL);
-  FX_BOOL IsVertical();
-  FWL_Error GetRange(FX_FLOAT& fMin, FX_FLOAT& fMax);
-  FWL_Error SetRange(FX_FLOAT fMin, FX_FLOAT fMax);
-  FX_FLOAT GetPageSize();
-  FWL_Error SetPageSize(FX_FLOAT fPageSize);
-  FX_FLOAT GetStepSize();
-  FWL_Error SetStepSize(FX_FLOAT fStepSize);
-  FX_FLOAT GetPos();
-  FWL_Error SetPos(FX_FLOAT fPos);
-  FX_FLOAT GetTrackPos();
-  FWL_Error SetTrackPos(FX_FLOAT fTrackPos);
-  FX_BOOL DoScroll(uint32_t dwCode, FX_FLOAT fPos = 0.0f);
-  CFWL_ScrollBar();
-  virtual ~CFWL_ScrollBar();
-};
-
-#endif  // XFA_FWL_LIGHTWIDGET_CFWL_SCROLLBAR_H_
diff --git a/xfa/fwl/lightwidget/cfwl_theme.cpp b/xfa/fwl/lightwidget/cfwl_theme.cpp
deleted file mode 100644
index 4824667..0000000
--- a/xfa/fwl/lightwidget/cfwl_theme.cpp
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fwl/lightwidget/cfwl_theme.h"
-
-#include <algorithm>
-
-#include "xfa/fwl/core/cfwl_themebackground.h"
-#include "xfa/fwl/core/cfwl_themepart.h"
-#include "xfa/fwl/core/cfwl_themetext.h"
-#include "xfa/fwl/theme/cfwl_barcodetp.h"
-#include "xfa/fwl/theme/cfwl_carettp.h"
-#include "xfa/fwl/theme/cfwl_checkboxtp.h"
-#include "xfa/fwl/theme/cfwl_comboboxtp.h"
-#include "xfa/fwl/theme/cfwl_datetimepickertp.h"
-#include "xfa/fwl/theme/cfwl_edittp.h"
-#include "xfa/fwl/theme/cfwl_formtp.h"
-#include "xfa/fwl/theme/cfwl_listboxtp.h"
-#include "xfa/fwl/theme/cfwl_monthcalendartp.h"
-#include "xfa/fwl/theme/cfwl_pictureboxtp.h"
-#include "xfa/fwl/theme/cfwl_pushbuttontp.h"
-#include "xfa/fwl/theme/cfwl_scrollbartp.h"
-
-CFWL_Theme::CFWL_Theme() {
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_FormTP));
-  m_ThemesArray.push_back(
-      std::unique_ptr<CFWL_WidgetTP>(new CFWL_PushButtonTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_CheckBoxTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_ListBoxTP));
-  m_ThemesArray.push_back(
-      std::unique_ptr<CFWL_WidgetTP>(new CFWL_PictureBoxTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_ScrollBarTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_EditTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_ComboBoxTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_BarcodeTP));
-  m_ThemesArray.push_back(
-      std::unique_ptr<CFWL_WidgetTP>(new CFWL_DateTimePickerTP));
-  m_ThemesArray.push_back(
-      std::unique_ptr<CFWL_WidgetTP>(new CFWL_MonthCalendarTP));
-  m_ThemesArray.push_back(std::unique_ptr<CFWL_WidgetTP>(new CFWL_CaretTP));
-}
-
-CFWL_Theme::~CFWL_Theme() {}
-
-bool CFWL_Theme::IsValidWidget(IFWL_Widget* pWidget) {
-  return !!GetTheme(pWidget);
-}
-
-uint32_t CFWL_Theme::GetThemeID(IFWL_Widget* pWidget) {
-  return GetTheme(pWidget)->GetThemeID(pWidget);
-}
-
-uint32_t CFWL_Theme::SetThemeID(IFWL_Widget* pWidget,
-                                uint32_t dwThemeID,
-                                FX_BOOL bChildren) {
-  uint32_t dwID = 0;
-  for (const auto& pTheme : m_ThemesArray) {
-    dwID = pTheme->GetThemeID(pWidget);
-    pTheme->SetThemeID(pWidget, dwThemeID, FALSE);
-  }
-  return dwID;
-}
-
-FWL_Error CFWL_Theme::GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) {
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_Theme::SetThemeMatrix(IFWL_Widget* pWidget,
-                                     const CFX_Matrix& matrix) {
-  return FWL_Error::Succeeded;
-}
-
-FX_BOOL CFWL_Theme::DrawBackground(CFWL_ThemeBackground* pParams) {
-  return GetTheme(pParams->m_pWidget)->DrawBackground(pParams);
-}
-
-FX_BOOL CFWL_Theme::DrawText(CFWL_ThemeText* pParams) {
-  return GetTheme(pParams->m_pWidget)->DrawText(pParams);
-}
-
-void* CFWL_Theme::GetCapacity(CFWL_ThemePart* pThemePart,
-                              CFWL_WidgetCapacity dwCapacity) {
-  return GetTheme(pThemePart->m_pWidget)->GetCapacity(pThemePart, dwCapacity);
-}
-
-FX_BOOL CFWL_Theme::IsCustomizedLayout(IFWL_Widget* pWidget) {
-  return GetTheme(pWidget)->IsCustomizedLayout(pWidget);
-}
-
-FWL_Error CFWL_Theme::GetPartRect(CFWL_ThemePart* pThemePart,
-                                  CFX_RectF& rtPart) {
-  return GetTheme(pThemePart->m_pWidget)->GetPartRect(pThemePart, rtPart);
-}
-
-FX_BOOL CFWL_Theme::IsInPart(CFWL_ThemePart* pThemePart,
-                             FX_FLOAT fx,
-                             FX_FLOAT fy) {
-  return GetTheme(pThemePart->m_pWidget)->IsInPart(pThemePart, fx, fy);
-}
-
-FX_BOOL CFWL_Theme::CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) {
-  return GetTheme(pParams->m_pWidget)->CalcTextRect(pParams, rect);
-}
-
-FWL_Error CFWL_Theme::Initialize() {
-  for (const auto& pTheme : m_ThemesArray)
-    pTheme->Initialize();
-
-  FWLTHEME_Init();
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_Theme::Finalize() {
-  for (const auto& pTheme : m_ThemesArray)
-    pTheme->Finalize();
-
-  FWLTHEME_Release();
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error CFWL_Theme::SetFont(IFWL_Widget* pWidget,
-                              const FX_WCHAR* strFont,
-                              FX_FLOAT fFontSize,
-                              FX_ARGB rgbFont) {
-  for (const auto& pTheme : m_ThemesArray)
-    pTheme->SetFont(pWidget, strFont, fFontSize, rgbFont);
-
-  return FWL_Error::Succeeded;
-}
-
-CFWL_WidgetTP* CFWL_Theme::GetTheme(IFWL_Widget* pWidget) {
-  for (const auto& pTheme : m_ThemesArray) {
-    if (pTheme->IsValidWidget(pWidget))
-      return pTheme.get();
-  }
-  return nullptr;
-}
diff --git a/xfa/fwl/lightwidget/cfwl_theme.h b/xfa/fwl/lightwidget/cfwl_theme.h
deleted file mode 100644
index effb31b..0000000
--- a/xfa/fwl/lightwidget/cfwl_theme.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FWL_LIGHTWIDGET_CFWL_THEME_H_
-#define XFA_FWL_LIGHTWIDGET_CFWL_THEME_H_
-
-#include <memory>
-#include <vector>
-
-#include "core/fxcrt/include/fx_coordinates.h"
-#include "core/fxcrt/include/fx_system.h"
-#include "core/fxge/include/fx_dib.h"
-#include "xfa/fwl/core/ifwl_themeprovider.h"
-
-class CFWL_WidgetTP;
-class IFWL_Widget;
-class CFWL_ThemePart;
-class CFWL_ThemeText;
-
-class CFWL_Theme final : public IFWL_ThemeProvider {
- public:
-  CFWL_Theme();
-  ~CFWL_Theme() override;
-
-  // IFWL_ThemeProvider:
-  bool IsValidWidget(IFWL_Widget* pWidget) override;
-  uint32_t GetThemeID(IFWL_Widget* pWidget) override;
-  uint32_t SetThemeID(IFWL_Widget* pWidget,
-                      uint32_t dwThemeID,
-                      FX_BOOL bChildren = TRUE) override;
-  FWL_Error GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
-  FWL_Error SetThemeMatrix(IFWL_Widget* pWidget,
-                           const CFX_Matrix& matrix) override;
-  FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
-  FX_BOOL DrawText(CFWL_ThemeText* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
-  FX_BOOL IsCustomizedLayout(IFWL_Widget* pWidget) override;
-  FWL_Error GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) override;
-  FX_BOOL IsInPart(CFWL_ThemePart* pThemePart,
-                   FX_FLOAT fx,
-                   FX_FLOAT fy) override;
-  FX_BOOL CalcTextRect(CFWL_ThemeText* pParams, CFX_RectF& rect) override;
-
-  FWL_Error Initialize();
-  FWL_Error Finalize();
-  FWL_Error SetFont(IFWL_Widget* pWidget,
-                    const FX_WCHAR* strFont,
-                    FX_FLOAT fFontSize,
-                    FX_ARGB rgbFont);
-  CFWL_WidgetTP* GetTheme(IFWL_Widget* pWidget);
-
- protected:
-  std::vector<std::unique_ptr<CFWL_WidgetTP>> m_ThemesArray;
-};
-
-#endif  // XFA_FWL_LIGHTWIDGET_CFWL_THEME_H_
diff --git a/xfa/fwl/lightwidget/cfwl_tooltip.cpp b/xfa/fwl/lightwidget/cfwl_tooltip.cpp
deleted file mode 100644
index 7a9a26c..0000000
--- a/xfa/fwl/lightwidget/cfwl_tooltip.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fwl/lightwidget/cfwl_tooltip.h"
-
-#include <memory>
-
-#include "xfa/fwl/core/fwl_formimp.h"
-#include "xfa/fwl/core/fwl_noteimp.h"
-#include "xfa/fwl/core/fwl_widgetimp.h"
-
-CFWL_ToolTip* CFWL_ToolTip::Create() {
-  return new CFWL_ToolTip;
-}
-
-FWL_Error CFWL_ToolTip::Initialize(const CFWL_WidgetProperties* pProperties) {
-  if (m_pIface)
-    return FWL_Error::Indefinite;
-  if (pProperties) {
-    *m_pProperties = *pProperties;
-  }
-  std::unique_ptr<IFWL_ToolTip> pToolTip(IFWL_ToolTip::Create(
-      m_pProperties->MakeWidgetImpProperties(&m_tooltipData), nullptr));
-  FWL_Error ret = pToolTip->Initialize();
-  if (ret != FWL_Error::Succeeded) {
-    return ret;
-  }
-  m_pIface = pToolTip.release();
-  CFWL_Widget::Initialize();
-  return FWL_Error::Succeeded;
-}
-
-void CFWL_ToolTip::GetCaption(CFX_WideString& wsCaption) {
-  wsCaption = m_tooltipData.m_wsCaption;
-}
-
-void CFWL_ToolTip::SetCaption(const CFX_WideStringC& wsCaption) {
-  m_tooltipData.m_wsCaption = wsCaption;
-}
-
-int32_t CFWL_ToolTip::GetInitialDelay() {
-  return m_tooltipData.m_nInitDelayTime;
-}
-
-void CFWL_ToolTip::SetInitialDelay(int32_t nDelayTime) {
-  m_tooltipData.m_nInitDelayTime = nDelayTime;
-}
-
-int32_t CFWL_ToolTip::GetAutoPopDelay() {
-  return m_tooltipData.m_nAutoPopDelayTime;
-}
-
-void CFWL_ToolTip::SetAutoPopDelay(int32_t nDelayTime) {
-  m_tooltipData.m_nAutoPopDelayTime = nDelayTime;
-}
-
-CFX_DIBitmap* CFWL_ToolTip::GetToolTipIcon() {
-  return m_tooltipData.m_pBitmap;
-}
-
-void CFWL_ToolTip::SetToolTipIcon(CFX_DIBitmap* pBitmap) {
-  m_tooltipData.m_pBitmap = pBitmap;
-}
-
-CFX_SizeF CFWL_ToolTip::GetToolTipIconSize() {
-  return m_tooltipData.m_fIconSize;
-}
-
-void CFWL_ToolTip::SetToolTipIconSize(CFX_SizeF fSize) {
-  m_tooltipData.m_fIconSize = fSize;
-}
-
-void CFWL_ToolTip::SetAnchor(const CFX_RectF& rtAnchor) {
-  static_cast<IFWL_ToolTip*>(m_pIface)->SetAnchor(rtAnchor);
-}
-
-void CFWL_ToolTip::Show() {
-  static_cast<IFWL_ToolTip*>(m_pIface)->Show();
-}
-
-void CFWL_ToolTip::Hide() {
-  static_cast<IFWL_ToolTip*>(m_pIface)->Hide();
-}
-
-CFWL_ToolTip::CFWL_ToolTip() {}
-
-CFWL_ToolTip::~CFWL_ToolTip() {}
-
-CFWL_ToolTip::CFWL_ToolTipDP::CFWL_ToolTipDP() : m_pBitmap(NULL) {
-  m_wsCaption = L"";
-  m_nInitDelayTime = 500;
-  m_nAutoPopDelayTime = 50000;
-  m_fAnchor.Set(0.0, 0.0, 0.0, 0.0);
-}
-
-FWL_Error CFWL_ToolTip::CFWL_ToolTipDP::GetCaption(IFWL_Widget* pWidget,
-                                                   CFX_WideString& wsCaption) {
-  wsCaption = m_wsCaption;
-  return FWL_Error::Succeeded;
-}
-
-int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetInitialDelay(IFWL_Widget* pWidget) {
-  return m_nInitDelayTime;
-}
-
-int32_t CFWL_ToolTip::CFWL_ToolTipDP::GetAutoPopDelay(IFWL_Widget* pWidget) {
-  return m_nAutoPopDelayTime;
-}
-
-CFX_DIBitmap* CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIcon(
-    IFWL_Widget* pWidget) {
-  return m_pBitmap;
-}
-
-CFX_SizeF CFWL_ToolTip::CFWL_ToolTipDP::GetToolTipIconSize(
-    IFWL_Widget* pWidget) {
-  return m_fIconSize;
-}
-
-CFX_RectF CFWL_ToolTip::CFWL_ToolTipDP::GetAnchor() {
-  return m_fAnchor;
-}
diff --git a/xfa/fwl/lightwidget/cfwl_tooltip.h b/xfa/fwl/lightwidget/cfwl_tooltip.h
deleted file mode 100644
index 74f7028..0000000
--- a/xfa/fwl/lightwidget/cfwl_tooltip.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FWL_LIGHTWIDGET_CFWL_TOOLTIP_H_
-#define XFA_FWL_LIGHTWIDGET_CFWL_TOOLTIP_H_
-
-#include "xfa/fwl/basewidget/ifwl_tooltip.h"
-#include "xfa/fwl/lightwidget/cfwl_widget.h"
-
-class CFWL_ToolTip : public CFWL_Widget {
- public:
-  static CFWL_ToolTip* Create();
-
-  CFWL_ToolTip();
-  virtual ~CFWL_ToolTip();
-
-  FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
-
-  void GetCaption(CFX_WideString& wsCaption);
-  void SetCaption(const CFX_WideStringC& wsCaption);
-
-  int32_t GetInitialDelay();
-  void SetInitialDelay(int32_t nDelayTime);
-
-  int32_t GetAutoPopDelay();
-  void SetAutoPopDelay(int32_t nDelayTime);
-
-  CFX_DIBitmap* GetToolTipIcon();
-  void SetToolTipIcon(CFX_DIBitmap* pBitmap);
-  CFX_SizeF GetToolTipIconSize();
-  void SetToolTipIconSize(CFX_SizeF fSize);
-
-  void SetAnchor(const CFX_RectF& rtAnchor);
-  void Show();
-  void Hide();
-
- protected:
-  class CFWL_ToolTipDP : public IFWL_ToolTipDP {
-   public:
-    CFWL_ToolTipDP();
-    FWL_Error GetCaption(IFWL_Widget* pWidget, CFX_WideString& wsCaption);
-    int32_t GetInitialDelay(IFWL_Widget* pWidget);
-    int32_t GetAutoPopDelay(IFWL_Widget* pWidget);
-    CFX_DIBitmap* GetToolTipIcon(IFWL_Widget* pWidget);
-    CFX_SizeF GetToolTipIconSize(IFWL_Widget* pWidget);
-    CFX_RectF GetAnchor();
-    CFX_WideString m_wsCaption;
-    int32_t m_nInitDelayTime;
-    int32_t m_nAutoPopDelayTime;
-    CFX_DIBitmap* m_pBitmap;
-    CFX_SizeF m_fIconSize;
-    CFX_RectF m_fAnchor;
-  };
-  CFWL_ToolTipDP m_tooltipData;
-};
-
-#endif  // XFA_FWL_LIGHTWIDGET_CFWL_TOOLTIP_H_
diff --git a/xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp b/xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp
deleted file mode 100644
index fcb7232..0000000
--- a/xfa/fwl/lightwidget/cfwl_widgetdelegate.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fwl/lightwidget/cfwl_widgetdelegate.h"
-
-#include "xfa/fwl/core/cfwl_event.h"
-#include "xfa/fwl/core/cfwl_message.h"
-
-CFWL_WidgetDelegate::CFWL_WidgetDelegate() {}
-
-CFWL_WidgetDelegate::~CFWL_WidgetDelegate() {}
-
-void CFWL_WidgetDelegate::OnProcessMessage(CFWL_Message* pMessage) {}
-
-void CFWL_WidgetDelegate::OnProcessEvent(CFWL_Event* pEvent) {}
-
-void CFWL_WidgetDelegate::OnDrawWidget(CFX_Graphics* pGraphics,
-                                       const CFX_Matrix* pMatrix) {}
diff --git a/xfa/fwl/lightwidget/cfwl_widgetdelegate.h b/xfa/fwl/lightwidget/cfwl_widgetdelegate.h
deleted file mode 100644
index 1f5cdab..0000000
--- a/xfa/fwl/lightwidget/cfwl_widgetdelegate.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FWL_LIGHTWIDGET_CFWL_WIDGETDELEGATE_H_
-#define XFA_FWL_LIGHTWIDGET_CFWL_WIDGETDELEGATE_H_
-
-#include <stdint.h>
-
-#include "xfa/fwl/core/fwl_error.h"
-#include "xfa/fwl/core/ifwl_widgetdelegate.h"
-
-class CFWL_Event;
-class CFWL_Message;
-class CFX_Graphics;
-class CFX_Matrix;
-
-class CFWL_WidgetDelegate : public IFWL_WidgetDelegate {
- public:
-  CFWL_WidgetDelegate();
-  virtual ~CFWL_WidgetDelegate();
-
-  void OnProcessMessage(CFWL_Message* pMessage) override;
-  void OnProcessEvent(CFWL_Event* pEvent) override;
-  void OnDrawWidget(CFX_Graphics* pGraphics,
-                    const CFX_Matrix* pMatrix = nullptr) override;
-};
-
-#endif  // XFA_FWL_LIGHTWIDGET_CFWL_WIDGETDELEGATE_H_
diff --git a/xfa/fwl/theme/cfwl_formtp.cpp b/xfa/fwl/theme/cfwl_formtp.cpp
deleted file mode 100644
index 0333759..0000000
--- a/xfa/fwl/theme/cfwl_formtp.cpp
+++ /dev/null
@@ -1,874 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "xfa/fwl/theme/cfwl_formtp.h"
-
-#include "xfa/fde/tto/fde_textout.h"
-#include "xfa/fwl/core/cfwl_themebackground.h"
-#include "xfa/fwl/core/cfwl_themepart.h"
-#include "xfa/fwl/core/cfwl_themetext.h"
-#include "xfa/fwl/core/ifwl_form.h"
-#include "xfa/fwl/core/ifwl_themeprovider.h"
-#include "xfa/fwl/core/ifwl_widget.h"
-#include "xfa/fxgraphics/cfx_color.h"
-#include "xfa/fxgraphics/cfx_path.h"
-
-namespace {
-
-const int kCXFormBorder = 3;
-const int kCYFormBorder = 3;
-const int kCYCaption = 29;
-const int kFormBigIconSize = 32;
-const int kFormSmallIconSize = 16;
-const uint32_t kFormTextColor = 0xFFFFFFFF;
-
-const int kButtonSize = 21;
-const int kButtonMargin = 5;
-const int kButtonSpan = 2;
-
-}  // namespace
-
-CFWL_FormTP::CFWL_FormTP() : m_pActiveBitmap(NULL), m_pDeactivebitmap(NULL) {
-  m_pThemeData = new SBThemeData;
-  SetThemeData(0);
-  m_rtDisLBorder.Reset();
-  m_rtDisRBorder.Reset();
-  m_rtDisBBorder.Reset();
-  m_rtDisCaption.Reset();
-}
-
-CFWL_FormTP::~CFWL_FormTP() {
-  delete m_pThemeData;
-}
-
-FWL_Error CFWL_FormTP::Initialize() {
-  InitTTO();
-  InitCaption(TRUE);
-  InitCaption(FALSE);
-  return CFWL_WidgetTP::Initialize();
-}
-
-FWL_Error CFWL_FormTP::Finalize() {
-  FinalizeTTO();
-  delete m_pActiveBitmap;
-  m_pActiveBitmap = nullptr;
-  delete m_pDeactivebitmap;
-  m_pDeactivebitmap = nullptr;
-  return CFWL_WidgetTP::Finalize();
-}
-
-bool CFWL_FormTP::IsValidWidget(IFWL_Widget* pWidget) {
-  return pWidget && pWidget->GetClassID() == FWL_Type::Form;
-}
-
-uint32_t CFWL_FormTP::SetThemeID(IFWL_Widget* pWidget,
-                                 uint32_t dwThemeID,
-                                 FX_BOOL bChildren) {
-  if (m_pThemeData) {
-    SetThemeData(FWL_GetThemeColor(dwThemeID));
-  }
-  InitCaption(TRUE);
-  InitCaption(FALSE);
-  return CFWL_WidgetTP::SetThemeID(pWidget, dwThemeID, bChildren);
-}
-FX_BOOL CFWL_FormTP::DrawBackground(CFWL_ThemeBackground* pParams) {
-  if (!pParams)
-    return FALSE;
-  int32_t iActive = 0;
-  if (pParams->m_dwStates & CFWL_PartState_Inactive)
-    iActive = 1;
-
-  FWLTHEME_STATE eState = FWLTHEME_STATE_Normal;
-  if (pParams->m_dwStates & CFWL_PartState_Hovered)
-    eState = FWLTHEME_STATE_Hover;
-  else if (pParams->m_dwStates & CFWL_PartState_Pressed)
-    eState = FWLTHEME_STATE_Pressed;
-  else if (pParams->m_dwStates & CFWL_PartState_Disabled)
-    eState = FWLTHEME_STATE_Disabale;
-
-  switch (pParams->m_iPart) {
-    case CFWL_Part::Border: {
-      DrawFormBorder(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                     &pParams->m_matrix, iActive);
-      break;
-    }
-    case CFWL_Part::Edge: {
-      DrawEdge(pParams->m_pGraphics, pParams->m_pWidget->GetStyles(),
-               &pParams->m_rtPart, &pParams->m_matrix);
-      break;
-    }
-    case CFWL_Part::Background: {
-      FillBackground(pParams->m_pGraphics, &pParams->m_rtPart,
-                     &pParams->m_matrix);
-      break;
-    }
-    case CFWL_Part::Caption: {
-      DrawCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                  &pParams->m_matrix, iActive);
-      break;
-    }
-    case CFWL_Part::NarrowCaption: {
-      DrawNarrowCaption(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                        &pParams->m_matrix, iActive);
-      break;
-    }
-    case CFWL_Part::CloseBox: {
-      DrawCloseBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                   &pParams->m_matrix, iActive);
-      break;
-    }
-    case CFWL_Part::MinimizeBox: {
-      DrawMinimizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                      &pParams->m_matrix, iActive);
-      break;
-    }
-    case CFWL_Part::MaximizeBox: {
-      DrawMaximizeBox(pParams->m_pGraphics, &pParams->m_rtPart, eState,
-                      pParams->m_bMaximize, &pParams->m_matrix, iActive);
-      break;
-    }
-    case CFWL_Part::Icon: {
-      DrawIconImage(pParams->m_pGraphics, pParams->m_pImage, &pParams->m_rtPart,
-                    eState, &pParams->m_matrix, iActive);
-      break;
-    }
-    default: {}
-  }
-  return TRUE;
-}
-FX_BOOL CFWL_FormTP::DrawText(CFWL_ThemeText* pParams) {
-  if (!m_pTextOut)
-    return FALSE;
-  if (pParams->m_iPart == CFWL_Part::Caption) {
-    m_pTextOut->SetTextColor(0xFFFFFFFF);
-  } else {
-    m_pTextOut->SetTextColor(0xFF000000);
-  }
-  return CFWL_WidgetTP::DrawText(pParams);
-}
-void* CFWL_FormTP::GetCapacity(CFWL_ThemePart* pThemePart,
-                               CFWL_WidgetCapacity dwCapacity) {
-  FX_BOOL bDefPro = FALSE;
-  FX_BOOL bDwordVal = FALSE;
-  switch (dwCapacity) {
-    case CFWL_WidgetCapacity::CXBorder: {
-      m_fValue = kCXFormBorder;
-      break;
-    }
-    case CFWL_WidgetCapacity::CYBorder: {
-      m_fValue = kCYFormBorder;
-      break;
-    }
-    case CFWL_WidgetCapacity::CYCaption: {
-      m_fValue = kCYCaption;
-      break;
-    }
-    case CFWL_WidgetCapacity::CYNarrowCaption: {
-      m_fValue = kCYCaption;
-      break;
-    }
-    case CFWL_WidgetCapacity::TextColor: {
-      bDwordVal = TRUE;
-      m_dwValue = kFormTextColor;
-      break;
-    }
-    case CFWL_WidgetCapacity::BigIcon: {
-      m_fValue = kFormBigIconSize;
-      break;
-    }
-    case CFWL_WidgetCapacity::SmallIcon: {
-      m_fValue = kFormSmallIconSize;
-      break;
-    }
-    default: { bDefPro = TRUE; }
-  }
-  if (!bDefPro) {
-    if (bDwordVal) {
-      return &m_dwValue;
-    }
-    return &m_fValue;
-  }
-  return CFWL_WidgetTP::GetCapacity(pThemePart, dwCapacity);
-}
-FWL_Error CFWL_FormTP::GetPartRect(CFWL_ThemePart* pThemePart,
-                                   CFX_RectF& rtPart) {
-  switch (pThemePart->m_iPart) {
-    case CFWL_Part::CloseBox: {
-      CalCloseBox(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case CFWL_Part::MaximizeBox: {
-      CalMaxBox(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case CFWL_Part::MinimizeBox: {
-      CalMinBox(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case CFWL_Part::HeadText: {
-      CalCaption(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    case CFWL_Part::Icon: {
-      CalIcon(pThemePart->m_pWidget, rtPart);
-      break;
-    }
-    default: {}
-  }
-  return FWL_Error::Succeeded;
-}
-void CFWL_FormTP::CalCloseBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  uint32_t dwStyles = pWidget->GetStyles();
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  if (dwStyles & FWL_WGTSTYLE_CloseBox) {
-    rect.Set(rtWidget.left + kButtonMargin + kButtonSpan,
-             rtWidget.top + kButtonMargin, kButtonSize, kButtonSize);
-  } else {
-    rect.Set(rtWidget.left + kButtonMargin + kButtonSpan,
-             rtWidget.top + kButtonMargin, 0, 0);
-  }
-}
-void CFWL_FormTP::CalMaxBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  uint32_t dwStyles = pWidget->GetStyles();
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  if (dwStyles & FWL_WGTSTYLE_MaximizeBox) {
-    rect.Set(rtWidget.left + kButtonMargin + kButtonSize + kButtonSpan * 2,
-             rtWidget.top + kButtonMargin, kButtonSize, kButtonSize);
-  } else {
-    rect.Set(rtWidget.left + kButtonMargin + kButtonSize + kButtonSpan * 2,
-             rtWidget.top + kButtonMargin, 0, 0);
-  }
-}
-void CFWL_FormTP::CalMinBox(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  uint32_t dwStyles = pWidget->GetStyles();
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  if (dwStyles & FWL_WGTSTYLE_MinimizeBox) {
-    rect.Set(rtWidget.left + kButtonMargin + kButtonSize * 2 + kButtonSpan * 3,
-             rtWidget.top + kButtonMargin, kButtonSize, kButtonSize);
-  } else {
-    rect.Set(rtWidget.left + kButtonMargin + kButtonSize * 2 + kButtonSpan * 3,
-             rtWidget.top + kButtonMargin, 0, 0);
-  }
-}
-void CFWL_FormTP::CalCaption(IFWL_Widget* pWidget, CFX_RectF& rect) {
-  CFX_RectF rtWidget;
-  pWidget->GetWidgetRect(rtWidget);
-  rtWidget.Offset(-rtWidget.left, -rtWidget.top);
-  rect.Set(rtWidget.left + kButtonMargin, rtWidget.top + kButtonMargin - 2,
-           rtWidget.width - kButtonMargin * 2,
-           kButtonSize + 2 * kButtonMargin + 4);
-}
-void CFWL_FormTP::CalIcon(IFWL_Widget* pWidget, CFX_RectF& rect) {}
-void CFWL_FormTP::DrawFormBorder(CFX_Graphics* pGraphics,
-                                 const CFX_RectF* pRect,
-                                 FWLTHEME_STATE eState,
-                                 CFX_Matrix* pMatrix,
-                                 int32_t iActive) {
-  CFX_RectF rt;
-  rt.Set(pRect->left, pRect->top, 1, pRect->height);
-  FX_FLOAT fBottom, fRight;
-  fBottom = pRect->bottom();
-  fRight = pRect->right();
-  CFX_Path path;
-  path.Create();
-  CFX_Color clrLine;
-  path.Clear();
-  path.MoveTo(pRect->left, pRect->top);
-  path.LineTo(pRect->left, fBottom - 1);
-  path.LineTo(fRight - 1, fBottom - 1);
-  path.LineTo(fRight - 1, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][2];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.MoveTo(pRect->left + 1, pRect->top);
-  path.LineTo(pRect->left + 1, fBottom - 2);
-  path.LineTo(fRight - 2, fBottom - 2);
-  path.LineTo(fRight - 2, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][1];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.MoveTo(pRect->left + 2, pRect->top);
-  path.LineTo(pRect->left + 2, fBottom - 3);
-  path.LineTo(fRight - 3, fBottom - 3);
-  path.LineTo(fRight - 3, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][0];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  path.Clear();
-  path.MoveTo(pRect->left + 3, pRect->top);
-  path.LineTo(pRect->left + 3, fBottom - 4);
-  path.LineTo(fRight - 4, fBottom - 4);
-  path.LineTo(fRight - 4, pRect->top);
-  clrLine = m_pThemeData->clrFormBorder[iActive][4];
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  m_rtDisLBorder.Set(pRect->left, pRect->top + 29, 4, pRect->height - 29);
-  m_rtDisRBorder.Set(pRect->right() - 4, pRect->top + 29, 4,
-                     pRect->height - 29);
-  m_rtDisBBorder.Set(pRect->left, pRect->bottom() - 4, pRect->width, 4);
-  m_rtDisCaption.Set(pRect->left, pRect->top, pRect->width, 29);
-}
-void CFWL_FormTP::DrawCaption(CFX_Graphics* pGraphics,
-                              const CFX_RectF* pRect,
-                              FWLTHEME_STATE eState,
-                              CFX_Matrix* pMatrix,
-                              int32_t iActive) {
-  CFX_RectF rt;
-  FX_FLOAT fBottom, fRight;
-  fBottom = pRect->bottom();
-  fRight = pRect->right();
-  rt.Set(pRect->left, pRect->top, pRect->width, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][0], &rt,
-                pMatrix);
-  rt.Offset(0, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][1], &rt,
-                pMatrix);
-  rt.Offset(0, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeTop[iActive][2], &rt,
-                pMatrix);
-  rt.Set(pRect->left, pRect->bottom() - 1, pRect->width, 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][2], &rt,
-                pMatrix);
-  rt.Offset(0, -1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeBottom[iActive][1], &rt,
-                pMatrix);
-  rt.Set(pRect->left, pRect->top, 1, pRect->height);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][2], &rt,
-                pMatrix);
-  rt.Set(pRect->left + 1, pRect->top + 1, 1, fBottom - 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][1], &rt,
-                pMatrix);
-  rt.Set(pRect->left + 2, pRect->top + 2, 1, fBottom - 2);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeLeft[iActive][0], &rt,
-                pMatrix);
-  rt.Set(fRight - 1, pRect->top, pRect->width, pRect->height);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][2], &rt,
-                pMatrix);
-  rt.Set(fRight - 2, pRect->top + 1, 1, fBottom - 1);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][1], &rt,
-                pMatrix);
-  rt.Set(fRight - 3, pRect->top + 2, 1, fBottom - 2);
-  FillSoildRect(pGraphics, m_pThemeData->clrHeadEdgeRight[iActive][0], &rt,
-                pMatrix);
-  CFX_RectF rect(*pRect);
-  rect.Set(rect.left + 3, rect.top + 3, rect.width - 6, rect.height - 5);
-  if (iActive == 0) {
-    pGraphics->StretchImage(m_pActiveBitmap, rect, pMatrix);
-  } else {
-    pGraphics->StretchImage(m_pDeactivebitmap, rect, pMatrix);
-  }
-}
-void CFWL_FormTP::DrawNarrowCaption(CFX_Graphics* pGraphics,
-                                    const CFX_RectF* pRect,
-                                    FWLTHEME_STATE eState,
-                                    CFX_Matrix* pMatrix,
-                                    int32_t iActive) {}
-void CFWL_FormTP::DrawCloseBox(CFX_Graphics* pGraphics,
-                               const CFX_RectF* pRect,
-                               FWLTHEME_STATE eState,
-                               CFX_Matrix* pMatrix,
-                               int32_t iActive) {
-  FX_FLOAT fRight = pRect->right();
-  FX_FLOAT fBottom = pRect->bottom();
-  FX_FLOAT fWidth = pRect->width;
-  FX_FLOAT fHeight = pRect->height;
-  pGraphics->SaveGraphState();
-  CFX_RectF rt(*pRect);
-  pGraphics->SetLineWidth(1.0f);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
-  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
-  CFX_Color crFill;
-  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
-  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
-  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
-  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
-  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
-  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
-  crFill = m_pThemeData->clrCloseBtEdgeLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
-  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
-  crFill = m_pThemeData->clrCloseBtEdgeDark[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
-  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
-                   fBottom - 2,
-                   m_pThemeData->clrCloseBtBKStart[iActive][eState - 1],
-                   m_pThemeData->clrCloseBtBKEnd[iActive][eState - 1], &path,
-                   FXFILL_WINDING, pMatrix);
-  CFX_RectF rtX(*pRect);
-  rtX.Inflate(-5, -5);
-  path.Clear();
-  FX_FLOAT frtXRight = rtX.right();
-  FX_FLOAT frtXBottom = rtX.bottom();
-  path.AddLine(rtX.left, rtX.top + 1, frtXRight - 1, frtXBottom);
-  path.AddLine(rtX.left, rtX.top, frtXRight, frtXBottom);
-  path.AddLine(rtX.left + 1, rtX.top, frtXRight, frtXBottom - 1);
-  path.AddLine(rtX.left, frtXBottom - 1, frtXRight - 1, rtX.top);
-  path.AddLine(rtX.left, frtXBottom, frtXRight, rtX.top);
-  path.AddLine(rtX.left + 1, frtXBottom, frtXRight, rtX.top + 1);
-  CFX_Color clrLine(0xffffffff);
-  pGraphics->SetLineWidth(1.0f);
-  pGraphics->SetStrokeColor(&clrLine);
-  pGraphics->StrokePath(&path, pMatrix);
-  pGraphics->RestoreGraphState();
-}
-void CFWL_FormTP::DrawMinMaxBoxCommon(CFX_Graphics* pGraphics,
-                                      const CFX_RectF* pRect,
-                                      FWLTHEME_STATE eState,
-                                      CFX_Matrix* pMatrix,
-                                      int32_t iActive) {
-  pGraphics->SaveGraphState();
-  FX_FLOAT fRight = pRect->right();
-  FX_FLOAT fBottom = pRect->bottom();
-  FX_FLOAT fWidth = pRect->width;
-  FX_FLOAT fHeight = pRect->height;
-  CFX_RectF rt(*pRect);
-  pGraphics->SetLineWidth(1.0f);
-  CFX_Path path;
-  path.Create();
-  path.AddRectangle(rt.left + 1, rt.top, fWidth - 2, 1);
-  path.AddRectangle(rt.left, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(fRight - 1, rt.top + 1, 1, fHeight - 2);
-  path.AddRectangle(rt.left + 1, fBottom - 1, fWidth - 2, 1);
-  CFX_Color crFill;
-  crFill = m_pThemeData->clrBtnEdgeOut[iActive];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 1, rt.top + 1, 1, 1);
-  path.AddRectangle(fRight - 2, rt.top + 1, 1, 1);
-  path.AddRectangle(rt.left + 1, fBottom - 2, 1, 1);
-  path.AddRectangle(fRight - 2, fBottom - 2, 1, 1);
-  crFill = m_pThemeData->clrBtnCornerLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(rt.left + 2, rt.top + 1, fWidth - 4, 1);
-  path.AddRectangle(rt.left + 1, rt.top + 2, 1, fHeight - 4);
-  crFill = m_pThemeData->clrNormalBtEdgeLight[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  path.Clear();
-  path.AddRectangle(fRight - 2, rt.top + 2, 1, fHeight - 4);
-  path.AddRectangle(rt.left + 2, fBottom - 2, fWidth - 4, 1);
-  crFill = m_pThemeData->clrNormalBtEdgeDark[iActive][eState - 1];
-  pGraphics->SetFillColor(&crFill);
-  pGraphics->FillPath(&path, FXFILL_WINDING, pMatrix);
-  pGraphics->RestoreGraphState();
-  path.Clear();
-  path.AddRectangle(pRect->left + 2, pRect->top + 2, fWidth - 4, fHeight - 4);
-  DrawAxialShading(pGraphics, pRect->left + 2, pRect->top + 2, fRight - 2,
-                   fBottom - 2,
-                   m_pThemeData->clrNormalBtBKStart[iActive][eState - 1],
-                   m_pThemeData->clrNormalBtBKEnd[iActive][eState - 1], &path,
-                   FXFILL_WINDING, pMatrix);
-}
-void CFWL_FormTP::DrawMinimizeBox(CFX_Graphics* pGraphics,
-                                  const CFX_RectF* pRect,
-                                  FWLTHEME_STATE eState,
-                                  CFX_Matrix* pMatrix,
-                                  int32_t iActive) {
-  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
-  CFX_RectF rtMin;
-  rtMin.Set(pRect->left + 5, pRect->top + 13, pRect->width - 14,
-            pRect->height - 18);
-  FillSoildRect(pGraphics, 0xFFFFFFFF, &rtMin, pMatrix);
-}
-void CFWL_FormTP::DrawMaximizeBox(CFX_Graphics* pGraphics,
-                                  const CFX_RectF* pRect,
-                                  FWLTHEME_STATE eState,
-                                  bool bMax,
-                                  CFX_Matrix* pMatrix,
-                                  int32_t iActive) {
-  DrawMinMaxBoxCommon(pGraphics, pRect, eState, pMatrix);
-  FX_FLOAT fWidth = pRect->width;
-  FX_FLOAT fHeight = pRect->height;
-  if (bMax) {
-    CFX_Path path;
-    path.Create();
-    path.AddLine(pRect->left + 7, pRect->top + 6, pRect->left + 14,
-                 pRect->top + 6);
-    path.AddLine(pRect->left + 4, pRect->top + 9, pRect->left + 11,
-                 pRect->top + 9);
-    pGraphics->SaveGraphState();
-    pGraphics->SetLineWidth(2);
-    CFX_Color crStroke(0xFFFFFFFF);
-    pGraphics->SetStrokeColor(&crStroke);
-    pGraphics->StrokePath(&path, pMatrix);
-    pGraphics->SetLineWidth(1);
-    path.Clear();
-    path.AddLine(pRect->left + 4, pRect->top + 10, pRect->left + 4,
-                 pRect->top + 14);
-    path.AddLine(pRect->left + 10, pRect->top + 10, pRect->left + 10,
-                 pRect->top + 14);
-    path.AddLine(pRect->left + 13, pRect->top + 7, pRect->left + 13,
-                 pRect->top + 11);
-    path.AddLine(pRect->left + 4, pRect->top + 14, pRect->left + 10,
-                 pRect->top + 14);
-    path.AddLine(pRect->left + 12, pRect->top + 11, pRect->left + 12,
-                 pRect->top + 11);
-    pGraphics->StrokePath(&path, pMatrix);
-    pGraphics->RestoreGraphState();
-  } else {
-    CFX_RectF rtMax(*pRect);
-    rtMax.Inflate(-5, -5);
-    CFX_Path path;
-    path.Create();
-    path.AddRectangle(pRect->left + 5, pRect->top + 5, fWidth - 10,
-                      fHeight - 10);
-    path.AddRectangle(pRect->left + 6, pRect->top + 8, fWidth - 12,
-                      fHeight - 14);
-    pGraphics->SaveGraphState();
-    CFX_Color crFill(0xFFFFFFFF);
-    pGraphics->SetFillColor(&crFill);
-    pGraphics->FillPath(&path, FXFILL_ALTERNATE, pMatrix);
-    pGraphics->RestoreGraphState();
-  }
-}
-void CFWL_FormTP::DrawIconImage(CFX_Graphics* pGraphics,
-                                CFX_DIBitmap* pDIBitmap,
-                                const CFX_RectF* pRect,
-                                FWLTHEME_STATE eState,
-                                CFX_Matrix* pMatrix,
-                                int32_t iActive) {
-  pGraphics->StretchImage(pDIBitmap, *pRect, pMatrix);
-}
-void CFWL_FormTP::SetThemeData(uint32_t dwID) {
-  m_pThemeData->clrTransWhite = ArgbEncode(0x65, 255, 255, 255);
-  m_pThemeData->clrCloseBtBKStart[0][0] = ArgbEncode(0xff, 240, 166, 148);
-  m_pThemeData->clrCloseBtBKEnd[0][0] = ArgbEncode(0xff, 228, 61, 5);
-  m_pThemeData->clrCloseBtBKStart[0][1] = ArgbEncode(0xff, 255, 184, 176);
-  m_pThemeData->clrCloseBtBKEnd[0][1] = ArgbEncode(0xff, 252, 107, 71);
-  m_pThemeData->clrCloseBtBKStart[0][2] = ArgbEncode(0xff, 141, 44, 20);
-  m_pThemeData->clrCloseBtBKEnd[0][2] = ArgbEncode(0xff, 202, 72, 33);
-  m_pThemeData->clrCloseBtEdgeLight[0][0] = ArgbEncode(0xff, 255, 122, 107);
-  m_pThemeData->clrCloseBtEdgeDark[0][0] = ArgbEncode(0xff, 218, 77, 54);
-  m_pThemeData->clrCloseBtEdgeLight[0][1] = ArgbEncode(0xff, 255, 93, 74);
-  m_pThemeData->clrCloseBtEdgeDark[0][1] = ArgbEncode(0xff, 218, 74, 51);
-  m_pThemeData->clrCloseBtEdgeLight[0][2] = ArgbEncode(0xff, 191, 61, 28);
-  m_pThemeData->clrCloseBtEdgeDark[0][2] = ArgbEncode(0xff, 93, 30, 13);
-  if (dwID) {
-    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 194, 205, 149);
-    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 170, 184, 131);
-    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 168, 182, 128);
-    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 194, 205, 149);
-    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 117, 141, 94);
-    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 139, 161, 105);
-    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 171, 189, 133);
-    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 155, 175, 125);
-    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 128, 146, 103);
-    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 94, 118, 79);
-    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 139, 161, 105);
-    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 234, 245, 201);
-    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 194, 205, 149);
-    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 175, 189, 133);
-    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 153, 168, 121);
-    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 150, 168, 103);
-    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 182, 195, 162);
-    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 128, 144, 84);
-    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 234, 241, 208);
-    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 169, 186, 112);
-    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 199, 199, 190);
-    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 133, 148, 88);
-    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 163, 176, 137);
-    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 118, 135, 83);
-    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 154, 174, 105);
-    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 154, 174, 105);
-    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 172, 193, 123);
-    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 154, 174, 105);
-    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
-    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
-    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 117, 141, 94);
-    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 139, 161, 105);
-    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 171, 189, 133);
-    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 164, 178, 127);
-    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 171, 189, 133);
-  } else {
-    m_pThemeData->clrHeadBK[0][0] = ArgbEncode(0xff, 3, 114, 255);
-    m_pThemeData->clrHeadBK[0][1] = ArgbEncode(0xff, 0, 85, 226);
-    m_pThemeData->clrHeadBK[0][2] = ArgbEncode(0xff, 0, 85, 226);
-    m_pThemeData->clrHeadBK[0][3] = ArgbEncode(0xff, 3, 114, 255);
-    m_pThemeData->clrHeadEdgeLeft[0][2] = ArgbEncode(0xff, 0, 32, 200);
-    m_pThemeData->clrHeadEdgeLeft[0][1] = ArgbEncode(0xff, 0, 61, 220);
-    m_pThemeData->clrHeadEdgeLeft[0][0] = ArgbEncode(0xff, 0, 54, 210);
-    m_pThemeData->clrHeadEdgeRight[0][0] = ArgbEncode(0xff, 0, 56, 234);
-    m_pThemeData->clrHeadEdgeRight[0][1] = ArgbEncode(0xff, 0, 50, 193);
-    m_pThemeData->clrHeadEdgeRight[0][2] = ArgbEncode(0xff, 0, 19, 139);
-    m_pThemeData->clrHeadEdgeTop[0][0] = ArgbEncode(0xff, 0, 88, 238);
-    m_pThemeData->clrHeadEdgeTop[0][1] = ArgbEncode(0xff, 63, 151, 255);
-    m_pThemeData->clrHeadEdgeTop[0][2] = ArgbEncode(0xff, 3, 114, 255);
-    m_pThemeData->clrHeadEdgeBottom[0][0] = ArgbEncode(0xff, 0, 96, 252);
-    m_pThemeData->clrHeadEdgeBottom[0][1] = ArgbEncode(0xff, 63, 151, 255);
-    m_pThemeData->clrHeadEdgeBottom[0][2] = ArgbEncode(0xff, 0, 67, 207);
-    m_pThemeData->clrNormalBtBKStart[0][2] = ArgbEncode(0xff, 0, 49, 112);
-    m_pThemeData->clrNormalBtBKEnd[0][2] = ArgbEncode(0xff, 0, 87, 188);
-    m_pThemeData->clrNormalBtBKStart[0][0] = ArgbEncode(0xff, 154, 183, 250);
-    m_pThemeData->clrNormalBtBKEnd[0][0] = ArgbEncode(0xff, 17, 110, 248);
-    m_pThemeData->clrNormalBtBKStart[0][1] = ArgbEncode(0xff, 164, 194, 255);
-    m_pThemeData->clrNormalBtBKEnd[0][1] = ArgbEncode(0xff, 29, 158, 255);
-    m_pThemeData->clrNormalBtEdgeLight[0][0] = ArgbEncode(0xff, 68, 120, 245);
-    m_pThemeData->clrNormalBtEdgeDark[0][0] = ArgbEncode(0xff, 24, 72, 187);
-    m_pThemeData->clrNormalBtEdgeLight[0][1] = ArgbEncode(0xff, 72, 122, 245);
-    m_pThemeData->clrNormalBtEdgeDark[0][1] = ArgbEncode(0xff, 35, 87, 195);
-    m_pThemeData->clrNormalBtEdgeLight[0][2] = ArgbEncode(0xff, 60, 114, 244);
-    m_pThemeData->clrNormalBtEdgeDark[0][2] = ArgbEncode(0xff, 21, 70, 185);
-    m_pThemeData->clrBtnCornerLight[0][0] = ArgbEncode(0xff, 220, 220, 220);
-    m_pThemeData->clrBtnCornerLight[0][1] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrBtnCornerLight[0][2] = ArgbEncode(0xff, 225, 225, 225);
-    m_pThemeData->clrBtnEdgeOut[0] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorder[0][0] = ArgbEncode(0xff, 0, 72, 241);
-    m_pThemeData->clrFormBorder[0][1] = ArgbEncode(0xff, 0, 61, 220);
-    m_pThemeData->clrFormBorder[0][2] = ArgbEncode(0xff, 0, 30, 160);
-    m_pThemeData->clrFormBorder[0][3] = ArgbEncode(0xff, 0, 19, 140);
-    m_pThemeData->clrFormBorder[0][4] = ArgbEncode(0xff, 255, 255, 255);
-    m_pThemeData->clrFormBorderLight[0] = ArgbEncode(0xff, 22, 106, 239);
-  }
-  m_pThemeData->clrCloseBtBKStart[1][0] = m_pThemeData->clrCloseBtBKStart[0][0];
-  m_pThemeData->clrCloseBtBKEnd[1][0] = m_pThemeData->clrCloseBtBKEnd[0][0];
-  m_pThemeData->clrCloseBtBKStart[1][1] = m_pThemeData->clrCloseBtBKStart[0][1];
-  m_pThemeData->clrCloseBtBKEnd[1][1] = m_pThemeData->clrCloseBtBKEnd[0][1];
-  m_pThemeData->clrCloseBtBKStart[1][2] = m_pThemeData->clrCloseBtBKStart[0][2];
-  m_pThemeData->clrCloseBtBKEnd[1][2] = m_pThemeData->clrCloseBtBKEnd[0][2];
-  m_pThemeData->clrCloseBtEdgeLight[1][0] =
-      m_pThemeData->clrCloseBtEdgeLight[0][0];
-  m_pThemeData->clrCloseBtEdgeDark[1][0] =
-      m_pThemeData->clrCloseBtEdgeDark[0][0];
-  m_pThemeData->clrCloseBtEdgeLight[1][1] =
-      m_pThemeData->clrCloseBtEdgeLight[0][1];
-  m_pThemeData->clrCloseBtEdgeDark[1][1] =
-      m_pThemeData->clrCloseBtEdgeDark[0][1];
-  m_pThemeData->clrCloseBtEdgeLight[1][2] =
-      m_pThemeData->clrCloseBtEdgeLight[0][2];
-  m_pThemeData->clrCloseBtEdgeDark[1][2] =
-      m_pThemeData->clrCloseBtEdgeDark[0][2];
-  m_pThemeData->clrHeadBK[1][0] = m_pThemeData->clrHeadBK[0][0];
-  m_pThemeData->clrHeadBK[1][1] = m_pThemeData->clrHeadBK[0][1];
-  m_pThemeData->clrHeadBK[1][2] = m_pThemeData->clrHeadBK[0][2];
-  m_pThemeData->clrHeadBK[1][3] = m_pThemeData->clrHeadBK[0][3];
-  m_pThemeData->clrHeadEdgeLeft[1][2] = m_pThemeData->clrHeadEdgeLeft[0][2];
-  m_pThemeData->clrHeadEdgeLeft[1][1] = m_pThemeData->clrHeadEdgeLeft[0][1];
-  m_pThemeData->clrHeadEdgeLeft[1][0] = m_pThemeData->clrHeadEdgeLeft[0][0];
-  m_pThemeData->clrHeadEdgeRight[1][0] = m_pThemeData->clrHeadEdgeRight[0][0];
-  m_pThemeData->clrHeadEdgeRight[1][1] = m_pThemeData->clrHeadEdgeRight[0][1];
-  m_pThemeData->clrHeadEdgeRight[1][2] = m_pThemeData->clrHeadEdgeRight[0][2];
-  m_pThemeData->clrHeadEdgeTop[1][0] = m_pThemeData->clrHeadEdgeTop[0][0];
-  m_pThemeData->clrHeadEdgeTop[1][1] = m_pThemeData->clrHeadEdgeTop[0][1];
-  m_pThemeData->clrHeadEdgeTop[1][2] = m_pThemeData->clrHeadEdgeTop[0][2];
-  m_pThemeData->clrHeadEdgeBottom[1][0] = m_pThemeData->clrHeadEdgeBottom[0][0];
-  m_pThemeData->clrHeadEdgeBottom[1][1] = m_pThemeData->clrHeadEdgeBottom[0][1];
-  m_pThemeData->clrHeadEdgeBottom[1][2] = m_pThemeData->clrHeadEdgeBottom[0][2];
-  m_pThemeData->clrNormalBtBKStart[1][2] =
-      m_pThemeData->clrNormalBtBKStart[0][2];
-  m_pThemeData->clrNormalBtBKEnd[1][2] = m_pThemeData->clrNormalBtBKEnd[0][2];
-  m_pThemeData->clrNormalBtBKStart[1][0] =
-      m_pThemeData->clrNormalBtBKStart[0][0];
-  m_pThemeData->clrNormalBtBKEnd[1][0] = m_pThemeData->clrNormalBtBKEnd[1][0];
-  m_pThemeData->clrNormalBtBKStart[1][1] =
-      m_pThemeData->clrNormalBtBKStart[0][1];
-  m_pThemeData->clrNormalBtBKEnd[1][1] = m_pThemeData->clrNormalBtBKEnd[0][1];
-  m_pThemeData->clrNormalBtEdgeLight[1][0] =
-      m_pThemeData->clrNormalBtEdgeLight[0][0];
-  m_pThemeData->clrNormalBtEdgeDark[1][0] =
-      m_pThemeData->clrNormalBtEdgeDark[0][0];
-  m_pThemeData->clrNormalBtEdgeLight[1][1] =
-      m_pThemeData->clrNormalBtEdgeLight[0][1];
-  m_pThemeData->clrNormalBtEdgeDark[1][1] =
-      m_pThemeData->clrNormalBtEdgeDark[0][1];
-  m_pThemeData->clrNormalBtEdgeLight[1][2] =
-      m_pThemeData->clrNormalBtEdgeLight[0][2];
-  m_pThemeData->clrNormalBtEdgeDark[1][2] =
-      m_pThemeData->clrNormalBtEdgeDark[0][2];
-  m_pThemeData->clrBtnCornerLight[1][0] = m_pThemeData->clrBtnCornerLight[0][0];
-  m_pThemeData->clrBtnCornerLight[1][1] = m_pThemeData->clrBtnCornerLight[0][1];
-  m_pThemeData->clrBtnCornerLight[1][2] = m_pThemeData->clrBtnCornerLight[0][2];
-  m_pThemeData->clrBtnEdgeOut[1] = m_pThemeData->clrBtnEdgeOut[0];
-  m_pThemeData->clrFormBorder[1][0] = m_pThemeData->clrFormBorder[0][0];
-  m_pThemeData->clrFormBorder[1][1] = m_pThemeData->clrFormBorder[0][1];
-  m_pThemeData->clrFormBorder[1][2] = m_pThemeData->clrFormBorder[0][2];
-  m_pThemeData->clrFormBorder[1][3] = m_pThemeData->clrFormBorder[0][3];
-  m_pThemeData->clrFormBorder[1][4] = m_pThemeData->clrFormBorder[0][4];
-  m_pThemeData->clrFormBorderLight[1] = m_pThemeData->clrFormBorderLight[0];
-  DeactiveForm();
-}
-void CFWL_FormTP::DeactiveForm() {
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrHeadBK[1][3]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeLeft[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeLeft[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeLeft[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeRight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeRight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeRight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeTop[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeTop[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeTop[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeBottom[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeBottom[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrHeadEdgeBottom[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKStart[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKStart[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKStart[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKEnd[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKEnd[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtBKEnd[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeLight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeLight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeLight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeDark[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeDark[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrNormalBtEdgeDark[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrBtnCornerLight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrBtnCornerLight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrBtnCornerLight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite, m_pThemeData->clrBtnEdgeOut[1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][3]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorder[1][4]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrFormBorderLight[1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKStart[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKStart[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKStart[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKEnd[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKEnd[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtBKEnd[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeLight[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeLight[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeLight[1][2]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeDark[1][0]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeDark[1][1]);
-  TransModeColor(m_pThemeData->clrTransWhite,
-                 m_pThemeData->clrCloseBtEdgeDark[1][2]);
-}
-void CFWL_FormTP::TransModeColor(FX_ARGB clrFore, FX_ARGB& clrBack) {
-  int32_t iAlfaF, iRF, iGF, iBF;
-  int32_t iAlfaB, iRB, iGB, iBB;
-  ArgbDecode(clrFore, iAlfaF, iRF, iGF, iBF);
-  ArgbDecode(clrBack, iAlfaB, iRB, iGB, iBB);
-  clrBack = ArgbEncode(0xff, iRB + (iRF - iRB) * iAlfaF / 255,
-                       iGB + (iGF - iGB) * iAlfaF / 255,
-                       iBB + (iBF - iBB) * iAlfaF / 255);
-}
-void CFWL_FormTP::InitCaption(FX_BOOL bActive) {
-  if (bActive) {
-    CFX_FxgeDevice dev;
-    CFX_Graphics gs;
-    CFX_Path path;
-    path.Create();
-    delete m_pActiveBitmap;
-    m_pActiveBitmap = new CFX_DIBitmap;
-    m_pActiveBitmap->Create(1, kCYCaption, FXDIB_Argb);
-    dev.Attach(m_pActiveBitmap, false, nullptr, false);
-    gs.Create(&dev);
-    path.AddRectangle(0, 0, 1, 5);
-    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[0][0],
-                     m_pThemeData->clrHeadBK[0][1], &path);
-    path.Clear();
-    path.AddRectangle(0, 5, 1, 15);
-    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[0][1],
-                     m_pThemeData->clrHeadBK[0][2], &path);
-    path.Clear();
-    path.AddRectangle(0, 20, 1, kCYCaption - 19);
-    DrawAxialShading(&gs, 0, 20, 0, kCYCaption, m_pThemeData->clrHeadBK[0][2],
-                     m_pThemeData->clrHeadBK[0][3], &path);
-  } else {
-    CFX_FxgeDevice dev;
-    CFX_Graphics gs;
-    CFX_Path path;
-    path.Create();
-    delete m_pDeactivebitmap;
-    m_pDeactivebitmap = new CFX_DIBitmap;
-    m_pDeactivebitmap->Create(1, kCYCaption, FXDIB_Argb);
-    dev.Attach(m_pDeactivebitmap, false, nullptr, false);
-    gs.Create(&dev);
-    path.AddRectangle(0, 0, 1, 5);
-    DrawAxialShading(&gs, 0, 0, 0, 5, m_pThemeData->clrHeadBK[1][0],
-                     m_pThemeData->clrHeadBK[1][1], &path);
-    path.Clear();
-    path.AddRectangle(0, 5, 1, 15);
-    DrawAxialShading(&gs, 0, 5, 0, 20, m_pThemeData->clrHeadBK[1][1],
-                     m_pThemeData->clrHeadBK[1][2], &path);
-    path.Clear();
-    path.AddRectangle(0, 20, 1, kCYCaption - 19);
-    DrawAxialShading(&gs, 0, 20, 0, kCYCaption, m_pThemeData->clrHeadBK[1][2],
-                     m_pThemeData->clrHeadBK[1][3], &path);
-  }
-}
diff --git a/xfa/fwl/theme/cfwl_formtp.h b/xfa/fwl/theme/cfwl_formtp.h
deleted file mode 100644
index ccbc71b..0000000
--- a/xfa/fwl/theme/cfwl_formtp.h
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FWL_THEME_CFWL_FORMTP_H_
-#define XFA_FWL_THEME_CFWL_FORMTP_H_
-
-#include "xfa/fwl/theme/cfwl_utils.h"
-#include "xfa/fwl/theme/cfwl_widgettp.h"
-
-class CFWL_FormTP : public CFWL_WidgetTP {
- public:
-  CFWL_FormTP();
-  ~CFWL_FormTP() override;
-
-  // CFWL_WidgetTP
-  FWL_Error Initialize() override;
-  FWL_Error Finalize() override;
-  bool IsValidWidget(IFWL_Widget* pWidget) override;
-  uint32_t SetThemeID(IFWL_Widget* pWidget,
-                      uint32_t dwThemeID,
-                      FX_BOOL bChildren = TRUE) override;
-  FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
-  FX_BOOL DrawText(CFWL_ThemeText* pParams) override;
-  void* GetCapacity(CFWL_ThemePart* pThemePart,
-                    CFWL_WidgetCapacity dwCapacity) override;
-  FWL_Error GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) override;
-
- protected:
-  void CalCloseBox(IFWL_Widget* pWidget, CFX_RectF& rect);
-  void CalMaxBox(IFWL_Widget* pWidget, CFX_RectF& rect);
-  void CalMinBox(IFWL_Widget* pWidget, CFX_RectF& rect);
-  void CalCaption(IFWL_Widget* pWidget, CFX_RectF& rect);
-  void CalIcon(IFWL_Widget* pWidget, CFX_RectF& rect);
-
-  void DrawFormBorder(CFX_Graphics* pGraphics,
-                      const CFX_RectF* pRect,
-                      FWLTHEME_STATE eState,
-                      CFX_Matrix* pMatrix,
-                      int32_t iActive = 0);
-  void DrawCaption(CFX_Graphics* pGraphics,
-                   const CFX_RectF* pRect,
-                   FWLTHEME_STATE eState,
-                   CFX_Matrix* pMatrix,
-                   int32_t iActive = 0);
-  void DrawNarrowCaption(CFX_Graphics* pGraphics,
-                         const CFX_RectF* pRect,
-                         FWLTHEME_STATE eState,
-                         CFX_Matrix* pMatrix,
-                         int32_t iActive = 0);
-  void DrawCloseBox(CFX_Graphics* pGraphics,
-                    const CFX_RectF* pRect,
-                    FWLTHEME_STATE eState,
-                    CFX_Matrix* pMatrix,
-                    int32_t iActive = 0);
-  void DrawMinMaxBoxCommon(CFX_Graphics* pGraphics,
-                           const CFX_RectF* pRect,
-                           FWLTHEME_STATE eState,
-                           CFX_Matrix* pMatrix,
-                           int32_t iActive = 0);
-  void DrawMinimizeBox(CFX_Graphics* pGraphics,
-                       const CFX_RectF* pRect,
-                       FWLTHEME_STATE eState,
-                       CFX_Matrix* pMatrix,
-                       int32_t iActive = 0);
-  void DrawMaximizeBox(CFX_Graphics* pGraphics,
-                       const CFX_RectF* pRect,
-                       FWLTHEME_STATE eState,
-                       bool bMax,
-                       CFX_Matrix* pMatrix,
-                       int32_t iActive = 0);
-  void DrawIconImage(CFX_Graphics* pGraphics,
-                     CFX_DIBitmap* pDIBitmap,
-                     const CFX_RectF* pRect,
-                     FWLTHEME_STATE eState,
-                     CFX_Matrix* pMatrix,
-                     int32_t iActive = 0);
-  void SetThemeData(uint32_t dwID);
-  void TransModeColor(FX_ARGB clrFore, FX_ARGB& clrBack);
-  void DeactiveForm();
-  void InitCaption(FX_BOOL bActive);
-  CFX_DIBitmap* m_pActiveBitmap;
-  CFX_DIBitmap* m_pDeactivebitmap;
-  CFX_RectF m_rtDisCaption;
-  CFX_RectF m_rtDisLBorder;
-  CFX_RectF m_rtDisRBorder;
-  CFX_RectF m_rtDisBBorder;
-  struct SBThemeData {
-    FX_ARGB clrHeadBK[2][4];
-    FX_ARGB clrHeadEdgeLeft[2][3];
-    FX_ARGB clrHeadEdgeRight[2][3];
-    FX_ARGB clrHeadEdgeTop[2][3];
-    FX_ARGB clrHeadEdgeBottom[2][3];
-    FX_ARGB clrCloseBtBKStart[2][3];
-    FX_ARGB clrCloseBtBKEnd[2][3];
-    FX_ARGB clrCloseBtEdgeLight[2][3];
-    FX_ARGB clrCloseBtEdgeDark[2][3];
-    FX_ARGB clrNormalBtBKStart[2][3];
-    FX_ARGB clrNormalBtBKEnd[2][3];
-    FX_ARGB clrNormalBtEdgeLight[2][3];
-    FX_ARGB clrNormalBtEdgeDark[2][3];
-    FX_ARGB clrBtnEdgeOut[2];
-    FX_ARGB clrBtnCornerLight[2][3];
-    FX_ARGB clrHeadText[2];
-    FX_ARGB clrFormBorder[2][5];
-    FX_ARGB clrFormBorderLight[2];
-    FX_ARGB clrTransWhite;
-  } * m_pThemeData;
-};
-
-#endif  // XFA_FWL_THEME_CFWL_FORMTP_H_
diff --git a/xfa/fxbarcode/BC_ResultPoint.cpp b/xfa/fxbarcode/BC_ResultPoint.cpp
deleted file mode 100644
index 9726ea4..0000000
--- a/xfa/fxbarcode/BC_ResultPoint.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/fxbarcode/BC_ResultPoint.h"
-
-CBC_ResultPoint::CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y) : m_x(x), m_y(y) {}
-FX_FLOAT CBC_ResultPoint::GetX() {
-  return m_x;
-}
-FX_FLOAT CBC_ResultPoint::GetY() {
-  return m_y;
-}
diff --git a/xfa/fxbarcode/BC_ResultPoint.h b/xfa/fxbarcode/BC_ResultPoint.h
deleted file mode 100644
index 81e2784..0000000
--- a/xfa/fxbarcode/BC_ResultPoint.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXBARCODE_BC_RESULTPOINT_H_
-#define XFA_FXBARCODE_BC_RESULTPOINT_H_
-
-#include "core/fxcrt/include/fx_basic.h"
-
-class CBC_ResultPoint {
- public:
-  CBC_ResultPoint();
-  CBC_ResultPoint(FX_FLOAT x, FX_FLOAT y);
-  virtual ~CBC_ResultPoint() {}
-  virtual FX_FLOAT GetX();
-  virtual FX_FLOAT GetY();
-
- protected:
-  FX_FLOAT m_x;
-  FX_FLOAT m_y;
-};
-
-#endif  // XFA_FXBARCODE_BC_RESULTPOINT_H_
diff --git a/xfa/fxbarcode/common/BC_CommonBitSource.cpp b/xfa/fxbarcode/common/BC_CommonBitSource.cpp
deleted file mode 100644
index af91d5e..0000000
--- a/xfa/fxbarcode/common/BC_CommonBitSource.cpp
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/fxbarcode/common/BC_CommonBitSource.h"
-
-CBC_CommonBitSource::CBC_CommonBitSource(CFX_ByteArray* bytes) {
-  m_bytes.Copy((*bytes));
-  m_bitOffset = 0;
-  m_byteOffset = 0;
-}
-CBC_CommonBitSource::~CBC_CommonBitSource() {}
-int32_t CBC_CommonBitSource::ReadBits(int32_t numBits, int32_t& e) {
-  if (numBits < 1 || numBits > 32) {
-    e = BCExceptionIllegalArgument;
-    return 0;
-  }
-  int32_t result = 0;
-  if (m_bitOffset > 0) {
-    int32_t bitsLeft = 8 - m_bitOffset;
-    int32_t toRead = numBits < bitsLeft ? numBits : bitsLeft;
-    int32_t bitsToNotRead = bitsLeft - toRead;
-    int32_t mask = (0xff >> (8 - toRead)) << bitsToNotRead;
-    result = (m_bytes[m_byteOffset] & mask) >> bitsToNotRead;
-    numBits -= toRead;
-    m_bitOffset += toRead;
-    if (m_bitOffset == 8) {
-      m_bitOffset = 0;
-      m_byteOffset++;
-    }
-  }
-  if (numBits > 0) {
-    while (numBits >= 8) {
-      result = (result << 8) | (m_bytes[m_byteOffset] & 0xff);
-      m_byteOffset++;
-      numBits -= 8;
-    }
-    if (numBits > 0) {
-      int32_t bitsToNotRead = 8 - numBits;
-      int32_t mask = (0xff >> bitsToNotRead) << bitsToNotRead;
-      result = (result << numBits) |
-               ((m_bytes[m_byteOffset] & mask) >> bitsToNotRead);
-      m_bitOffset += numBits;
-    }
-  }
-  return result;
-}
-int32_t CBC_CommonBitSource::Available() {
-  return 8 * (m_bytes.GetSize() - m_byteOffset) - m_bitOffset;
-}
-int32_t CBC_CommonBitSource::getByteOffset() {
-  return m_byteOffset;
-}
diff --git a/xfa/fxbarcode/common/BC_CommonBitSource.h b/xfa/fxbarcode/common/BC_CommonBitSource.h
deleted file mode 100644
index 7c6736c..0000000
--- a/xfa/fxbarcode/common/BC_CommonBitSource.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
-#define XFA_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
-
-#include "core/fxcrt/include/fx_basic.h"
-#include "xfa/fxbarcode/utils.h"
-
-class CBC_CommonBitSource {
- public:
-  CBC_CommonBitSource(CFX_ByteArray* bytes);
-  ~CBC_CommonBitSource();
-
-  int32_t ReadBits(int32_t numBits, int32_t& e);
-  int32_t Available();
-  int32_t getByteOffset();
-
- private:
-  CFX_ByteArray m_bytes;
-  int32_t m_byteOffset;
-  int32_t m_bitOffset;
-};
-
-#endif  // XFA_FXBARCODE_COMMON_BC_COMMONBITSOURCE_H_
diff --git a/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp b/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp
deleted file mode 100644
index d84ed61..0000000
--- a/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2007 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h"
-
-#include <memory>
-
-#include "core/fxcrt/include/fx_basic.h"
-#include "xfa/fxbarcode/utils.h"
-
-CBC_CommonPerspectiveTransform::CBC_CommonPerspectiveTransform(FX_FLOAT a11,
-                                                               FX_FLOAT a21,
-                                                               FX_FLOAT a31,
-                                                               FX_FLOAT a12,
-                                                               FX_FLOAT a22,
-                                                               FX_FLOAT a32,
-                                                               FX_FLOAT a13,
-                                                               FX_FLOAT a23,
-                                                               FX_FLOAT a33)
-    : m_a11(a11),
-      m_a12(a12),
-      m_a13(a13),
-      m_a21(a21),
-      m_a22(a22),
-      m_a23(a23),
-      m_a31(a31),
-      m_a32(a32),
-      m_a33(a33) {}
-CBC_CommonPerspectiveTransform::~CBC_CommonPerspectiveTransform() {}
-CBC_CommonPerspectiveTransform*
-CBC_CommonPerspectiveTransform::QuadrilateralToQuadrilateral(FX_FLOAT x0,
-                                                             FX_FLOAT y0,
-                                                             FX_FLOAT x1,
-                                                             FX_FLOAT y1,
-                                                             FX_FLOAT x2,
-                                                             FX_FLOAT y2,
-                                                             FX_FLOAT x3,
-                                                             FX_FLOAT y3,
-                                                             FX_FLOAT x0p,
-                                                             FX_FLOAT y0p,
-                                                             FX_FLOAT x1p,
-                                                             FX_FLOAT y1p,
-                                                             FX_FLOAT x2p,
-                                                             FX_FLOAT y2p,
-                                                             FX_FLOAT x3p,
-                                                             FX_FLOAT y3p) {
-  std::unique_ptr<CBC_CommonPerspectiveTransform> qToS(
-      QuadrilateralToSquare(x0, y0, x1, y1, x2, y2, x3, y3));
-  std::unique_ptr<CBC_CommonPerspectiveTransform> sToQ(
-      SquareToQuadrilateral(x0p, y0p, x1p, y1p, x2p, y2p, x3p, y3p));
-  return sToQ->Times(*(qToS.get()));
-}
-void CBC_CommonPerspectiveTransform::TransformPoints(CFX_FloatArray* points) {
-  int32_t max = points->GetSize();
-  FX_FLOAT a11 = m_a11;
-  FX_FLOAT a12 = m_a12;
-  FX_FLOAT a13 = m_a13;
-  FX_FLOAT a21 = m_a21;
-  FX_FLOAT a22 = m_a22;
-  FX_FLOAT a23 = m_a23;
-  FX_FLOAT a31 = m_a31;
-  FX_FLOAT a32 = m_a32;
-  FX_FLOAT a33 = m_a33;
-  int32_t i;
-  for (i = 0; i < max; i += 2) {
-    FX_FLOAT x = (*points)[i];
-    FX_FLOAT y = (*points)[i + 1];
-    FX_FLOAT denominator = a13 * x + a23 * y + a33;
-    (*points)[i] = (a11 * x + a21 * y + a31) / denominator;
-    (*points)[i + 1] = (a12 * x + a22 * y + a32) / denominator;
-  }
-}
-CBC_CommonPerspectiveTransform*
-CBC_CommonPerspectiveTransform::SquareToQuadrilateral(FX_FLOAT x0,
-                                                      FX_FLOAT y0,
-                                                      FX_FLOAT x1,
-                                                      FX_FLOAT y1,
-                                                      FX_FLOAT x2,
-                                                      FX_FLOAT y2,
-                                                      FX_FLOAT x3,
-                                                      FX_FLOAT y3) {
-  FX_FLOAT dy2 = y3 - y2;
-  FX_FLOAT dy3 = y0 - y1 + y2 - y3;
-  if ((dy2 == 0.0f) && (dy3 == 0.0f)) {
-    return new CBC_CommonPerspectiveTransform(x1 - x0, x2 - x1, x0, y1 - y0,
-                                              y2 - y1, y0, 0.0f, 0.0f, 1.0f);
-  } else {
-    FX_FLOAT dx1 = x1 - x2;
-    FX_FLOAT dx2 = x3 - x2;
-    FX_FLOAT dx3 = x0 - x1 + x2 - x3;
-    FX_FLOAT dy1 = y1 - y2;
-    FX_FLOAT denominator = dx1 * dy2 - dx2 * dy1;
-    FX_FLOAT a13 = (dx3 * dy2 - dx2 * dy3) / denominator;
-    FX_FLOAT a23 = (dx1 * dy3 - dx3 * dy1) / denominator;
-    return new CBC_CommonPerspectiveTransform(
-        x1 - x0 + a13 * x1, x3 - x0 + a23 * x3, x0, y1 - y0 + a13 * y1,
-        y3 - y0 + a23 * y3, y0, a13, a23, 1.0f);
-  }
-}
-CBC_CommonPerspectiveTransform*
-CBC_CommonPerspectiveTransform::QuadrilateralToSquare(FX_FLOAT x0,
-                                                      FX_FLOAT y0,
-                                                      FX_FLOAT x1,
-                                                      FX_FLOAT y1,
-                                                      FX_FLOAT x2,
-                                                      FX_FLOAT y2,
-                                                      FX_FLOAT x3,
-                                                      FX_FLOAT y3) {
-  std::unique_ptr<CBC_CommonPerspectiveTransform> temp1(
-      SquareToQuadrilateral(x0, y0, x1, y1, x2, y2, x3, y3));
-  return temp1->BuildAdjoint();
-}
-CBC_CommonPerspectiveTransform* CBC_CommonPerspectiveTransform::BuildAdjoint() {
-  return new CBC_CommonPerspectiveTransform(
-      m_a22 * m_a33 - m_a23 * m_a32, m_a23 * m_a31 - m_a21 * m_a33,
-      m_a21 * m_a32 - m_a22 * m_a31, m_a13 * m_a32 - m_a12 * m_a33,
-      m_a11 * m_a33 - m_a13 * m_a31, m_a12 * m_a31 - m_a11 * m_a32,
-      m_a12 * m_a23 - m_a13 * m_a22, m_a13 * m_a21 - m_a11 * m_a23,
-      m_a11 * m_a22 - m_a12 * m_a21);
-}
-CBC_CommonPerspectiveTransform* CBC_CommonPerspectiveTransform::Times(
-    CBC_CommonPerspectiveTransform& other) {
-  return new CBC_CommonPerspectiveTransform(
-      m_a11 * other.m_a11 + m_a21 * other.m_a12 + m_a31 * other.m_a13,
-      m_a11 * other.m_a21 + m_a21 * other.m_a22 + m_a31 * other.m_a23,
-      m_a11 * other.m_a31 + m_a21 * other.m_a32 + m_a31 * other.m_a33,
-      m_a12 * other.m_a11 + m_a22 * other.m_a12 + m_a32 * other.m_a13,
-      m_a12 * other.m_a21 + m_a22 * other.m_a22 + m_a32 * other.m_a23,
-      m_a12 * other.m_a31 + m_a22 * other.m_a32 + m_a32 * other.m_a33,
-      m_a13 * other.m_a11 + m_a23 * other.m_a12 + m_a33 * other.m_a13,
-      m_a13 * other.m_a21 + m_a23 * other.m_a22 + m_a33 * other.m_a23,
-      m_a13 * other.m_a31 + m_a23 * other.m_a32 + m_a33 * other.m_a33);
-}
diff --git a/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h b/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h
deleted file mode 100644
index 8a5fd26..0000000
--- a/xfa/fxbarcode/common/BC_CommonPerspectiveTransform.h
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
-#define XFA_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
-
-#include "core/fxcrt/include/fx_basic.h"
-
-class CBC_CommonPerspectiveTransform {
- public:
-  CBC_CommonPerspectiveTransform(FX_FLOAT a11,
-                                 FX_FLOAT a21,
-                                 FX_FLOAT a31,
-                                 FX_FLOAT a12,
-                                 FX_FLOAT a22,
-                                 FX_FLOAT a32,
-                                 FX_FLOAT a13,
-                                 FX_FLOAT a23,
-                                 FX_FLOAT a33);
-  virtual ~CBC_CommonPerspectiveTransform();
-
-  static CBC_CommonPerspectiveTransform* QuadrilateralToQuadrilateral(
-      FX_FLOAT x0,
-      FX_FLOAT y0,
-      FX_FLOAT x1,
-      FX_FLOAT y1,
-      FX_FLOAT x2,
-      FX_FLOAT y2,
-      FX_FLOAT x3,
-      FX_FLOAT y3,
-      FX_FLOAT x0p,
-      FX_FLOAT y0p,
-      FX_FLOAT x1p,
-      FX_FLOAT y1p,
-      FX_FLOAT x2p,
-      FX_FLOAT y2p,
-      FX_FLOAT x3p,
-      FX_FLOAT y3p);
-  static CBC_CommonPerspectiveTransform* SquareToQuadrilateral(FX_FLOAT x0,
-                                                               FX_FLOAT y0,
-                                                               FX_FLOAT x1,
-                                                               FX_FLOAT y1,
-                                                               FX_FLOAT x2,
-                                                               FX_FLOAT y2,
-                                                               FX_FLOAT x3,
-                                                               FX_FLOAT y3);
-  static CBC_CommonPerspectiveTransform* QuadrilateralToSquare(FX_FLOAT x0,
-                                                               FX_FLOAT y0,
-                                                               FX_FLOAT x1,
-                                                               FX_FLOAT y1,
-                                                               FX_FLOAT x2,
-                                                               FX_FLOAT y2,
-                                                               FX_FLOAT x3,
-                                                               FX_FLOAT y3);
-  CBC_CommonPerspectiveTransform* BuildAdjoint();
-  CBC_CommonPerspectiveTransform* Times(CBC_CommonPerspectiveTransform& other);
-  void TransformPoints(CFX_FloatArray* points);
-
- private:
-  FX_FLOAT m_a11, m_a12, m_a13, m_a21, m_a22, m_a23, m_a31, m_a32, m_a33;
-};
-
-#endif  // XFA_FXBARCODE_COMMON_BC_COMMONPERSPECTIVETRANSFORM_H_
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp b/xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp
deleted file mode 100644
index 0280ea0..0000000
--- a/xfa/fxbarcode/pdf417/BC_PDF417Codeword.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-// Original code is licensed as follows:
-/*
- * Copyright 2013 ZXing authors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "xfa/fxbarcode/pdf417/BC_PDF417Codeword.h"
-
-int32_t CBC_Codeword::BARCODE_ROW_UNKNOWN = -1;
-CBC_Codeword::CBC_Codeword(int32_t startX,
-                           int32_t endX,
-                           int32_t bucket,
-                           int32_t cvalue) {
-  m_startX = startX;
-  m_endX = endX;
-  m_bucket = bucket;
-  m_value = cvalue;
-  m_rowNumber = BARCODE_ROW_UNKNOWN;
-}
-CBC_Codeword::~CBC_Codeword() {}
-FX_BOOL CBC_Codeword::hasValidRowNumber() {
-  return isValidRowNumber(m_rowNumber);
-}
-FX_BOOL CBC_Codeword::isValidRowNumber(int32_t rowNumber) {
-  return m_rowNumber != BARCODE_ROW_UNKNOWN &&
-         m_bucket == (m_rowNumber % 3) * 3;
-}
-void CBC_Codeword::setRowNumberAsRowIndicatorColumn() {
-  m_rowNumber = (m_value / 30) * 3 + m_bucket / 3;
-}
-int32_t CBC_Codeword::getWidth() {
-  return m_endX - m_startX;
-}
-int32_t CBC_Codeword::getStartX() {
-  return m_startX;
-}
-int32_t CBC_Codeword::getEndX() {
-  return m_endX;
-}
-int32_t CBC_Codeword::getBucket() {
-  return m_bucket;
-}
-int32_t CBC_Codeword::getValue() {
-  return m_value;
-}
-int32_t CBC_Codeword::getRowNumber() {
-  return m_rowNumber;
-}
-void CBC_Codeword::setRowNumber(int32_t rowNumber) {
-  m_rowNumber = rowNumber;
-}
-CFX_ByteString CBC_Codeword::toString() {
-  return m_rowNumber + (FX_CHAR)'|' + m_value;
-}
diff --git a/xfa/fxbarcode/pdf417/BC_PDF417Codeword.h b/xfa/fxbarcode/pdf417/BC_PDF417Codeword.h
deleted file mode 100644
index 2423cab..0000000
--- a/xfa/fxbarcode/pdf417/BC_PDF417Codeword.h
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
-#define XFA_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
-
-#include "core/fxcrt/include/fx_basic.h"
-
-class CBC_Codeword {
- public:
-  CBC_Codeword(int32_t startX, int32_t endX, int32_t bucket, int32_t value);
-  virtual ~CBC_Codeword();
-
-  FX_BOOL hasValidRowNumber();
-  FX_BOOL isValidRowNumber(int32_t rowNumber);
-  void setRowNumberAsRowIndicatorColumn();
-  int32_t getWidth();
-  int32_t getStartX();
-  int32_t getEndX();
-  int32_t getBucket();
-  int32_t getValue();
-  int32_t getRowNumber();
-  void setRowNumber(int32_t rowNumber);
-  CFX_ByteString toString();
-
- private:
-  static int32_t BARCODE_ROW_UNKNOWN;
-  int32_t m_startX;
-  int32_t m_endX;
-  int32_t m_bucket;
-  int32_t m_value;
-  int32_t m_rowNumber;
-};
-
-#endif  // XFA_FXBARCODE_PDF417_BC_PDF417CODEWORD_H_
