#ifndef __BMOBJECT_H__
#define __BMOBJECT_H__

class CBmObjSequence;

// Get*Prop return type
enum GPT
    {
    invalid,    // Not a known property or disabled
    valid,      // Value is correct
    ambiguous   // Multiple selection with different values
    };

// Selection Object
class CFileBuffer;

class CBitmapObj : public CObject
    {
    DECLARE_DYNCREATE( CBitmapObj )

    public:

    CBitmapObj();

    ~CBitmapObj();

    void Clear();

    void InformDependants( UINT idChange );
    void AddDependant    ( CBitmapObj* newDependant );
    void RemoveDependant ( CBitmapObj* oldDependant );

    // Notification Callback
    void OnInform( CBitmapObj* pChangedSlob, UINT idChange );

    // Property Management
    BOOL SetIntProp (UINT idProp, int val);
    GPT  GetIntProp (UINT idProp, int& val);
    BOOL SetSizeProp(UINT nPropID, const CSize& val);

    BOOL MakeEmpty       ();
    BOOL Import          ( LPCTSTR szFileName );
    BOOL Export          ( LPCTSTR szFileName );

    // Specify the type of header to put on a resource
    typedef enum _PBResType
    {
        rtFile,
        rtDIB,
        rtPaintOLEObj,
        rtPBrushOLEObj,
    } PBResType;

    BOOL ReadResource    ( HGLOBAL hDib );
    BOOL ReadResource    ( CFile* pfile, PBResType rtType = rtFile );
    BOOL WriteResource   ( CFile* pfile, PBResType rtType = rtFile );

#ifdef PCX_SUPPORT
    BOOL ReadPCX         ( CFile* pfile );
    BOOL WritePCX        ( CFile* pfile );
    BOOL PackBuff        ( CFileBuffer *FileBuffer, BYTE *PtrDib, int byteWidth);
#endif


    BOOL CreateImg       ();
    BOOL SaveResource    ( BOOL bClear = TRUE );
    void ReLoadImage     ( CPBDoc* pbDoc );
    void UndoAction      ( CBmObjSequence* pSeq, UINT nActionID );
    void DeleteUndoAction( CBmObjSequence* pSeq, UINT nActionID );
    BOOL FinishUndo      ( const CRect* pRect );

    // Resource data access helpers...
    BOOL    Alloc(); // m_hThing of size m_lMemSize
    void    Free();                 // m_hThing and set m_lMemSize to zero
    void    Zap();  // frees memory and zeros out the file position
                    // information - used to completely empty a resobject

    CString GetDefExtension(int iStringId=0);

    BOOL SetupForIcon( HBITMAP& hBitmap, HBITMAP& hMaskBitmap );

    // Load m_hThing with the resource data from the res file
    inline  BOOL  IsDirty() const { return m_bDirty; }

    void SetDirty(BOOL bDirty = TRUE);

#ifdef  ICO_SUPPORT
    BOOL IsSaveIcon() { return(m_bSaveIcon); }
#endif

    struct IMG* m_pImg;

    // Properties...
    int  m_nWidth;
    int  m_nHeight;
    int  m_nColors;
    int  m_nSaveColors;
#ifdef ICO_SUPPORT
    BOOL m_bSaveIcon;
#endif

#ifdef PCX_SUPPORT
    BOOL m_bPCX;
#endif

    BOOL m_bCompressed;
    BOOL m_nShrink; // 0=crop, 1=shrink, 2=ask

    BOOL   m_bTempName;     // true if not save as m_strFileName yet
    BOOL   m_bDirty;        // true if changed

    HGLOBAL m_hThing;      // in memory resource (must be valid)
    DWORD   m_dwOffBits;     // offset of pixels in m_hThing; packed if 0
    LONG    m_lMemSize;      // size in bytes

    protected:

    CObList m_dependants;
    };

// Standard Slob Notifications
#define SN_DESTROY      0
#define SN_ALL          1

extern int mpncolorsbits[];

void PBGetDefDims(int& pnWidth, int& pnHeight);

#ifndef _WIN32
#define POINTS POINT
#endif

#endif // __BMOBJECT_H__
