// Copyright 2016 The PDFium Authors
// 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_CFX_DEFAULTRENDERDEVICE_H_
#define CORE_FXGE_CFX_DEFAULTRENDERDEVICE_H_

#include <memory>

#include "core/fxcrt/retain_ptr.h"
#include "core/fxge/cfx_renderdevice.h"
#include "core/fxge/dib/fx_dib.h"

class SkCanvas;

class CFX_DefaultRenderDevice final : public CFX_RenderDevice {
 public:
  CFX_DefaultRenderDevice();
  ~CFX_DefaultRenderDevice() override;

  bool Attach(RetainPtr<CFX_DIBitmap> pBitmap);
  bool AttachWithRgbByteOrder(RetainPtr<CFX_DIBitmap> pBitmap,
                              bool bRgbByteOrder);
  bool AttachWithBackdropAndGroupKnockout(
      RetainPtr<CFX_DIBitmap> pBitmap,
      RetainPtr<CFX_DIBitmap> pBackdropBitmap,
      bool bGroupKnockout);
#if defined(PDF_USE_SKIA)
  bool AttachCanvas(SkCanvas* canvas);
#endif

  bool Create(int width, int height, FXDIB_Format format);
  bool CreateWithBackdrop(int width,
                          int height,
                          FXDIB_Format format,
                          RetainPtr<CFX_DIBitmap> backdrop);

  void Clear(uint32_t color);

  // Runtime check to see if Skia is the renderer variant in use.
  static bool UseSkiaRenderer();

#if defined(PDF_USE_SKIA)
  // This internal definition of renderer types must stay updated with respect
  // to the public definition of `FPDF_RENDERER_TYPE`, so that all public
  // definition values can be mapped to a value in
  // `CFX_DefaultRenderDevice::RendererType`.
  enum class RendererType {
    kAgg = 0,
    kSkia = 1,
  };

  // When Skia is enabled at compile time, this constant is assigned as the
  // default value UseSkiaRenderer() returns. SetRendererType() may override it.
  static constexpr RendererType kDefaultRenderer = RendererType::kSkia;

  static void SetRendererType(RendererType renderer_type);
#endif  // defined(PDF_USE_SKIA)

 private:
  bool AttachImpl(RetainPtr<CFX_DIBitmap> pBitmap,
                  bool bRgbByteOrder,
                  RetainPtr<CFX_DIBitmap> pBackdropBitmap,
                  bool bGroupKnockout);

  bool AttachAggImpl(RetainPtr<CFX_DIBitmap> pBitmap,
                     bool bRgbByteOrder,
                     RetainPtr<CFX_DIBitmap> pBackdropBitmap,
                     bool bGroupKnockout);

  bool CreateAgg(int width,
                 int height,
                 FXDIB_Format format,
                 RetainPtr<CFX_DIBitmap> pBackdropBitmap);

#if defined(PDF_USE_SKIA)
  bool AttachSkiaImpl(RetainPtr<CFX_DIBitmap> pBitmap,
                      bool bRgbByteOrder,
                      RetainPtr<CFX_DIBitmap> pBackdropBitmap,
                      bool bGroupKnockout);

  bool CreateSkia(int width,
                  int height,
                  FXDIB_Format format,
                  RetainPtr<CFX_DIBitmap> pBackdropBitmap);
#endif
};

#endif  // CORE_FXGE_CFX_DEFAULTRENDERDEVICE_H_
