#include "stdafx.h"
#include "../ArcFile.h"
#include "../Image.h"
#include "Zlib.h"

BOOL CZlib::Decode(CArcFile* pclArc)
{
	SFileInfo* pInfFile = pclArc->GetOpenFileInfo();

	if (pInfFile->format != _T("zlib"))
		return FALSE;

	DecompressFile(pclArc);

	return TRUE;
}

void CZlib::DecompressFile(CArcFile* pclArc)
{
	SFileInfo* pInfFile = pclArc->GetOpenFileInfo();

	// バッファ確保
	YCMemory<BYTE> z_buf(pInfFile->sizeCmp);
	YCMemory<BYTE> buf(pInfFile->sizeOrg);

	// zlib展開
	pclArc->Read(&z_buf[0], pInfFile->sizeCmp);
	Decompress(&buf[0], &pInfFile->sizeOrg, &z_buf[0], pInfFile->sizeCmp);

	if (lstrcmp(PathFindExtension(pInfFile->name), _T(".bmp")) == 0) {
		CImage image;
		image.Init(pclArc, &buf[0]);
		image.Write(pInfFile->sizeOrg);
	}
	else {
		// 出力
		pclArc->OpenFile();
		pclArc->WriteFile(&buf[0], pInfFile->sizeOrg);
	}
}

// zlibをメモリ上に展開する関数
int CZlib::Decompress(BYTE* dst, DWORD* dstSize, const BYTE* src, DWORD srcSize)
{
	return uncompress(dst, dstSize, src, srcSize);

	/*
	z_stream z;

	z.zalloc = Z_NULL;
	z.zfree = Z_NULL;
	z.opaque = Z_NULL;

	// 初期化
	z.next_in = Z_NULL;
	z.avail_in = 0;
	if (inflateInit(&z) != Z_OK) {
		CError error;
		error.Message(NULL, _T("inflateInit: %s"), z.msg);
		return -1;
	}

	z.next_out = dst; // 出力ポインタ
	z.avail_out = dstSize; // 出力バッファ残量

	z.next_in = src; // 入力ポインタを元に戻す
	z.avail_in = srcSize; // データを読む

	// 展開
	inflate(&z, Z_NO_FLUSH);

	// 後始末
	if (inflateEnd(&z) != Z_OK) {
		CError error;
		error.Message(NULL, _T("inflateEnd: %s"), z.msg);
		return -1;
	}
*/
}

// zlibをメモリ上に展開する関数
int CZlib::Decompress(BYTE* dst, DWORD dstSize, const BYTE* src, DWORD srcSize)
{
	return uncompress(dst, &dstSize, src, srcSize);
}