📄 gd.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Rasmus Lerdorf <rasmus@php.net> | | Stig Bakken <ssb@fast.no> | | Jim Winstead <jimw@php.net> | +----------------------------------------------------------------------+ *//* $Id: gd.c,v 1.221.2.56.2.5 2007/01/01 09:46:42 sebastian Exp $ *//* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. *//* Note that there is no code from the gd package in this file */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "ext/standard/head.h"#include <math.h>#include "SAPI.h"#include "php_gd.h"#include "ext/standard/info.h"#include "php_open_temporary_file.h"#if HAVE_SYS_WAIT_H# include <sys/wait.h>#endif#if HAVE_UNISTD_H# include <unistd.h>#endif#ifdef PHP_WIN32# include <io.h># include <fcntl.h>#endif#if HAVE_LIBGDstatic int le_gd, le_gd_font;#if HAVE_LIBT1#include <t1lib.h>static int le_ps_font, le_ps_enc;static void php_free_ps_font(zend_rsrc_list_entry *rsrc TSRMLS_DC);static void php_free_ps_enc(zend_rsrc_list_entry *rsrc TSRMLS_DC);#endif#include <gd.h>#include <gdfontt.h> /* 1 Tiny font */#include <gdfonts.h> /* 2 Small font */#include <gdfontmb.h> /* 3 Medium bold font */#include <gdfontl.h> /* 4 Large font */#include <gdfontg.h> /* 5 Giant font */#ifdef HAVE_GD_WBMP#include "libgd/wbmp.h"#endif#ifdef ENABLE_GD_TTF# include "gdttf.h"#endif#ifndef M_PI#define M_PI 3.14159265358979323846#endif#ifdef ENABLE_GD_TTFstatic void php_imagettftext_common(INTERNAL_FUNCTION_PARAMETERS, int, int);#endif#if HAVE_LIBGD15/* it's >= 1.5, i.e. has IOCtx */#define USE_GD_IOCTX 1#else#undef USE_GD_IOCTX#endif#ifdef USE_GD_IOCTX#include "gd_ctx.c"#else#define gdImageCreateFromGdCtx NULL#define gdImageCreateFromGd2Ctx NULL#define gdImageCreateFromGd2partCtx NULL#define gdImageCreateFromGifCtx NULL#define gdImageCreateFromJpegCtx NULL#define gdImageCreateFromPngCtx NULL#define gdImageCreateFromWBMPCtx NULLtypedef FILE gdIOCtx;#define CTX_PUTC(c, fp) fputc(c, fp)#endif#ifndef HAVE_GDIMAGECOLORRESOLVEextern int gdImageColorResolve(gdImagePtr, int, int, int);#endif#if HAVE_COLORCLOSESTHWBint gdImageColorClosestHWB(gdImagePtr im, int r, int g, int b);#endif#ifndef HAVE_GD_DYNAMIC_CTX_EX#define gdNewDynamicCtxEx(len, data, val) gdNewDynamicCtx(len, data)#endifstatic gdImagePtr _php_image_create_from_string (zval **Data, char *tn, gdImagePtr (*ioctx_func_p)() TSRMLS_DC);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 int _php_image_type(char data[8]);static void _php_image_convert(INTERNAL_FUNCTION_PARAMETERS, int image_type);static void _php_image_bw_convert(gdImagePtr im_org, gdIOCtx *out, int threshold);/* {{{ gd_functions[] */function_entry gd_functions[] = { PHP_FE(gd_info, NULL) PHP_FE(imagearc, NULL) PHP_FE(imageellipse, NULL) PHP_FE(imagechar, NULL) PHP_FE(imagecharup, NULL) PHP_FE(imagecolorat, NULL) PHP_FE(imagecolorallocate, NULL)#if HAVE_LIBGD15 PHP_FE(imagepalettecopy, NULL) PHP_FE(imagecreatefromstring, NULL)#endif PHP_FE(imagecolorclosest, NULL)#if HAVE_COLORCLOSESTHWB PHP_FE(imagecolorclosesthwb, NULL)#endif PHP_FE(imagecolordeallocate, NULL) PHP_FE(imagecolorresolve, NULL) PHP_FE(imagecolorexact, NULL) PHP_FE(imagecolorset, NULL) PHP_FE(imagecolortransparent, NULL) PHP_FE(imagecolorstotal, NULL) PHP_FE(imagecolorsforindex, NULL) PHP_FE(imagecopy, NULL)#if HAVE_LIBGD15 PHP_FE(imagecopymerge, NULL) PHP_FE(imagecopymergegray, NULL)#endif PHP_FE(imagecopyresized, NULL) PHP_FE(imagecreate, NULL)#if HAVE_LIBGD20 PHP_FE(imagecreatetruecolor, NULL) PHP_FE(imageistruecolor, NULL) PHP_FE(imagetruecolortopalette, NULL) PHP_FE(imagesetthickness, NULL) PHP_FE(imagefilledarc, NULL) PHP_FE(imagefilledellipse, NULL) PHP_FE(imagealphablending, NULL) PHP_FE(imagesavealpha, NULL) PHP_FE(imagecolorallocatealpha, NULL) PHP_FE(imagecolorresolvealpha, NULL) PHP_FE(imagecolorclosestalpha, NULL) PHP_FE(imagecolorexactalpha, NULL) PHP_FE(imagecopyresampled, NULL)#endif#ifdef HAVE_GD_BUNDLED PHP_FE(imagerotate, NULL) PHP_FE(imageantialias, NULL)#endif#if HAVE_GD_IMAGESETTILE PHP_FE(imagesettile, NULL)#endif#if HAVE_GD_IMAGESETBRUSH PHP_FE(imagesetbrush, NULL)#endif PHP_FE(imagesetstyle, NULL)#ifdef HAVE_GD_PNG PHP_FE(imagecreatefrompng, NULL)#endif#ifdef HAVE_GD_GIF_READ PHP_FE(imagecreatefromgif, NULL)#endif#ifdef HAVE_GD_JPG PHP_FE(imagecreatefromjpeg, NULL)#endif#ifdef HAVE_GD_WBMP PHP_FE(imagecreatefromwbmp, NULL)#endif#ifdef HAVE_GD_XBM PHP_FE(imagecreatefromxbm, NULL)#endif#if defined(HAVE_GD_XPM) && defined(HAVE_GD_BUNDLED) PHP_FE(imagecreatefromxpm, NULL)#endif PHP_FE(imagecreatefromgd, NULL)#ifdef HAVE_GD_GD2 PHP_FE(imagecreatefromgd2, NULL) PHP_FE(imagecreatefromgd2part, NULL)#endif#ifdef HAVE_GD_PNG PHP_FE(imagepng, NULL)#endif#ifdef HAVE_GD_GIF_CREATE PHP_FE(imagegif, NULL)#endif#ifdef HAVE_GD_JPG PHP_FE(imagejpeg, NULL)#endif#ifdef HAVE_GD_WBMP PHP_FE(imagewbmp, NULL)#endif PHP_FE(imagegd, NULL)#ifdef HAVE_GD_GD2 PHP_FE(imagegd2, NULL)#endif PHP_FE(imagedestroy, NULL) PHP_FE(imagegammacorrect, NULL) PHP_FE(imagefill, NULL) PHP_FE(imagefilledpolygon, NULL) PHP_FE(imagefilledrectangle, NULL) PHP_FE(imagefilltoborder, NULL) PHP_FE(imagefontwidth, NULL) PHP_FE(imagefontheight, NULL) PHP_FE(imageinterlace, NULL) PHP_FE(imageline, NULL) PHP_FE(imageloadfont, NULL) PHP_FE(imagepolygon, NULL) PHP_FE(imagerectangle, NULL) PHP_FE(imagesetpixel, NULL) PHP_FE(imagestring, NULL) PHP_FE(imagestringup, NULL) PHP_FE(imagesx, NULL) PHP_FE(imagesy, NULL) PHP_FE(imagedashedline, NULL)#ifdef ENABLE_GD_TTF PHP_FE(imagettfbbox, NULL) PHP_FE(imagettftext, NULL)#if HAVE_LIBGD20 && HAVE_LIBFREETYPE && HAVE_GD_STRINGFTEX PHP_FE(imageftbbox, NULL) PHP_FE(imagefttext, NULL)#endif#endif#ifdef HAVE_LIBT1 PHP_FE(imagepsloadfont, NULL) /* PHP_FE(imagepscopyfont, NULL) */ PHP_FE(imagepsfreefont, NULL) PHP_FE(imagepsencodefont, NULL) PHP_FE(imagepsextendfont, NULL) PHP_FE(imagepsslantfont, NULL) PHP_FE(imagepstext, NULL) PHP_FE(imagepsbbox, NULL)#endif PHP_FE(imagetypes, NULL)#if defined(HAVE_GD_JPG) && defined(HAVE_GD_WBMP) PHP_FE(jpeg2wbmp, NULL)#endif#if defined(HAVE_GD_PNG) && defined(HAVE_GD_WBMP) PHP_FE(png2wbmp, NULL)#endif#ifdef HAVE_GD_WBMP PHP_FE(image2wbmp, NULL)#endif#if HAVE_GD_BUNDLED PHP_FE(imagelayereffect, NULL) PHP_FE(imagecolormatch, NULL)#endif {NULL, NULL, NULL}};/* }}} */zend_module_entry gd_module_entry = { STANDARD_MODULE_HEADER, "gd", gd_functions, PHP_MINIT(gd), PHP_MSHUTDOWN(gd), NULL,#if HAVE_LIBGD20 && HAVE_GD_STRINGFT && (HAVE_GD_FONTCACHESHUTDOWN || HAVE_GD_FREEFONTCACHE) PHP_RSHUTDOWN(gd),#else NULL,#endif PHP_MINFO(gd), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_GDZEND_GET_MODULE(gd)#endif/* {{{ php_free_gd_image */static void php_free_gd_image(zend_rsrc_list_entry *rsrc TSRMLS_DC){ gdImageDestroy((gdImagePtr) rsrc->ptr);}/* }}} *//* {{{ php_free_gd_font */static void php_free_gd_font(zend_rsrc_list_entry *rsrc TSRMLS_DC){ gdFontPtr fp = (gdFontPtr) rsrc->ptr; if (fp->data) { efree(fp->data); } efree(fp);}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(gd){#if HAVE_LIBT1 T1_CloseLib();#endif return SUCCESS;}/* }}} *//* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(gd){ le_gd = zend_register_list_destructors_ex(php_free_gd_image, NULL, "gd", module_number); le_gd_font = zend_register_list_destructors_ex(php_free_gd_font, NULL, "gd font", module_number);#if HAVE_LIBT1 T1_SetBitmapPad(8); T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE); T1_SetLogLevel(T1LOG_DEBUG); le_ps_font = zend_register_list_destructors_ex(php_free_ps_font, NULL, "gd PS font", module_number); le_ps_enc = zend_register_list_destructors_ex(php_free_ps_enc, NULL, "gd PS encoding", module_number);#endif REGISTER_LONG_CONSTANT("IMG_GIF", 1, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_JPG", 2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_JPEG", 2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_PNG", 4, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_WBMP", 8, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_XPM", 16, CONST_CS | CONST_PERSISTENT);#ifdef gdTiled /* special colours for gd */ REGISTER_LONG_CONSTANT("IMG_COLOR_TILED", gdTiled, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_COLOR_STYLED", gdStyled, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_COLOR_BRUSHED", gdBrushed, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_COLOR_STYLEDBRUSHED", gdStyledBrushed, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_COLOR_TRANSPARENT", gdTransparent, CONST_CS | CONST_PERSISTENT);#endif#if HAVE_LIBGD20 /* for imagefilledarc */ REGISTER_LONG_CONSTANT("IMG_ARC_ROUNDED", gdArc, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_ARC_PIE", gdPie, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_ARC_CHORD", gdChord, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_ARC_NOFILL", gdNoFill, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_ARC_EDGED", gdEdged, CONST_CS | CONST_PERSISTENT);#endif/* GD2 image format types */#ifdef GD2_FMT_RAW REGISTER_LONG_CONSTANT("IMG_GD2_RAW", GD2_FMT_RAW, CONST_CS | CONST_PERSISTENT);#endif#ifdef GD2_FMT_COMPRESSED REGISTER_LONG_CONSTANT("IMG_GD2_COMPRESSED", GD2_FMT_COMPRESSED, CONST_CS | CONST_PERSISTENT);#endif#if HAVE_GD_BUNDLED REGISTER_LONG_CONSTANT("IMG_EFFECT_REPLACE", gdEffectReplace, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_EFFECT_ALPHABLEND", gdEffectAlphaBlend, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_EFFECT_NORMAL", gdEffectNormal, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("IMG_EFFECT_OVERLAY", gdEffectOverlay, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("GD_BUNDLED", 1, CONST_CS | CONST_PERSISTENT);#else REGISTER_LONG_CONSTANT("GD_BUNDLED", 0, CONST_CS | CONST_PERSISTENT);#endif return SUCCESS;}/* }}} *//* {{{ PHP_RSHUTDOWN_FUNCTION */#if HAVE_LIBGD20 && HAVE_GD_STRINGFT && (HAVE_GD_FONTCACHESHUTDOWN || HAVE_GD_FREEFONTCACHE)PHP_RSHUTDOWN_FUNCTION(gd){#if HAVE_GD_FONTCACHESHUTDOWN gdFontCacheShutdown();#else gdFreeFontCache();#endif return SUCCESS;}#endif/* }}} */#if HAVE_GD_BUNDLED#define PHP_GD_VERSION_STRING "bundled (2.0.28 compatible)"#elif HAVE_LIBGD20#define PHP_GD_VERSION_STRING "2.0 or higher"#elif HAVE_GDIMAGECOLORRESOLVE#define PHP_GD_VERSION_STRING "1.6.2 or higher"#elif HAVE_LIBGD13#define PHP_GD_VERSION_STRING "between 1.3 and 1.6.1"#else#define PHP_GD_VERSION_STRING "1.2"#endif/* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(gd){ php_info_print_table_start(); php_info_print_table_row(2, "GD Support", "enabled"); /* need to use a PHPAPI function here because it is external module in windows */ php_info_print_table_row(2, "GD Version", PHP_GD_VERSION_STRING);#ifdef ENABLE_GD_TTF php_info_print_table_row(2, "FreeType Support", "enabled");#if HAVE_LIBFREETYPE php_info_print_table_row(2, "FreeType Linkage", "with freetype");#elif HAVE_LIBTTF php_info_print_table_row(2, "FreeType Linkage", "with TTF library");#else php_info_print_table_row(2, "FreeType Linkage", "with unknown library");#endif#endif#ifdef HAVE_LIBT1 php_info_print_table_row(2, "T1Lib Support", "enabled");#endif/* this next part is stupid ... if I knew better, I'd put them all on one row (cmv) */#ifdef HAVE_GD_GIF_READ php_info_print_table_row(2, "GIF Read Support", "enabled");#endif#ifdef HAVE_GD_GIF_CREATE php_info_print_table_row(2, "GIF Create Support", "enabled");#endif#ifdef HAVE_GD_JPG php_info_print_table_row(2, "JPG Support", "enabled");#endif#ifdef HAVE_GD_PNG php_info_print_table_row(2, "PNG Support", "enabled");#endif#ifdef HAVE_GD_WBMP php_info_print_table_row(2, "WBMP Support", "enabled");#endif#ifdef HAVE_GD_XBM php_info_print_table_row(2, "XBM Support", "enabled");#endif#if defined(USE_GD_JISX0208) && defined(HAVE_GD_BUNDLED) php_info_print_table_row(2, "JIS-mapped Japanese Font Support", "enabled");#endif php_info_print_table_end();}/* }}} *//* {{{ proto array gd_info() */PHP_FUNCTION(gd_info){ if (ZEND_NUM_ARGS() != 0) { ZEND_WRONG_PARAM_COUNT();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -