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

#ifndef XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
#define XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_

#include "core/fxcrt/include/fx_coordinates.h"
#include "core/fxcrt/include/fx_string.h"
#include "core/fxcrt/include/fx_system.h"
#include "core/fxge/include/fx_dib.h"
#include "xfa/fxbarcode/include/BC_Library.h"

class CBC_CodeBase;
class CFX_Font;
class CFX_RenderDevice;
class CFX_Matrix;

class CFX_Barcode {
 public:
  CFX_Barcode();
  ~CFX_Barcode();

  FX_BOOL Create(BC_TYPE type);
  BC_TYPE GetType();
  FX_BOOL Encode(const CFX_WideStringC& contents, FX_BOOL isDevice, int32_t& e);
  FX_BOOL RenderDevice(CFX_RenderDevice* device,
                       const CFX_Matrix* matrix,
                       int32_t& e);
  FX_BOOL RenderBitmap(CFX_DIBitmap*& pOutBitmap, int32_t& e);
  CFX_WideString Decode(uint8_t* buf,
                        int32_t width,
                        int32_t height,
                        int32_t& errorCode);
  CFX_WideString Decode(CFX_DIBitmap* pBitmap, int32_t& errorCode);
  FX_BOOL SetCharEncoding(BC_CHAR_ENCODING encoding);
  FX_BOOL SetModuleHeight(int32_t moduleHeight);
  FX_BOOL SetModuleWidth(int32_t moduleWidth);
  FX_BOOL SetHeight(int32_t height);
  FX_BOOL SetWidth(int32_t width);
  FX_BOOL CheckContentValidity(const CFX_WideStringC& contents);
  FX_BOOL SetPrintChecksum(FX_BOOL checksum);
  FX_BOOL SetDataLength(int32_t length);
  FX_BOOL SetCalChecksum(int32_t state);
  FX_BOOL SetFont(CFX_Font* pFont);
  FX_BOOL SetFontSize(FX_FLOAT size);
  FX_BOOL SetFontStyle(int32_t style);
  FX_BOOL SetFontColor(FX_ARGB color);
  FX_BOOL SetTextLocation(BC_TEXT_LOC location);
  FX_BOOL SetWideNarrowRatio(int32_t ratio);
  FX_BOOL SetStartChar(FX_CHAR start);
  FX_BOOL SetEndChar(FX_CHAR end);
  FX_BOOL SetVersion(int32_t version);
  FX_BOOL SetErrorCorrectionLevel(int32_t level);
  FX_BOOL SetTruncated(FX_BOOL truncated);

 protected:
  CBC_CodeBase* m_pBCEngine;
};

#endif  // XFA_FWL_BASEWIDGET_FXMATH_BARCODEIMP_H_
