]> granicus.if.org Git - php/commitdiff
- MFH: add imagegrabwindow and imagegrabscreen (win32 only) [DOC]
authorPierre Joye <pajoye@php.net>
Tue, 17 Apr 2007 15:31:45 +0000 (15:31 +0000)
committerPierre Joye <pajoye@php.net>
Tue, 17 Apr 2007 15:31:45 +0000 (15:31 +0000)
  capture a window using its handle or a full screen

ext/gd/config.w32
ext/gd/gd.c
ext/gd/php_gd.h

index ab8c13603621ea676c1ce3d6e24e92f26dd98f4d..69861ddce6dbb3c83cccf08043f0e105fedaff97 100644 (file)
@@ -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 \
index 755f82501234efc0e9b6096980f8cf2042f9c5ed..b273c57ec467fc5d36715caaa9503a3052348b10 100644 (file)
@@ -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 */
index 528057a19ff95b135994d81d46a8fb59f2251268..9ced4a44bb1e12088c56cfd7e3fbdcb4f0e38eff 100644 (file)
@@ -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);