Blame src/gdpp.cxx

Packit Service df60bb
/* *****************************************************************************
Packit Service df60bb
** $Id$
Packit Service df60bb
** Initial file written and documented by:
Packit Service df60bb
** Kevin Shepherd <kshepherd@php.net> December 2007
Packit Service df60bb
** of Scarlet Line http://www.scarletline.com/
Packit Service df60bb
*******************************************************************************/
Packit Service df60bb
/** \file gdpp.cxx
Packit Service df60bb
	\brief Implements the non-trivial methods of GD::Image.
Packit Service df60bb
	
Packit Service df60bb
	Implementation of the more complex methods defined
Packit Service df60bb
	in gdpp.h.
Packit Service df60bb
	Notably includes the methods which determine the image file
Packit Service df60bb
	format of a file before reading it into memory.
Packit Service df60bb
*/
Packit Service df60bb
#ifdef __cplusplus
Packit Service df60bb
#include "gdpp.h"
Packit Service df60bb
Packit Service df60bb
namespace GD
Packit Service df60bb
	{
Packit Service df60bb
	/**
Packit Service df60bb
		Load an image from a file, after attempting to
Packit Service df60bb
		determine it's image file format. 
Packit Service df60bb
		Invoke CreateFrom with an already opened
Packit Service df60bb
		pointer to a file containing the desired image. 
Packit Service df60bb
		CreateFrom does not close the file.
Packit Service df60bb
		\param[in] in An opened FILE * pointer.
Packit Service df60bb
		\return true for success, or false if unable to load the image (most often because the 
Packit Service df60bb
		file is corrupt or does not contain a recognized image format). 
Packit Service df60bb
		You can call Width() and Height() member functions of the image to determine its size.
Packit Service df60bb
	*/
Packit Service df60bb
	bool Image::CreateFrom(FILE * in)
Packit Service df60bb
		{
Packit Service df60bb
		bool rtn;
Packit Service df60bb
		int c = fgetc(in);
Packit Service df60bb
		ungetc(c, in);
Packit Service df60bb
		switch (c)
Packit Service df60bb
			{
Packit Service df60bb
		/* PNG
Packit Service df60bb
		The first eight bytes of a PNG file always contain the following (decimal) values:
Packit Service df60bb
		   0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
Packit Service df60bb
		   == .PNG\r\n.\n
Packit Service df60bb
		*/
Packit Service df60bb
#ifdef HAVE_LIBPNG
Packit Service df60bb
		case 0x89: // PNG
Packit Service df60bb
			rtn = CreateFromPng(in);
Packit Service df60bb
			break;
Packit Service df60bb
#endif
Packit Service df60bb
		/* GIF
Packit Service df60bb
			0x47 0x49 0x46
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x47: // GIF
Packit Service df60bb
			rtn = CreateFromGif(in);
Packit Service df60bb
			break;
Packit Service df60bb
#ifdef HAVE_LIBJPEG
Packit Service df60bb
		/* JPEG
Packit Service df60bb
		A JFIF-standard file will start with the four bytes (hex) FF D8 FF E0,
Packit Service df60bb
		    followed by two variable bytes (often hex 00 10), followed by 'JFIF'.		
Packit Service df60bb
		*/
Packit Service df60bb
		case 0xFF: // JPEG
Packit Service df60bb
			rtn = CreateFromJpeg(in);
Packit Service df60bb
			break;
Packit Service df60bb
#endif
Packit Service df60bb
		/* WBMP
Packit Service df60bb
		WBMP Type 0: B/W, Uncompressed bitmap is the only gd supported type		
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x00: // WBMP
Packit Service df60bb
			rtn = CreateFromWBMP(in);
Packit Service df60bb
			break;
Packit Service df60bb
		/* GD2
Packit Service df60bb
			0x67 0x64 0x32 0x00 
Packit Service df60bb
			== GD2\0
Packit Service df60bb
		Starts with gd2 
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x67: // GD2
Packit Service df60bb
			rtn = CreateFromGd2(in);
Packit Service df60bb
			break;
Packit Service df60bb
		/* GD
Packit Service df60bb
			0xFF 0xFE
Packit Service df60bb
			or 
Packit Service df60bb
			0xFF 0xFF 
Packit Service df60bb
			Conflicts with Jpeg
Packit Service df60bb
		*/
Packit Service df60bb
		/* XBM
Packit Service df60bb
			#define test_width 16
Packit Service df60bb
			#define test_height 7
Packit Service df60bb
		*/	
Packit Service df60bb
		case 0x23: // XBM
Packit Service df60bb
			rtn = CreateFromXbm(in);
Packit Service df60bb
			break;
Packit Service df60bb
		default:
Packit Service df60bb
			rtn = false;
Packit Service df60bb
			break;
Packit Service df60bb
			}
Packit Service df60bb
		return rtn; 
Packit Service df60bb
		}
Packit Service df60bb
Packit Service df60bb
	/**
Packit Service df60bb
		Load an image from a standard input stream, after attempting to
Packit Service df60bb
		determine it's image file format. 
Packit Service df60bb
		Invoke CreateFrom with an already opened stream
Packit Service df60bb
		containing the desired image. 
Packit Service df60bb
		CreateFrom does not close the stream.
Packit Service df60bb
		\param[in] in An opened standard library input stream.
Packit Service df60bb
		\return true for success, or false if unable to load the image (most often because the 
Packit Service df60bb
		file is corrupt or does not contain a recognized image format). 
Packit Service df60bb
		You can call Width() and Height() member functions of the image to determine its size.
Packit Service df60bb
		Example usage, convert anything to gif:
Packit Service df60bb
		#include <fstream>
Packit Service df60bb
		#include <gdpp.h>
Packit Service df60bb
Packit Service df60bb
		std::ifstream in("image.xxx", std::ios_base::in | std::ios_base::binary );
Packit Service df60bb
		GD::Image im;
Packit Service df60bb
		im.CreateFrom(in);
Packit Service df60bb
		if (im.good())
Packit Service df60bb
			{
Packit Service df60bb
			std::ofstream out("image.gif", std::ios_base::out | std::ios_base::binary );
Packit Service df60bb
			im.Gif(out);
Packit Service df60bb
			}
Packit Service df60bb
	*/
Packit Service df60bb
	bool Image::CreateFrom(std::istream & in)
Packit Service df60bb
		{
Packit Service df60bb
		bool rtn;
Packit Service df60bb
		switch (in.peek())
Packit Service df60bb
			{
Packit Service df60bb
#ifdef HAVE_LIBPNG
Packit Service df60bb
		/* PNG
Packit Service df60bb
		The first eight bytes of a PNG file always contain the following (decimal) values:
Packit Service df60bb
		   0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
Packit Service df60bb
		   == .PNG\r\n.\n
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x89: // PNG
Packit Service df60bb
			rtn = CreateFromPng(in);
Packit Service df60bb
			break;
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
		/* GIF
Packit Service df60bb
			0x47 0x49 0x46
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x47: // GIF
Packit Service df60bb
			rtn = CreateFromGif(in);
Packit Service df60bb
			break;
Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_LIBJPEG
Packit Service df60bb
		/* JPEG
Packit Service df60bb
		A JFIF-standard file will start with the four bytes (hex) FF D8 FF E0,
Packit Service df60bb
		    followed by two variable bytes (often hex 00 10), followed by 'JFIF'.		
Packit Service df60bb
		*/
Packit Service df60bb
		case 0xFF: // JPEG
Packit Service df60bb
			rtn = CreateFromJpeg(in);
Packit Service df60bb
			break;
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
		/* WBMP
Packit Service df60bb
		WBMP Type 0: B/W, Uncompressed bitmap is the only gd supported type		
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x00: // WBMP
Packit Service df60bb
			rtn = CreateFromWBMP(in);
Packit Service df60bb
			break;
Packit Service df60bb
		/* GD2
Packit Service df60bb
			0x67 0x64 0x32 0x00 
Packit Service df60bb
			== GD2\0
Packit Service df60bb
		Starts with gd2 
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x67: // GD2
Packit Service df60bb
			rtn = CreateFromGd2(in);
Packit Service df60bb
			break;
Packit Service df60bb
		/* GD
Packit Service df60bb
			0xFF 0xFE
Packit Service df60bb
			or 
Packit Service df60bb
			0xFF 0xFF 
Packit Service df60bb
			Conflicts with Jpeg
Packit Service df60bb
		*/
Packit Service df60bb
		default:
Packit Service df60bb
			rtn = false;
Packit Service df60bb
			break;
Packit Service df60bb
			}
Packit Service df60bb
		return rtn; 
Packit Service df60bb
		}
Packit Service df60bb
Packit Service df60bb
	/**
Packit Service df60bb
		Load an image from an in-RAM memory block, after attempting to
Packit Service df60bb
		determine it's image format. 
Packit Service df60bb
		CreateFrom does not de-allocate the memory.
Packit Service df60bb
		\param[in] size The byte count of the memory block.
Packit Service df60bb
		\param[in] data A pointer to the memory block.
Packit Service df60bb
		\return true for success, or false if unable to load the image (most often because the 
Packit Service df60bb
		formatting is corrupt or does not contain a recognized image format). 
Packit Service df60bb
		You can call Width() and Height() member functions of the image to determine its size.
Packit Service df60bb
	*/
Packit Service df60bb
	bool Image::CreateFrom(int size, void * data)
Packit Service df60bb
		{
Packit Service df60bb
		bool rtn;
Packit Service df60bb
		switch (((unsigned char * )data)[0])
Packit Service df60bb
			{
Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_LIBPNG
Packit Service df60bb
		/* PNG
Packit Service df60bb
		The first eight bytes of a PNG file always contain the following (decimal) values:
Packit Service df60bb
		   0x89 0x50 0x4E 0x47 0x0D 0x0A 0x1A 0x0A
Packit Service df60bb
		   == .PNG\r\n.\n
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x89: // PNG
Packit Service df60bb
			rtn = CreateFromPng(size, data);
Packit Service df60bb
			break;
Packit Service df60bb
#endif
Packit Service df60bb
		/* GIF
Packit Service df60bb
			0x47 0x49 0x46
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x47: // GIF
Packit Service df60bb
			rtn = CreateFromGif(size, data);
Packit Service df60bb
			break;
Packit Service df60bb
Packit Service df60bb
#ifdef HAVE_LIBJPEG
Packit Service df60bb
		/* JPEG
Packit Service df60bb
		A JFIF-standard file will start with the four bytes (hex) FF D8 FF E0,
Packit Service df60bb
		    followed by two variable bytes (often hex 00 10), followed by 'JFIF'.		
Packit Service df60bb
		*/
Packit Service df60bb
		case 0xFF: // JPEG
Packit Service df60bb
			rtn = CreateFromJpeg(size, data);
Packit Service df60bb
			break;
Packit Service df60bb
#endif
Packit Service df60bb
Packit Service df60bb
		/* WBMP
Packit Service df60bb
		WBMP Type 0: B/W, Uncompressed bitmap is the only gd supported type		
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x00: // WBMP
Packit Service df60bb
			rtn = CreateFromWBMP(size, data);
Packit Service df60bb
			break;
Packit Service df60bb
		/* GD2
Packit Service df60bb
			0x67 0x64 0x32 0x00 
Packit Service df60bb
			== GD2\0
Packit Service df60bb
		Starts with gd2 
Packit Service df60bb
		*/
Packit Service df60bb
		case 0x67: // GD2
Packit Service df60bb
			rtn = CreateFromGd2(size, data);
Packit Service df60bb
			break;
Packit Service df60bb
		/* GD
Packit Service df60bb
			0xFF 0xFE
Packit Service df60bb
			or 
Packit Service df60bb
			0xFF 0xFF 
Packit Service df60bb
			Conflicts with Jpeg
Packit Service df60bb
		*/
Packit Service df60bb
		default:
Packit Service df60bb
			rtn = false;
Packit Service df60bb
			break;
Packit Service df60bb
			}
Packit Service df60bb
		return rtn; 
Packit Service df60bb
		}
Packit Service df60bb
	} // namespace GD
Packit Service df60bb
/**
Packit Service df60bb
	Load an image from a standard input stream, regardless of it's image file format. 
Packit Service df60bb
	You can call Width() and Height() member functions of the image to determine its size.
Packit Service df60bb
	Example usage, convert anything to gif:
Packit Service df60bb
	#include <fstream>
Packit Service df60bb
	#include <gdpp.h>
Packit Service df60bb
Packit Service df60bb
	std::ifstream in("image.xxx", std::ios_base::in | std::ios_base::binary );
Packit Service df60bb
	GD::Image im;
Packit Service df60bb
	in >> im;
Packit Service df60bb
	if (im.good())
Packit Service df60bb
		{
Packit Service df60bb
		std::ofstream out("image.gif", std::ios_base::out | std::ios_base::binary );
Packit Service df60bb
		im.Gif(out);
Packit Service df60bb
		}
Packit Service df60bb
*/
Packit Service df60bb
std::istream & operator>> (std::istream & in, GD::Image & img)
Packit Service df60bb
	{
Packit Service df60bb
	img.CreateFrom(in);
Packit Service df60bb
	return in;
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
#endif /* __cplusplus */