// Copyright 2018 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

#include "core/fxcodec/bmp/cfx_bmpcontext.h"

#include <utility>

#include "core/fxcodec/cfx_codec_memory.h"
#include "core/fxcodec/fx_codec.h"
#include "core/fxcodec/fx_codec_def.h"
#include "core/fxcrt/check.h"

namespace fxcodec {

CFX_BmpContext::CFX_BmpContext(ProgressiveDecoderContextDelegate* pDelegate)
    : bmp_(this), delegate_(pDelegate) {}

CFX_BmpContext::~CFX_BmpContext() = default;

FX_FILESIZE CFX_BmpContext::GetAvailInput() const {
  return bmp_.GetAvailInput();
}

void CFX_BmpContext::Input(RetainPtr<CFX_CodecMemory> codec_memory) {
  bmp_.SetInputBuffer(std::move(codec_memory));
}

ProgressiveDecoderContext::Status CFX_BmpContext::DecodeImage() {
  return bmp_.DecodeImage();
}

ProgressiveDecoderContext::Status CFX_BmpContext::ReadHeader(
    int32_t* width,
    int32_t* height,
    int32_t* components,
    pdfium::span<const FX_ARGB>* palette,
    CFX_DIBAttribute* attribute) {
  DCHECK(attribute);

  ProgressiveDecoderContext::Status status = bmp_.ReadHeader();
  if (status != ProgressiveDecoderContext::Status::kSuccess) {
    return status;
  }

  *width = bmp_.width();
  *height = bmp_.height();
  *components = bmp_.components();
  *palette = bmp_.palette();
  attribute->dpi_unit_ = CFX_DIBAttribute::kResUnitMeter;
  attribute->x_dpi_ = bmp_.dpi_x();
  attribute->y_dpi_ = bmp_.dpi_y();
  return ProgressiveDecoderContext::Status::kSuccess;
}

}  // namespace fxcodec
