From: cristy Date: Sun, 30 Mar 2014 12:05:00 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~2527 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b03e4c067776790d7df85fc970fed19acae876ee;p=imagemagick --- diff --git a/coders/screenshot.c b/coders/screenshot.c index 5b783b694..caebc00b7 100644 --- a/coders/screenshot.c +++ b/coders/screenshot.c @@ -45,7 +45,7 @@ # include # else /* All MinGW needs ... */ -# include "MagickCore/nt-base-private.h" +# include "magick/nt-base-private.h" # include # endif #endif @@ -59,12 +59,17 @@ #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" /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -90,141 +95,151 @@ % 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); } /* @@ -286,4 +301,4 @@ ModuleExport size_t RegisterSCREENSHOTImage(void) ModuleExport void UnregisterSCREENSHOTImage(void) { (void) UnregisterMagickInfo("SCREENSHOT"); -} \ No newline at end of file +}