// 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 _JBIG2_IMAGE_H_
#define _JBIG2_IMAGE_H_
#include "JBig2_Define.h"
#include "JBig2_Module.h"
typedef enum {
    JBIG2_COMPOSE_OR		= 0,
    JBIG2_COMPOSE_AND		= 1,
    JBIG2_COMPOSE_XOR		= 2,
    JBIG2_COMPOSE_XNOR		= 3,
    JBIG2_COMPOSE_REPLACE	= 4
} JBig2ComposeOp;
struct FX_RECT;
class CJBig2_Image : public CJBig2_Object
{
public:

    CJBig2_Image(int32_t w, int32_t h);

    CJBig2_Image(int32_t w, int32_t h, int32_t stride, uint8_t*pBuf);

    CJBig2_Image(CJBig2_Image &im);

    ~CJBig2_Image();

    bool getPixel(int32_t x, int32_t y);

    int32_t setPixel(int32_t x, int32_t y, bool v);

    void copyLine(int32_t hTo, int32_t hFrom);

    void fill(bool v);

    bool composeTo(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op);
    bool composeTo(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op, const FX_RECT* pSrcRect);

    bool composeTo_unopt(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op);

    bool composeTo_opt(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op);

    bool composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op);
    bool composeTo_opt2(CJBig2_Image *pDst, int32_t x, int32_t y, JBig2ComposeOp op, const FX_RECT* pSrcRect);

    bool composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig2ComposeOp op);
    bool composeFrom(int32_t x, int32_t y, CJBig2_Image *pSrc, JBig2ComposeOp op, const FX_RECT* pSrcRect);
    CJBig2_Image *subImage_unopt(int32_t x, int32_t y, int32_t w, int32_t h);

    CJBig2_Image *subImage(int32_t x, int32_t y, int32_t w, int32_t h);

    void expand(int32_t h, bool v);
public:

    int32_t m_nWidth;

    int32_t m_nHeight;

    int32_t m_nStride;

    uint8_t *m_pData;

    bool m_bNeedFree;
};
#endif
