// 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 "barcode.h"
#include "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()
{
}
FX_BOOL CBC_Writer::SetCharEncoding(int32_t encoding)
{
    m_CharEncoding = encoding;
    return TRUE;
}
FX_BOOL CBC_Writer::SetModuleHeight(int32_t moduleHeight)
{
    if (moduleHeight > 10 || moduleHeight < 1) {
        return FALSE;
    }
    m_ModuleHeight = moduleHeight;
    return TRUE;
}
FX_BOOL CBC_Writer::SetModuleWidth(int32_t moduleWidth)
{
    if ( moduleWidth > 10 || moduleWidth < 1) {
        return FALSE;
    }
    m_ModuleWidth = moduleWidth;
    return TRUE;
}
FX_BOOL CBC_Writer::SetHeight(int32_t height)
{
    m_Height = height;
    return TRUE;
}
FX_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_DIBitmap* CBC_Writer::CreateDIBitmap(int32_t width, int32_t height)
{
    CFX_DIBitmap *pDIBitmap = NULL;
    pDIBitmap = FX_NEW CFX_DIBitmap;
    if(pDIBitmap != NULL) {
        pDIBitmap->Create(width, height, m_colorSpace);
    }
    return pDIBitmap;
}
