summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Joye <pajoye@php.net>2007-04-17 15:31:45 +0000
committerPierre Joye <pajoye@php.net>2007-04-17 15:31:45 +0000
commit569e8596afb280b1d72e7ec17eee9498b944b8dd (patch)
tree1b23f2f820ce8d5c55afc362ca560f1919079b89
parent1e0f6fe5bbba046208479b3f15cc9e5954a58daa (diff)
downloadphp-git-569e8596afb280b1d72e7ec17eee9498b944b8dd.tar.gz
- MFH: add imagegrabwindow and imagegrabscreen (win32 only) [DOC]
capture a window using its handle or a full screen
-rw-r--r--ext/gd/config.w323
-rw-r--r--ext/gd/gd.c169
-rw-r--r--ext/gd/php_gd.h5
3 files changed, 177 insertions, 0 deletions
diff --git a/ext/gd/config.w32 b/ext/gd/config.w32
index ab8c136036..69861ddce6 100644
--- a/ext/gd/config.w32
+++ b/ext/gd/config.w32
@@ -24,6 +24,9 @@ if (PHP_GD != "no") {
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 \
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index 755f825012..b273c57ec4 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -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_BEGIN_ARG_INFO(arginfo_imagecopyresampled, 0)
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 @@ zend_function_entry gd_functions[] = {
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 @@ PHP_FUNCTION(imagecopyresampled)
/* }}} */
#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 */
diff --git a/ext/gd/php_gd.h b/ext/gd/php_gd.h
index 528057a19f..9ced4a44bb 100644
--- a/ext/gd/php_gd.h
+++ b/ext/gd/php_gd.h
@@ -114,6 +114,11 @@ PHP_FUNCTION(imagecolorexactalpha);
PHP_FUNCTION(imagecopyresampled);
#endif
+#ifdef PHP_WIN32
+PHP_FUNCTION(imagegrabwindow);
+PHP_FUNCTION(imagegrabscreen);
+#endif
+
#ifdef HAVE_GD_BUNDLED
PHP_FUNCTION(imagerotate);
PHP_FUNCTION(imageantialias);