pajoye Tue Apr 17 15:31:45 2007 UTC Modified files: (Branch: PHP_5_2) /php-src/ext/gd config.w32 gd.c php_gd.h Log: - MFH: add imagegrabwindow and imagegrabscreen (win32 only) [DOC] capture a window using its handle or a full screen http://cvs.php.net/viewvc.cgi/php-src/ext/gd/config.w32?r1=1.10.4.3&r2=1.10.4.4&diff_format=u Index: php-src/ext/gd/config.w32 diff -u php-src/ext/gd/config.w32:1.10.4.3 php-src/ext/gd/config.w32:1.10.4.4 --- php-src/ext/gd/config.w32:1.10.4.3 Wed Apr 11 11:44:20 2007 +++ php-src/ext/gd/config.w32 Tue Apr 17 15:31:45 2007 @@ -1,4 +1,4 @@ -// $Id: config.w32,v 1.10.4.3 2007/04/11 11:44:20 pajoye Exp $ +// $Id: config.w32,v 1.10.4.4 2007/04/17 15:31:45 pajoye Exp $ // vim:ft=javascript ARG_WITH("gd", "Bundled GD support", "yes,shared"); @@ -24,6 +24,9 @@ CHECK_LIB("zlib.lib", "gd", PHP_GD); } + CHECK_LIB("User32.lib", "gd", PHP_GD); + CHECK_LIB("Gdi32.lib", "gd", PHP_GD); + EXTENSION("gd", "gd.c gdttf.c", null, "-Iext/gd/libgd", "php_gd2.dll"); ADD_SOURCES("ext/gd/libgd", "gd2copypal.c gd_arc_f_buggy.c gd.c \ gdcache.c gdfontg.c gdfontl.c gdfontmb.c gdfonts.c gdfontt.c \ http://cvs.php.net/viewvc.cgi/php-src/ext/gd/gd.c?r1=1.312.2.20.2.20&r2=1.312.2.20.2.21&diff_format=u Index: php-src/ext/gd/gd.c diff -u php-src/ext/gd/gd.c:1.312.2.20.2.20 php-src/ext/gd/gd.c:1.312.2.20.2.21 --- php-src/ext/gd/gd.c:1.312.2.20.2.20 Fri Apr 6 15:38:35 2007 +++ php-src/ext/gd/gd.c Tue Apr 17 15:31:45 2007 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd.c,v 1.312.2.20.2.20 2007/04/06 15:38:35 pajoye Exp $ */ +/* $Id: gd.c,v 1.312.2.20.2.21 2007/04/17 15:31:45 pajoye Exp $ */ /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. */ @@ -52,6 +52,9 @@ #ifdef PHP_WIN32 # include <io.h> # include <fcntl.h> +#include <windows.h> +#include <Winuser.h> +#include <Wingdi.h> #endif #if HAVE_LIBGD @@ -314,6 +317,18 @@ ZEND_END_ARG_INFO() #endif +#ifdef PHP_WIN32 +static +ZEND_BEGIN_ARG_INFO(arginfo_imagegrabwindow, 0, 0, 1) + ZEND_ARG_INFO(0, handle) + ZEND_ARG_INFO(0, client_area) +ZEND_END_ARG_INFO() + +static +ZEND_BEGIN_ARG_INFO(arginfo_imagegrabscreen, 0) +ZEND_END_ARG_INFO() +#endif + #ifdef HAVE_GD_BUNDLED static ZEND_BEGIN_ARG_INFO_EX(arginfo_imagerotate, 0, 0, 3) @@ -1020,6 +1035,11 @@ PHP_FE(imagecopyresampled, arginfo_imagecopyresampled) #endif +#ifdef PHP_WIN32 + PHP_FE(imagegrabwindow, arginfo_imagegrabwindow) + PHP_FE(imagegrabscreen, arginfo_imagegrabscreen) +#endif + #ifdef HAVE_GD_BUNDLED PHP_FE(imagerotate, arginfo_imagerotate) PHP_FE(imageantialias, arginfo_imageantialias) @@ -2069,6 +2089,155 @@ /* }}} */ #endif +#ifdef PHP_WIN32 +/* {{{ proto resource imagegrabwindow(int window_handle [, int client_area]) + Grab a window or its client area using a windows handle (HWND property in COM instance) */ +PHP_FUNCTION(imagegrabwindow) +{ + HWND window; + long client_area = 0; + RECT rc = {0}; + RECT rc_win = {0}; + int Width, Height; + HDC hdc; + HDC memDC; + HBITMAP memBM; + HBITMAP hOld; + HINSTANCE handle; + long lwindow_handle; + typedef BOOL (WINAPI *tPrintWindow)(HWND, HDC,UINT); + tPrintWindow pPrintWindow = 0; + gdImagePtr im; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|l", &lwindow_handle, &client_area) == FAILURE) { + RETURN_FALSE; + } + + window = (HWND) lwindow_handle; + + if (!IsWindow(window)) { + php_error_docref(NULL TSRMLS_CC, E_NOTICE, "Invalid window handle"); + RETURN_FALSE; + } + + hdc = GetDC(0); + + if (client_area) { + GetClientRect(window, &rc); + Width = rc.right; + Height = rc.bottom; + } else { + GetWindowRect(window, &rc); + Width = rc.right - rc.left; + Height = rc.bottom - rc.top; + } + + Width = (Width/4)*4; + + memDC = CreateCompatibleDC(hdc); + memBM = CreateCompatibleBitmap(hdc, Width, Height); + hOld = (HBITMAP) SelectObject (memDC, memBM); + + + handle = LoadLibrary("User32.dll"); + if ( handle == 0 ) { + goto clean; + } + pPrintWindow = (tPrintWindow) GetProcAddress(handle, "PrintWindow"); + + if ( pPrintWindow ) { + pPrintWindow(window, memDC, (UINT) client_area); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Windows API too old"); + RETURN_FALSE; + goto clean; + } + + FreeLibrary(handle); + + im = gdImageCreateTrueColor(Width, Height); + if (im) { + int x,y; + for (y=0; y <= Height; y++) { + for (x=0; x <= Width; x++) { + int c = GetPixel(memDC, x,y); + gdImageSetPixel(im, x, y, gdTrueColor(GetRValue(c), GetGValue(c), GetBValue(c))); + } + } + } + +clean: + SelectObject(memDC,hOld); + DeleteObject(memBM); + DeleteDC(memDC); + ReleaseDC( 0, hdc ); + + if (!im) { + RETURN_FALSE; + } else { + ZEND_REGISTER_RESOURCE(return_value, im, le_gd); + } +} +/* }}} */ + +/* {{{ proto resource imagegrabscreen(int window_handle [, int client_area]) + Grab a screenshot */ +PHP_FUNCTION(imagegrabscreen) +{ + HWND window = GetDesktopWindow(); + RECT rc = {0}; + int Width, Height; + HDC hdc; + HDC memDC; + HBITMAP memBM; + HBITMAP hOld; + HINSTANCE handle; + long lwindow_handle; + typedef BOOL (WINAPI *tPrintWindow)(HWND, HDC,UINT); + tPrintWindow pPrintWindow = 0; + gdImagePtr im; + hdc = GetDC(0); + + if (!hdc) { + RETURN_FALSE; + } + + GetWindowRect(window, &rc); + Width = rc.right - rc.left; + Height = rc.bottom - rc.top; + + Width = (Width/4)*4; + + memDC = CreateCompatibleDC(hdc); + memBM = CreateCompatibleBitmap(hdc, Width, Height); + hOld = (HBITMAP) SelectObject (memDC, memBM); + BitBlt( memDC, 0, 0, Width, Height , hdc, rc.left, rc.top , SRCCOPY ); + + im = gdImageCreateTrueColor(Width, Height); + if (im) { + int x,y; + for (y=0; y <= Height; y++) { + for (x=0; x <= Width; x++) { + int c = GetPixel(memDC, x,y); + gdImageSetPixel(im, x, y, gdTrueColor(GetRValue(c), GetGValue(c), GetBValue(c))); + } + } + } + + SelectObject(memDC,hOld); + DeleteObject(memBM); + DeleteDC(memDC); + ReleaseDC( 0, hdc ); + + if (!im) { + RETURN_FALSE; + } else { + ZEND_REGISTER_RESOURCE(return_value, im, le_gd); + } +} +/* }}} */ +#endif PHP_WIN32 + #ifdef HAVE_GD_BUNDLED /* {{{ proto resource imagerotate(resource src_im, float angle, int bgdcolor [, int ignoretransparent]) Rotate an image using a custom angle */ http://cvs.php.net/viewvc.cgi/php-src/ext/gd/php_gd.h?r1=1.59.2.3.2.4&r2=1.59.2.3.2.5&diff_format=u Index: php-src/ext/gd/php_gd.h diff -u php-src/ext/gd/php_gd.h:1.59.2.3.2.4 php-src/ext/gd/php_gd.h:1.59.2.3.2.5 --- php-src/ext/gd/php_gd.h:1.59.2.3.2.4 Wed Apr 4 01:58:24 2007 +++ php-src/ext/gd/php_gd.h Tue Apr 17 15:31:45 2007 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_gd.h,v 1.59.2.3.2.4 2007/04/04 01:58:24 pajoye Exp $ */ +/* $Id: php_gd.h,v 1.59.2.3.2.5 2007/04/17 15:31:45 pajoye Exp $ */ #ifndef PHP_GD_H #define PHP_GD_H @@ -114,6 +114,11 @@ PHP_FUNCTION(imagecopyresampled); #endif +#ifdef PHP_WIN32 +PHP_FUNCTION(imagegrabwindow); +PHP_FUNCTION(imagegrabscreen); +#endif + #ifdef HAVE_GD_BUNDLED PHP_FUNCTION(imagerotate); PHP_FUNCTION(imageantialias);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php