]> granicus.if.org Git - imagemagick/commitdiff
(no commit message)
authorcristy <urban-warrior@git.imagemagick.org>
Sun, 30 Mar 2014 12:05:00 +0000 (12:05 +0000)
committercristy <urban-warrior@git.imagemagick.org>
Sun, 30 Mar 2014 12:05:00 +0000 (12:05 +0000)
coders/screenshot.c

index 5b783b6943ae395204fd596f03fdeca5820f37ac..caebc00b70f11d3a363434aaad1da558a06d5ff3 100644 (file)
@@ -45,7 +45,7 @@
 #    include <windows.h>
 #  else
      /* All MinGW needs ... */
-#    include "MagickCore/nt-base-private.h"
+#    include "magick/nt-base-private.h"
 #    include <wingdi.h>
 #  endif
 #endif
 #include "MagickCore/list.h"
 #include "MagickCore/magick.h"
 #include "MagickCore/memory_.h"
+#include "MagickCore/module.h"
 #include "MagickCore/nt-feature.h"
+#include "MagickCore/option.h"
 #include "MagickCore/pixel-accessor.h"
 #include "MagickCore/quantum-private.h"
 #include "MagickCore/static.h"
 #include "MagickCore/string_.h"
-#include "MagickCore/module.h"
+#include "MagickCore/token.h"
+#include "MagickCore/utility.h"
+#include "MagickCore/xwindow.h"
+#include "MagickCore/xwindow-private.h"
 \f
 /*
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %    o exception: return any errors or warnings in this structure.
 %
 */
