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

#include "fxbarcode/BC_Writer.h"

CBC_Writer::CBC_Writer() {
  m_CharEncoding = 0;
  m_ModuleHeight = 1;
  m_ModuleWidth = 1;
  m_Height = 320;
  m_Width = 640;
  m_colorSpace = FXDIB_Argb;
  m_barColor = 0xff000000;
  m_backgroundColor = 0xffffffff;
}
CBC_Writer::~CBC_Writer() {}
bool CBC_Writer::SetCharEncoding(int32_t encoding) {
  m_CharEncoding = encoding;
  return true;
}
bool CBC_Writer::SetModuleHeight(int32_t moduleHeight) {
  if (moduleHeight > 10 || moduleHeight < 1) {
    return false;
  }
  m_ModuleHeight = moduleHeight;
  return true;
}
bool CBC_Writer::SetModuleWidth(int32_t moduleWidth) {
  if (moduleWidth > 10 || moduleWidth < 1) {
    return false;
  }
  m_ModuleWidth = moduleWidth;
  return true;
}
bool CBC_Writer::SetHeight(int32_t height) {
  m_Height = height;
  return true;
}
bool CBC_Writer::SetWidth(int32_t width) {
  m_Width = width;
  return true;
}
void CBC_Writer::SetBackgroundColor(FX_ARGB backgroundColor) {
  m_backgroundColor = backgroundColor;
}
void CBC_Writer::SetBarcodeColor(FX_ARGB foregroundColor) {
  m_barColor = foregroundColor;
}

CFX_RetainPtr<CFX_DIBitmap> CBC_Writer::CreateDIBitmap(int32_t width,
                                                       int32_t height) {
  auto pDIBitmap = pdfium::MakeRetain<CFX_DIBitmap>();
  pDIBitmap->Create(width, height, m_colorSpace);
  return pDIBitmap;
}
