// Copyright 2017 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_FXGE_DIB_CFX_FILTEREDDIB_H_
#define CORE_FXGE_DIB_CFX_FILTEREDDIB_H_

#include <vector>

#include "core/fxcrt/cfx_retain_ptr.h"
#include "core/fxge/dib/cfx_dibsource.h"

class CFX_FilteredDIB : public CFX_DIBSource {
 public:
  template <typename T, typename... Args>
  friend CFX_RetainPtr<T> pdfium::MakeRetain(Args&&... args);

  ~CFX_FilteredDIB() override;

  virtual FXDIB_Format GetDestFormat() = 0;
  virtual uint32_t* GetDestPalette() = 0;
  virtual void TranslateScanline(const uint8_t* src_buf,
                                 std::vector<uint8_t>* dest_buf) const = 0;
  virtual void TranslateDownSamples(uint8_t* dest_buf,
                                    const uint8_t* src_buf,
                                    int pixels,
                                    int Bpp) const = 0;

  void LoadSrc(const CFX_RetainPtr<CFX_DIBSource>& pSrc);

 protected:
  CFX_FilteredDIB();

  // CFX_DIBSource
  const uint8_t* GetScanline(int line) const override;
  void DownSampleScanline(int line,
                          uint8_t* dest_scan,
                          int dest_bpp,
                          int dest_width,
                          bool bFlipX,
                          int clip_left,
                          int clip_width) const override;

  CFX_RetainPtr<CFX_DIBSource> m_pSrc;
  mutable std::vector<uint8_t> m_Scanline;
};

#endif  // CORE_FXGE_DIB_CFX_FILTEREDDIB_H_
