// 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 CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_
#define CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_

#include "core/fxcrt/retain_ptr.h"
#include "core/fxcrt/unowned_ptr.h"
#include "core/fxge/fx_dib.h"

class CPDF_Document;
class CFX_DIBSource;

class CPDF_TransferFunc : public Retainable {
 public:
  template <typename T, typename... Args>
  friend RetainPtr<T> pdfium::MakeRetain(Args&&... args);

  FX_COLORREF TranslateColor(FX_COLORREF src) const;
  RetainPtr<CFX_DIBSource> TranslateImage(const RetainPtr<CFX_DIBSource>& pSrc);

  const CPDF_Document* GetDocument() const { return m_pPDFDoc.Get(); }

  const uint8_t* GetSamples() const { return m_Samples; }
  uint8_t* GetSamples() { return m_Samples; }

  bool GetIdentity() const { return m_bIdentity; }
  void SetIdentity(bool identity) { m_bIdentity = identity; }

 private:
  explicit CPDF_TransferFunc(CPDF_Document* pDoc);
  ~CPDF_TransferFunc() override;

  UnownedPtr<CPDF_Document> const m_pPDFDoc;
  bool m_bIdentity;
  uint8_t m_Samples[256 * 3];
};

#endif  // CORE_FPDFAPI_RENDER_CPDF_TRANSFERFUNC_H_
