// Copyright 2022 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "core/fxge/cfx_defaultrenderdevice.h"

#include <utility>

#include "core/fxge/dib/cfx_dibitmap.h"

namespace {

// When build variant is Skia then it is assumed as the default, but might be
// overridden at runtime.
#if defined(_SKIA_SUPPORT_)
CFX_DefaultRenderDevice::RendererType g_default_renderer_type =
    CFX_DefaultRenderDevice::RendererType::kSkia;
#endif

}  // namespace

// static
bool CFX_DefaultRenderDevice::SkiaIsDefaultRenderer() {
#if defined(_SKIA_SUPPORT_)
  return g_default_renderer_type == RendererType::kSkia;
#else
  return false;
#endif
}

#if defined(_SKIA_SUPPORT_)
// static
void CFX_DefaultRenderDevice::SetDefaultRenderer(RendererType renderer_type) {
  g_default_renderer_type = renderer_type;
}
#endif

CFX_DefaultRenderDevice::CFX_DefaultRenderDevice() = default;

CFX_DefaultRenderDevice::~CFX_DefaultRenderDevice() = default;

bool CFX_DefaultRenderDevice::Attach(RetainPtr<CFX_DIBitmap> pBitmap) {
  return AttachWithRgbByteOrder(std::move(pBitmap), false);
}

bool CFX_DefaultRenderDevice::AttachWithRgbByteOrder(
    RetainPtr<CFX_DIBitmap> pBitmap,
    bool bRgbByteOrder) {
  return AttachImpl(std::move(pBitmap), bRgbByteOrder, nullptr, false);
}

bool CFX_DefaultRenderDevice::AttachWithBackdropAndGroupKnockout(
    RetainPtr<CFX_DIBitmap> pBitmap,
    RetainPtr<CFX_DIBitmap> pBackdropBitmap,
    bool bGroupKnockout) {
  return AttachImpl(std::move(pBitmap), false, std::move(pBackdropBitmap),
                    bGroupKnockout);
}

bool CFX_DefaultRenderDevice::CFX_DefaultRenderDevice::AttachImpl(
    RetainPtr<CFX_DIBitmap> pBitmap,
    bool bRgbByteOrder,
    RetainPtr<CFX_DIBitmap> pBackdropBitmap,
    bool bGroupKnockout) {
#ifdef _SKIA_SUPPORT_
  if (SkiaIsDefaultRenderer()) {
    return AttachSkiaImpl(std::move(pBitmap), bRgbByteOrder,
                          std::move(pBackdropBitmap), bGroupKnockout);
  }
#endif
  return AttachAggImpl(std::move(pBitmap), bRgbByteOrder,
                       std::move(pBackdropBitmap), bGroupKnockout);
}

bool CFX_DefaultRenderDevice::Create(int width,
                                     int height,
                                     FXDIB_Format format,
                                     RetainPtr<CFX_DIBitmap> pBackdropBitmap) {
#ifdef _SKIA_SUPPORT_
  if (SkiaIsDefaultRenderer())
    return CreateSkia(width, height, format, pBackdropBitmap);
#endif
  return CreateAgg(width, height, format, pBackdropBitmap);
}
