Blame src/gd_io_stream.h

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 gd_io_stream.h
Packit Service df60bb
	\brief C++ standard library iostream specializations of gdIOCtx.
Packit Service df60bb
Packit Service df60bb
	Note that all of the methods defined in this header are internal to the
Packit Service df60bb
	libgd library, except for the constructors.
Packit Service df60bb
	Only the constructors are needed by a user of the libgd API.
Packit Service df60bb
	This file does not use or need gdpp.h, but if GD::Image is
Packit Service df60bb
	used, then C++ coding becomes even simpler, and the classes below
Packit Service df60bb
	become entirely hidden implementation details.
Packit Service df60bb
	Example usage, convert png to gif:
Packit Service df60bb
	#include <fstream>
Packit Service df60bb
	#include "gd_io_stream.h"
Packit Service df60bb
	std::ifstream in("image.png", std::ios_base::in | std::ios_base::binary );
Packit Service df60bb
	if (in.good())
Packit Service df60bb
		{
Packit Service df60bb
		istreamIOCtx _in_ctx(in);
Packit Service df60bb
		gdImagePtr im_in = gdImageCreateFromPngCtx ( & _in_ctx);
Packit Service df60bb
		std::ofstream out("image.gif", std::ios_base::out | std::ios_base::binary );
Packit Service df60bb
		ostreamIOCtx _out_ctx(out);
Packit Service df60bb
		gdImageGifCtx(im_in, & _out_ctx);
Packit Service df60bb
		}
Packit Service df60bb
	gdImageDestroy(im_in);
Packit Service df60bb
*/
Packit Service df60bb
#ifdef __cplusplus
Packit Service df60bb
#ifndef _gd_io_stream_h
Packit Service df60bb
#define _gd_io_stream_h
Packit Service df60bb
Packit Service df60bb
#include "gd.h"
Packit Service df60bb
#include <iostream>
Packit Service df60bb
Packit Service df60bb
/** Standard library input stream specialization of gdIOCtx
Packit Service df60bb
*/
Packit Service df60bb
class BGD_EXPORT_DATA_IMPL istreamIOCtx : public gdIOCtx
Packit Service df60bb
{
Packit Service df60bb
public:
Packit Service df60bb
	typedef std::istream	stream_type;
Packit Service df60bb
	/** Construct an instance of this input stream specialization,
Packit Service df60bb
		given an input stream.
Packit Service df60bb
		For example:
Packit Service df60bb
		std::ifstream in("image.png", std::ios_base::in | std::ios_base::binary );
Packit Service df60bb
		istreamIOCtx in_ctx(in);
Packit Service df60bb
	*/
Packit Service df60bb
	istreamIOCtx(stream_type & __stream) {
Packit Service df60bb
		init( & __stream);
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	static int	Getbuf (struct gdIOCtx * ctx, void * buf, int size);
Packit Service df60bb
	static int	Putbuf (struct gdIOCtx * , const void * , int );
Packit Service df60bb
	static void	Putchar (struct gdIOCtx * , int );
Packit Service df60bb
	static int	Getchar (struct gdIOCtx * ctx);
Packit Service df60bb
	static int	Seek (struct gdIOCtx * ctx, const int pos);
Packit Service df60bb
	static long	Tell (struct gdIOCtx * ctx);
Packit Service df60bb
	static void	FreeCtx (struct gdIOCtx * ctx);
Packit Service df60bb
Packit Service df60bb
	void init(stream_type * __stream) {
Packit Service df60bb
		getC = Getchar;
Packit Service df60bb
		putC = Putchar;
Packit Service df60bb
		getBuf = Getbuf;
Packit Service df60bb
		putBuf = Putbuf;
Packit Service df60bb
		tell = Tell;
Packit Service df60bb
		seek = Seek;
Packit Service df60bb
		gd_free = FreeCtx;
Packit Service df60bb
		_M_stream = __stream;
Packit Service df60bb
	}
Packit Service df60bb
private:
Packit Service df60bb
	stream_type *	_M_stream;
Packit Service df60bb
};
Packit Service df60bb
/** Allocate a new instance of the class
Packit Service df60bb
*/
Packit Service df60bb
inline gdIOCtx * gdNewIstreamCtx (std::istream * __stream)
Packit Service df60bb
{
Packit Service df60bb
	return new istreamIOCtx(* __stream);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
/** Standard library output stream specialization of gdIOCtx
Packit Service df60bb
*/
Packit Service df60bb
class BGD_EXPORT_DATA_IMPL ostreamIOCtx : public gdIOCtx
Packit Service df60bb
{
Packit Service df60bb
public:
Packit Service df60bb
	typedef std::ostream	stream_type;
Packit Service df60bb
	/** Construct an instance of this output stream specialization,
Packit Service df60bb
		given an output stream.
Packit Service df60bb
		For example:
Packit Service df60bb
		std::ofstream out("image.gif", std::ios_base::out | std::ios_base::binary );
Packit Service df60bb
		ostreamIOCtx out_ctx(out);
Packit Service df60bb
	*/
Packit Service df60bb
	ostreamIOCtx(stream_type & __stream) {
Packit Service df60bb
		init( & __stream);
Packit Service df60bb
	}
Packit Service df60bb
Packit Service df60bb
	static int	Getbuf (struct gdIOCtx * , void * , int );
Packit Service df60bb
	static int	Putbuf (struct gdIOCtx * ctx, const void * buf, int size);
Packit Service df60bb
	static int	Getchar (struct gdIOCtx * );
Packit Service df60bb
	static void	Putchar (struct gdIOCtx * ctx, int a);
Packit Service df60bb
	static int	Seek (struct gdIOCtx * ctx, const int pos);
Packit Service df60bb
	static long	Tell (struct gdIOCtx * ctx);
Packit Service df60bb
	static void	FreeCtx (struct gdIOCtx * ctx);
Packit Service df60bb
Packit Service df60bb
	void init(stream_type * __stream) {
Packit Service df60bb
		getC = Getchar;
Packit Service df60bb
		putC = Putchar;
Packit Service df60bb
		getBuf = Getbuf;
Packit Service df60bb
		putBuf = Putbuf;
Packit Service df60bb
		tell = Tell;
Packit Service df60bb
		seek = Seek;
Packit Service df60bb
		gd_free = FreeCtx;
Packit Service df60bb
		_M_stream = __stream;
Packit Service df60bb
	}
Packit Service df60bb
private:
Packit Service df60bb
	stream_type *	_M_stream;
Packit Service df60bb
};
Packit Service df60bb
/** Allocate a new instance of the class
Packit Service df60bb
*/
Packit Service df60bb
inline gdIOCtx * gdNewOstreamCtx (std::ostream * __stream)
Packit Service df60bb
{
Packit Service df60bb
	return new ostreamIOCtx(* __stream);
Packit Service df60bb
}
Packit Service df60bb
Packit Service df60bb
#endif /* _gd_io_stream_h */
Packit Service df60bb
#endif /* __cplusplus */