[rust png] Hoist `PngDecoder::Delegate` into a top-level class.

This CL moves the declaration of the abstract `PngDecoder::Delegate`
interface into a separate `png_decoder_delegate.h` header (renaming the
interface into `PngDecoderDelegate`).  This is desirable for follow-up
CLs, where the interface will be used from a future
`skia_png_decoder.cc` without having to reach for the current,
`libpng`-related `png_decoder.cc`.

Bug: 444045690
Change-Id: I546c8da2c8f6d90894cef9af8bd6df54c13d358f
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/135653
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fxcodec/png/png_decoder.cpp b/core/fxcodec/png/png_decoder.cpp
index 950e28a..60a70a2 100644
--- a/core/fxcodec/png/png_decoder.cpp
+++ b/core/fxcodec/png/png_decoder.cpp
@@ -12,6 +12,7 @@
 #include "core/fxcodec/cfx_codec_memory.h"
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcodec/fx_codec_def.h"
+#include "core/fxcodec/png/png_decoder_delegate.h"
 #include "core/fxcrt/compiler_specific.h"
 #include "core/fxcrt/notreached.h"
 #include "core/fxcrt/unowned_ptr.h"
@@ -24,17 +25,18 @@
 
 #define PNG_ERROR_SIZE 256
 
-using DecodedColorType = fxcodec::PngDecoder::Delegate::DecodedColorType;
-using EncodedColorType = fxcodec::PngDecoder::Delegate::EncodedColorType;
+using PngDecoderDelegate = fxcodec::PngDecoderDelegate;
+using DecodedColorType = PngDecoderDelegate::DecodedColorType;
+using EncodedColorType = PngDecoderDelegate::EncodedColorType;
 
 class CPngContext final : public ProgressiveDecoderIface::Context {
  public:
-  explicit CPngContext(PngDecoder::Delegate* pDelegate);
+  explicit CPngContext(PngDecoderDelegate* pDelegate);
   ~CPngContext() override;
 
   png_structp png_ = nullptr;
   png_infop info_ = nullptr;
-  UnownedPtr<PngDecoder::Delegate> const delegate_;
+  UnownedPtr<PngDecoderDelegate> const delegate_;
   char last_error_[PNG_ERROR_SIZE] = {};
 };
 
@@ -203,7 +205,7 @@
 
 }  // extern "C"
 
