diff --git a/core/fxge/BUILD.gn b/core/fxge/BUILD.gn
index da644fc..8d41381 100644
--- a/core/fxge/BUILD.gn
+++ b/core/fxge/BUILD.gn
@@ -142,7 +142,7 @@
     ]
   }
 
-  if (pdf_use_skia || pdf_use_skia_paths) {
+  if (pdf_use_skia) {
     sources += [ "skia/fx_skia_device.cpp" ]
     deps += [ "//skia" ]
   }
@@ -239,7 +239,7 @@
   deps = []
   pdfium_root_dir = "../../"
 
-  if (pdf_use_skia || pdf_use_skia_paths) {
+  if (pdf_use_skia) {
     sources += [ "skia/fx_skia_device_embeddertest.cpp" ]
     deps += [
       ":fxge",
diff --git a/core/fxge/skia/fx_skia_device.cpp b/core/fxge/skia/fx_skia_device.cpp
index 39ffdae..ef51a8f 100644
--- a/core/fxge/skia/fx_skia_device.cpp
+++ b/core/fxge/skia/fx_skia_device.cpp
@@ -26,6 +26,7 @@
 #include "core/fxcrt/cfx_bitstream.h"
 #include "core/fxcrt/data_vector.h"
 #include "core/fxcrt/fx_2d_size.h"
+#include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_memory_wrappers.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/stl_util.h"
@@ -36,10 +37,10 @@
 #include "core/fxge/cfx_renderdevice.h"
 #include "core/fxge/cfx_substfont.h"
 #include "core/fxge/cfx_textrenderoptions.h"
-#include "core/fxge/dib/cfx_bitmapcomposer.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/dib/cfx_imagerenderer.h"
 #include "core/fxge/dib/cfx_imagestretcher.h"
+#include "core/fxge/dib/cstretchengine.h"
 #include "core/fxge/dib/fx_dib.h"
 #include "core/fxge/text_char_pos.h"
 #include "third_party/base/check.h"
@@ -51,12 +52,15 @@
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "third_party/skia/include/core/SkClipOp.h"
+#include "third_party/skia/include/core/SkColorFilter.h"
 #include "third_party/skia/include/core/SkColorPriv.h"
 #include "third_party/skia/include/core/SkColorType.h"
 #include "third_party/skia/include/core/SkImage.h"
+#include "third_party/skia/include/core/SkMaskFilter.h"
 #include "third_party/skia/include/core/SkPaint.h"
 #include "third_party/skia/include/core/SkPath.h"
 #include "third_party/skia/include/core/SkPathEffect.h"
+#include "third_party/skia/include/core/SkPictureRecorder.h"
 #include "third_party/skia/include/core/SkRSXform.h"
 #include "third_party/skia/include/core/SkRect.h"
 #include "third_party/skia/include/core/SkSamplingOptions.h"
@@ -68,129 +72,8 @@
 #include "third_party/skia/include/effects/SkGradientShader.h"
 #include "third_party/skia/include/pathops/SkPathOps.h"
 
-#if defined(_SKIA_SUPPORT_PATHS_)
-#include "core/fxge/cfx_cliprgn.h"
-#endif
-
-#if defined(_SKIA_SUPPORT_)
-#include "core/fxcrt/fx_coordinates.h"
-#include "core/fxge/dib/cstretchengine.h"
-#include "third_party/skia/include/core/SkColorFilter.h"
-#include "third_party/skia/include/core/SkMaskFilter.h"
-#include "third_party/skia/include/core/SkPictureRecorder.h"
-#endif
-
 namespace {
 
-#if defined(_SKIA_SUPPORT_PATHS_)
-void RgbByteOrderTransferBitmap(const RetainPtr<CFX_DIBitmap>& pBitmap,
-                                int width,
-                                int height,
-                                const RetainPtr<CFX_DIBBase>& pSrcBitmap,
-                                int src_left,
-                                int src_top) {
-  if (!pBitmap)
-    return;
-
-  int dest_left = 0;
-  int dest_top = 0;
-  if (!pBitmap->GetOverlapRect(dest_left, dest_top, width, height,
-                               pSrcBitmap->GetWidth(), pSrcBitmap->GetHeight(),
-                               src_left, src_top, nullptr)) {
-    return;
-  }
-
-  const int Bpp = pBitmap->GetBPP() / 8;
-  const FXDIB_Format dest_format = pBitmap->GetFormat();
-  const FXDIB_Format src_format = pSrcBitmap->GetFormat();
-  const int dest_pitch = pBitmap->GetPitch();
-
-  const size_t dest_x_offset = Fx2DSizeOrDie(dest_left, Bpp);
-  const size_t dest_y_offset = Fx2DSizeOrDie(dest_top, dest_pitch);
-
-  pdfium::span<uint8_t> dest_span =
-      pBitmap->GetBuffer().subspan(dest_y_offset).subspan(dest_x_offset);
-  if (dest_format == src_format) {
-    const size_t src_x_offset = Fx2DSizeOrDie(src_left, Bpp);
-    for (int row = 0; row < height; row++) {
-      uint8_t* dest_scan = dest_span.data();
-      const uint8_t* src_scan =
-          pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
-      if (Bpp == 4) {
-        for (int col = 0; col < width; col++) {
-          FXARGB_SETRGBORDERDIB(dest_scan,
-                                *reinterpret_cast<const uint32_t*>(src_scan));
-          dest_scan += 4;
-          src_scan += 4;
-        }
-      } else {
-        for (int col = 0; col < width; col++) {
-          *dest_scan++ = src_scan[2];
-          *dest_scan++ = src_scan[1];
-          *dest_scan++ = src_scan[0];
-          src_scan += 3;
-        }
-      }
-      dest_span = dest_span.subspan(dest_pitch);
-    }
-    return;
-  }
-
-  if (dest_format == FXDIB_Format::kRgb) {
-    DCHECK_EQ(src_format, FXDIB_Format::kRgb32);
-    const size_t src_x_offset = Fx2DSizeOrDie(src_left, 4);
-    for (int row = 0; row < height; row++) {
-      uint8_t* dest_scan = dest_span.data();
-      const uint8_t* src_scan =
-          pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
-      for (int col = 0; col < width; col++) {
-        *dest_scan++ = src_scan[2];
-        *dest_scan++ = src_scan[1];
-        *dest_scan++ = src_scan[0];
-        src_scan += 4;
-      }
-      dest_span = dest_span.subspan(dest_pitch);
-    }
-    return;
-  }
-
-  DCHECK(dest_format == FXDIB_Format::kArgb ||
-         dest_format == FXDIB_Format::kRgb32);
-  if (src_format == FXDIB_Format::kRgb) {
-    const size_t src_x_offset = Fx2DSizeOrDie(src_left, 3);
-    for (int row = 0; row < height; row++) {
-      uint8_t* dest_scan = dest_span.data();
-      const uint8_t* src_scan =
-          pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
-      for (int col = 0; col < width; col++) {
-        FXARGB_SETDIB(dest_scan,
-                      ArgbEncode(0xff, src_scan[0], src_scan[1], src_scan[2]));
-        dest_scan += 4;
-        src_scan += 3;
-      }
-      dest_span = dest_span.subspan(dest_pitch);
-    }
-    return;
-  }
-  if (src_format != FXDIB_Format::kRgb32)
-    return;
-  DCHECK_EQ(dest_format, FXDIB_Format::kArgb);
-  const size_t src_x_offset = Fx2DSizeOrDie(src_left, 4);
-  for (int row = 0; row < height; row++) {
-    uint8_t* dest_scan = dest_span.data();
-    const uint8_t* src_scan =
-        pSrcBitmap->GetScanline(src_top + row).subspan(src_x_offset).data();
-    for (int col = 0; col < width; col++) {
-      FXARGB_SETDIB(dest_scan,
-                    ArgbEncode(0xff, src_scan[0], src_scan[1], src_scan[2]));
-      src_scan += 4;
-      dest_scan += 4;
-    }
-    dest_span = dest_span.subspan(dest_pitch);
-  }
-}
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
-
 #define SHOW_SKIA_PATH 0  // set to 1 to print the path contents
 #if SHOW_SKIA_PATH
 #define SHOW_SKIA_PATH_SHORTHAND 0  // set to 1 for abbreviated path contents
@@ -295,7 +178,6 @@
 
 #endif  // DRAW_SKIA_CLIP
 
-#if defined(_SKIA_SUPPORT_)
 bool IsRGBColorGrayScale(uint32_t color) {
   return FXARGB_R(color) == FXARGB_G(color) &&
          FXARGB_R(color) == FXARGB_B(color);
@@ -343,7 +225,6 @@
     }
   }
 }
-#endif  // defined(_SKIA_SUPPORT_)
 
 SkColorType Get32BitSkColorType(bool is_rgb_byte_order) {
   return is_rgb_byte_order ? kRGBA_8888_SkColorType : kBGRA_8888_SkColorType;
@@ -673,7 +554,6 @@
   clip->lineTo(IntersectSides(rectPts[maxBounds], slope, startEdgePt));
 }
 
-#if defined(_SKIA_SUPPORT_)
 void SetBitmapMatrix(const CFX_Matrix& m,
                      int width,
                      int height,
@@ -838,7 +718,6 @@
   bitmap->Clear(color);
   return bitmap;
 }
-#endif  // defined(_SKIA_SUPPORT_)
 
 }  // namespace
 
@@ -870,7 +749,6 @@
                 BlendMode blend_type) {
     if (m_debugDisable)
       return false;
-    Dump(__func__);
     int drawIndex = std::min(m_drawIndex, m_commands.size());
     if (Accumulator::kText == m_type || drawIndex != m_commandIndex ||
         (Accumulator::kPath == m_type &&
@@ -906,7 +784,6 @@
   }
 
   void FlushPath() {
-    Dump(__func__);
     SkMatrix skMatrix = ToSkMatrix(m_drawMatrix);
     SkPaint skPaint;
     skPaint.setAntiAlias(!m_fillOptions.aliased_path);
@@ -938,18 +815,12 @@
       }
       skPaint.setStyle(SkPaint::kFill_Style);
       skPaint.setColor(m_fillColor);
-#if defined(_SKIA_SUPPORT_PATHS_)
-      m_pDriver->PreMultiply();
-#endif
       DebugShowSkiaDrawPath(m_pDriver, skCanvas, skPaint, *fillPath);
       skCanvas->drawPath(*fillPath, skPaint);
     }
     if (stroke_alpha && do_stroke) {
       skPaint.setStyle(SkPaint::kStroke_Style);
       skPaint.setColor(m_strokeColor);
-#if defined(_SKIA_SUPPORT_PATHS_)
-      m_pDriver->PreMultiply();
-#endif
       if (!m_skPath.isLastContourClosed() && IsPathAPoint(m_skPath)) {
         DCHECK_GE(m_skPath.countPoints(), 1);
         skCanvas->drawPoint(m_skPath.getPoint(0), skPaint);
@@ -1004,7 +875,6 @@
                 const CFX_TextRenderOptions& options) {
     if (m_debugDisable)
       return false;
-    Dump(__func__);
     float scaleX = 1;
     bool oneAtATime = false;
     bool hasRSX = HasRSX(nChars, pCharPos, &scaleX, &oneAtATime);
@@ -1090,7 +960,6 @@
   }
 
   void FlushText() {
-    Dump(__func__);
     SkPaint skPaint;
     skPaint.setAntiAlias(true);
     skPaint.setColor(m_fillColor);
@@ -1113,9 +982,6 @@
     SkMatrix skMatrix = ToFlippedSkMatrix(m_drawMatrix, flip);
     skCanvas->concat(skMatrix);
     const SkTDArray<uint16_t>& glyphs = m_charDetails.GetGlyphs();
-#if defined(_SKIA_SUPPORT_PATHS_)
-    m_pDriver->PreMultiply();
-#endif
     if (m_rsxform.size()) {
       sk_sp<SkTextBlob> blob = SkTextBlob::MakeFromRSXform(
           glyphs.begin(), glyphs.size_bytes(), m_rsxform.begin(), font,
@@ -1146,7 +1012,6 @@
                    const CFX_FillRenderOptions& fill_options) {
     if (m_debugDisable)
       return false;
-    Dump(__func__);
     SkPath skClipPath;
     if (path.GetPoints().size() == 5 || path.GetPoints().size() == 4) {
       absl::optional<CFX_FloatRect> maybe_rectf = path.GetRect(pMatrix);
@@ -1204,7 +1069,6 @@
                      const CFX_GraphStateData* pGraphState) {
     if (m_debugDisable)
       return false;
-    Dump(__func__);
     SkPath skPath = BuildPath(path);
     SkMatrix skMatrix = ToSkMatrix(*pMatrix);
     SkPaint skPaint;
@@ -1241,7 +1105,6 @@
   bool ClipSave() {
     if (m_debugDisable)
       return false;
-    Dump(__func__);
     int count = m_commands.size();
     if (m_commandIndex < count) {
       if (Clip::kSave == m_commands[m_commandIndex]) {
@@ -1264,7 +1127,6 @@
   bool ClipRestore() {
     if (m_debugDisable)
       return false;
-    Dump(__func__);
 
     for (int i = m_commandIndex - 1; i > 0; --i) {
       if (m_commands[i] == Clip::kSave) {
@@ -1357,7 +1219,6 @@
   void Flush() {
     if (m_debugDisable)
       return;
-    Dump(__func__);
     if (Accumulator::kPath == m_type || Accumulator::kText == m_type) {
       AdjustClip(std::min(m_drawIndex, m_commands.size()));
       Accumulator::kPath == m_type ? FlushPath() : FlushText();
@@ -1371,213 +1232,6 @@
     AdjustClip(m_commandIndex);  // set up clip stack with any pending state
   }
 
-#if SHOW_SKIA_PATH
-  void DumpPrefix(int index) const {
-    if (index != m_commandIndex && index != m_drawIndex &&
-        index != m_clipIndex) {
-      printf("     ");
-      return;
-    }
-    printf("%c%c%c> ", index == m_commandIndex ? 'x' : '-',
-           index == m_drawIndex ? 'd' : '-', index == m_clipIndex ? 'c' : '-');
-  }
-
-  void DumpEndPrefix() const {
-    int index = m_commands.size();
-    if (index != m_commandIndex && index > m_drawIndex && index != m_clipIndex)
-      return;
-    printf("%c%c%c>\n", index == m_commandIndex ? 'x' : '-',
-           index <= m_drawIndex ? 'd' : '-', index == m_clipIndex ? 'c' : '-');
-  }
-#endif  // SHOW_SKIA_PATH
-
-  void Dump(const char* where) const {
-#if SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-    if (m_debugDisable)
-      return;
-    printf(
-        "\n%s\nSkia Save Count %d  Agg Save Stack/Count %d/%d"
-        "  Cache Save Index/Count %d/%d\n",
-        where, m_pDriver->SkiaCanvas()->getSaveCount(),
-        (int)m_pDriver->stack().size(), AggSaveCount(m_pDriver), m_commandIndex,
-        CacheSaveCount(m_commands, m_commandIndex));
-    printf("Cache:\n");
-#if SHOW_SKIA_PATH_SHORTHAND
-    bool dumpedPath = false;
-#endif
-    for (int index = 0; index < m_commands.size(); ++index) {
-#if SHOW_SKIA_PATH_SHORTHAND
-      if (Clip::kSave == m_commands[index] && dumpedPath) {
-        printf("\n");
-        dumpedPath = false;
-      }
-#endif
-      DumpPrefix(index);
-      switch (m_commands[index]) {
-        case Clip::kSave:
-          printf("Save %d\n", ++m_debugSaveCounter);
-          break;
-        case Clip::kPath:
-#if SHOW_SKIA_PATH_SHORTHAND
-          printf("*");
-          dumpedPath = true;
-#else
-          m_clips[index].dump();
-#endif
-          break;
-        default:
-          printf("unknown\n");
-      }
-    }
-#if SHOW_SKIA_PATH_SHORTHAND
-    if (dumpedPath)
-      printf("\n");
-#endif
-    DumpEndPrefix();
-    int skCanvasSaveCount = m_pDriver->SkiaCanvas()->getSaveCount();
-    int cacheSaveCount = 1;
-    DCHECK(m_clipIndex <= m_commands.size());
-    for (int index = 0; index < m_clipIndex; ++index)
-      cacheSaveCount += Clip::kSave == m_commands[index];
-    DCHECK_EQ(skCanvasSaveCount, cacheSaveCount);
-#endif  // SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-  }
-
-#if SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-  static int AggSaveCount(const UnownedPtr<CFX_SkiaDeviceDriver> driver) {
-    FX_RECT last;
-    int aggSaveCount = 0;
-    bool foundLast = false;
-    for (int index = 0; index < (int)driver->stack().size(); ++index) {
-      if (!driver->stack()[index]) {
-        continue;
-      }
-      if (driver->stack()[index]->GetType() != CFX_ClipRgn::kRectI) {
-        aggSaveCount += 1;
-        foundLast = false;
-        continue;
-      }
-      if (!foundLast ||
-          memcmp(&last, &driver->stack()[index]->GetBox(), sizeof(FX_RECT))) {
-        aggSaveCount += 1;
-        foundLast = true;
-        last = driver->stack()[index]->GetBox();
-      }
-    }
-    if (driver->clip_region()) {
-      CFX_ClipRgn::ClipType clipType = driver->clip_region()->GetType();
-      if (clipType != CFX_ClipRgn::kRectI || !foundLast ||
-          memcmp(&last, &driver->clip_region()->GetBox(), sizeof(FX_RECT))) {
-        aggSaveCount += 1;
-      }
-    }
-    return aggSaveCount;
-  }
-
-  static int CacheSaveCount(const SkTDArray<SkiaState::Clip>& commands,
-                            int commandIndex) {
-    int cacheSaveCount = 0;
-    bool newPath = false;
-    for (int index = 0; index < commandIndex; ++index) {
-      if (Clip::kSave == commands[index]) {
-        newPath = true;
-      } else if (newPath) {
-        ++cacheSaveCount;
-        newPath = false;
-      }
-    }
-    return cacheSaveCount;
-  }
-#endif  // SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-
-  void DebugCheckClip() {
-#if SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-    if (m_debugDisable)
-      return;
-    int aggSaveCount = AggSaveCount(m_pDriver);
-    int cacheSaveCount = CacheSaveCount(m_commands, m_commandIndex);
-    DCHECK(m_clipIndex <= m_commands.size());
-    if (aggSaveCount != cacheSaveCount) {
-      // may not signify a bug if counts don't match
-      printf("aggSaveCount %d != cacheSaveCount %d\n", aggSaveCount,
-             cacheSaveCount);
-      DumpClipStacks();
-    }
-    for (int aggIndex = 0; aggIndex < (int)m_pDriver->stack().size();
-         ++aggIndex) {
-      if (!m_pDriver->stack()[aggIndex])
-        continue;
-      if (m_pDriver->stack()[aggIndex]->GetType() != CFX_ClipRgn::kRectI)
-        continue;
-      const FX_RECT& aggRect = m_pDriver->stack()[aggIndex]->GetBox();
-      SkRect skRect = SkRect::MakeLTRB(aggRect.left, aggRect.top, aggRect.right,
-                                       aggRect.bottom);
-      bool foundMatch = false;
-      for (int skIndex = 0; skIndex < m_commandIndex; ++skIndex) {
-        if (Clip::kPath != m_commands[skIndex])
-          continue;
-        const SkPath& clip = m_clips[skIndex];
-        SkRect bounds;
-        if (!clip.isRect(&bounds))
-          continue;
-        bounds.roundOut(&bounds);
-        if (skRect == bounds) {
-          foundMatch = true;
-          break;
-        }
-      }
-      if (!foundMatch) {
-        DumpClipStacks();
-        NOTREACHED();
-      }
-    }
-#endif  // SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-  }
-
-#if SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-  void DumpClipStacks() const {
-    if (m_debugDisable)
-      return;
-    printf("\ncache\n");
-    for (int index = 0; index < m_commandIndex; ++index) {
-      DumpPrefix(index);
-      switch (m_commands[index]) {
-        case Clip::kSave:
-          printf("Save\n");
-          break;
-        case Clip::kPath:
-          m_clips[index].dump();
-          break;
-        default:
-          printf("unknown\n");
-      }
-    }
-    printf("\nagg\n");
-    for (int index = 0; index < (int)m_pDriver->stack().size(); ++index) {
-      if (!m_pDriver->stack()[index]) {
-        printf("null\n");
-        continue;
-      }
-      CFX_ClipRgn::ClipType clipType = m_pDriver->stack()[index]->GetType();
-      const FX_RECT& box = m_pDriver->stack()[index]->GetBox();
-      printf("stack rect: %d,%d,%d,%d mask=%s\n", box.left, box.top, box.right,
-             box.bottom,
-             CFX_ClipRgn::kMaskF == clipType
-                 ? "1"
-                 : CFX_ClipRgn::kRectI == clipType ? "0" : "?");
-    }
-    if (m_pDriver->clip_region()) {
-      const FX_RECT& box = m_pDriver->clip_region()->GetBox();
-      CFX_ClipRgn::ClipType clipType = m_pDriver->clip_region()->GetType();
-      printf("clip rect: %d,%d,%d,%d mask=%s\n", box.left, box.top, box.right,
-             box.bottom,
-             CFX_ClipRgn::kMaskF == clipType
-                 ? "1"
-                 : CFX_ClipRgn::kRectI == clipType ? "0" : "?");
-    }
-  }
-#endif  // SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_PATHS_)
-
  private:
   class CharDetail {
    public:
@@ -1646,17 +1300,8 @@
   bool m_groupKnockout = false;
   bool m_isSubstFontBold = false;
   bool m_debugDisable = false;  // turn off cache for debugging
-#if SHOW_SKIA_PATH
- public:
-  mutable int m_debugSaveCounter = 0;
-  static int m_debugInitCounter;
-#endif
 };
 
-#if SHOW_SKIA_PATH
-int SkiaState::m_debugInitCounter;
-#endif
-
 // convert a stroking path to scanlines
 void CFX_SkiaDeviceDriver::PaintStroke(SkPaint* spaint,
                                        const CFX_GraphStateData* pGraphState,
@@ -1731,9 +1376,6 @@
       m_pBackdropBitmap(pBackdropBitmap),
       m_pRecorder(nullptr),
       m_pCache(std::make_unique<SkiaState>(this)),
-#if defined(_SKIA_SUPPORT_PATHS_)
-      m_pClipRgn(nullptr),
-#endif
       m_bRgbByteOrder(bRgbByteOrder),
       m_bGroupKnockout(bGroupKnockout) {
   SkBitmap skBitmap;
@@ -1756,7 +1398,6 @@
   m_pCanvas = new SkCanvas(skBitmap);
 }
 
-#if defined(_SKIA_SUPPORT_)
 CFX_SkiaDeviceDriver::CFX_SkiaDeviceDriver(SkPictureRecorder* recorder)
     : m_pRecorder(recorder),
       m_pCache(std::make_unique<SkiaState>(this)),
@@ -1771,7 +1412,6 @@
   m_pBitmap = MakeDebugBitmap(width, height, kMagenta);
   m_pBackdropBitmap = MakeDebugBitmap(width, height, kGreen);
 }
-#endif  // defined(_SKIA_SUPPORT_)
 
 CFX_SkiaDeviceDriver::~CFX_SkiaDeviceDriver() {
   Flush();
@@ -1864,9 +1504,6 @@
   }
   if (oneAtATime)
     useRSXform = false;
-#if defined(_SKIA_SUPPORT_PATHS_)
-  m_pBitmap->PreMultiply();
-#endif
   if (useRSXform) {
     SkTDArray<SkRSXform> xforms;
     xforms.resize(nChars);
@@ -1947,7 +1584,6 @@
 
 int CFX_SkiaDeviceDriver::GetDeviceCaps(int caps_id) const {
   switch (caps_id) {
-#if defined(_SKIA_SUPPORT_)
     case FXDC_PIXEL_WIDTH:
       return m_pCanvas->imageInfo().width();
     case FXDC_PIXEL_HEIGHT:
@@ -1961,34 +1597,6 @@
       return FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
              FXRC_BLEND_MODE | FXRC_SOFT_CLIP | FXRC_ALPHA_OUTPUT |
              FXRC_FILLSTROKE_PATH | FXRC_SHADING;
-#endif  // defined(_SKIA_SUPPORT_)
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-    case FXDC_PIXEL_WIDTH:
-      return m_pBitmap->GetWidth();
-    case FXDC_PIXEL_HEIGHT:
-      return m_pBitmap->GetHeight();
-    case FXDC_BITS_PIXEL:
-      return m_pBitmap->GetBPP();
-    case FXDC_HORZ_SIZE:
-    case FXDC_VERT_SIZE:
-      return 0;
-    case FXDC_RENDER_CAPS: {
-      int flags = FXRC_GET_BITS | FXRC_ALPHA_PATH | FXRC_ALPHA_IMAGE |
-                  FXRC_BLEND_MODE | FXRC_SOFT_CLIP | FXRC_SHADING;
-      if (m_pBitmap->IsAlphaFormat()) {
-        flags |= FXRC_ALPHA_OUTPUT;
-      } else if (m_pBitmap->IsMaskFormat()) {
-        if (m_pBitmap->GetBPP() == 1) {
-          flags |= FXRC_BITMASK_OUTPUT;
-        } else {
-          flags |= FXRC_BYTEMASK_OUTPUT;
-        }
-      }
-      return flags;
-    }
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
-
     default:
       NOTREACHED();
       return 0;
@@ -1996,80 +1604,19 @@
 }
 
 void CFX_SkiaDeviceDriver::SaveState() {
-  m_pCache->DebugCheckClip();
   if (!m_pCache->ClipSave())
     m_pCanvas->save();
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-#if SHOW_SKIA_PATH
-  printf("SaveState %zd\n", stack().size());
-#endif
-  std::unique_ptr<CFX_ClipRgn> pClip;
-  if (m_pClipRgn)
-    pClip = std::make_unique<CFX_ClipRgn>(*m_pClipRgn);
-  m_StateStack.push_back(std::move(pClip));
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
 }
 
 void CFX_SkiaDeviceDriver::RestoreState(bool bKeepSaved) {
-#if defined(_SKIA_SUPPORT_PATHS_)
-  m_pClipRgn.reset();
-
-  if (m_StateStack.empty())
-    return;
-#else
   if (m_pCache->IsEmpty())
     return;
-#endif
   if (!m_pCache->ClipRestore())
     m_pCanvas->restore();
   if (bKeepSaved && !m_pCache->ClipSave())
     m_pCanvas->save();
-#if defined(_SKIA_SUPPORT_PATHS_)
-#if SHOW_SKIA_PATH
-  printf("RestoreState %zd %s\n", m_StateStack.size(),
-         bKeepSaved ? "bKeepSaved" : "");
-#endif
-  if (bKeepSaved) {
-    if (m_StateStack.back())
-      m_pClipRgn = std::make_unique<CFX_ClipRgn>(*m_StateStack.back());
-  } else {
-    m_pClipRgn = std::move(m_StateStack.back());
-    m_StateStack.pop_back();
-  }
-  m_pCache->DebugCheckClip();
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
 }
 
-#if defined(_SKIA_SUPPORT_PATHS_)
-void CFX_SkiaDeviceDriver::SetClipMask(const FX_RECT& clipBox,
-                                       const SkPath& path) {
-  FX_RECT path_rect(clipBox.left, clipBox.top, clipBox.right + 1,
-                    clipBox.bottom + 1);
-  path_rect.Intersect(m_pClipRgn->GetBox());
-  auto pThisLayer = pdfium::MakeRetain<CFX_DIBitmap>();
-  pThisLayer->Create(path_rect.Width(), path_rect.Height(),
-                     FXDIB_Format::k8bppMask);
-  pThisLayer->Clear(0);
-
-  SkImageInfo imageInfo =
-      SkImageInfo::Make(pThisLayer->GetWidth(), pThisLayer->GetHeight(),
-                        SkColorType::kAlpha_8_SkColorType, kOpaque_SkAlphaType);
-  SkBitmap bitmap;
-  bitmap.installPixels(imageInfo, pThisLayer->GetBuffer().data(),
-                       pThisLayer->GetPitch());
-  auto canvas = std::make_unique<SkCanvas>(bitmap);
-  canvas->translate(
-      -path_rect.left,
-      -path_rect.top);  // FIXME(caryclark) wrong sign(s)? upside down?
-  SkPaint paint;
-  paint.setAntiAlias(!m_FillOptions.aliased_path);
-  canvas->drawPath(path, paint);
-  m_pClipRgn->IntersectMaskF(path_rect.left, path_rect.top,
-                             std::move(pThisLayer));
-}
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
-
 bool CFX_SkiaDeviceDriver::SetClip_PathFill(
     const CFX_Path& path,              // path info
     const CFX_Matrix* pObject2Device,  // flips object's y-axis
@@ -2078,12 +1625,6 @@
   CFX_Matrix identity;
   const CFX_Matrix* deviceMatrix = pObject2Device ? pObject2Device : &identity;
   bool cached = m_pCache->SetClipFill(path, deviceMatrix, fill_options);
-#if defined(_SKIA_SUPPORT_PATHS_)
-  if (!m_pClipRgn) {
-    m_pClipRgn = std::make_unique<CFX_ClipRgn>(
-        GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
-  }
-#endif
   if (path.GetPoints().size() == 5 || path.GetPoints().size() == 4) {
     absl::optional<CFX_FloatRect> maybe_rectf = path.GetRect(deviceMatrix);
     if (maybe_rectf.has_value()) {
@@ -2099,10 +1640,6 @@
         m_pCanvas->clipRect(skClipRect, SkClipOp::kIntersect, true);
       }
 
-#if defined(_SKIA_SUPPORT_PATHS_)
-      FX_RECT rect = rectf.GetOuterRect();
-      m_pClipRgn->IntersectRect(rect);
-#endif
       DebugShowCanvasClip(this, m_pCanvas);
       return true;
     }
@@ -2116,11 +1653,6 @@
     DebugDrawSkiaClipPath(m_pCanvas, skClipPath);
     m_pCanvas->clipPath(skClipPath, SkClipOp::kIntersect, true);
   }
-#if defined(_SKIA_SUPPORT_PATHS_)
-  FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH),
-                  GetDeviceCaps(FXDC_PIXEL_HEIGHT));
-  SetClipMask(clipBox, skClipPath);
-#endif
   DebugShowCanvasClip(this, m_pCanvas);
   return true;
 }
@@ -2132,12 +1664,6 @@
 ) {
   bool cached = m_pCache->SetClipStroke(path, pObject2Device, pGraphState);
 
-#if defined(_SKIA_SUPPORT_PATHS_)
-  if (!m_pClipRgn) {
-    m_pClipRgn = std::make_unique<CFX_ClipRgn>(
-        GetDeviceCaps(FXDC_PIXEL_WIDTH), GetDeviceCaps(FXDC_PIXEL_HEIGHT));
-  }
-#endif
   // build path data
   SkPath skPath = BuildPath(path);
   SkMatrix skMatrix = ToSkMatrix(*pObject2Device);
@@ -2150,11 +1676,6 @@
     DebugDrawSkiaClipPath(m_pCanvas, dst_path);
     m_pCanvas->clipPath(dst_path, SkClipOp::kIntersect, true);
   }
-#if defined(_SKIA_SUPPORT_PATHS_)
-  FX_RECT clipBox(0, 0, GetDeviceCaps(FXDC_PIXEL_WIDTH),
-                  GetDeviceCaps(FXDC_PIXEL_HEIGHT));
-  SetClipMask(clipBox, dst_path);
-#endif
   DebugShowCanvasClip(this, m_pCanvas);
   return true;
 }
@@ -2209,18 +1730,12 @@
     }
     skPaint.setStyle(SkPaint::kFill_Style);
     skPaint.setColor(fill_color);
-#if defined(_SKIA_SUPPORT_PATHS_)
-    m_pBitmap->PreMultiply();
-#endif
     DebugShowSkiaDrawPath(this, m_pCanvas, skPaint, *fillPath);
     m_pCanvas->drawPath(*fillPath, skPaint);
   }
   if (is_paint_stroke && do_stroke) {
     skPaint.setStyle(SkPaint::kStroke_Style);
     skPaint.setColor(stroke_color);
-#if defined(_SKIA_SUPPORT_PATHS_)
-    m_pBitmap->PreMultiply();
-#endif
     if (!skPath.isLastContourClosed() && IsPathAPoint(skPath)) {
       DCHECK_GE(skPath.countPoints(), 1);
       m_pCanvas->drawPoint(skPath.getPoint(0), skPaint);
@@ -2446,22 +1961,12 @@
 }
 
 bool CFX_SkiaDeviceDriver::GetClipBox(FX_RECT* pRect) {
-#if defined(_SKIA_SUPPORT_PATHS_)
-  if (!m_pClipRgn) {
-    pRect->left = pRect->top = 0;
-    pRect->right = GetDeviceCaps(FXDC_PIXEL_WIDTH);
-    pRect->bottom = GetDeviceCaps(FXDC_PIXEL_HEIGHT);
-    return true;
-  }
-  *pRect = m_pClipRgn->GetBox();
-#else
   // TODO(caryclark) call m_canvas->getClipDeviceBounds() instead
   pRect->left = 0;
   pRect->top = 0;
   const SkImageInfo& canvasSize = m_pCanvas->imageInfo();
   pRect->right = canvasSize.width();
   pRect->bottom = canvasSize.height();
-#endif
   return true;
 }
 
@@ -2473,7 +1978,6 @@
   uint8_t* srcBuffer = m_pBitmap->GetBuffer().data();
   if (!srcBuffer)
     return true;
-#if defined(_SKIA_SUPPORT_)
   m_pCache->FlushForDraw();
   int srcWidth = m_pBitmap->GetWidth();
   int srcHeight = m_pBitmap->GetHeight();
@@ -2497,39 +2001,6 @@
                        SkRect::MakeXYWH(left, top, dstWidth, dstHeight),
                        SkSamplingOptions(), /*paint=*/nullptr);
   return true;
-#endif  // defined(_SKIA_SUPPORT_)
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-  Flush();
-  m_pBitmap->UnPreMultiply();
-  FX_RECT rect(left, top, left + pBitmap->GetWidth(),
-               top + pBitmap->GetHeight());
-  RetainPtr<CFX_DIBitmap> pBack;
-  if (m_pBackdropBitmap) {
-    pBack = m_pBackdropBitmap->ClipTo(rect);
-    if (!pBack)
-      return true;
-
-    pBack->CompositeBitmap(0, 0, pBack->GetWidth(), pBack->GetHeight(),
-                           m_pBitmap, 0, 0, BlendMode::kNormal, nullptr, false);
-  } else {
-    pBack = m_pBitmap->ClipTo(rect);
-    if (!pBack)
-      return true;
-  }
-
-  bool bRet = true;
-  left = std::min(left, 0);
-  top = std::min(top, 0);
-  if (m_bRgbByteOrder) {
-    RgbByteOrderTransferBitmap(pBitmap, rect.Width(), rect.Height(), pBack,
-                               left, top);
-  } else {
-    bRet = pBitmap->TransferBitmap(0, 0, rect.Width(), rect.Height(), pBack,
-                                   left, top);
-  }
-  return bRet;
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
 }
 
 RetainPtr<CFX_DIBitmap> CFX_SkiaDeviceDriver::GetBackDrop() {
@@ -2545,7 +2016,6 @@
   if (!m_pBitmap || m_pBitmap->GetBuffer().empty())
     return true;
 
-#if defined(_SKIA_SUPPORT_)
   CFX_Matrix m = CFX_RenderDevice::GetFlipMatrix(
       pBitmap->GetWidth(), pBitmap->GetHeight(), left, top);
 
@@ -2554,20 +2024,6 @@
   sampling_options.bNoSmoothing = true;
 
   return StartDIBitsSkia(pBitmap, 0xFF, argb, m, sampling_options, blend_type);
-#endif
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-  Flush();
-  if (pBitmap->IsMaskFormat()) {
-    return m_pBitmap->CompositeMask(left, top, src_rect.Width(),
-                                    src_rect.Height(), pBitmap, argb,
-                                    src_rect.left, src_rect.top, blend_type,
-                                    m_pClipRgn.get(), m_bRgbByteOrder);
-  }
-  return m_pBitmap->CompositeBitmap(
-      left, top, src_rect.Width(), src_rect.Height(), pBitmap, src_rect.left,
-      src_rect.top, blend_type, m_pClipRgn.get(), m_bRgbByteOrder);
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
 }
 
 bool CFX_SkiaDeviceDriver::StretchDIBits(const RetainPtr<CFX_DIBBase>& pSource,
@@ -2579,7 +2035,6 @@
                                          const FX_RECT* pClipRect,
                                          const FXDIB_ResampleOptions& options,
                                          BlendMode blend_type) {
-#if defined(_SKIA_SUPPORT_)
   m_pCache->FlushForDraw();
   if (m_pBitmap->GetBuffer().empty())
     return true;
@@ -2596,30 +2051,6 @@
   sampling_options.bNoSmoothing = true;
 
   return StartDIBitsSkia(pSource, 0xFF, argb, m, sampling_options, blend_type);
-#endif  // defined(_SKIA_SUPPORT_)
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-  if (dest_width == pSource->GetWidth() &&
-      dest_height == pSource->GetHeight()) {
-    FX_RECT rect(0, 0, dest_width, dest_height);
-    return SetDIBits(pSource, argb, rect, dest_left, dest_top, blend_type);
-  }
-  Flush();
-  FX_RECT dest_rect(dest_left, dest_top, dest_left + dest_width,
-                    dest_top + dest_height);
-  dest_rect.Normalize();
-  FX_RECT dest_clip = dest_rect;
-  dest_clip.Intersect(*pClipRect);
-  CFX_BitmapComposer composer;
-  composer.Compose(m_pBitmap, m_pClipRgn.get(), 255, argb, dest_clip, false,
-                   false, false, m_bRgbByteOrder, blend_type);
-  dest_clip.Offset(-dest_rect.left, -dest_rect.top);
-  CFX_ImageStretcher stretcher(&composer, pSource, dest_width, dest_height,
-                               dest_clip, options);
-  if (stretcher.Start())
-    stretcher.Continue(nullptr);
-  return true;
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
 }
 
 bool CFX_SkiaDeviceDriver::StartDIBits(
@@ -2630,45 +2061,20 @@
     const FXDIB_ResampleOptions& options,
     std::unique_ptr<CFX_ImageRenderer>* handle,
     BlendMode blend_type) {
-#if defined(_SKIA_SUPPORT_)
   return StartDIBitsSkia(pSource, bitmap_alpha, argb, matrix, options,
                          blend_type);
-#endif  // defined(_SKIA_SUPPORT_)
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-  Flush();
-  if (m_pBitmap->GetBuffer().empty())
-    return true;
-
-  *handle = std::make_unique<CFX_ImageRenderer>(
-      m_pBitmap, m_pClipRgn.get(), pSource, bitmap_alpha, argb, matrix, options,
-      m_bRgbByteOrder);
-  return true;
-#endif  // defined(_SKIA_SUPPORT_PATHS_)
 }
 
 bool CFX_SkiaDeviceDriver::ContinueDIBits(CFX_ImageRenderer* handle,
                                           PauseIndicatorIface* pPause) {
-#if defined(_SKIA_SUPPORT_)
   m_pCache->FlushForDraw();
   return false;
-#endif
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-  Flush();
-  if (m_pBitmap->GetBuffer().empty()) {
-    return true;
-  }
-  return handle->Continue(pPause);
-#endif
 }
 
-#if defined(_SKIA_SUPPORT_)
 void CFX_SkiaDeviceDriver::PreMultiply(
     const RetainPtr<CFX_DIBitmap>& pDIBitmap) {
   pDIBitmap->PreMultiply();
 }
-#endif
 
 void CFX_DIBitmap::PreMultiply() {
   if (this->GetBPP() != 32)
@@ -2723,7 +2129,6 @@
   premultiplied.readPixels(unpremultiplied);
 }
 
-#if defined(_SKIA_SUPPORT_)
 bool CFX_SkiaDeviceDriver::DrawBitsWithMask(
     const RetainPtr<CFX_DIBBase>& pSource,
     const RetainPtr<CFX_DIBBase>& pMask,
@@ -2801,16 +2206,7 @@
 void CFX_SkiaDeviceDriver::Clear(uint32_t color) {
   m_pCanvas->clear(color);
 }
-#endif  // defined(_SKIA_SUPPORT_)
 
-void CFX_SkiaDeviceDriver::Dump() const {
-#if SHOW_SKIA_PATH && defined(_SKIA_SUPPORT_)
-  if (m_pCache)
-    m_pCache->Dump(__func__);
-#endif
-}
-
-#if defined(_SKIA_SUPPORT_)
 void CFX_SkiaDeviceDriver::DebugVerifyBitmapIsPreMultiplied() const {
   if (m_pBackdropBitmap)
     m_pBackdropBitmap->DebugVerifyBitmapIsPreMultiplied();
@@ -2888,9 +2284,7 @@
   DebugValidate(m_pBitmap, m_pBackdropBitmap);
   return true;
 }
-#endif
 
-#if defined(_SKIA_SUPPORT_)
 void CFX_DefaultRenderDevice::Clear(uint32_t color) {
   CFX_SkiaDeviceDriver* skDriver =
       static_cast<CFX_SkiaDeviceDriver*>(GetDeviceDriver());
@@ -2905,7 +2299,6 @@
   SetDeviceDriver(std::make_unique<CFX_SkiaDeviceDriver>(recorder.get()));
   return recorder;
 }
-#endif  // defined(_SKIA_SUPPORT_)
 
 bool CFX_DefaultRenderDevice::AttachSkiaImpl(
     RetainPtr<CFX_DIBitmap> pBitmap,
@@ -2921,14 +2314,12 @@
   return true;
 }
 
-#if defined(_SKIA_SUPPORT_)
 bool CFX_DefaultRenderDevice::AttachRecorder(SkPictureRecorder* recorder) {
   if (!recorder)
     return false;
   SetDeviceDriver(std::make_unique<CFX_SkiaDeviceDriver>(recorder));
   return true;
 }
-#endif
 
 bool CFX_DefaultRenderDevice::CreateSkia(
     int width,
@@ -2945,7 +2336,6 @@
   return true;
 }
 
-#if defined(_SKIA_SUPPORT_)
 void CFX_DefaultRenderDevice::DebugVerifyBitmapIsPreMultiplied() const {
 #ifdef SK_DEBUG
   CFX_SkiaDeviceDriver* skDriver =
@@ -2972,7 +2362,6 @@
   }
   return false;
 }
-#endif  // defined(_SKIA_SUPPORT_)
 
 void CFX_DIBBase::DebugVerifyBufferIsPreMultiplied(void* arg) const {
 #ifdef SK_DEBUG
diff --git a/core/fxge/skia/fx_skia_device.h b/core/fxge/skia/fx_skia_device.h
index 3a8fca6..8ddee6c 100644
--- a/core/fxge/skia/fx_skia_device.h
+++ b/core/fxge/skia/fx_skia_device.h
@@ -5,21 +5,16 @@
 #ifndef CORE_FXGE_SKIA_FX_SKIA_DEVICE_H_
 #define CORE_FXGE_SKIA_FX_SKIA_DEVICE_H_
 
-#if defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
-
 #include <memory>
-#include <vector>
 
 #include "core/fxcrt/retain_ptr.h"
 #include "core/fxge/cfx_fillrenderoptions.h"
 #include "core/fxge/cfx_path.h"
 #include "core/fxge/renderdevicedriver_iface.h"
 
-class CFX_ClipRgn;
 class SkCanvas;
 class SkMatrix;
 class SkPaint;
-class SkPath;
 class SkPictureRecorder;
 class SkiaState;
 class TextCharPos;
@@ -30,9 +25,7 @@
                        bool bRgbByteOrder,
                        RetainPtr<CFX_DIBitmap> pBackdropBitmap,
                        bool bGroupKnockout);
-#if defined(_SKIA_SUPPORT_)
   explicit CFX_SkiaDeviceDriver(SkPictureRecorder* recorder);
-#endif
   ~CFX_SkiaDeviceDriver() override;
 
   /** Options */
@@ -92,7 +85,6 @@
                  int dest_left,
                  int dest_top,
                  BlendMode blend_type) override;
-#if defined(_SKIA_SUPPORT_)
   bool SetBitsWithMask(const RetainPtr<CFX_DIBBase>& pBitmap,
                        const RetainPtr<CFX_DIBBase>& pMask,
                        int dest_left,
@@ -100,11 +92,6 @@
                        int bitmap_alpha,
                        BlendMode blend_type) override;
   void SetGroupKnockout(bool group_knockout) override;
-#endif
-
-#if defined(_SKIA_SUPPORT_PATHS_)
-  void SetClipMask(const FX_RECT& clipBox, const SkPath& skClipPath);
-#endif
 
   bool StretchDIBits(const RetainPtr<CFX_DIBBase>& pBitmap,
                      uint32_t color,
@@ -163,36 +150,22 @@
 
   bool GetGroupKnockout() const { return m_bGroupKnockout; }
 
-#if defined(_SKIA_SUPPORT_PATHS_)
-  const CFX_ClipRgn* clip_region() const { return m_pClipRgn.get(); }
-  const std::vector<std::unique_ptr<CFX_ClipRgn>>& stack() const {
-    return m_StateStack;
-  }
-#endif
-
  private:
-#if defined(_SKIA_SUPPORT_)
   bool StartDIBitsSkia(const RetainPtr<CFX_DIBBase>& pBitmap,
                        int bitmap_alpha,
                        uint32_t color,
                        const CFX_Matrix& matrix,
                        const FXDIB_ResampleOptions& options,
                        BlendMode blend_type);
-#endif
 
   RetainPtr<CFX_DIBitmap> m_pBitmap;
   RetainPtr<CFX_DIBitmap> m_pBackdropBitmap;
   SkCanvas* m_pCanvas;
   SkPictureRecorder* const m_pRecorder;
   std::unique_ptr<SkiaState> m_pCache;
-#if defined(_SKIA_SUPPORT_PATHS_)
-  std::unique_ptr<CFX_ClipRgn> m_pClipRgn;
-  std::vector<std::unique_ptr<CFX_ClipRgn>> m_StateStack;
-#endif
   CFX_FillRenderOptions m_FillOptions;
   bool m_bRgbByteOrder;
   bool m_bGroupKnockout;
 };
-#endif  // defined(_SKIA_SUPPORT_) || defined(_SKIA_SUPPORT_PATHS_)
 
 #endif  // CORE_FXGE_SKIA_FX_SKIA_DEVICE_H_
diff --git a/core/fxge/skia/fx_skia_device_embeddertest.cpp b/core/fxge/skia/fx_skia_device_embeddertest.cpp
index d6022db..b84f222 100644
--- a/core/fxge/skia/fx_skia_device_embeddertest.cpp
+++ b/core/fxge/skia/fx_skia_device_embeddertest.cpp
@@ -166,7 +166,6 @@
                         State::Graphic::kPath, 0xFF112233});
 }
 
-#if defined(_SKIA_SUPPORT_)
 // TODO(crbug.com/pdfium/11): Fix this test and enable.
 TEST(fxge, DISABLED_SkiaStateText) {
   if (!CFX_DefaultRenderDevice::SkiaIsDefaultRenderer())
@@ -178,7 +177,6 @@
   Harness(&CommonTest, {State::Change::kNo, State::Save::kYes,
                         State::Clip::kSame, State::Graphic::kText, 0xFF445566});
 }
-#endif
 
 TEST(fxge, SkiaStateOOSClip) {
   if (!CFX_DefaultRenderDevice::SkiaVariantIsDefaultRenderer())