-
-#if defined(MAGICKCORE_WINGDI32_DELEGATE)
-static Image *ReadWindowsSCREENSHOTImage(const ImageInfo *image_info,
+static Image *ReadSCREENSHOTImage(const ImageInfo *image_info,
   ExceptionInfo *exception)
 {
-  BITMAPINFO
-    bmi;
-
-  DISPLAY_DEVICE
-    device;
-
-  HBITMAP
-    bitmap,
-    bitmapOld;
-
-  HDC
-    bitmapDC,
-    hDC;
-
   Image
-    *image,
-    *screen;
-
-  int
-    i;
-
-  register Quantum
-    *q;
-
-  register ssize_t
-    x;
-
-  RGBTRIPLE
-    *p;
+    *image;
 
-  ssize_t
-    y;
-
-  assert(image_info != (const ImageInfo *) NULL);
   assert(image_info->signature == MagickSignature);
   if (image_info->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
       image_info->filename);
   assert(exception != (ExceptionInfo *) NULL);
   assert(exception->signature == MagickSignature);
-
-  i=0;
-  device.cb = sizeof(device);
   image=(Image *) NULL;
-  while(EnumDisplayDevices(NULL,i,&device,0) && ++i)
+#if defined(MAGICKCORE_WINGDI32_DELEGATE)
   {
-    if ((device.StateFlags & DISPLAY_DEVICE_ACTIVE) != DISPLAY_DEVICE_ACTIVE)
-      continue;
+    BITMAPINFO
+      bmi;
 
-    hDC=CreateDC(device.DeviceName,device.DeviceName,NULL,NULL);
-    if (hDC == (HDC) NULL)
-      ThrowReaderException(CoderError,"UnableToCreateDC");
+    DISPLAY_DEVICE
+      device;
 
-    screen=AcquireImage(image_info,exception);
-    screen->columns=(size_t) GetDeviceCaps(hDC,HORZRES);
-    screen->rows=(size_t) GetDeviceCaps(hDC,VERTRES);
-    screen->storage_class=DirectClass;
+    HBITMAP
+      bitmap,
+      bitmapOld;
 
-    if (image == (Image *) NULL)
-      image=screen;
-    else
-      AppendImageToList(&image,screen);
+    HDC
+      bitmapDC,
+      hDC;
 
-    bitmapDC=CreateCompatibleDC(hDC);
-    if (bitmapDC == (HDC) NULL)
-      {
-        DeleteDC(hDC);
-        ThrowReaderException(CoderError,"UnableToCreateDC");
-      }
-    (void) ResetMagickMemory(&bmi,0,sizeof(BITMAPINFO));
-    bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
-    bmi.bmiHeader.biWidth=(LONG) screen->columns;
-    bmi.bmiHeader.biHeight=(-1)*(LONG) screen->rows;
-    bmi.bmiHeader.biPlanes=1;
-    bmi.bmiHeader.biBitCount=24;
-    bmi.bmiHeader.biCompression=BI_RGB;
-    bitmap=CreateDIBSection(hDC,&bmi,DIB_RGB_COLORS,(void **) &p,NULL,0);
-    if (bitmap == (HBITMAP) NULL)
-      {
-        DeleteDC(hDC);
-        DeleteDC(bitmapDC);
-        ThrowReaderException(CoderError,"UnableToCreateBitmap");
-      }
-    bitmapOld=(HBITMAP) SelectObject(bitmapDC,bitmap);
-    if (bitmapOld == (HBITMAP) NULL)
-      {
-        DeleteDC(hDC);
-        DeleteDC(bitmapDC);
-        DeleteObject(bitmap);
-        ThrowReaderException(CoderError,"UnableToCreateBitmap");
-      }
-    BitBlt(bitmapDC,0,0,(int) screen->columns,(int) screen->rows,hDC,0,0,
-      SRCCOPY);
-    (void) SelectObject(bitmapDC,bitmapOld);
+    Image
+      *image,
+      *screen;
+
+    int
+      i;
 
-    for (y=0; y < (ssize_t) screen->rows; y++)
+    register PixelPacket
+      *q;
+
+    register ssize_t
+      x;
+
+    RGBTRIPLE
+      *p;
+
+    ssize_t
+      y;
+
+    assert(image_info != (const ImageInfo *) NULL);
+    i=0;
+    device.cb = sizeof(device);
+    image=(Image *) NULL;
+    while(EnumDisplayDevices(NULL,i,&device,0) && ++i)
     {
-      q=QueueAuthenticPixels(screen,0,y,screen->columns,1,exception);
-      if (q == (Quantum *) NULL)
-        break;
-      for (x=0; x < (ssize_t) screen->columns; x++)
+      if ((device.StateFlags & DISPLAY_DEVICE_ACTIVE) != DISPLAY_DEVICE_ACTIVE)
+        continue;
+
+      hDC=CreateDC(device.DeviceName,device.DeviceName,NULL,NULL);
+      if (hDC == (HDC) NULL)
+        ThrowReaderException(CoderError,"UnableToCreateDC");
+
+      screen=AcquireImage(image_info);
+      screen->columns=(size_t) GetDeviceCaps(hDC,HORZRES);
+      screen->rows=(size_t) GetDeviceCaps(hDC,VERTRES);
+      screen->storage_class=DirectClass;
+
+      if (image == (Image *) NULL)
+        image=screen;
+      else
+        AppendImageToList(&image,screen);
+
+      bitmapDC=CreateCompatibleDC(hDC);
+      if (bitmapDC == (HDC) NULL)
+        {
+          DeleteDC(hDC);
+          ThrowReaderException(CoderError,"UnableToCreateDC");
+        }
+      (void) ResetMagickMemory(&bmi,0,sizeof(BITMAPINFO));
+      bmi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
+      bmi.bmiHeader.biWidth=(LONG) screen->columns;
+      bmi.bmiHeader.biHeight=(-1)*(LONG) screen->rows;
+      bmi.bmiHeader.biPlanes=1;
+      bmi.bmiHeader.biBitCount=24;
+      bmi.bmiHeader.biCompression=BI_RGB;
+      bitmap=CreateDIBSection(hDC,&bmi,DIB_RGB_COLORS,(void **) &p,NULL,0);
+      if (bitmap == (HBITMAP) NULL)
+        {
+          DeleteDC(hDC);
+          DeleteDC(bitmapDC);
+          ThrowReaderException(CoderError,"UnableToCreateBitmap");
+        }
+      bitmapOld=(HBITMAP) SelectObject(bitmapDC,bitmap);
+      if (bitmapOld == (HBITMAP) NULL)
+        {
+          DeleteDC(hDC);
+          DeleteDC(bitmapDC);
+          DeleteObject(bitmap);
+          ThrowReaderException(CoderError,"UnableToCreateBitmap");
+        }
+      BitBlt(bitmapDC,0,0,(int) screen->columns,(int) screen->rows,hDC,0,0,
+        SRCCOPY);
+      (void) SelectObject(bitmapDC,bitmapOld);
+
+      for (y=0; y < (ssize_t) screen->rows; y++)
       {
-        SetPixelRed(image,ScaleCharToQuantum(p->rgbtRed),q);
-        SetPixelGreen(image,ScaleCharToQuantum(p->rgbtGreen),q);
-        SetPixelBlue(image,ScaleCharToQuantum(p->rgbtBlue),q);
-        SetPixelAlpha(image,OpaqueAlpha,q);
-        p++;
-        q++;
+        q=QueueAuthenticPixels(screen,0,y,screen->columns,1,exception);
+        if (q == (PixelPacket *) NULL)
+          break;
+        for (x=0; x < (ssize_t) screen->columns; x++)
+        {
+          SetPixelRed(q,ScaleCharToQuantum(p->rgbtRed));
+          SetPixelGreen(q,ScaleCharToQuantum(p->rgbtGreen));
+          SetPixelBlue(q,ScaleCharToQuantum(p->rgbtBlue));
+          SetPixelOpacity(q,OpaqueOpacity);
+          p++;
+          q++;
+        }
+        if (SyncAuthenticPixels(screen,exception) == MagickFalse)
+          break;
       }
-      if (SyncAuthenticPixels(screen,exception) == MagickFalse)
-        break;
-    }
 
-    DeleteDC(hDC);
-    DeleteDC(bitmapDC);
-    DeleteObject(bitmap);
+      DeleteDC(hDC);
+      DeleteDC(bitmapDC);
+      DeleteObject(bitmap);
+    }
   }
-  return(image);
-}
-#endif
+#elif defined(MAGICKCORE_X11_DELEGATE)
+  {
+    const char
+      *option;
 
-static Image *ReadSCREENSHOTImage(const ImageInfo *image_info,ExceptionInfo *exception)
-{
-#if defined(MAGICKCORE_WINGDI32_DELEGATE)
-  return ReadWindowsSCREENSHOTImage(image_info,exception);
-#else
-  magick_unreferenced(image_info);
-  magick_unreferenced(exception);
-  return((Image *) NULL);
+    XImportInfo
+      ximage_info;
+
+    XGetImportInfo(&ximage_info);
+    option=GetImageOption(image_info,"x:screen");
+    if (option != (const char *) NULL)
+      ximage_info.screen=IsStringTrue(option);
+    option=GetImageOption(image_info,"x:silent");
+    if (option != (const char *) NULL)
+      ximage_info.silent=IsStringTrue(option);
+    image=XImportImage(image_info,&ximage_info,exception);
+  }
 #endif
+  return(image);
 }
 \f
 /*
@@ -286,4 +301,4 @@ ModuleExport size_t RegisterSCREENSHOTImage(void)
 ModuleExport void UnregisterSCREENSHOTImage(void)
 {
   (void) UnregisterMagickInfo("SCREENSHOT");
-}
\ No newline at end of file
+}