Alien-FreeImage

 view release on metacpan or  search on metacpan

src/Source/FreeImage/PluginCUT.cpp  view on Meta::CPAN

#endif

// ==========================================================
// Plugin Interface
// ==========================================================

static int s_format_id;

// ==========================================================
// Plugin Implementation
// ==========================================================

static const char * DLL_CALLCONV
Format() {
	return "CUT";
}

static const char * DLL_CALLCONV
Description() {
	return "Dr. Halo";
}

static const char * DLL_CALLCONV
Extension() {
	return "cut";
}

static const char * DLL_CALLCONV
RegExpr() {
	return NULL;
}

static const char * DLL_CALLCONV
MimeType() {
	return "image/x-cut";
}

static BOOL DLL_CALLCONV
Validate(FreeImageIO *io, fi_handle handle) {
	return FALSE;
}

static BOOL DLL_CALLCONV
SupportsExportDepth(int depth) {
	return FALSE;
}

static BOOL DLL_CALLCONV 
SupportsExportType(FREE_IMAGE_TYPE type) {
	return FALSE;
}

static BOOL DLL_CALLCONV
SupportsNoPixels() {
	return TRUE;
}

// ----------------------------------------------------------

static FIBITMAP * DLL_CALLCONV
Load(FreeImageIO *io, fi_handle handle, int page, int flags, void *data) {
	FIBITMAP *dib = NULL;

	if(!handle) {
		return NULL;
	}

	try {
		CUTHEADER header;		

		BOOL header_only = (flags & FIF_LOAD_NOPIXELS) == FIF_LOAD_NOPIXELS;

		// read the cut header

		if(io->read_proc(&header, 1, sizeof(CUTHEADER), handle) != sizeof(CUTHEADER)) {
			throw FI_MSG_ERROR_PARSING;
		}

#ifdef FREEIMAGE_BIGENDIAN
		SwapShort((WORD *)&header.width);
		SwapShort((WORD *)&header.height);
#endif

		if ((header.width == 0) || (header.height == 0)) {
			return NULL;
		}

		// allocate a new bitmap

		dib = FreeImage_AllocateHeader(header_only, header.width, header.height, 8);

		if (dib == NULL) {
			throw FI_MSG_ERROR_DIB_MEMORY;
		}

		// stuff it with a palette

		RGBQUAD *palette = FreeImage_GetPalette(dib);

		for (int j = 0; j < 256; ++j) {
			palette[j].rgbBlue = palette[j].rgbGreen = palette[j].rgbRed = (BYTE)j;
		}
		
		if(header_only) {
			// header only mode
			return dib;
		}

		// unpack the RLE bitmap bits

		BYTE *bits = FreeImage_GetScanLine(dib, header.height - 1);

		unsigned i = 0, k = 0;
		unsigned pitch = FreeImage_GetPitch(dib);
		unsigned size = header.width * header.height;
		BYTE count = 0, run = 0;

		while (i < size) {
			if(io->read_proc(&count, 1, sizeof(BYTE), handle) != 1) {
				throw FI_MSG_ERROR_PARSING;
			}

			if (count == 0) {
				k = 0;
				bits -= pitch;

				// paint shop pro adds two useless bytes here...

				io->read_proc(&count, 1, sizeof(BYTE), handle);
				io->read_proc(&count, 1, sizeof(BYTE), handle);



( run in 0.949 second using v1.01-cache-2.11-cpan-63c85eba8c4 )