79 lines
2.2 KiB
C++
79 lines
2.2 KiB
C++
////////////////////////////////////////////////////////////////////
|
|
// ImageSCI.cpp
|
|
//
|
|
// Copyright 2007 cDc@seacave
|
|
// Distributed under the Boost Software License, Version 1.0
|
|
// (See http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#include "Common.h"
|
|
#include "ImageSCI.h"
|
|
|
|
using namespace SEACAVE;
|
|
|
|
|
|
// D E F I N E S ///////////////////////////////////////////////////
|
|
|
|
#define IMAGE_SCI_TYPE 0x494353 //"SCI" = 3 bytes
|
|
#define IMAGE_SCI_VERSION 1 //1 byte
|
|
#define IMAGE_SCI_HEADER ((DWORD)((((DWORD)IMAGE_SCI_VERSION)<<24)|(DWORD)IMAGE_SCI_TYPE)) //"SCI"+ver = 4 bytes
|
|
|
|
|
|
// S T R U C T S ///////////////////////////////////////////////////
|
|
|
|
typedef struct SCIINFOHEADER_TYPE {
|
|
uint32_t dwHeader;
|
|
uint16_t shWidth;
|
|
uint16_t shHeight;
|
|
uint8_t byFormat;
|
|
uint8_t byLevels;
|
|
uint8_t byReserved1;
|
|
uint8_t byReserved2;
|
|
} SCIINFOHEADER;
|
|
|
|
|
|
CImageSCI::CImageSCI()
|
|
{
|
|
} // Constructor
|
|
|
|
CImageSCI::~CImageSCI()
|
|
{
|
|
} // Destructor
|
|
/*----------------------------------------------------------------*/
|
|
|
|
|
|
HRESULT CImageSCI::ReadHeader()
|
|
{
|
|
// read header
|
|
((ISTREAM*)m_pStream)->setPos(0);
|
|
SCIINFOHEADER sciInfo;
|
|
m_pStream->read(&sciInfo, sizeof(SCIINFOHEADER));
|
|
if (sciInfo.dwHeader != IMAGE_SCI_HEADER) {
|
|
LOG(LT_IMAGE, "error: invalid SCI image");
|
|
return _INVALIDFILE;
|
|
}
|
|
m_width = sciInfo.shWidth;
|
|
m_height = sciInfo.shHeight;
|
|
m_numLevels = sciInfo.byLevels;
|
|
m_level = 0;
|
|
m_format = (PIXELFORMAT)sciInfo.byFormat;
|
|
m_stride = GetStride(m_format);
|
|
m_lineWidth = GetDataSizes(0, m_dataWidth, m_dataHeight);
|
|
return _OK;
|
|
} // ReadHeader
|
|
/*----------------------------------------------------------------*/
|
|
|
|
|
|
HRESULT CImageSCI::WriteHeader(PIXELFORMAT imageFormat, Size width, Size height, BYTE numLevels)
|
|
{
|
|
// write header
|
|
CImage::WriteHeader(imageFormat, width, height, numLevels);
|
|
((OSTREAM*)m_pStream)->setPos(0);
|
|
const SCIINFOHEADER sciInfo = {IMAGE_SCI_HEADER, (uint16_t)m_width, (uint16_t)m_height, (uint8_t)m_format, m_numLevels, 0, 0};
|
|
if (sizeof(SCIINFOHEADER) != m_pStream->write(&sciInfo, sizeof(SCIINFOHEADER))) {
|
|
LOG(LT_IMAGE, "error: failed writing the SCI image");
|
|
return _INVALIDFILE;
|
|
}
|
|
return _OK;
|
|
} // WriteHeader
|
|
/*----------------------------------------------------------------*/
|