|
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 */
|