#pragma once
#include "resource.h"

extern "C" {
typedef struct {
	DWORD head;
	DWORD fsize;
	BYTE bpp;
	BYTE mask;
	short w;
	short h;
	DWORD buf_size;
}PBMP_FILEHEADER;
//{{2016/12/24追加:VQ圧縮テクスチャ形式(独自拡張)に対応しました。
typedef struct _VQTC_DATAHEADER {
	unsigned short	sig;	//+ 0, 2 シグネチャ	"QV"固定	PBMP_FILEHEADER.headの流儀に従って、リトルエンディアンで読み込んだ時に'VQ'となるように、文字列の並びとしては逆順にする事にした。
//{{2016/12/25変更:clipvqtc.cモジュールにて、符号の数の上限を256⇒65536に変更した事に伴い、当ツールも修正しました。
//	unsigned short	k_1;	//+ 2, 2 符号の数-1	0〜255
//↓2016/12/25変更:clipvqtc.cモジュールにて、符号の数の上限を256⇒65536に変更した事に伴い、当ツールも修正しました。
	unsigned short	k_1;	//+ 2, 2 符号の数-1	0〜65535
//}}2016/12/25変更:clipvqtc.cモジュールにて、符号の数の上限を256⇒65536に変更した事に伴い、当ツールも修正しました。
} VQTC_DATAHEADER;		//= 4
//}}2016/12/24追加:VQ圧縮テクスチャ形式(独自拡張)に対応しました。
void calcrc_init();
unsigned long calcrc(unsigned char* c, unsigned n);
unsigned int zlbencode(unsigned char* inptr, unsigned int size, unsigned char* code);
unsigned int zlbdecode(unsigned char* inptr, unsigned int size, unsigned char* data);
}

/****************************************************************************
 *	CPbmp
 ****************************************************************************/

class CPbmp : public CObject {
	DECLARE_DYNAMIC(CPbmp)
public:
	CPbmp(PBMP_FILEHEADER* bh, void* data);
	virtual ~CPbmp();
	CString str() const;
	int save(FILE* fp) const;
	PBMP_FILEHEADER m_bh;
//{{2016/12/24追加:VQ圧縮テクスチャ形式(独自拡張)に対応しました。
	VQTC_DATAHEADER m_dathdr;
//}}2016/12/24追加:VQ圧縮テクスチャ形式(独自拡張)に対応しました。
	BITMAPINFO* m_bmi;
	CBitmap m_bmp;
	unsigned char* m_bits;
};
typedef CTypedPtrList<CObList, CPbmp*> CPbmpList;

/****************************************************************************
 *	CViewWnd
 ****************************************************************************/

class CViewWnd : public CWnd {
public:
	CViewWnd(CWnd* parent);
	virtual ~CViewWnd();
	//{{AFX_VIRTUAL(CViewWnd)
	//}}AFX_VIRTUAL
	void show(CPbmp* pbmp);
	void hide();
protected:
	CPbmp* m_pbmp;
	//{{AFX_MSG(CViewWnd)
	afx_msg BOOL OnEraseBkgnd(CDC* pDC);
	afx_msg void OnPaint();
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/****************************************************************************
 *	CMyApp
 ****************************************************************************/

class CMyApp : public CWinApp {
public:
	CMyApp();

	//{{AFX_VIRTUAL(CMyApp)
	public:
	virtual BOOL InitInstance();
	//}}AFX_VIRTUAL

protected:
	//{{AFX_MSG(CMyApp)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/****************************************************************************
 *	CMyDlg
 ****************************************************************************/

class CMyDlg : public CDialog {
public:
	CMyDlg(CWnd* pParent = NULL);

	//{{AFX_DATA(CMyDlg)
	enum { IDD = IDD_MAINFRAME };
	CEdit m_filename;
	CListBox m_itemlist;
	CButton m_open;
	CButton m_save;
	CButton m_saveall;
	CButton m_cancel;
	//}}AFX_DATA
	//{{AFX_VIRTUAL(CMyDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);
	//}}AFX_VIRTUAL

protected:
	HICON m_hIcon;
	CViewWnd* m_viewwnd;
	CPbmpList m_pbmplist;

	int open_file(const char* path);
	void close_file();
	int save_file();
	int save_all();

	//{{AFX_MSG(CMyDlg)
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnOpen();
	afx_msg void OnSelchangeItemlist();
	afx_msg void OnDestroy();
	afx_msg void OnSave();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnSaveall();
	afx_msg void OnDropFiles(HDROP hDropInfo);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