-CPngContext::CPngContext(PngDecoder::Delegate* pDelegate)
+CPngContext::CPngContext(PngDecoderDelegate* pDelegate)
     : delegate_(pDelegate) {}
 
 CPngContext::~CPngContext() {
@@ -215,7 +217,7 @@
 
 // static
 std::unique_ptr<ProgressiveDecoderIface::Context> PngDecoder::StartDecode(
-    Delegate* pDelegate) {
+    PngDecoderDelegate* pDelegate) {
   auto p = std::make_unique<CPngContext>(pDelegate);
   p->png_ =
       png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
diff --git a/core/fxcodec/png/png_decoder.h b/core/fxcodec/png/png_decoder.h
index d1f1cb6..635c05a 100644
--- a/core/fxcodec/png/png_decoder.h
+++ b/core/fxcodec/png/png_decoder.h
@@ -19,66 +19,12 @@
 namespace fxcodec {
 
 class CFX_DIBAttribute;
+class PngDecoderDelegate;
 
 class PngDecoder {
  public:
-  class Delegate {
-   public:
-    // Color type specified in the PNG IHDR chunk.  See also
-    // https://www.w3.org/TR/png-3/#6Colour-values and
-    // https://www.w3.org/TR/png-3/#11IHDR
-    //
-    // The enumerator values below have been picked to match 1) the PNG spec and
-    // 2) `PNG_COLOR_TYPE_...` constants from `libpng/png.h`.
-    enum class EncodedColorType : int {
-      kGrayscale = 0,
-      kTruecolor = 2,
-      kIndexedColor = 3,
-      kGrayscaleWithAlpha = 4,
-      kTruecolorWithAlpha = 6,
-    };
-
-    // Color format to decode into.
-    enum class DecodedColorType {
-      kBgr,
-      kBgra,
-    };
-
-    // Called by `PngDecoder` after decoding the image header:
-    //
-    // * `width` and `height` specify image dimensions in pixels
-    // * `bpc` is number of bits per component (e.g. per red, or per alpha)
-    // * `src_color_type` is the color type the image has been encoded with
-    //
-    // Implementation should:
-    //
-    // * Return `true` upon success (and `false` otherwise)
-    // * Set `*dst_color_type` to the color type to decode into
-    // * Set `*gamma` to the target gamma to decode with
-    // * TODO(crbug.com/355630556): Add out parameter for desired alpha-premul.
-    virtual bool PngReadHeader(int width,
-                               int height,
-                               int bpc,
-                               int pass,
-                               EncodedColorType src_color_type,
-                               DecodedColorType* dst_color_type,
-                               double* gamma) = 0;
-
-    // Called by `PngDecoder` to ask where to write decoded pixels.
-    // Implementation should return a pointer to the buffer where the
-    // decoded pixels should be written to.
-    //
-    // `PngDecoder` guarantees that `0 <= line && line < height`
-    // (`height` that was earlier passed to `PngReadHeader`).
-    virtual uint8_t* PngAskScanlineBuf(int line) = 0;
-
-    // Called by `PngDecoder` Communicates that `line`th row has been decoded
-    // enough to be displayed.
-    virtual void PngFillScanlineBufCompleted(int line) = 0;
-  };
-
   static std::unique_ptr<ProgressiveDecoderIface::Context> StartDecode(
-      Delegate* pDelegate);
+      PngDecoderDelegate* pDelegate);
 
   static bool ContinueDecode(ProgressiveDecoderIface::Context* pContext,
                              RetainPtr<CFX_CodecMemory> codec_memory,
diff --git a/core/fxcodec/png/png_decoder_delegate.h b/core/fxcodec/png/png_decoder_delegate.h
new file mode 100644
index 0000000..a28e18c
--- /dev/null
+++ b/core/fxcodec/png/png_decoder_delegate.h
@@ -0,0 +1,75 @@
+// Copyright 2025 The PDFium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CORE_FXCODEC_PNG_PNG_DECODER_DELEGATE_H_
+#define CORE_FXCODEC_PNG_PNG_DECODER_DELEGATE_H_
+
+#include <stdint.h>
+
+namespace fxcodec {
+
+// Abstract interface used by the `libpng`-based decoder from `png_decoder.h`
+// (in the future by Skia-based decoder from `skia_png_decoder.h`).
+//
+// TODO(https://crbug.com/444045690): Update the comment above once the
+// Skia-based decoder is implemented and/or the `libpng`-based decoder moved
+// to renamed .h/.cc files.
+class PngDecoderDelegate {
+ public:
+  // Color type specified in the PNG IHDR chunk.  See also
+  // https://www.w3.org/TR/png-3/#6Colour-values and
+  // https://www.w3.org/TR/png-3/#11IHDR
+  //
+  // The enumerator values below have been picked to match 1) the PNG spec and
+  // 2) `PNG_COLOR_TYPE_...` constants from `libpng/png.h`.
+  enum class EncodedColorType : int {
+    kGrayscale = 0,
+    kTruecolor = 2,
+    kIndexedColor = 3,
+    kGrayscaleWithAlpha = 4,
+    kTruecolorWithAlpha = 6,
+  };
+
+  // Color format to decode into.
+  enum class DecodedColorType {
+    kBgr,
+    kBgra,
+  };
+
+  // Called by `PngDecoder` after decoding the image header:
+  //
+  // * `width` and `height` specify image dimensions in pixels
+  // * `bpc` is number of bits per component (e.g. per red, or per alpha)
+  // * `src_color_type` is the color type the image has been encoded with
+  //
+  // Implementation should:
+  //
+  // * Return `true` upon success (and `false` otherwise)
+  // * Set `*dst_color_type` to the color type to decode into
+  // * Set `*gamma` to the target gamma to decode with
+  // * TODO(crbug.com/355630556): Add out parameter for desired alpha-premul.
+  virtual bool PngReadHeader(int width,
+                             int height,
+                             int bpc,
+                             int pass,
+                             EncodedColorType src_color_type,
+                             DecodedColorType* dst_color_type,
+                             double* gamma) = 0;
+
+  // Called by `PngDecoder` to ask where to write decoded pixels.
+  // Implementation should return a pointer to the buffer where the
+  // decoded pixels should be written to.
+  //
+  // `PngDecoder` guarantees that `0 <= line && line < height`
+  // (`height` that was earlier passed to `PngReadHeader`).
+  virtual uint8_t* PngAskScanlineBuf(int line) = 0;
+
+  // Called by `PngDecoder` Communicates that `line`th row has been decoded
+  // enough to be displayed.
+  virtual void PngFillScanlineBufCompleted(int line) = 0;
+};
+
+}  // namespace fxcodec
+
+#endif  // CORE_FXCODEC_PNG_PNG_DECODER_DELEGATE_H_
diff --git a/core/fxcodec/progressive_decoder.cpp b/core/fxcodec/progressive_decoder.cpp
index 4fa0e8e..d38aa72 100644
--- a/core/fxcodec/progressive_decoder.cpp
+++ b/core/fxcodec/progressive_decoder.cpp
@@ -48,8 +48,8 @@
 constexpr size_t kBlockSize = 4096;
 
 #ifdef PDF_ENABLE_XFA_PNG
-using PngDecodedColorType = fxcodec::PngDecoder::Delegate::DecodedColorType;
-using PngEncodedColorType = fxcodec::PngDecoder::Delegate::EncodedColorType;
+using PngDecodedColorType = fxcodec::PngDecoderDelegate::DecodedColorType;
+using PngEncodedColorType = fxcodec::PngDecoderDelegate::EncodedColorType;
 #if BUILDFLAG(IS_APPLE)
 const double kPngGamma = 1.7;
 #else
diff --git a/core/fxcodec/progressive_decoder.h b/core/fxcodec/progressive_decoder.h
index 3589dfb..c96138c 100644
--- a/core/fxcodec/progressive_decoder.h
+++ b/core/fxcodec/progressive_decoder.h
@@ -33,6 +33,7 @@
 
 #ifdef PDF_ENABLE_XFA_PNG
 #include "core/fxcodec/png/png_decoder.h"
+#include "core/fxcodec/png/png_decoder_delegate.h"
 #endif  // PDF_ENABLE_XFA_PNG
 
 class CFX_DIBitmap;
@@ -52,7 +53,7 @@
     public GifDecoder::Delegate,
 #endif  // PDF_ENABLE_XFA_GIF
 #ifdef PDF_ENABLE_XFA_PNG
-    public PngDecoder::Delegate,
+    public PngDecoderDelegate,
 #endif  // PDF_ENABLE_XFA_PNG
     public Dummy {
  public:
@@ -85,13 +86,13 @@
   FXCODEC_STATUS ContinueDecode();
 
 #ifdef PDF_ENABLE_XFA_PNG
-  // PngDecoder::Delegate
+  // PngDecoderDelegate
   bool PngReadHeader(int width,
                      int height,
                      int bpc,
                      int pass,
-                     PngDecoder::Delegate::EncodedColorType src_color_type,
-                     PngDecoder::Delegate::DecodedColorType* dst_color_type,
+                     PngDecoderDelegate::EncodedColorType src_color_type,
+                     PngDecoderDelegate::DecodedColorType* dst_color_type,
                      double* gamma) override;
   uint8_t* PngAskScanlineBuf(int line) override;
   void PngFillScanlineBufCompleted(int line) override;