13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
64e82e51d7ebce7b4ef0f808d906124dd6f812248cristy%        CCCC  L      IIIII  PPPP   BBBB    OOO    AAA   RRRR   DDDD          %
74e82e51d7ebce7b4ef0f808d906124dd6f812248cristy%       C      L        I    P   P  B   B  O   O  A   A  R   R  D   D         %
84e82e51d7ebce7b4ef0f808d906124dd6f812248cristy%       C      L        I    PPP    BBBB   O   O  AAAAA  RRRR   D   D         %
94e82e51d7ebce7b4ef0f808d906124dd6f812248cristy%       C      L        I    P      B   B  O   O  A   A  R R    D   D         %
104e82e51d7ebce7b4ef0f808d906124dd6f812248cristy%        CCCC  LLLLL  IIIII  P      BBBB    OOO   A   A  R  R   DDDD          %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                        Read/Write Windows Clipboard.                        %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             Leonard Rosenthol                               %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 May 2002                                    %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_WINGDI32_DELEGATE)
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#  if defined(__CYGWIN__)
453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#    include <windows.h>
463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#  else
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     /* All MinGW needs ... */
48b5ae05b44058a9b8976cd09a43145a23b219748dcristy#    include "MagickCore/nt-base-private.h"
493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#    include <wingdi.h>
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#  endif
513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
62f7836bf507b2e32ad7343056f8af34f3ce65d08acristy#include "MagickCore/nt-feature.h"
63d3a48928f150c1b6963167220a5f7ff9681a5036cristy#include "MagickCore/pixel-accessor.h"
644c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
664c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
674c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_WINGDI32_DELEGATE)
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
741e178e70fb3c956f9fc1e30c3ba863e882666465cristy  WriteCLIPBOARDImage(const ImageInfo *,Image *,ExceptionInfo *);
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d C L I P B O A R D I m a g e                                       %
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadCLIPBOARDImage() reads an image from the system clipboard and returns
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  it.  It allocates the memory necessary for the new Image structure and
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns a pointer to the new image.
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadCLIPBOARDImage method is:
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadCLIPBOARDImage(const ImageInfo *image_info,
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo exception)
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_WINGDI32_DELEGATE)
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadCLIPBOARDImage(const ImageInfo *image_info,
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1113ec328f01daf9179c098eeca6026899fd53121d3dirk  MagickBooleanType
1123ec328f01daf9179c098eeca6026899fd53121d3dirk    status;
1133ec328f01daf9179c098eeca6026899fd53121d3dirk
114bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1174c08aed51c5899665ade97263692328eea4af106cristy  register Quantum
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1204e82e51d7ebce7b4ef0f808d906124dd6f812248cristy  ssize_t
1214e82e51d7ebce7b4ef0f808d906124dd6f812248cristy    y;
1224e82e51d7ebce7b4ef0f808d906124dd6f812248cristy
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
124e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
129e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
1309950d57e1124b73f684fb5946e206994cefda628cristy  image=AcquireImage(image_info,exception);
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    HBITMAP
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bitmapH;
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    HPALETTE
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hPal;
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    OpenClipboard(NULL);
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bitmapH=(HBITMAP) GetClipboardData(CF_BITMAP);
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    hPal=(HPALETTE) GetClipboardData(CF_PALETTE);
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CloseClipboard();
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ( bitmapH == NULL )
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowReaderException(CoderError,"NoBitmapOnClipboard");
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      BITMAPINFO
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        DIBinfo;
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      BITMAP
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        bitmap;
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      HBITMAP
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        hBitmap,
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        hOldBitmap;
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      HDC
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        hDC,
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        hMemDC;
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      RGBQUAD
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *pBits,
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        *ppBits;
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* create an offscreen DC for the source */
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hMemDC=CreateCompatibleDC(NULL);
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hOldBitmap=(HBITMAP) SelectObject(hMemDC,bitmapH);
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      GetObject(bitmapH,sizeof(BITMAP),(LPSTR) &bitmap);
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((image->columns == 0) || (image->rows == 0))
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image->columns=bitmap.bmWidth;
170acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy          image->rows=bitmap.bmHeight;
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
172acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy      status=SetImageExtent(image,image->columns,image->rows,exception);
173acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy      if (status == MagickFalse)
174acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy        return(DestroyImageList(image));
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Initialize the bitmap header info.
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ResetMagickMemory(&DIBinfo,0,sizeof(BITMAPINFO));
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      DIBinfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
180eaedf06777741da32408da72c1e512975c600c48cristy      DIBinfo.bmiHeader.biWidth=(LONG) image->columns;
181eaedf06777741da32408da72c1e512975c600c48cristy      DIBinfo.bmiHeader.biHeight=(-1)*(LONG) image->rows;
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      DIBinfo.bmiHeader.biPlanes=1;
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      DIBinfo.bmiHeader.biBitCount=32;
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      DIBinfo.bmiHeader.biCompression=BI_RGB;
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hDC=GetDC(NULL);
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (hDC == 0)
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CoderError,"UnableToCreateADC");
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hBitmap=CreateDIBSection(hDC,&DIBinfo,DIB_RGB_COLORS,(void **) &ppBits,
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        NULL,0);
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ReleaseDC(NULL,hDC);
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (hBitmap == 0)
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ThrowReaderException(CoderError,"UnableToCreateBitmap");
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* create an offscreen DC */
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hDC=CreateCompatibleDC(NULL);
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (hDC == 0)
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          DeleteObject(hBitmap);
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowReaderException(CoderError,"UnableToCreateADC");
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      hOldBitmap=(HBITMAP) SelectObject(hDC,hBitmap);
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (hOldBitmap == 0)
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          DeleteDC(hDC);
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          DeleteObject(hBitmap);
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowReaderException(CoderError,"UnableToCreateBitmap");
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (hPal != NULL)
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* Kenichi Masuko says this needed */
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        SelectPalette(hDC, hPal, FALSE);
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RealizePalette(hDC);
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* bitblt from the memory to the DIB-based one */
214eaedf06777741da32408da72c1e512975c600c48cristy      BitBlt(hDC,0,0,(int) image->columns,(int) image->rows,hMemDC,0,0,SRCCOPY);
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* finally copy the pixels! */
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pBits=ppBits;
217bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (y=0; y < (ssize_t) image->rows; y++)
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=QueueAuthenticPixels(image,0,y,image->columns,1,exception);
220acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy        if (q == (Quantum *) NULL)
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
222bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        for (x=0; x < (ssize_t) image->columns; x++)
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
2244c08aed51c5899665ade97263692328eea4af106cristy          SetPixelRed(image,ScaleCharToQuantum(pBits->rgbRed),q);
2254c08aed51c5899665ade97263692328eea4af106cristy          SetPixelGreen(image,ScaleCharToQuantum(pBits->rgbGreen),q);
2264c08aed51c5899665ade97263692328eea4af106cristy          SetPixelBlue(image,ScaleCharToQuantum(pBits->rgbBlue),q);
2274c08aed51c5899665ade97263692328eea4af106cristy          SetPixelAlpha(image,OpaqueAlpha,q);
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          pBits++;
229ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy          q+=GetPixelChannels(image);
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (SyncAuthenticPixels(image,exception) == MagickFalse)
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          break;
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      DeleteDC(hDC);
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      DeleteObject(hBitmap);
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(image);
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(image));
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MAGICKCORE_WINGDI32_DELEGATE */
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r C L I P B O A R D I m a g e                               %
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterCLIPBOARDImage() adds attributes for the clipboard "image format" to
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterCLIPBOARDImage method is:
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
263bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterCLIPBOARDImage(void)
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
266bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterCLIPBOARDImage(void)
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
27106b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("CLIPBOARD","CLIPBOARD","The system clipboard");
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_WINGDI32_DELEGATE)
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadCLIPBOARDImage;
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteCLIPBOARDImage;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
27608e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
277009d739511cb808de2f5899fe7e06be7350838e9cristy  entry->format_type=ImplicitFormatType;
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r C L I P B O A R D I m a g e                           %
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterCLIPBOARDImage() removes format registrations made by the
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RGB module from the list of supported formats.
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterCLIPBOARDImage method is:
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterCLIPBOARDImage(void)
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterCLIPBOARDImage(void)
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("CLIPBOARD");
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e C L I P B O A R D I m a g e                                     %
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WriteCLIPBOARDImage() writes an image to the system clipboard.
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WriteCLIPBOARDImage method is:
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType WriteCLIPBOARDImage(const ImageInfo *image_info,
3221e178e70fb3c956f9fc1e30c3ba863e882666465cristy%        Image *image,ExceptionInfo *exception)
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3301e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o exception: return any errors or warnings in this structure.
3311e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_WINGDI32_DELEGATE)
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteCLIPBOARDImage(const ImageInfo *image_info,
3351e178e70fb3c956f9fc1e30c3ba863e882666465cristy  Image *image,ExceptionInfo *exception)
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Allocate memory for pixels.
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
341e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
343e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    HBITMAP
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      bitmapH;
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3504e82e51d7ebce7b4ef0f808d906124dd6f812248cristy    OpenClipboard(NULL);
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    EmptyClipboard();
352a7540de2cbe9210c2fa77b49cfb68071a826f501cristy    bitmapH=(HBITMAP) ImageToHBITMAP(image,exception);
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    SetClipboardData(CF_BITMAP,bitmapH);
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    CloseClipboard();
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MAGICKCORE_WINGDI32_DELEGATE */
359