0023712: Remove dependency on Aspect_GraphicDevice from Aspect_Window
[occt.git] / src / WNT / WNT_ImageProcessor.cxx
diff --git a/src/WNT/WNT_ImageProcessor.cxx b/src/WNT/WNT_ImageProcessor.cxx
deleted file mode 100755 (executable)
index 662eca3..0000000
+++ /dev/null
@@ -1,1758 +0,0 @@
-// Copyright (c) 1996-1999 Matra Datavision
-// Copyright (c) 1999-2012 OPEN CASCADE SAS
-//
-// The content of this file is subject to the Open CASCADE Technology Public
-// License Version 6.5 (the "License"). You may not use the content of this file
-// except in compliance with the License. Please obtain a copy of the License
-// at http://www.opencascade.org and read it completely before using this file.
-//
-// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
-// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
-//
-// The Original Code and all software distributed under the License is
-// distributed on an "AS IS" basis, without warranty of any kind, and the
-// Initial Developer hereby disclaims all such warranties, including without
-// limitation, any warranties of merchantability, fitness for a particular
-// purpose or non-infringement. Please see the License for the specific terms
-// and conditions governing the rights and limitations under the License.
-
-#define TEST   // EPV_160499
-//             Avoid do retrieve properly an XWD image with
-//             NT 4.0 Service pack 4
-
-#define IMP080200      //GG
-//             Enable to evaluate correctly the fileneme extension
-//             according to the CSF_DefaultImageFormat symbol.
-
-#define BUC60837       // GG 07/03/01
-//             Enable to read a GIF image file even a if the file contains
-//             wrong informations.
-
-#define STRICT
-#include <windows.h>
-#include <windowsx.h>
-#include <stdio.h>
-
-#ifdef DrawText
-# undef DrawText
-#endif  /* DrawText */
-
-#include <Aspect_XWD.hxx>
-
-#include <WNT.h>
-#include <Quantity_Color.hxx>
-#include <WNT_GraphicDevice.hxx>
-#include <WNT_TypeOfImage.hxx>
-#include <Image_AlienPixMap.hxx>
-#include <TCollection_AsciiString.hxx>
-
-//***//
-#define I_SUCCESS Standard_True
-#define I_ERROR   Standard_False
-
-#define PIXEL4   4
-#define PIXEL8   8
-#define PIXEL16 16
-#define PIXEL24 24
-#define PIXEL32 32
-
-#define MAXCOLOR   256
-#define PAD(a)     (   ( a ) % sizeof ( LONG ) ?                          \
-                   sizeof ( LONG ) - (  ( a ) % sizeof ( LONG )  ) : 0  )
-#ifdef _DEBUG
-# define MALLOC(s) calloc (  ( s ), 1  )
-# define FREE(p)   free   (  ( p )     )
-#else
-# define MALLOC(s)  HeapAlloc (  hHeap, HEAP_ZERO_MEMORY | HEAP_GENERATE_EXCEPTIONS, ( s )  )
-# define FREE(p)    HeapFree  (  hHeap, 0, ( p )  )
-#endif  /* _DEBUG */
-#define WINNT35X() (WNT_osVer.dwPlatformId   == VER_PLATFORM_WIN32_NT && \
-                    WNT_osVer.dwMajorVersion == 3 )
-//***//
-typedef struct {
-
-                BYTE pixel[ 3 ];
-
-        } TRIPLET, *PTRIPLET;
-
-class _init {
-
- public:
-
-   _init ();
-  ~_init ();
-
-};  // end _init
-//***//
-OSVERSIONINFO WNT_osVer;
-
-HWINSTA ( WINAPI *NTOpenWindowStation       ) ( LPTSTR, BOOL, DWORD        );
-BOOL    ( WINAPI *NTSetProcessWindowStation ) ( HWINSTA                    );
-HDESK   ( WINAPI *NTOpenDesktop             ) ( LPTSTR, DWORD, BOOL, DWORD );
-BOOL    ( WINAPI *NTSetThreadDesktop        ) ( HDESK                      );
-BOOL    ( WINAPI *NTCloseDesktop            ) ( HDESK                      );
-BOOL    ( WINAPI *NTCloseWindowStation      ) ( HWINSTA                    );
-//***//
-static DWORD           dwFileSize;
-static LPVOID          lpvFile;
-static HDC             hDC;
-#ifdef TEST
-static BOOL            fWindow=FALSE;
-#endif
-static WNT_TypeOfImage imgType;
-static HANDLE          hHeap;
-static _init           init;
-//***//
-static HBITMAP loadXWD (  Handle( WNT_GraphicDevice )&  );
-static HBITMAP loadBMP (  Handle( WNT_GraphicDevice )&  );
-static HBITMAP loadGIF (  Handle( WNT_GraphicDevice )&  );
-//***//
-static void            __fastcall _swaplong   ( char*, unsigned );
-static void            __fastcall _swapshort  ( char*, unsigned );
-static int             __fastcall _getshift   ( unsigned long   );
-static WNT_TypeOfImage __fastcall _image_type ( LPTSTR, BOOL    );
-//***//
-static void __fastcall _alloc_colors (
-                        PVOID, int, int, int, LPRGBQUAD, Handle( WNT_GraphicDevice )&
-                       );
-//***//
-int SaveBitmapToFile (
-     Handle( WNT_GraphicDevice )& , HBITMAP , char*, int, int, int, int
-       );
-//***//
-HBITMAP LoadImageFromFile (
-         Handle( WNT_GraphicDevice )& gDev, char* fileName, HDC hDevCtx
-           ) {
-
- HANDLE   hFile, hFileMap = NULL;
- HBITMAP  retVal = NULL;
- DWORD    dwProtect, dwAccess;
-
- if ( WNT_osVer.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS ) {
-
-  dwProtect = PAGE_WRITECOPY;
-  dwAccess  = GENERIC_READ | GENERIC_WRITE;
-
- } else {
-
-  dwProtect = PAGE_READONLY;
-  dwAccess  = GENERIC_READ;
-
- }  // end else
-
- hDC = ( hDevCtx != NULL ) ? hDevCtx : GetDC ( NULL );
-
-#ifdef IMP080200       // Check extension
- WNT_TypeOfImage iType   = imgType;
- TCHAR           drv[ _MAX_DRIVE ];
- TCHAR           dir[ _MAX_DIR   ];
- TCHAR           fnm[ _MAX_FNAME ];
- TCHAR           ext[ _MAX_EXT   ];
- TCHAR           ifl[ _MAX_PATH  ];
-
- _splitpath ( fileName, drv, dir, fnm, ext );
-
- if (  ext[ 0 ] == TEXT( '\x00' )  ) {
-   ext[ 0 ] = TEXT( '.'    );
-   ext[ 1 ] = TEXT( '\x00' );
- }  // end if
-
- iType = _image_type ( &ext[ 1 ], FALSE );
-
- _makepath ( ifl, drv, dir, fnm, ext );
-#endif
-
- __try {
-
-  hFile = CreateFile (
-#ifdef IMP080200
-       ifl, dwAccess, FILE_SHARE_READ, NULL,
-#else
-       fileName, dwAccess, FILE_SHARE_READ, NULL,
-#endif
-           OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL
-                 );
-
-  if ( hFile == INVALID_HANDLE_VALUE ) __leave;
-
-  dwFileSize = GetFileSize ( hFile, NULL );
-
-  if ( dwFileSize == 0xFFFFFFFF ) __leave;
-
-  hFileMap = CreateFileMapping (
-              hFile, NULL, dwProtect, 0, dwFileSize, NULL
-             );
-
-  if ( hFileMap == NULL ) __leave;
-
-  lpvFile = MapViewOfFile ( hFileMap, FILE_MAP_COPY, 0, 0, 0 );
-
-  if ( lpvFile == NULL ) __leave;
-
-  if (   memcmp (  ( const void* )lpvFile, ( const void* )"BM", 2  ) == 0   )
-
-   retVal = loadBMP ( gDev );
-
-  else if (   memcmp (  ( const void* )lpvFile, ( const void* )"GIF87a", 6  ) == 0 ||
-              memcmp (  ( const void* )lpvFile, ( const void* )"GIF89a", 6  ) == 0
-       )
-
-   retVal = loadGIF ( gDev );
-
-  else  // assume XWD file
-
-   retVal = loadXWD ( gDev );
-
- }  // end __try
-
- __finally {
-
-  if ( lpvFile  != NULL ) {
-
-   UnmapViewOfFile ( lpvFile );
-   lpvFile = NULL;
-
-  }  // end if
-
-  if ( hFileMap != NULL                 ) CloseHandle ( hFileMap );
-  if ( hFile    != INVALID_HANDLE_VALUE ) CloseHandle ( hFile    );
-
- }  // end __finally
-
- if ( hDevCtx == NULL ) ReleaseDC ( NULL, hDC );
-
- return retVal;
-
-}  // end LoadImageFromFile
-
-int __WNT_API SaveWindowToFile (
-     Handle( WNT_GraphicDevice )& gDev,
-     HWND hWnd, char* fName, int x, int y, int w, int h
-    ) {
-
- int      retVal = I_ERROR;
- HDC      hDCmem;
- HBITMAP  hBmp = NULL, hOldBmp;
- HPALETTE hOldPal;
-
- __try {
-
-  hDC = GetDC ( hWnd );
-#ifdef TEST
-  fWindow = TRUE;
-#endif
-
-  if (  gDev -> IsPaletteDevice ()  ) {
-
-   hOldPal = SelectPalette (  hDC, ( HPALETTE )(  gDev -> HPalette ()  ), FALSE  );
-   RealizePalette ( hDC );
-
-  }  // end if
-
-  hDCmem = CreateCompatibleDC ( hDC );
-
-  hBmp = CreateCompatibleBitmap ( hDC, w, h );
-
-  if ( hBmp == NULL ) __leave;
-
-  hOldBmp = SelectBitmap ( hDCmem, hBmp );
-
-   BitBlt ( hDCmem, 0, 0, w, h, hDC, x, y, SRCCOPY );
-
-  SelectBitmap ( hDCmem, hOldBmp );
-
-  retVal = SaveBitmapToFile ( gDev, hBmp, fName, 0, 0, w, h );
-
- }  // end __try
-
- __finally {
-
-#ifdef TEST
-  fWindow = FALSE;
-#endif
-
-  if ( hBmp != NULL ) DeleteObject ( hBmp );
-
-  if (  gDev -> IsPaletteDevice ()  )
-
-   SelectPalette ( hDC, hOldPal, FALSE );
-
-  DeleteDC ( hDCmem );
-  ReleaseDC ( hWnd, hDC );
-
- }  // end __finally
-
- return retVal;
-
-}  // end SaveWindowToFile
-
-int DumpBitmapToFile (HBITMAP     theHBitmap,
-                      const char* theFileName)
-{
-  // get informations about the bitmap
-  BITMAP aBitmap;
-  if (GetObject (theHBitmap, sizeof(BITMAP), &aBitmap) == 0)
-  {
-    return I_ERROR;
-  }
-
-  Image_AlienPixMap anImage;
-  const Standard_Size aSizeRowBytes = Standard_Size(aBitmap.bmWidth) * 4;
-  if (!anImage.InitTrash (Image_PixMap::ImgBGR32, Standard_Size(aBitmap.bmWidth), Standard_Size(aBitmap.bmHeight), aSizeRowBytes))
-  {
-    return I_ERROR;
-  }
-  anImage.SetTopDown (false);
-
-  // Setup image data
-  BITMAPINFOHEADER aBitmapInfo;
-  memset (&aBitmapInfo, 0, sizeof(BITMAPINFOHEADER));
-  aBitmapInfo.biSize        = sizeof(BITMAPINFOHEADER);
-  aBitmapInfo.biWidth       = aBitmap.bmWidth;
-  aBitmapInfo.biHeight      = aBitmap.bmHeight; // positive means bottom-up!
-  aBitmapInfo.biPlanes      = 1;
-  aBitmapInfo.biBitCount    = 32; // use 32bit for automatic word-alignment per row
-  aBitmapInfo.biCompression = BI_RGB;
-
-  // Copy the pixels
-  HDC aDC = GetDC (NULL);
-  Standard_Boolean isSuccess = GetDIBits (aDC, theHBitmap,
-                                          0,                           // first scan line to set
-                                          aBitmap.bmHeight,            // number of scan lines to copy
-                                          anImage.ChangeData(),        // array for bitmap bits
-                                          (LPBITMAPINFO )&aBitmapInfo, // bitmap data info
-                                          DIB_RGB_COLORS) != 0;
-
-  ReleaseDC (NULL, aDC);
-  return (isSuccess && anImage.Save (theFileName)) ? I_SUCCESS : I_ERROR;
-}
-
-//***//
-int SaveBitmapToFile (Handle(WNT_GraphicDevice)& gDev,
-                      HBITMAP hBmp, char* fName,
-                      int x, int y, int w, int h)
-{
-  int      retVal  = I_ERROR;
-  HBITMAP  hNewBmp = NULL;
-  HPALETTE hOldPal;
-  BOOL     newBmp  = FALSE, newDC = FALSE;
-
-  __try {
-
-  #ifdef TEST
-    if (!fWindow)
-  #else
-    if (y != 0 || x != 0)
-  #endif
-    {
-      HBITMAP hOldBmp;
-
-      newDC = TRUE;
-      hDC = GetDC (NULL);
-
-      if (gDev->IsPaletteDevice())
-      {
-        hOldPal = SelectPalette (hDC, (HPALETTE)(gDev->HPalette()), FALSE);
-        RealizePalette (hDC);
-      }  // end if
-
-      HDC hDCmemSrc = CreateCompatibleDC (hDC);
-      HDC hDCmemDst = CreateCompatibleDC (hDC);
-
-      hNewBmp = CreateCompatibleBitmap (hDC, w, h);
-      if (hNewBmp != NULL)
-      {
-        hOldBmp = SelectBitmap (hDCmemDst, hNewBmp);
-        SelectBitmap (hDCmemSrc, hBmp);
-        BitBlt (hDCmemDst, 0, 0, w, h, hDCmemSrc, x, y, SRCCOPY);
-        newBmp = TRUE;
-        SelectBitmap (hDCmemDst, hOldBmp);
-      }  // end if
-
-      DeleteDC (hDCmemDst);
-      DeleteDC (hDCmemSrc);
-
-      if (gDev->IsPaletteDevice())
-      {
-        SelectPalette (hDC, hOldPal, FALSE);
-      }
-      if (hNewBmp == NULL) __leave;
-    }
-    else
-    {
-      hNewBmp = hBmp;
-    }
-
-    retVal = DumpBitmapToFile (hNewBmp, fName);
-  }  // end __try
-  __finally {
-    if (hNewBmp != NULL && newBmp) DeleteObject (hNewBmp);
-    if (newDC) ReleaseDC (NULL, hDC);
-  }  // end __finally
-  return retVal;
-}  // end SaveBitmapToFile
-//***//
-void SetOutputFormat ( WNT_TypeOfImage type ) {
-
- imgType = type;
-
-}  // end SetOutputFormat
-//***//
-//**************** Routines to process XWD file ***************************//
-//***//
-static HBITMAP loadXWD (  Handle( WNT_GraphicDevice )& gDev  ) {
-
- UINT             i, j, k;
- UINT             red_shift, green_shift, blue_shift;
- HBITMAP          retVal = NULL;
- PBITMAPINFO      pBmi   = NULL;
- PBYTE            pbInit;
- UINT             nBytes, bitmapSize;
- WORD             bitCount;
- HPALETTE         hOldPal;
- LONG             lPixel;
- WORD             wPixel;
- BYTE             bPixel;
- BOOL             newMem = FALSE;
- PBYTE            ptrDIB, ptrXWD;
- UINT             incDIB, incXWD;
- XWDFileHeader*   xwdHdr;
- XColor*          xColor;
- Standard_Integer r, g, b;
- WORD             colors[ MAXCOLOR ];
- LPVOID           imageData;
- DWORD            dataSize;
-
- __try {
-
-  xwdHdr = ( XWDFileHeader* )lpvFile;
-
-  _swaplong (  ( char* )xwdHdr, sizeof ( XWDFileHeader )  );
-
-  if ( xwdHdr -> file_version  != XWD_FILE_VERSION ||
-       xwdHdr -> pixmap_format != ZPixmap          ||
-       xwdHdr -> header_size   <  sizeof ( XWDFileHeader )
-  ) __leave;
-
-  xColor = ( XColor* )(  ( char* )lpvFile + xwdHdr -> header_size  );
-
-  for ( i = 0; i < xwdHdr -> ncolors; ++i ) {
-
-   _swaplong  (  ( char* )&xColor[ i ].pixel, sizeof ( unsigned long  )  );
-   _swapshort (  ( char* )&xColor[ i ].red,   sizeof ( unsigned short ) * 3  );
-
-  }  // end for
-
-  imageData = ( LPVOID )( xColor + xwdHdr -> ncolors );
-  imageData = ( LPVOID )(  ( char* )imageData + xwdHdr -> xoffset  );
-  dataSize  = ( DWORD )(  ( char* )lpvFile + dwFileSize - ( char* )imageData  );
-
-  nBytes = sizeof ( BITMAPINFO );
-
-  switch ( xwdHdr -> visual_class ) {
-
-   case StaticColor:
-   case PseudoColor:
-
-    if ( xwdHdr -> bits_per_pixel < 12 ) {
-
-        bitCount = ( xwdHdr -> bits_per_pixel <= 4 ) ? 4 : 8;
-#ifdef TEST
-        nBytes  += sizeof ( RGBQUAD ) * ( 1 << bitCount );
-#else
-        nBytes  += sizeof ( RGBQUAD ) * xwdHdr -> ncolors;
-#endif
-       } else if ( xwdHdr -> bits_per_pixel == 16 )
-
-        bitCount = 16;
-
-       else
-
-        __leave;
-
-    break;
-
-   case TrueColor:
-   case DirectColor:
-
-     red_shift   = _getshift ( xwdHdr -> red_mask   );
-     green_shift = _getshift ( xwdHdr -> green_mask );
-     blue_shift  = _getshift ( xwdHdr -> blue_mask  );
-
-        if ( xwdHdr -> bits_per_pixel < 24 )
-
-         bitCount = 16;
-
-        else if ( xwdHdr -> bits_per_pixel == 24 )
-
-         bitCount = 24;
-
-        else if ( xwdHdr -> bits_per_pixel == 32 )
-
-         bitCount = 32;
-
-        else
-
-         __leave;
-
-    break;
-
-  }  // end switch
-
-  pBmi = ( PBITMAPINFO )MALLOC( nBytes );
-
-  if ( pBmi == NULL ) __leave;
-
-  pBmi -> bmiHeader.biSize          = sizeof ( BITMAPINFOHEADER );
-  pBmi -> bmiHeader.biWidth            = xwdHdr -> pixmap_width;
-  pBmi -> bmiHeader.biHeight        = -( int )xwdHdr -> pixmap_height;
-  pBmi -> bmiHeader.biPlanes        = 1;
-  pBmi -> bmiHeader.biBitCount      = bitCount;
-  pBmi -> bmiHeader.biCompression   = BI_RGB;
-
-  ZeroMemory (  ( PVOID )&colors, sizeof ( colors )  );
-
-  switch ( xwdHdr -> visual_class ) {
-
-   case StaticColor:
-   case PseudoColor:
-
-    if ( bitCount != 16 ) {
-
-     for ( i = 0; i < xwdHdr -> ncolors; ++i ) {
-
-      pBmi -> bmiColors[ i ].rgbBlue  = ( xColor[ i ].blue  >> 8 );
-      pBmi -> bmiColors[ i ].rgbGreen = ( xColor[ i ].green >> 8 );
-      pBmi -> bmiColors[ i ].rgbRed   = ( xColor[ i ].red   >> 8 );
-
-     }  // end for
-
-     incXWD = xwdHdr -> bytes_per_line;
-     incDIB = incXWD + PAD( incXWD );
-
-     if ( xwdHdr -> bytes_per_line == incDIB )
-
-         pbInit = ( PBYTE )imageData;
-
-        else {
-
-         bitmapSize = xwdHdr -> pixmap_height * incDIB;
-
-         pbInit = ( PBYTE )MALLOC( bitmapSize );
-
-         if ( pbInit == NULL ) __leave;
-
-         newMem = TRUE;
-
-         ptrDIB = ( PBYTE )pbInit;
-         ptrXWD = ( PBYTE )imageData;
-
-         for ( i = 0; i < xwdHdr -> pixmap_height; ++i ) {
-
-       CopyMemory ( ptrDIB, ptrXWD, incXWD );
-
-          ptrDIB += incDIB;
-          ptrXWD += incXWD;
-
-         }  // end for ( i . . . )
-
-        }  // end else
-
-     ptrDIB = ( PBYTE )MALLOC( dataSize );
-
-        if ( ptrDIB == NULL ) __leave;
-
-        CopyMemory (  ( PVOID )ptrDIB, ( PVOID )pbInit, dataSize  );
-        FillMemory (  ( PVOID )colors, MAXCOLOR * sizeof ( WORD ), 0xFFFF );
-
-        for ( i = 0; i < dataSize; ++i ) {
-
-         if ( colors[  ptrDIB[ i ]  ] != 0xFFFF ) continue;
-
-         for ( j = 0; j < xwdHdr -> ncolors; ++j )
-
-          if ( xColor[ j ].pixel == pbInit[ i ] )
-
-           break;
-
-         for ( k = 0; k < dataSize; ++k )
-
-          if ( ptrDIB[ k ] == xColor[ j ].pixel )
-
-           pbInit[ k ] = j;
-
-         colors[  ptrDIB[ i ]  ] = j;
-
-        }  // end for
-
-         if (  gDev -> IsPaletteDevice ()  ) {
-
-          for ( i = 0; i < MAXCOLOR; ++i ) {
-
-        if ( colors[ i ] == 0xFFFF ) continue;
-
-           b = ( Standard_Integer )( xColor[  colors[ i ]  ].blue  >> 8 );
-           g = ( Standard_Integer )( xColor[  colors[ i ]  ].green >> 8 );
-           r = ( Standard_Integer )( xColor[  colors[ i ]  ].red   >> 8 );
-
-           gDev -> SetColor ( r, g, b );
-
-       }  // end for
-
-         }  // end if
-
-        FREE( ptrDIB );
-
-    } else {  // bitCount == 16
-
-     WORD red, green, blue;
-
-        incXWD = xwdHdr -> bytes_per_line;
-        incDIB = xwdHdr -> pixmap_width * sizeof ( WORD );
-        incDIB += PAD( incDIB );
-
-     _swapshort (  ( char* )imageData, dataSize  );
-
-     if ( xwdHdr -> bytes_per_line == incDIB )
-
-         pbInit = ( PBYTE )imageData;
-
-        else {
-
-         bitmapSize = xwdHdr -> pixmap_height * incDIB;
-
-         pbInit = ( PBYTE )MALLOC( bitmapSize );
-
-         if ( pbInit == NULL ) __leave;
-
-         newMem = TRUE;
-
-         ptrDIB = ( PBYTE )pbInit;
-         ptrXWD = ( PBYTE )imageData;
-
-         for ( i = 0; i < xwdHdr -> pixmap_height; ++i ) {
-
-       CopyMemory ( ptrDIB, ptrXWD, incXWD );
-
-          ptrDIB += incDIB;
-          ptrXWD += incXWD;
-
-         }  // end for ( i . . . )
-
-        }  // end else
-
-     ptrDIB = pbInit;
-        dataSize = xwdHdr -> pixmap_height * incDIB;
-
-        for ( i = 0; i < xwdHdr -> pixmap_height; ++i ) {
-
-         for ( j = 0; j < xwdHdr -> pixmap_width; ++j ) {
-
-          wPixel = (  ( PWORD )ptrDIB  )[ j ];
-          red   = ( xColor[ wPixel ].red   >> 11 ) << 10;
-          green = ( xColor[ wPixel ].green >> 11 ) <<  5;
-          blue  = ( xColor[ wPixel ].blue  >> 11 );
-          wPixel = red | green | blue;
-          (  ( PWORD )ptrDIB  )[ j ] = wPixel;
-
-         }  // end for ( j . . . )
-
-         ptrDIB += incDIB;
-
-     }  // end for ( i . . . )
-
-AllocColors_16:
-
-        if (  gDev -> IsPaletteDevice ()  )
-
-         _alloc_colors (
-          pbInit, xwdHdr -> pixmap_width, xwdHdr -> pixmap_height, PIXEL16, NULL, gDev
-         );
-
-    }  // end else
-
-   break;
-
-   case TrueColor:
-   case DirectColor:
-
-    switch ( bitCount ) {
-
-     case 16:
-
-         _swapshort (  ( char* )imageData, dataSize  );
-
-         incXWD = xwdHdr -> bytes_per_line;
-         incDIB = xwdHdr -> pixmap_width * sizeof ( WORD );
-         incDIB += PAD( incDIB );
-         bitmapSize = incDIB * xwdHdr -> pixmap_height;
-
-         pbInit = ( PBYTE )MALLOC( bitmapSize );
-
-         if ( pbInit == NULL ) __leave;
-
-         newMem = TRUE;
-
-         ptrDIB = ( PBYTE )pbInit;
-         ptrXWD = ( PBYTE )imageData;
-
-      switch ( xwdHdr -> bits_per_pixel ) {
-
-       case 8:
-
-        for ( i = 0; i < xwdHdr -> pixmap_height; ++i ) {
-
-         for ( j = 0; j < xwdHdr -> pixmap_width; ++j ) {
-
-          bPixel = ptrXWD[ j ];
-                 b = ( xColor[ ( bPixel & xwdHdr -> blue_mask  ) >> blue_shift  ].blue  ) >> 11;
-                 g = ( xColor[ ( bPixel & xwdHdr -> green_mask ) >> green_shift ].green ) >> 11;
-                 r = ( xColor[ ( bPixel & xwdHdr -> red_mask   ) >> red_shift   ].red   ) >> 11;
-                 (  ( PWORD )ptrDIB  )[ j ] = ( WORD )(  b | ( g << 5 ) | ( r << 10 )  );
-
-         }  // end for ( j . . . )
-
-                ptrDIB += incDIB;
-                ptrXWD += incXWD;
-
-        }  // end for ( i . . . )
-
-       break;
-
-       case 16:
-
-        for ( i = 0; i < xwdHdr -> pixmap_height; ++i ) {
-
-         for ( j = 0; j < xwdHdr -> pixmap_width; ++j ) {
-
-          wPixel = (  ( PWORD )ptrXWD  )[ j ];
-                 b = ( xColor[ ( wPixel & xwdHdr -> blue_mask  ) >> blue_shift  ].blue  ) >> 11;
-                 g = ( xColor[ ( wPixel & xwdHdr -> green_mask ) >> green_shift ].green ) >> 11;
-                 r = ( xColor[ ( wPixel & xwdHdr -> red_mask   ) >> red_shift   ].red   ) >> 11;
-                 (  ( PWORD )ptrDIB  )[ j ] = ( WORD )(  b | ( g << 5 ) | ( r << 10 )  );
-
-         }  // end for ( j . . . )
-
-                ptrDIB += incDIB;
-                ptrXWD += incXWD;
-
-        }  // end for ( i . . . )
-
-          break;
-
-          default:
-
-           __leave;
-
-      }  // end switch ( xwdHdr -> bits_per_pixel . . . )
-
-      goto AllocColors_16;   // not attractive but efficient
-
-        break;
-
-     case 24:
-
-      __leave;
-
-     case 32:
-
-      _swaplong (  ( char* )imageData, dataSize  );
-
-         pbInit = ( PBYTE )imageData;
-         bitmapSize = xwdHdr -> pixmap_height *
-                      xwdHdr -> pixmap_width * sizeof ( LONG );
-
-      if ( xwdHdr -> ncolors != 0 )
-
-          for (  i = j = 0; j < bitmapSize; i += sizeof ( LONG )  ) {
-
-        lPixel = ( LONG )*(   ( PLONG )(  ( PBYTE )imageData + j  )   );
-
-           pbInit[ i ]     =
-            ( BYTE )( xColor[ ( lPixel & xwdHdr -> blue_mask  ) >> blue_shift  ].blue  );
-           pbInit[ i + 1 ] =
-            ( BYTE )( xColor[ ( lPixel & xwdHdr -> green_mask ) >> green_shift ].green );
-           pbInit[ i + 2 ] =
-            ( BYTE )( xColor[ ( lPixel & xwdHdr -> red_mask   ) >> red_shift   ].red   );
-           pbInit[ i + 3 ] = 0;
-
-           j += sizeof ( LONG );
-
-          }  // end for
-
-         else
-
-          for (  i = j = 0; j < bitmapSize; i += sizeof ( LONG )  ) {
-
-        lPixel = ( LONG )*(   ( PLONG )(  ( PBYTE )imageData + j  )   );
-
-           pbInit[ i ]     =
-            ( BYTE )(  ( lPixel & xwdHdr -> blue_mask  ) >> blue_shift  );
-           pbInit[ i + 1 ] =
-            ( BYTE )(  ( lPixel & xwdHdr -> green_mask ) >> green_shift );
-           pbInit[ i + 2 ] =
-            ( BYTE )(  ( lPixel & xwdHdr -> red_mask   ) >> red_shift   );
-           pbInit[ i + 3 ] = 0;
-
-           j += sizeof ( LONG );
-
-          }  // end for
-
-      if (  gDev -> IsPaletteDevice ()  )
-
-          _alloc_colors (
-           pbInit, xwdHdr -> pixmap_width, xwdHdr -> pixmap_height, PIXEL32, NULL, gDev
-          );
-
-    }  // end switch ( bitCount . . . )
-
-  }  // end switch ( xwdHdr -> visual_class . . . )
-
-  if (  gDev -> IsPaletteDevice ()  ) {
-
-   hOldPal = SelectPalette (  hDC, ( HPALETTE )(  gDev -> HPalette ()  ), FALSE  );
-
-   if (  RealizePalette ( hDC )  )
-
-    UpdateColors ( hDC );
-
-  }  // end if
-
-   retVal = CreateDIBitmap (
-             hDC, &pBmi -> bmiHeader, CBM_INIT, pbInit, pBmi, DIB_RGB_COLORS
-                   );
-
-  if (  gDev -> IsPaletteDevice ()  )
-
-   SelectPalette ( hDC, hOldPal, FALSE );
-
- }  // end try
-
- __finally {
-
-  if ( pbInit != NULL && newMem ) FREE( pbInit );
-  if ( pBmi   != NULL           ) FREE( pBmi   );
-
- }  // end finally
-
- return retVal;
-
-}  // end readXWD
-
-static void __fastcall _swaplong ( char* bp, unsigned n ) {
-
- char  c;
- char* ep = bp + n;
- char* sp;
-
- while ( bp < ep ) {
-
-  sp    = bp + 3;
-  c     = *sp;
-  *sp   = *bp;
-  *bp++ = c;
-  sp    = bp + 1;
-  c     = *sp;
-  *sp   = *bp;
-  *bp++ = c;
-  bp    += 2;
-
- }  // end while
-
-}  // end _swaplong
-
-static void __fastcall _swapshort ( char* bp, unsigned n ) {
-
- char  c;
- char* ep = bp + n;
-
- while ( bp < ep ) {
-
-  c     = *bp;
-  *bp++ = *( bp + 1 );
-  *bp++ = c;
-
- }  // end while
-
-}  // end _swapshort
-
-static int __fastcall _getshift ( unsigned long mask ) {
-
- int retVal = 0;
-
- while (  !( mask & 1 )  ) {
-
-  ++retVal;
-  mask >>= 1;
-
- }  // end while
-
- return retVal;
-
-}  // end _getshift
-
-//**************** Routines to process BMP file ***************************//
-//***//
-static HBITMAP loadBMP (  Handle( WNT_GraphicDevice )& gDev  ) {
-
- HBITMAP           retVal = NULL;
- PBITMAPFILEHEADER pBmfh;
- PBITMAPINFOHEADER pBmih;
- LPRGBQUAD         pRGB;
- PBYTE             pData;
- HPALETTE          hOldPal;
- WORD              bitCount;
- UINT              nColors;
- DWORD             dwWidth, dwHeight;
- BOOL              os2Flag;
-
- __try {
-
-  pBmfh = ( PBITMAPFILEHEADER )lpvFile;
-  pBmih = ( PBITMAPINFOHEADER )(  ( PBYTE )lpvFile + sizeof ( BITMAPFILEHEADER )  );
-
-  if (  pBmih -> biSize == sizeof ( BITMAPCOREHEADER )  ) {  // OS/2 bitmap
-
-   PBITMAPCOREHEADER pBmch = ( PBITMAPCOREHEADER )pBmih;
-
-   bitCount = pBmch -> bcBitCount;
-   nColors = ( bitCount < 16 ) ? ( 1 << bitCount ) : 0;
-
-   pBmih = ( PBITMAPINFOHEADER )MALLOC(
-                                 sizeof ( BITMAPINFO ) +
-                                                        sizeof ( RGBQUAD ) * nColors
-                                                   );
-
-   if ( pBmih == NULL ) __leave;
-
-   pBmih -> biSize        = sizeof ( BITMAPINFOHEADER );
-   pBmih -> biWidth       = pBmch -> bcWidth;
-   pBmih -> biHeight      = pBmch -> bcHeight;
-   pBmih -> biPlanes      = 1;
-   pBmih -> biBitCount    = bitCount;
-   pBmih -> biCompression = BI_RGB;
-
-   for ( UINT i = 0; i < nColors; ++i ) {
-
-       (  ( PBITMAPINFO )pBmih  ) -> bmiColors[ i ].rgbRed =
-        (  ( PBITMAPCOREINFO )pBmch  ) -> bmciColors[ i ].rgbtRed;
-       (  ( PBITMAPINFO )pBmih  ) -> bmiColors[ i ].rgbGreen =
-        (  ( PBITMAPCOREINFO )pBmch  ) -> bmciColors[ i ].rgbtGreen;
-       (  ( PBITMAPINFO )pBmih  ) -> bmiColors[ i ].rgbBlue =
-        (  ( PBITMAPCOREINFO )pBmch  ) -> bmciColors[ i ].rgbtBlue;
-
-   }  // end for
-
-   pRGB     = (  ( PBITMAPINFO )pBmih  ) -> bmiColors;
-   os2Flag  = TRUE;
-
-  } else {  // Windows DIB
-
-   pRGB     = ( LPRGBQUAD )(  ( PBYTE )pBmih + pBmih -> biSize  );
-   os2Flag  = FALSE;
-
-  }  // end else
-
-  bitCount = pBmih -> biBitCount;
-  dwWidth  = pBmih -> biWidth;
-  dwHeight = pBmih -> biHeight;
-  pData    = ( PBYTE )(  ( PBYTE )lpvFile + pBmfh -> bfOffBits  );
-
-  if (  gDev -> IsPaletteDevice ()  ) {
-
-   _alloc_colors ( pData, dwWidth, dwHeight, bitCount, pRGB, gDev );
-
-   hOldPal = SelectPalette (  hDC, ( HPALETTE )(  gDev -> HPalette ()  ), FALSE  );
-   RealizePalette ( hDC );
-
-  }  // end if
-
-  retVal = CreateDIBitmap (
-            hDC, pBmih, CBM_INIT, pData, ( PBITMAPINFO )pBmih, DIB_RGB_COLORS
-                  );
-
-  if (  gDev -> IsPaletteDevice ()  )
-
-   SelectPalette ( hDC, hOldPal, FALSE );
-
- }  // end __try
-
- __finally {
-
-  if ( os2Flag && pBmih ) FREE( pBmih );
-
- }  // end __finally
-
-  return retVal;
-
-}  // end  loadBMP
-
-//***//
-//**************** Routines to process GIF file ***************************//
-//***//
-#define NEXT_BYTE      ( *ptr++ )
-#define IMAGESEP       0x2C
-#define INTERLACE_MASK 0x40
-#define COLORMAP_MASK  0x80
-#define COMMENT_BYTE   0x21
-
-static UINT        x, y, pass, bytesPerLine, imgWidth, imgHeight;
-static PBYTE       pData;
-static PBITMAPINFO pBmi;
-static BOOL        isInterlace;
-
-static void __fastcall _add_pixel ( UINT );
-//***//
-static HBITMAP loadGIF (  Handle( WNT_GraphicDevice )& gDev  ) {
-
- int      i, nColors;
- HBITMAP  retVal = NULL;
- UINT     Bits, BitMask, CodeSize, ClearCode, EOFCode, FreeCode,
-          InitCodeSize, MaxCode, ReadMask, FirstFree, OutCount, BitOffset,
-          ByteOffset, Code, CurCode, OldCode, FinChar, InCode;
- PUINT    OutCode, Prefix, Suffix;
- BYTE     byte, byte1;
- PBYTE    rasterPtr, ptr1, ptr = (  ( PBYTE )lpvFile  ) + 10;
- BOOL     hasColormap;
- HPALETTE hOldPal;
- DWORD    dataSize;
-
-#ifdef BUC60837
-  pBmi = NULL;
-  rasterPtr = pData = NULL;
-  Suffix = Prefix = OutCode = NULL;
-#endif
-
- __try {
-
-#ifdef BUC60837
-  OutCode = ( PUINT )MALLOC(  1026 * sizeof ( UINT )  );
-#else
-  pBmi      = NULL;
-  rasterPtr = pData = NULL;
-  OutCode = ( PUINT )MALLOC(  1025 * sizeof ( UINT )  );
-#endif
-  Prefix  = ( PUINT )MALLOC(  4096 * sizeof ( UINT )  );
-  Suffix  = ( PUINT )MALLOC(  4096 * sizeof ( UINT )  );
-
-  if ( OutCode == NULL || Prefix == NULL || Suffix == NULL ) __leave;
-
-  byte = NEXT_BYTE;
-
-  hasColormap = ( byte & COLORMAP_MASK ) ? TRUE : FALSE;
-  Bits        = ( byte & 0x07 ) + 1;
-  nColors     = 1 << Bits;
-  BitMask     = nColors - 1;
-  ++ptr;
-
-  if ( NEXT_BYTE ) __leave;
-
-  pBmi = ( PBITMAPINFO )MALLOC(
-                         sizeof ( BITMAPINFO ) + sizeof ( RGBQUAD ) * 256
-                                           );
-
-  if ( pBmi == NULL ) __leave;
-
-  if ( hasColormap ) {
-
-   for ( i = 0; i < nColors; ++i ) {
-
-       pBmi -> bmiColors[ i ].rgbRed   = NEXT_BYTE;
-       pBmi -> bmiColors[ i ].rgbGreen = NEXT_BYTE;
-       pBmi -> bmiColors[ i ].rgbBlue  = NEXT_BYTE;
-
-   }  // end for
-
-  }  // end if
-
-  while ( *ptr == COMMENT_BYTE ) {
-
-   ptr += 2;
-
-   while ( *ptr ) ( ptr += *ptr )++;
-
-   NEXT_BYTE;
-
-  }  // end while
-
-  if ( NEXT_BYTE != IMAGESEP ) __leave;
-
-  rasterPtr = ( PBYTE )MALLOC( dwFileSize );
-
-  if ( rasterPtr == NULL ) __leave;
-
-  ptr += 4;
-
-  byte      = NEXT_BYTE;
-  imgWidth  = byte + 0x100 * NEXT_BYTE;
-  byte      = NEXT_BYTE;
-  imgHeight    = byte + 0x100 * NEXT_BYTE;
-
-  isInterlace = ( NEXT_BYTE & INTERLACE_MASK ) ? TRUE : FALSE;
-
-  CodeSize  = NEXT_BYTE;
-  ClearCode = 1 << CodeSize;
-  EOFCode   = ClearCode + 1;
-  FreeCode  = FirstFree = EOFCode + 1;
-
-  ++CodeSize;
-
-  InitCodeSize = CodeSize;
-  MaxCode      = 1 << CodeSize;
-  ReadMask     = MaxCode - 1;
-
-  ptr1 = rasterPtr;
-
-  do {
-
-   byte = byte1 = NEXT_BYTE;
-
-   while ( byte != 0 ) {
-
-    *ptr1++ = NEXT_BYTE;
-       --byte;
-
-   }  // end while
-
-   if (  ( UINT )( ptr1 - rasterPtr ) > dwFileSize  ) __leave;  // corrupt file - unblock
-
-  } while ( byte1 );
-
-  bytesPerLine = imgWidth + PAD( imgWidth );
-  dataSize     = bytesPerLine * imgHeight;
-
-  pData = ( PBYTE )MALLOC( dataSize );
-
-  if ( pData == NULL ) __leave;
-
-  x = y = pass = OutCount = BitOffset = ByteOffset = 0;
-
-  Code = rasterPtr[ ByteOffset ] + ( rasterPtr[ ByteOffset + 1 ] << 8 );
-
-  if ( CodeSize >= 8 ) Code += ( rasterPtr[ ByteOffset + 2 ] << 16 );
-
-  Code >>= ( BitOffset % 8 );
-  BitOffset += CodeSize;
-  Code      &= ReadMask;
-
-  while ( Code != EOFCode ) {
-
-   if ( Code == ClearCode ) {
-
-       CodeSize   = InitCodeSize;
-       MaxCode    = 1 << CodeSize;
-       ReadMask   = MaxCode - 1;
-       FreeCode   = FirstFree;
-       ByteOffset = BitOffset >> 3;
-#ifdef BUC60837
-      if( ByteOffset > (dwFileSize-3) ) break;
-#endif
-       Code       = rasterPtr[ ByteOffset ] + ( rasterPtr[ ByteOffset + 1 ] << 8 );
-
-      if ( CodeSize >= 8 ) Code += ( rasterPtr[ ByteOffset + 2 ] << 16 );
-
-       Code      >>= ( BitOffset % 8 );
-       BitOffset +=  CodeSize;
-       Code      &=  ReadMask;
-
-       CurCode = OldCode = Code;
-       FinChar = CurCode & BitMask;
-
-       _add_pixel ( FinChar );
-
-   } else {
-
-       CurCode = InCode = Code;
-
-       if ( CurCode >= FreeCode ) {
-
-        CurCode = OldCode;
-        OutCode[ OutCount++ ] = FinChar;
-
-       }  // end if
-
-       while ( CurCode > BitMask ) {
-
-
-        if ( OutCount > 1024 )
-#ifdef BUC60837
-                                       break;
-#else
-                                       __leave;
-#endif
-        OutCode[ OutCount++ ] = Suffix[ CurCode ];
-        CurCode               = Prefix[ CurCode ];
-
-       }  // end while
-
-       FinChar = CurCode & BitMask;
-       OutCode[ OutCount++ ] = FinChar;
-
-       for ( i = OutCount - 1; i >= 0; --i ) _add_pixel ( OutCode[ i ] );
-
-       OutCount = 0;
-       Prefix[ FreeCode ] = OldCode;
-       Suffix[ FreeCode ] = FinChar;
-       OldCode            = InCode;
-       ++FreeCode;
-
-       if ( FreeCode >= MaxCode ) {
-
-     if ( CodeSize < 12 ) {
-
-      ++CodeSize;
-         MaxCode <<= 1;
-         ReadMask = ( 1 << CodeSize ) - 1;
-
-     } // end if
-
-       }  // end if
-
-   }  // end else
-
-   ByteOffset = BitOffset >> 3;
-#ifdef BUC60837
-      if( ByteOffset > (dwFileSize-3) ) break;
-#endif
-   Code = rasterPtr[ ByteOffset ] + ( rasterPtr[ ByteOffset + 1 ] << 8 );
-
-   if ( CodeSize >= 8 ) Code += ( rasterPtr[ ByteOffset + 2 ] << 16 );
-
-   Code      >>= ( BitOffset % 8 );
-   BitOffset +=         CodeSize;
-   Code      &=  ReadMask;
-
-  }  // end while
-
-  pBmi -> bmiHeader.biSize        =  sizeof ( BITMAPINFOHEADER );
-  pBmi -> bmiHeader.biWidth       =  imgWidth;
-  pBmi -> bmiHeader.biHeight      = -( INT )imgHeight;
-  pBmi -> bmiHeader.biPlanes      =  1;
-  pBmi -> bmiHeader.biBitCount    =  8;
-  pBmi -> bmiHeader.biCompression =  BI_RGB;
-
-  if (  gDev -> IsPaletteDevice ()  ) {
-
-   _alloc_colors (
-    pData, imgWidth, imgHeight, PIXEL8, pBmi -> bmiColors, gDev
-   );
-
-   hOldPal = SelectPalette ( hDC, ( HPALETTE )(  gDev -> HPalette ()  ), FALSE );
-   RealizePalette ( hDC );
-
-  }  // end if
-
-  retVal = CreateDIBitmap (
-            hDC, ( PBITMAPINFOHEADER )pBmi, CBM_INIT, pData, pBmi, DIB_RGB_COLORS
-                  );
-
-  if (  gDev -> IsPaletteDevice ()  )
-
-   SelectPalette ( hDC, hOldPal, FALSE );
-
- }  // end __try
-
- __finally {
-
-  if ( pData     != NULL ) FREE( pData     );
-  if ( rasterPtr != NULL ) FREE( rasterPtr );
-  if ( pBmi      != NULL ) FREE( pBmi      );
-  if ( Suffix    != NULL ) FREE( Suffix    );
-  if ( Prefix    != NULL ) FREE( Prefix    );
-  if ( OutCode   != NULL ) FREE( OutCode   );
-
- }  // end __finally
-
- return retVal;
-
-}  // end loadGIF
-
-typedef struct _screen_descr {
-
-                               char gifID[ 6 ];
-                               WORD scrnWidth;
-                               WORD scrnHeight;
-                               BYTE scrnFlag;
-
-               } SCREEN_DESCR;
-
-typedef struct _image_descr {
-
-                               WORD imgX;
-                               WORD imgY;
-                               WORD imgWidth;
-                               WORD imgHeight;
-                               BYTE imgFlag;
-
-               } IMAGE_DESCR;
-
-static void __fastcall _add_pixel ( UINT idx ) {
-
- if ( y < imgHeight )
-
-  *( pData + y * bytesPerLine + x ) = ( BYTE )idx;
-
- if ( ++x == imgWidth ) {
-
-  x = 0;
-
-  if ( !isInterlace )
-
-   ++y;
-
-  else {
-
-   switch ( pass ) {
-
-       case 0:
-
-        y += 8;
-
-        if ( y >= imgHeight ) ++pass, y = 4;
-
-       break;
-
-       case 1:
-
-        y += 8;
-
-        if ( y >= imgHeight ) ++pass, y = 2;
-
-       break;
-
-       case 2:
-
-        y += 4;
-
-        if ( y >= imgHeight ) ++pass, y = 1;
-
-       break;
-
-       case 3:
-
-        y += 2;
-
-   }  // end switch
-
-  }  // end else
-
- }  // end if
-
-}  // end _add_pixel
-
-
-//***//
-//*************************************************************************//
-//***//
-static void __fastcall _alloc_colors (
-                        PVOID data, int width, int height, int size, LPRGBQUAD colors,
-                        Handle( WNT_GraphicDevice )& gDev
-                       ) {
-
- int              i, j, k, bytes_per_line;
- Standard_Integer r, g, b;
- PBYTE            pLine;
-
- if ( height < 0 ) height = -height;
-
- switch ( size ) {
-
-  case PIXEL4: {
-
-   PBYTE pixels;
-   int   l, idx, nColors;
-
-   pixels = ( PBYTE )MALLOC( 0x10 );
-
-   if ( pixels != NULL ) {
-
-    pLine = ( PBYTE )data;
-
-       bytes_per_line  = width >> 1;
-       bytes_per_line += PAD( bytes_per_line );
-
-       nColors = gDev -> NumColors ();
-
-       for ( i = k = 0; i < height; ++i ) {
-
-        for ( j = l = 0; j < width; ++j ) {
-
-         idx = pLine[ l ] & 0x0F;
-
-         if ( !pixels[ idx ] ) {
-retry_4:
-          r = ( Standard_Integer )( colors[ idx ].rgbRed   );
-          g = ( Standard_Integer )( colors[ idx ].rgbGreen );
-          b = ( Standard_Integer )( colors[ idx ].rgbBlue  );
-
-          gDev -> SetColor (  ( r << 16 ) | ( g << 8 ) | b  );
-
-          pixels[ idx ] = TRUE;
-
-          if ( ++k > nColors )
-
-           goto end_4;
-
-         } else {
-
-          idx = ( pLine[ l++ ] >> 4 ) & 0x0F;
-
-          if ( !pixels[ idx ] )
-
-           goto retry_4;
-
-         }  // end else
-
-        }  // end for ( j . . . )
-
-        pLine += bytes_per_line;
-
-       }  // end for ( i . . . )
-end_4:
-       FREE( pixels );
-
-   }  // end if
-
-  }  // PIXEL4
-
-  break;
-
-  case PIXEL8: {
-
-   int   idx, nColors;
-   PBYTE pixels;
-
-   pixels = ( PBYTE )MALLOC( 0x100 );
-
-   if ( pixels != NULL ) {
-
-    pLine = ( PBYTE )data;
-
-       bytes_per_line = width + PAD( width );
-
-       nColors = gDev -> NumColors ();
-
-       for ( i = k = 0; i < height; ++i ) {
-
-        for ( j = 0; j < width; ++j ) {
-
-         idx = pLine[ j ];
-
-      if ( pixels[ idx ] ) continue;
-
-         r = ( Standard_Integer )( colors[ idx ].rgbRed   );
-         g = ( Standard_Integer )( colors[ idx ].rgbGreen );
-         b = ( Standard_Integer )( colors[ idx ].rgbBlue  );
-
-         gDev -> SetColor (  ( r << 16 ) | ( g << 8 ) | b  );
-
-         pixels[ idx ] = TRUE;
-
-      if ( ++k > nColors ) goto end_8;
-
-        }  // end for ( j . . . )
-
-        pLine += bytes_per_line;
-
-       }  // end for ( i . . . )
-end_8:
-       FREE( pixels );
-
-   }  // end if
-
-  }  // PIXEL8
-
-  break;
-
-  case PIXEL16: {
-
-   PWORD pixels, hPixels, pData;
-   WORD  pix, hPix, mask = 0xFF, rmask = 0xFFFF, mult;
-   DWORD dataSize;
-
-   pixels  = ( PWORD )MALLOC(  0x100 * sizeof ( WORD )  );
-   hPixels = ( PWORD )MALLOC(  0x100 * sizeof ( WORD )  );
-
-   if ( pixels != NULL && hPixels != NULL ) {
-
-    FillMemory (  ( PVOID )pixels,  0x100 * sizeof ( WORD ), ~0  );
-    FillMemory (  ( PVOID )hPixels, 0x100 * sizeof ( WORD ), ~0  );
-
-    pData = ( PWORD )data;
-
-       bytes_per_line  = width * sizeof ( WORD );
-       bytes_per_line += PAD( bytes_per_line );
-       dataSize        = bytes_per_line * height;
-
-       mult  = ( WORD )(  dataSize / sizeof ( WORD ) / RAND_MAX  );
-
-       if ( mult == 0 ) {
-
-        mult  = 1;
-        rmask = ( WORD )(  dataSize / sizeof ( WORD ) - 1  );
-
-       }  // end if
-
-    for ( i = j = 0, k = gDev -> NumColors ();
-          i < ( int )(  dataSize / sizeof ( WORD )  );
-          ++i
-    ) {
-
-     pix  = pData[ (  rand () * mult  ) & rmask ];
-        hPix = (  ( pix >> 8 ) ^ pix  ) & mask;
-
-        if (  pixels[ hPix ] == ~0 || hPixels[ hPix ] != pix  ) {
-
-         gDev -> SetColor (
-                  (  ( pix & 0x1F   ) << 3  ) |
-                  (  ( pix & 0x3E0  ) << 6  ) |
-                  (  ( pix & 0x7C00 ) << 9  )
-                 );
-
-         if ( ++j > k ) break;
-
-          hPixels[ hPix ] = pixels[ hPix ] = pix;
-
-        }  // end if
-
-    }  // end for
-
-       FREE( hPixels );
-       FREE( pixels  );
-
-   }  // end if
-
-  }  // PIXEL16
-
-  break;
-
-  case PIXEL24: {
-
-   PLONG    pixels, hPixels;
-   PTRIPLET    pData;
-   LONG     pix, hPix, mask = 0x0FFF, rmask = 0xFFFFFFFF, mult;
-   DWORD    dataSize;
-
-   pixels  = ( PLONG )MALLOC(  0x1000 * sizeof ( LONG )  );
-   hPixels = ( PLONG )MALLOC(  0x1000 * sizeof ( LONG )  );
-
-   if ( pixels != NULL && hPixels != NULL ) {
-
-    FillMemory (  ( PVOID )pixels,  0x1000 * sizeof ( LONG ), ~0  );
-    FillMemory (  ( PVOID )hPixels, 0x1000 * sizeof ( LONG ), ~0  );
-
-       pData = ( PTRIPLET )data;
-
-       bytes_per_line  = width * sizeof ( TRIPLET );
-       bytes_per_line += PAD( bytes_per_line );
-       dataSize        = bytes_per_line * height;
-
-       mult  = dataSize / sizeof ( TRIPLET ) / RAND_MAX;
-
-       if ( mult == 0 ) {
-
-        mult  = 1;
-        rmask = dataSize / sizeof ( TRIPLET ) - 1;
-
-       }  // end if
-
-    for ( i = j = 0, k = gDev -> NumColors ();
-          i < ( int )(  dataSize / sizeof ( TRIPLET )  );
-          ++i
-    ) {
-
-        pix = (  *( PLONG )( pData[ (  rand () * mult  ) & rmask ].pixel )  ) & 0x00FFFFFF;
-        hPix = (  ( pix >> 12 ) ^ pix  ) & mask;
-
-        if (  pixels[ hPix ] == ~0 || hPixels[ hPix ] != pix  ) {
-
-         gDev -> SetColor ( pix );
-
-         if ( ++j > k ) break;
-
-         hPixels[ hPix ] = pixels[ hPix ] = pix;
-
-        }  // end if
-
-    }  // end for
-
-       FREE( hPixels );
-       FREE( pixels  );
-
-   }  // end if
-
-  }  // PIXEL24
-
-  break;
-
-  case PIXEL32: {
-
-   PLONG pixels, hPixels, pData;
-   LONG  pix, hPix, mask = 0x0FFF, rmask = 0xFFFFFFFF, mult;
-   DWORD dataSize;
-
-   pixels  = ( PLONG )MALLOC(  0x1000 * sizeof ( LONG )  );
-   hPixels = ( PLONG )MALLOC(  0x1000 * sizeof ( LONG )  );
-
-   if ( pixels != NULL && hPixels != NULL ) {
-
-    FillMemory (  ( PVOID )pixels,  0x1000 * sizeof ( LONG ), ~0  );
-    FillMemory (  ( PVOID )hPixels, 0x1000 * sizeof ( LONG ), ~0  );
-
-       pData = ( PLONG )data;
-
-       bytes_per_line  = width * sizeof ( LONG );
-       bytes_per_line += PAD( bytes_per_line );
-       dataSize        = bytes_per_line * height;
-
-       mult  = dataSize / sizeof ( LONG ) / RAND_MAX;
-
-       if ( mult == 0 ) {
-
-        mult  = 1;
-        rmask = dataSize / sizeof ( LONG ) - 1;
-
-       }  // end if
-
-    for ( i = j = 0, k = gDev -> NumColors ();
-          i < ( int )(  dataSize / sizeof ( LONG )  );
-          ++i
-    ) {
-
-        pix = pData[ (  rand () * mult  ) & rmask ];
-        hPix = (  ( pix >> 12 ) ^ pix  ) & mask;
-
-        if (  pixels[ hPix ] == ~0 || hPixels[ hPix ] != pix  ) {
-
-         gDev -> SetColor ( pix );
-
-         if ( ++j > k ) break;
-
-         hPixels[ hPix ] = pixels[ hPix ] = pix;
-
-        }  // end if
-
-    }  // end for
-
-       FREE( hPixels );
-       FREE( pixels  );
-
-   }  // end if
-
-  }  // PIXEL32
-
- }  // end switch
-
-}  // end _alloc_colors
-
-_init :: _init () {
-
- TCHAR cimgType[ 17 ];
-
- WNT_osVer.dwOSVersionInfoSize = sizeof ( OSVERSIONINFO );
-
- GetVersionEx ( &WNT_osVer );
-
- if ( hHeap == NULL ) {
-
-  SYSTEM_INFO si;
-
-  GetSystemInfo ( &si );
-
-  hHeap = HeapCreate ( HEAP_GENERATE_EXCEPTIONS, si.dwPageSize, 0 );
-
- }  // end if
-
- if ( WNT_osVer.dwPlatformId == VER_PLATFORM_WIN32_NT ) {
-#ifndef UNICODE
-  LPSTR    lpNTproc[] = { "OpenWindowStationA", "SetProcessWindowStation",
-                          "OpenDesktopA"      , "SetThreadDesktop"       ,
-                          "CloseDesktop"      , "CloseWindowStation"
-                        };
-#else
-  LPSTR    lpNTproc[] = { "OpenWindowStationW", "SetProcessWindowStation",
-                          "OpenDesktopW"      , "SetThreadDesktop"       ,
-                          "CloseDesktop"      , "CloseWindowStation"
-                        };
-#endif  // UNICODE
-  FARPROC* fpNTproc[] = { ( FARPROC* )&NTOpenWindowStation, ( FARPROC* )&NTSetProcessWindowStation,
-                          ( FARPROC* )&NTOpenDesktop,       ( FARPROC* )&NTSetThreadDesktop,
-                          ( FARPROC* )&NTCloseDesktop,      ( FARPROC* )&NTCloseWindowStation
-                        };
-  HMODULE  hUser32    = GetModuleHandle (  TEXT( "USER32" )  );
-
-  for (   int i = 0; i < (  sizeof ( lpNTproc ) / sizeof ( lpNTproc[ 0 ] )  ); ++i   )
-
-   *fpNTproc[ i ] = GetProcAddress ( hUser32, lpNTproc[ i ] );
-
- }  // end if
-
- ZeroMemory (  cimgType, sizeof ( cimgType )  );
-
- if (   GetEnvironmentVariable (
-         TEXT( "CSF_DefaultImageFormat" ), cimgType, sizeof ( imgType )
-        ) == 0
- ) lstrcpy (  cimgType, TEXT( "GIF" )  );
-
- imgType = _image_type ( cimgType, TRUE );
-
-}  // end constructor
-
-_init :: ~_init () {
-
- if ( hHeap != NULL ) {
-
-  HeapDestroy ( hHeap );
-  hHeap = NULL;
-
- }  // end if
-
-}  // end destructor
-
-static WNT_TypeOfImage __fastcall _image_type ( LPTSTR ext, BOOL fInit ) {
-
- WNT_TypeOfImage retVal;
-
- if (   !lstrcmpi (  ext, TEXT( "BMP" )  )   )
-
-  retVal = WNT_TOI_BMP;
-
- else if (   !lstrcmpi (  ext, TEXT( "XWD" )  )   )
-
-  retVal = WNT_TOI_XWD;
-
- else if ( fInit )
-
-  retVal = WNT_TOI_GIF;
-
- else {
-
-  retVal = imgType;
-
-  if (   lstrcmpi (  ext, TEXT( "GIF" )  )   )
-
-   switch ( retVal ) {
-
-    case WNT_TOI_BMP:
-
-     lstrcpy (  ext, TEXT( "bmp" )  );
-
-    break;
-
-    case WNT_TOI_XWD:
-
-     lstrcpy (  ext, TEXT( "xwd" )  );
-
-    break;
-
-    default:
-
-     lstrcpy (  ext, TEXT( "gif" )  );
-
-   }  // end switch
-
- }  // end else
-
- return retVal;
-
-}  // end _image_type