/*
 * Copyright 2022 Rive
 */

#pragma once

#include "rive/renderer/render_context_helper_impl.hpp"
#include "rive/gpu_texture_format.hpp"

#ifdef RIVE_CANVAS
#include "rive/renderer/ore/ore_context.hpp"
#endif

class RenderContextNULL : public rive::gpu::RenderContextHelperImpl
{
public:
  static std::unique_ptr<rive::gpu::RenderContext> MakeContext();

  RenderContextNULL();

#ifdef RIVE_CANVAS
  std::unique_ptr<rive::ore::Context> makeOreContext() override
  {
    return nullptr;
  }

  // Backs an offscreen canvas with null-device pixels so replay actually
  // opens its frame instead of dropping the content. Without this a canvas
  // recorded against this context stays unbacked and its draws are
  // discarded, which would make an offscreen render look free.
  void ensureCanvasBacking(rive::gpu::RenderCanvas*) override;
#endif

  rive::rcp<rive::gpu::RenderTarget> makeRenderTarget(
      uint32_t width,
      uint32_t height);

private:
  rive::rcp<rive::RenderBuffer> makeRenderBuffer(
      rive::RenderBufferType,
      rive::RenderBufferFlags,
      size_t) override;

  rive::rcp<rive::gpu::Texture> makeImageTexture(
      uint32_t width,
      uint32_t height,
      uint32_t mipLevelCount,
      rive::GPUTextureFormat format,
      const uint8_t imageData[],
      uint8_t blockWidth = 1,
      uint8_t blockHeight = 1,
      bool srgb = false,
      bool generateRemainingMips = false) override;

  std::unique_ptr<rive::gpu::BufferRing> makeUniformBufferRing(
      size_t capacityInBytes) override;
  std::unique_ptr<rive::gpu::BufferRing> makeStorageBufferRing(
      size_t capacityInBytes,
      rive::gpu::StorageBufferStructure) override;
  std::unique_ptr<rive::gpu::BufferRing> makeVertexBufferRing(
      size_t capacityInBytes) override;

  void resizeGradientTexture(uint32_t width, uint32_t height) override {}
  void resizeTessellationTexture(uint32_t width, uint32_t height) override {}
  void resizeFeatherAtlasTexture(uint32_t width, uint32_t height) override {}
  void resizeCoverageBuffer(size_t) override {}

  void flush(const rive::gpu::FlushDescriptor&) override {}
};
