stas Thu Feb 1 07:40:35 2001 EDT Added files: /php4/ext/gd gd_ctx.c Modified files: /php4/ext/gd gd.c php_gd.h Log: Allow usage of GD contexts and not tempfiles in output functions
Index: php4/ext/gd/gd.c diff -u php4/ext/gd/gd.c:1.111 php4/ext/gd/gd.c:1.112 --- php4/ext/gd/gd.c:1.111 Sat Jan 27 06:20:06 2001 +++ php4/ext/gd/gd.c Thu Feb 1 07:40:34 2001 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd.c,v 1.111 2001/01/27 14:20:06 eschmid Exp $ */ +/* $Id: gd.c,v 1.112 2001/02/01 15:40:34 stas Exp $ */ /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. */ @@ -30,7 +30,6 @@ #include <math.h> #include "SAPI.h" #include "php_gd.h" -#include "ext/standard/fsock.h" #include "ext/standard/info.h" #if HAVE_SYS_WAIT_H @@ -69,20 +68,26 @@ static void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int); #endif -#ifdef GD2_VERS +#if HAVE_LIBGD15 /* it's >= 1.5, i.e. has IOCtx */ #define USE_GD_IOCTX 1 #else #undef USE_GD_IOCTX #endif -#ifndef USE_GD_IOCTX +#ifdef USE_GD_IOCTX +#include "gd_ctx.c" +#else #define gdImageCreateFromGifCtx NULL #define gdImageCreateFromJpegCtx NULL #define gdImageCreateFromPngCtx NULL #define gdImageCreateFromWBMPCtx NULL +typedef FILE gdIOCtx; +#define CTX_PUTC(c,fp) fputc(c, fp) #endif +static void _php_image_output_wbmp(gdImagePtr im, gdIOCtx *fp); + #ifdef THREAD_SAFE DWORD GDlibTls; static int numthreads=0; @@ -662,26 +667,24 @@ if(issock && socketd) { #ifdef USE_GD_IOCTX gdIOCtx* io_ctx; -#define CHUNK_SIZE 8192 - int read_len=0,buff_len=0,buff_size=5*CHUNK_SIZE; - char *buff,*buff_cur; + int buff_size; + char *buff,*buff_em; - buff = malloc(buff_size); /* Should be malloc! GD uses free */ - buff_cur = buff; + buff_size = php_fread_all(&buff_em, socketd, fp, issock); - do { - if(buff_len > buff_size - CHUNK_SIZE) { - buff_size += CHUNK_SIZE; - buff = realloc(buff, buff_size); - } - read_len = SOCK_FREAD(buff_cur, CHUNK_SIZE, socketd); - buff_len += read_len; - buff_cur += read_len; - } while(read_len>0); + if(!buff_size) { + php_error(E_WARNING,"%s: Cannot read image +data",get_active_function_name()); + RETURN_FALSE; + } + + buff = malloc(buff_size); /* Should be malloc! GD uses free */ + memcpy(buff, buff_em, buff_size); + efree(buff_em); - io_ctx = gdNewDynamicCtx(buff_len,buff); + io_ctx = gdNewDynamicCtx(buff_size,buff); if(!io_ctx) { php_error(E_WARNING,"%s: Cannot allocate GD IO context",get_active_function_name()); + RETURN_FALSE; } im = (*ioctx_func_p)(io_ctx); io_ctx->free(io_ctx); @@ -888,7 +891,11 @@ PHP_FUNCTION(imagegif) { #ifdef HAVE_GD_GIF +#ifdef USE_GD_IOCTX + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, +"GIF", gdImageGifCtx); +#else _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_GIF, "GIF", gdImageGif); +#endif #else /* HAVE_GD_GIF */ php_error(E_WARNING, "ImageGif: No GIF support in this PHP build"); RETURN_FALSE; @@ -901,7 +908,11 @@ PHP_FUNCTION(imagepng) { #ifdef HAVE_GD_PNG +#ifdef USE_GD_IOCTX + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, +"PNG", gdImagePngCtx); +#else _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_PNG, "PNG", gdImagePng); +#endif #else /* HAVE_GD_PNG */ php_error(E_WARNING, "ImagePng: No PNG support in this PHP build"); RETURN_FALSE; @@ -915,7 +926,11 @@ PHP_FUNCTION(imagejpeg) { #ifdef HAVE_GD_JPG +#ifdef USE_GD_IOCTX + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, +"JPEG", gdImageJpegCtx); +#else _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_JPG, "JPEG", gdImageJpeg); +#endif #else /* HAVE_GD_JPG */ php_error(E_WARNING, "ImageJpeg: No JPG support in this PHP build"); RETURN_FALSE; @@ -927,29 +942,33 @@ Output WBMP image to browser or file */ PHP_FUNCTION(imagewbmp) { +#ifdef USE_GD_IOCTX + _php_image_output_ctx(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WBM, +"WBMP", _php_image_output_wbmp); +#else _php_image_output(INTERNAL_FUNCTION_PARAM_PASSTHRU, PHP_GDIMG_TYPE_WBM, "WBMP", _php_image_output_wbmp); +#endif } /* }}} */ /* {{{ _php_image_output_wbmp(gdImagePtr im, FILE *fp) */ -static void _php_image_output_wbmp(gdImagePtr im, FILE *fp) +static void _php_image_output_wbmp(gdImagePtr im, gdIOCtx *fp) { int x, y; int c, p, width, height; /* WBMP header, black and white, no compression */ - fputc(0,fp); fputc(0,fp); + CTX_PUTC(0,fp); CTX_PUTC(0,fp); /* Width and height of image */ c = 1; width = im->sx; while(width & 0x7f << 7*c) c++; - while(c > 1) fputc(0x80 | ((width >> 7*--c) & 0xff), fp); - fputc(width & 0x7f,fp); + while(c > 1) CTX_PUTC(0x80 | ((width >> 7*--c) & 0xff), fp); + CTX_PUTC(width & 0x7f,fp); c = 1; height = im->sy; while(height & 0x7f << 7*c) c++; - while(c > 1) fputc(0x80 | ((height >> 7*--c) & 0xff), fp); - fputc(height & 0x7f,fp); + while(c > 1) CTX_PUTC(0x80 | ((height >> 7*--c) & 0xff), fp); + CTX_PUTC(height & 0x7f,fp); /* Actual image data */ for(y = 0; y < im->sy; y++) { @@ -961,11 +980,11 @@ if(im->pixels[y][x] == 0) c = c | (1 << (7-p)); #endif if(++p == 8) { - fputc(c,fp); + CTX_PUTC(c,fp); p = c = 0; } } - if(p) fputc(c,fp); + if(p) CTX_PUTC(c,fp); } } /* }}} */ Index: php4/ext/gd/php_gd.h diff -u php4/ext/gd/php_gd.h:1.21 php4/ext/gd/php_gd.h:1.22 --- php4/ext/gd/php_gd.h:1.21 Wed Jan 24 01:24:26 2001 +++ php4/ext/gd/php_gd.h Thu Feb 1 07:40:35 2001 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_gd.h,v 1.21 2001/01/24 09:24:26 derick Exp $ */ +/* $Id: php_gd.h,v 1.22 2001/02/01 15:40:35 stas Exp $ */ #ifndef PHP_GD_H #define PHP_GD_H @@ -139,7 +139,7 @@ gdImagePtr _php_image_create_from_string ( zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() ); static void _php_image_create_from(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, gdImagePtr (*func_p)(), gdImagePtr (*ioctx_func_p)()); static void _php_image_output(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()); -static void _php_image_output_wbmp(gdImagePtr im, FILE *fp); +/* static void _php_image_output_wbmp(gdImagePtr im, FILE *fp); */ static int _php_image_type ( char data[8] ); static void _php_image_bw_convert( gdImagePtr im_org, int threshold, FILE *out ); static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type); Index: php4/ext/gd/gd_ctx.c +++ php4/ext/gd/gd_ctx.c #define CTX_PUTC(c,ctx) ctx->putC(ctx, c) static void _php_image_output_putc(struct gdIOCtx *ctx, int c) { php_write(&c, 1); } static int _php_image_output_putbuf(struct gdIOCtx *ctx, const void* buf, int l) { return php_write((void *)buf, l); } static void _php_image_output_ctxfree(struct gdIOCtx *ctx) { if(ctx) { efree(ctx); } } static void _php_image_output_ctx(INTERNAL_FUNCTION_PARAMETERS, int image_type, char *tn, void (*func_p)()) { zval **imgind, **file, **quality; gdImagePtr im; char *fn = NULL; FILE *fp = NULL; int argc = ZEND_NUM_ARGS(); int q = -1; gdIOCtx *ctx; GDLS_FETCH(); /* The quality parameter for Wbmp stands for the threshold So the q variable */ if (argc < 1 || argc > 3 || zend_get_parameters_ex(argc, &imgind, &file, &quality) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(im, gdImagePtr, imgind, -1, "Image", le_gd); if (argc > 1) { convert_to_string_ex(file); fn = Z_STRVAL_PP(file); if (argc == 3) { convert_to_long_ex(quality); q = Z_LVAL_PP(quality); } } if ((argc == 2) || (argc == 3 && Z_STRLEN_PP(file))) { if (!fn || fn == empty_string || php_check_open_basedir(fn)) { php_error(E_WARNING, "%s: invalid filename '%s'", get_active_function_name(), fn); RETURN_FALSE; } fp = V_FOPEN(fn, "wb"); if (!fp) { php_error(E_WARNING, "%s: unable to open '%s' for writing", get_active_function_name(), fn); RETURN_FALSE; } ctx = gdNewFileCtx(fp); } else { if(!php_header()) { RETURN_TRUE; } ctx = emalloc(sizeof(gdIOCtx)); ctx->putC = _php_image_output_putc; ctx->putBuf = _php_image_output_putbuf; ctx->free = _php_image_output_ctxfree; #if APACHE && defined(CHARSET_EBCDIC) SLS_FETCH(); /* This is a binary file already: avoid EBCDIC->ASCII conversion */ ap_bsetflag(php3_rqst->connection->client, B_EBCDIC2ASCII, 0); #endif } switch(image_type) { case PHP_GDIMG_TYPE_JPG: (*func_p)(im, ctx, q); break; case PHP_GDIMG_TYPE_WBM: if(q<0||q>255) { php_error(E_WARNING, "%s: invalid threshold value '%d'. It must be between 0 and 255",get_active_function_name(), q); } /* break missing intentionally */ default: (*func_p)(im, ctx); break; } ctx->free(ctx); if(fp) { fflush(fp); fclose(fp); } RETURN_TRUE; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]